sábado, 24 de noviembre de 2018

Botones de cambio de periodo en el calendario de SharePoint 2013


Recientemente en SharePoint 2013 nos han pedido que mostremos los botones que permiten cambiar entre la vista mensual, semanal y diaria de un Calendario . Normalmente esos botones están en la Ribbon, pero consideran que no están lo suficientemente visibles.

Además nos han pedido que pongamos un titulo que ponga Agenda, para ello basta con poner:

<script>
$(document).ready(function() {
$("#contentRow").prepend($('<div id="contenedorTitulos"><div id="tituloPagina">Agenda</div></div><div style="padding-top:10px;"><input name="Month" type="button" value="Mes" onclick="javascript:MoveView(\'month\')"/><input name="Week" type="button" value="Semana" onclick="javascript:MoveView(\'week\')"/><input name="Day" type="button" value="Día" onclick="javascript:MoveView(\'day\')"/></div></br>'));
});
</script>

Lo que hace el código es buscar el id contentRow, que esta en la parte superior de la página que es donde nos han pedido que lo coloquemos. Ponemos un div con el titulo y luego una serie de div con los input que ejecutan el JavaScript que llama a MoveView del mes, semana o día.

Lo único reseñable que para el carácter ' hemos tenido que escaparlo con \'.

domingo, 23 de septiembre de 2018

Iframe de contenido de SharePoint 2013

Recientemente he construido en un SharePoint 2013 un formulario de petición de información, a través de una lista de SharePoint.

Tras crearlo, he ido a incluirlo en una página de la web del cliente, para sustituir el formulario que tenían, que sólo generaba un correo, por el formulario de nuevo elemento de nuestra lista.
Esto le permitirá explotar y tratar las solicitudes desde SharePoint.

Pero al ir a hacerlo por medio de la etiqueta correspondiente:

<iframe width="550" height="650" src="https://misitio/Lists/Solicitud/Nuevo.aspx?Source=/misitio/Paginas/Agradecimiento.aspx">
</iframe>

La sorpresa ha sido que al publicarlo, no nos ha mostrado el formulario, sino un mensaje de error. En el que nos indica que "Este contenido no se puede mostrar en un marco":

Tras buscar en Google, he encontrado un explicación de Microsoft:
https://blogs.msdn.microsoft.com/officeapps/2012/12/12/iframing-sharepoint-hosted-pages-in-apps/

Pero lo que nos interesa que es la solución, ha bastado con incluir en el código de la página deseada:
<WebPartPages:AllowFraming runat="server"/>
Y hay que incluirla dentro de ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea".

Y solucionado:


 Ahora ya vemos nuestro formulario. También tuve que repetir está operación en la página que vamos tras responder.

sábado, 11 de agosto de 2018

Ocultar opciones del panel de resultados de búsqueda en SharePoint 2013

Esta semana me pidieron que pusiera un buscador en una página en un SharePoint 2013. Entonces para ello, agregue una caja de búsqueda y un panel de resultados de búsqueda.

Sí se deja el panel de resultados tal y como viene tiene la siguiente apariencia:

Tras verlo, nos pidieron que ocultáramos todas las opciones que aparecían para evitar que los usuarios se liaran con otra cosa que no fuera buscar. Entonces es cuando tuvimos que ocultar algunas opciones por medio de la configuración (En rojo en la captura) y otras por CSS (En azul en la captura):


Para ocultar las opciones en rojo, deberemos editar la página y editar el elemento web. Dentro del menú Configuración deberemos desmarcar las siguientes opciones:


En cambio, para ocultar la parte en azul, habría que poner un elemento web del tipo Editor de secuencias de comando en el cual pondremos el siguiente código CSS:

<style>
    #NoResult div, #NoResult ul {
        display: none
    }
    #NoResult .ms-srch-result-noResultsTitle {
        display: inherit
    }
    .ms-srch-result-noResultsTitle {
        padding-bottom: 0px;
    }
</style>

Con lo cual, quedarían todas las zonas indicadas ocultas:


Existiría otra opción que sería crear plantilla de presentación especifica, pero eso lo veremos en otra entrada del blog.

sábado, 17 de marzo de 2018

Cambiar usuario en SharePoint 2013

En versiones anteriores de SharePoint se podía cambiar de usuario desde Acciones del sitio. En SharePoint 2013 no he encontrado esa opción. Pero para poder cambiar de usuario, podremos hacerlo desde la dirección:

/_layouts/15/closeconnection.aspx?loginasanotheruser=true

Nos mostrará la ventana de inicio y nos permitirá introducir el usuario y la contraseña.


sábado, 24 de febrero de 2018

Aceptación de condiciones con SharePoint

Esta semana me han pedido que al acceder a la página principal de un SharePoint saliera un recordatorio respecto a la normativa corporativa de la empresa. Querían que saliera todas las veces que accedían al portal.

Solución rápida: Un alert de JavaScript.

Como era de esperar a los tres días les ha parecido que no era una buena solución y que les parecía mejor la solución que les propuse inicialmente, que sólo saliera la primera vez que accedes al espacio y que quedase registrado cuando has dicho que estabas de acuerdo con los términos legales de la empresa.

Para ello, lo primero que he creado ha sido una lista llamada AceptaciónCondiciones. En ella, sólo utilizo la columna Título, Creado por y Creado. Todas ellas propias del tipo de contenido Elemento, propio de una lista personalizada.

Y en la página de inicio he incluido el siguiente script en un editor de secuencias de comando:
<script type="text/javascript">
 $( document ).ready(function(){
 var usuario = $().SPServices.SPGetCurrentUser({
  fieldNames: ["FirstName", "LastName", "UserName"],
  debug: false
 });
 $().SPServices({
    operation: "GetListItems",
    async: false,
    listName: "AceptacionCondiciones",
    CAMLViewFields: "<ViewFields><FieldRef Name='Title' /></ViewFields>",
CAMLQuery: "<Query><Where><Eq><FieldRef Name='Title'/><Value Type='Text'>"+usuario.UserName+"</Value></Eq></Where></Query>",
    completefunc: function (xData, Status) {
if($(xData.responseXML).SPFilterNode("z:row").length == 0){
//No está y lo incluyo
alert('Advertencia: Este acceso sólo está disponible para usuarios autorizados por personal del servicio. Cualquier intento de acceso no autorizado quedará registrado para su posterior análisis. La documentación aquí alojada es para uso profesional, no permitiéndose su divulgación. ');
AddListItem(usuario.UserName);
}    
    }
  });
})
function AddListItem(TitleField) {
        $().SPServices({
            operation: "UpdateListItems",
            async: false,
            batchCmd: "New",
            listName: "AceptacionCondiciones",
            valuepairs: [["Title", TitleField]],
            completefunc: function (xData, Status) {   
            }
        });
    }
</script>

Lo que hace este Script es guardar en una variable llamada "usuario" el Nombre, Apellido y Nombre de usuario. Luego hago una llamada a la lista AceptacionCondiciones a través de una Query de CALM preguntando si existe algún elemento que en la columna Title (Nombre interno de la columna Título) que contenga el valor de UserName del usuario de DA que esta accediendo a la página principal.
En caso de que no este, hago saltar un Alert de JavaScript con el texto deseado y tras ello incluyo en la lista el usuario, a través de la función AddListItem, completando el campo Titulo con el UserName y como los campos "Creado" y "Creado por" toman automáticamente el nombre a mostrar del usuario y el momento en que hemos aceptado las condiciones.

Ya tendríamos nuestra lista de aceptación de condiciones pedida.

Sí nos hubieran pedido que esta aceptación saliera en cualquier página de nuestro sitio, bastaría con incluir este Script en la página maestra e incluir la línea que indica donde esta la lista, por si estamos en un sitio diferente al de la lista:
webURL: "https://URL del sitio donde esta mi lista de Aceptación de condiciones",

Quedando algo como:
 $().SPServices({
    webURL: "https://URL del sitio donde esta mi lista de Aceptación de condiciones",
    operation: "GetListItems",
    async: false,

Y el resto igual.

Posiblemente con .Net se pudiera hacer algo más completo, pero seguro que también sería más costoso en tiempo.

sábado, 27 de enero de 2018

Validation failed: Cannot resolve Activity

Tras varios años trabajando con SharePoint 2013, hay un error muy común cuando hago flujos de 2010 con SharePoint Designer 2013.
Consiste en que si copias y pegas acciones o simplemente el flujo es muy grande, hay veces que al ir a publicarlo, puede aparecer un mensaje del tipo:

(0, 0) Activity 'ID257' validation failed: Cannot resolve Activity 'ID420'

Lo gracioso es que si comprobamos errores en el flujo, nos dirá que no existen errores en nuestro flujo, pero al publicarlos no nos dejará.

Solución: Copiar cada uno de los pasos que tenga el flujo y pegarlos. Tras ello eliminar el original y darle a publicar.





Y misterios de SharePoint, ya no nos sale este error y el flujo se publica correctamente.

Espero que a alguien más le sirva de solución como me ha servido a mí.