sábado, 23 de enero de 2016

Eliminar una palabra de un texto en SharePoint

Esta entrada es una continuación de la anterior. En la anterior entrada vimos como era posible completar un campo de tipo hipervínculo. Todo ello, vino de una lista llamada Miembros que servía para guardar todos nuestros contactos de diferentes grupos y una lista llamada Grupos, que nos servia para nombrar los diferentes grupos y para tener un "botón" que al hacer clic en el, nos permitiera mandar un correo a todos los miembros de ese Grupo.

Obviamente la siguiente parte que tuvimos que implementar era el mecanismo de dar de baja miembros de dicho grupo. El eliminar elementos de la lista de Miembros, es básico, es eliminar un elemento de la lista. Pero eso no nos eliminaría el correo asociado de la lista Grupos donde esta el "botón".

Así que lo que hicimos fue crear una columna de tipo elección en la lista Miembros, que llamamos Eliminar miembro, cuyo valor por defecto es No. Pero que cuando el usuario quiera eliminar un contacto, simplemente tenga que cambiar a . También cree una columna oculta de tipo texto llamada Todos, donde guardaría los valores de todos los email que había bajo el "botón" Enviar Email. Adicionalmente cree 4 campos calculados sobre la lista  Miembros: SinCorreoI, SinCorreoD, SinCorreoPre y SinCorreo.

Estos campos calculados nos servirán para almacenar los correos que hay a la izquierda del correo que queremos eliminar y sin el "mailto:", la parte derecha que hay tras el correo a eliminar, concatenar ambas partes y finalmente comprobar si es vacío o si quedan correos tras eliminar el correo a borrar.

Para ellos utilizamos también un flujo de trabajo sobre la lista Miembros que se lanza cuando se modifica un elemento y que tiene la siguiente forma:


Ejecutaremos sólo el borrado, si seleccionan Eliminar miembro a .

Lo siguiente que hacemos es guardar en la variable del flujo EmailTodos de tipo cadena, los emails que hay en el "botón".


Lo siguiente que hacemos es rellenar la columna oculta Todos de tipo una línea de texto, de nuestra lista Miembros con el valor de la variable EmailTodos, que contendrá todos los emails:


Tras ello, entra en funcionamiento las columnas calculadas que hemos citado antes:

  • SinCorreoI: =RIGHT(LEFT(Todos;(FIND(Email;Todos)-1));LEN(LEFT(Todos;(FIND(Email;Todos)-1)))-7)
  • SinCorreoD: =RIGHT(Todos;(LEN(Todos)-((FIND(Email;Todos)+LEN(Email)))))
  • SinCorreoPre: =SincorreoI&SinCorreoD
  • SinCorreo: =IF(SinCorreoPre="";"@";SinCorreoPre)
Lo siguiente que hacemos es esperar a que se ejecute y se rellenen los campos calculados. Personalmente tuve que poner una espera hasta que en el campo hubiera una arroba, ya que la acción esperar 1 minuto, no terminaba nunca por un problema de configuración de nuestro SharePoint que debemos revisar. Sino hubiera sido más óptimo poner una espera de 1 minutos y la última columna calculada hubiera sido:

  • SinCorreo: =IF(SinCorreoPre="";"";SinCorreoPre)
No obstante el resto del flujo lo separe en un paso más para asegurarme de que estaban todos los valores asignados.

En el paso 2, lo único que hacemos es establecer la variable del flujo EmailTodosSin de tipo cadena con el valor de la columna SinCorreo.

Lo último que hacemos es volver a rellenar el "botón" tal y como vimos en la anterior entrada, con el valor de la variable, que puede contener correo o no. Y en ambos casos, lo último que hacemos el borrar el elemento de la lista Miembros que queríamos borrar.

RESUMEN:

En las acciones de flujos de SharePoint no existe una función que nos haga eliminar una palabra de un cadena de texto. Sólo existe en 2013 la opción de quedarnos con una parte a partir de una posición determinada. Entonces para ello, utilizaremos columnas calculadas.



sábado, 12 de diciembre de 2015

Campo de hipervínculo en flujos de trabajo 2013

Esta semana un cliente nos ha propuesto un reto. El reto consistía en tener en una lista todos los miembros de los diferentes grupos de trabajo con los que trataban. Hasta aquí, sencillo. Lo siguiente era tener un "botón" que les abriera Outlook y le pusiera todos los correos de los miembros de ese grupo. Esto ya tiene más interés.

La solución una lista llamada Grupos donde listemos los grupos y un "botón" que ponga Enviar Email.
Ese "botón" es un campo de tipo hipervínculo donde la dirección web es mailto:david@dominio.es;blanca@dominio.es; .... Mientras que la descripción del campo pone Enviar Email.

Para dar de alta los miembros, tendremos otra lista llamada Miembros, donde tenemos tres campos (pueden ser más pero nosotros sólo necesitamos esos tres) Nombre (Texto), Grupo (Búsqueda sobre la lista Grupos) y Email (Una linea de texto).

¿Cómo creamos y rellenamos el "botón"? Con un flujo de trabajo sobre la lista Miembros que se lanza cuando se crea un nuevo elemento.

¿Qué hará nuestro flujo?


Resumiendo: Tendremos dos ramas, una por la que iremos si el grupo tiene emails asociados y otra por la que el grupo aún no tiene emails asociados. La condición será:


Que consiste en ir a la lista Grupos y miraremos el campo Emails, que es donde guardaremos nuestros emails concatenados con ";", para ello, queremos el elemento de la lista Grupos, cuyo nombre coincida con el grupo del elemento que ha lanzado el flujo en la lista Miembros.

Si avanzamos por la primera rama, guardamos en una variable del flujo (EmailAnteriores) de tipo Cadena, los emails que ya hay de ese grupo (los recogemos como campo de tipo Dirección URL):



Para en un siguiente paso concatenar esos emails (recuperamos la variable EmailAnteriores con el tipo Dirección de correo electrónico) con el email de elementos de la lista Miembros que ha lanzado el flujo:


El siguiente paso será guardar esa concatenación de los email anteriores y el actual en otra variable de Flujo de tipo cadena (EmailsFinal), pero completar también un campo de descripción que ponga Enviar Email.
Para ello la cadena se genera, con la variable Email donde se encuentran todos los emails del grupo, y separado por una coma y un espacio, el nombre a mostrar:


Y finalmente sólo nos quedará guardar la variable de flujo EmailsFinal, sobre el campo Emails de la lista Grupos, que es nuestro "botón" Enviar Email:


La segunda rama, será la que nos generé el primer correo en la lista Grupos, porque hemos agregado el primer miembro en la lista Miembros. Con la única particularidad de que como estamos guardando en un campo de tipo hipervínculo, deberemos poner delante la palabra "mailto:":


RESUMEN:

Para completar campos de tipo hipervínculo a través de un flujo, deberemos crear una variable de tipo cadena, y completar con la "url, texto descriptivo". Muy importante la coma y el espacio.

domingo, 15 de noviembre de 2015

Trabajando con las Master Pages de SharePoint 2013

Si estáis acostumbrados a trabajar con SharePoint 2007 y/o 2010, seguro que más de una vez habréis tenido que modificar su página maestra o master page.

Para ello, habréis abierto el sitio raíz de vuestra colección de sitios con SharePoint Designer y habréis accedido a la carpeta _catalogs/masterpage, donde están esos maravillosos archivos .master:


O bien, habréis accedido vía web a través de la opción Páginas maestra y diseños de página, que se encuentra en la configuración de sitio del sitio raíz de vuestra colección de sitios:


Pues bien, habréis modifica esos archivos .master y seguro que con un poco de trabajo, habéis conseguido lo que queríais: Modificar las migas, incluir una CSS, incluir un JS...

Al ir a hacer esto en 2013, puede que os hayáis encontrado una sorpresa y tras copiar el archivo .master, habréis intentado renombrarlo y os habrá salido un mensaje que dice: Error del servidor: Este archivo no se puede mover, eliminar, editar ni se puede cambiar su nombre.



Comprobareis que tampoco podéis borrarlo.

La solución para todo, es copiar el archivo .html que tiene el mismo nombre. Tras ello, ya podremos por medio del archivo .html, modificar el nombre, eliminarlo, etc... Pero en cambio, si lo que hacemos es modificar el código del archivo .master, veremos que no nos deja. Eso es porque el código .master, esta asociado al .html.

La manera de modificar la master page que plantea Microsoft, es por medio de la edición del archivo .html asociado. Esto puede ser muy engorroso y no muy agradable (al menos esa ha sido mi experiencia).

Para ello, existe la posibilidad de desasociar el .html del .master y trabajar con el .master directamente. Bastaría con acceder a la configuración del sitio raíz de nuestra colección de sitios y elegir la opción Páginas maestras y diseños de página que se encuentra bajo la agrupación Galerías del diseñador web:


Una vez dentro, buscaremos nuestro archivo .html y editaremos sus propiedades, desmarcando la opción de Archivo asociado:


A partir de este momento, ya será posible modificar el archivo .master, tal y como estábamos acostumbrados en las versiones 2007 y 2010.

Importante: NO volver a marcar esta opción, ya que como nos advierte, que nos macharía nuestro archivo .master, con el código generado a paritr del .html que no ha sido modificado.

domingo, 18 de octubre de 2015

Cómo habilitar varias líneas de texto enriquecido en una biblioteca

Seguro que si lleváis un tiempo trabajando con SharePoint, estaréis acostumbrados a que el tipo de columna de Varias líneas de texto, pueda ser de Texto sin formato, Texto enriquecido o Texto enriquecido mejorado.



Pero si probáis a hacer esa misma columna en una biblioteca, veréis que no os da la opción, ¿dónde está?, ¿lo he soñado?. No, por defecto y desde el navegador la opción de elegir entre los tipos de columna de Varias líneas de texto sólo esta disponible para las listas.

Pero como todo en SharePoint, tiene solución.

Bastará con añadir nuestra columna de tipo Varías líneas de texto, abrir el sitio donde se encuentra nuestra biblioteca con SharePoint Designer y seleccionar Listas y bibliotecas, tras seleccionar nuestra biblioteca. Podremos hacer clic sobre Editar las columnas de la lista.

Esto nos mostrará las columnas de nuestra biblioteca y tras selección las columna deseada, en mi caso Borrar, podremos hacer clic en la ribbon superior en la opción Configuración de columnas y esto nos abrirá una ventana, donde podremos dejarla como Texto sin formato, o bien cambiarla a Texto enriquecido o Texto enriquecido mejorado:



Guardaremos los cambios y listo.

sábado, 19 de septiembre de 2015

Ejecutar javascript tras la carga de un componente

Con SharePoint muchas veces ejecutaremos código Javascript justo tras la carga de la página, para eso es bien conocido el document.ready de JQuery. Pero algunas veces para nuestra sorpresa, campos como metadatos administrados o formularios con InfoPath, no se ve afectados por ese document.ready.

El problema consiste en que construyen tras el document.ready. Lo primero que se puede venir a la cabeza es meter un retardo y ejecutarlo. Eso me lo soluciona, si y no, ya que si por el motivo que sea, nuestra página tarda más tiempo que ese retardo, no le afecta nuestro código retardado.

Consultando con los compañeros, uno de ellos, me recomendó que le echará un ojo a:
https://gist.github.com/vishaltelangre/6727962

A modo de resumen, lo que hace este maravilloso Javascript, consiste en esperar a que en nuestra página aparezca una clase, un ID,... En resumen, un objeto en nuestra página y entonces ejecuta lo que nosotros deseemos.

Por ejemplo, teníamos un formulario con Infopath, que queríamos que los campos fueran multiidioma, pero InfoPath Designer, no nos dejaba tocar el código, así que optamos por poner en la página que mostrábamos el formulario, el siguiente código:

<script src="/_catalogs/masterpage/js/jquery.waituntilexists.js"></script>
<script>
$("span.a5_iiYsMdwb7doT5eh1_0:eq(0)").waitUntilExists(function () {
var lcid =_spPageContextInfo.currentLanguage;
switch (lcid)
{
case 1033:
$("span.a0_iiYsMdwb7doT5eh1_0:eq(1)").html("Title");
$("span.a0_iiYsMdwb7doT5eh1_0:eq(2)").html("Description");
$("span.a0_iiYsMdwb7doT5eh1_0:eq(4)").html("Attachments");
$("input#ctl00_m_g_91e536f8_f104_463c_9c16_4fa6c3988842_FormControl0_V1_I1_B10").val("Send");
break;
}
});
</script>

Con ello conseguimos que cuando se cargaba una clase que estaba dentro del formulario, nos cambiará los textos de los campos y botones del formulario a inglés.

Igual hay soluciones alternativas, pero esta solución nos funciono correctamente.

sábado, 8 de agosto de 2015

Problemas con los flujos de trabajo en las encuestas en SharePoint 2007

Hoy un cliente que usa MOSS (SharePoint 2007), me ha pedido que cree una encuesta. Hasta aquí ningún problema, encuesta creada con sus maravillosas bifurcaciones.

Los problemas han venido cuando me ha dicho que un usuario podía responder varias veces a la encuesta. Eso no es un problema en sí, el problema viene cuando el usuario a los días se ha dado cuenta de que ha respondido mal a la encuesta. Entonces puede ser un problema saber cual es la respuesta que coincide con la respuesta a modificar.

Lo primero que se me ha ocurrido ha sido, crear o modificar una vista, para mostrar en ella, el campo que diferenciaría cada respuesta, en mi caso el campo "operación", pero que por el alto número de operaciones que tenían, he separado en 9 preguntas de operación que se llega a ella por medio de una bifurcación al elegir el departamento.
Para mi sorpresa en una lista no se puede crear vistas, ni modificar vistas (Si que se puede añadir campos con SharePoint Designer):


Pero no sería solución porque tendría que sacar las 9 columnas de operación.

Las encuestas tampoco aceptan columnas calculadas, en la cual, podría concatenar en una sola columna, la concatenación de las 9 y mostrar dicha columna.

Lo siguiente que se me ha ocurrido es crear un correo, que además de confirmarle al usuario la respuesta en la encuesta, les ponga un enlace a la edición de la respuesta en sí.

Me pongo manos a la obra y cuando esta finalizado, me encuentro con que me aparece la columna del flujo en la vista por defecto, como siempre, pero con este mensaje:


Busco en San Google y encuentro esta maravillosa página de Microsoft:
https://support.microsoft.com/es-es/kb/926370

En la que por si desaparece, os copio lo que pone:

"Considere el siguiente escenario. Cree una encuesta y, a continuación, agregue un flujo de trabajo a la encuesta en Microsoft Windows SharePoint Services 3.0. A continuación, conectarse a la encuesta y responder a él. Por último, ver la respuesta que ha enviado y, a continuación, intenta iniciar un flujo de trabajo de la respuesta. Para ello, haga clic en la flecha situada junto a la respuesta, haga clic en flujos de trabajo, haga clic en el flujo de trabajo que ha agregado, escriba su nombre de usuario en el cuadro de los revisores y, a continuación, haga clic en Inicio. Sin embargo, no se inicia el flujo de trabajo. En su lugar, el estado del flujo de trabajo aparece como Error al iniciar."

Que suerte, justo lo que me pasa a mi, busco la solución y me encuentro:

"Este problema se produce porque a partir de un flujo de trabajo de una respuesta de encuesta no es compatible con Windows SharePoint Services 3.0. Aunque la opción de flujos de trabajo aparece al hacer clic en la flecha situada junto a la respuesta de una encuesta, no se puede iniciar un flujo de trabajo de respuesta de una encuesta."

Perfecto, descubro que las encuestas no soportan los flujos. Por cierto, la traducción rara, ha sido cortesía de Google.

Y las alertas no me sirven, porque no puedo hacer que llegue una alerta al creador y sólo al creador, cuando este crea un elemento:


Conclusión, la encuestas son maravillosas, pero no soportan:

  • Flujos
  • Vistas personalizadas
  • Alertas para indicarme que he respondido a la encuesta
  • Columnas calculadas


domingo, 12 de julio de 2015

¿Qué plantilla de sitio se está usando en mi sitio?

Algunas veces nos puede interesar saber que plantilla de sitio ha sido utilizada para la creación de un sitio en concreto. Pues en SharePoint 2010 y 2013 hay una manera muy sencilla de hacerlo.

Basta con hacer clic con el botón derecho sobre la página del sitio que queremos conocer su plantilla y en el menú contextual que nos sale, elegiremos la opción de Ver código fuente:


Esto nos abrirá una nueva ventana con el código fuente de la página en cuestión. Ahora sólo habrá que buscar g_wsaSiteTemplateId en el código (para ello podremos utilizar el buscador Ctrl+F):



Y ahora copiaremos el identificador de la plantilla, en mi caso, PROJECTSITE#0 e iremos a buscarla a la página de Microsoft:
http://social.technet.microsoft.com/wiki/contents/articles/20100.sharepoint-2010-default-site-templates.aspx
ó
http://social.technet.microsoft.com/wiki/contents/articles/20149.sharepoint-2013-default-site-templates.aspx

De hecho, también hay una página interesante con los cambios que ha habido de la versión 2010 a la 2013:
https://technet.microsoft.com/en-us/library/ff607742.aspx

En nuestro caso, veremos que es una plantilla de sitio de proyectos:


Como podéis ver, ha sido muy fácil.