SSD: el síndrome de la Sharepoint dependencia

Sharepoint me proporciona seguridad y me hace sentir más fuerte. Las 10 cosas que más me gustan de Sharepoint.

10 puntos para entender a Project Server 2010

Microsoft Project es quizá la herramienta de gestión de proyectos más conocida y utilizada por los líderes de proyectos...

Diseño Gráfico en SharePoint

Serie de artìculos que nos ayudan a incorporar diseño gráfico en las implementaciones de SharePoint...

Revista CompartiMOSS

Artículos publicados en la revista especializada en SharePoint: CompartiMOSS.

Contacto

Enviame un correo :-)

Mostrando entradas con la etiqueta CEWP. Mostrar todas las entradas
Mostrando entradas con la etiqueta CEWP. Mostrar todas las entradas

miércoles, 2 de julio de 2014

Relaciones de Maestro Detalle en SharePoint 2007 con jQuery (simple y efectivo) [Parte 2]

Introducción
Un requerimiento que siempre surge en SharePoint tiene que ver con manejar relaciones de maestro-detalle. He visto y utilizado diferentes formas, con ventajas y desventajas que siempre dependen del escenario en que nos encontremos. En el artículo original mostramos un ejemplo para WSS 3.0 que utiliza programación del lado del cliente.

Si no leíste ese artículo, te recomiendo su lectura en: Relaciones de maestro detalle en SharePoint 2007.

Segunda parte
En esta segunda parte vamos a modificar uno de los 4 scripts, el del padre, para que soporte diferentes tipos de contenido en el hijo. A continuación el código (cambios resaltados):

<script type="text/javascript">

// Agregar esta CEWP debajo de la vista de la lista Padre


// Parámetros importantes

// Posición en que se encuentra la columna ID
var posicion_id = 3;
// Posición en que se encuentra la columna Tipo de Contenido
var posicion_tc = 4;
// Nombre de la lista hija
var lista_hija = "blabla";
// Texto para el botón o imagen
var texto_boton = "<img style='border: none;' src='/_layouts/images/itann.gif'/ title='Agregar ...' >";
// Estilo del botón nuevo
var estilo_boton = "";
// Título columna
var titulo_columna = "Agregar";
// Tipos de Contenido
var tipos_de_contenido = {
Proyecto:"0x010039837982075D1E4490A428B24D078C36", 
Programa:"0x01004B51B7C49BE3CE459ECEE01CACD0CF2F00C53AA5923F258A41A1C1A8354004CF68", 
Producto:"0x01004B51B7C49BE3CE459ECEE01CACD0CF2F00C53AA5923F258A41A1C1A8354004CF68"
};

// Fin de Parámetros importantes



// Id de ítem
var identificador;

// Tipo de Contenido
var tipo_contenido;

// URL del sitio
var sitio= window.location.href;
var origen = encodeURIComponent(sitio);
var posicion_listas = sitio.indexOf("Lists/");
sitio = sitio.substring(0, posicion_listas); 


// URL de nuevo elemento en el hijo
var nuevo_hijo = sitio + "Lists/" + lista_hija + "/NewForm.aspx?source=" + origen + "&padre=";


// Cambiar Título de columna
$(".ms-listviewtable > tbody > tr > th #diidSortID").text(titulo_columna);


// Cambiar columna
// Asumo que la lista usa la vista standar que posee la clase .ms-listviewtable
$(".ms-listviewtable > tbody > tr").each(function( index ) {  

// Obtengo el ID del elemento
identificador = $(this).find("td:nth-child("+posicion_id+")").text();

// Obtengo el Tipo de Contenido
tipo_contenido = $(this).find("td:nth-child("+posicion_tc+")").text();

// Cambio el ID por el botón nuevo
$( this ).find("td:nth-child("+posicion_id+")").html("<a style='" + estilo_boton + "' href='" + nuevo_hijo + identificador + "&ContentTypeId=" + tipos_de_contenido[tipo_contenido] + "'>" + texto_boton + "</a>") ;

}); 

</script>

miércoles, 11 de diciembre de 2013

Relaciones de Maestro Detalle en SharePoint 2007 con jQuery (simple y efectivo)

Introducción

Un requerimiento que siempre surge en SharePoint tiene que ver con manejar relaciones de maestro-detalle. He visto y utilizado diferentes formas, con ventajas y desventajas que siempre dependen del escenario en que nos encontremos. En este artículo vamos a mostrar un ejemplo para WSS 3.0 que utiliza programación del lado del cliente.

Funcionalidades que necesitamos

En esta lista detallo lo que necesitamos. A lo largo del artículo veremos cómo implementaremos cada caso:

· ¿Cómo vincular en las listas al padre y al hijo?

· ¿Cómo mostrar los hijos de un padre?

· ¿Cómo tener un botón que dispare la creación un hijo para el padre seleccionado?

· ¿Cómo crear un hijo sin tener que completar manualmente los datos del padre?

· ¿Cómo ocultar los datos del padre en el momento de editar el hijo?

¿Cómo vincular en las listas el padre y al hijo?

Para vincular, yo prefiero usar el campo ID del padre como referencia en el hijo. No creo que ese campo necesite ser de tipo “búsqueda”, con lo cual, simplemente creamos en el hijo un campo con estas características:

· Nombre = Padre (o lo que se adapte mejor a nuestro caso)

· Tipo = Texto

· Obligatorio

¿Cómo mostrar los hijos de un padre?

Una forma sencilla para evitar programación es usar las conexiones entre elementos web. Con lo cual, simplemente creamos una página de elementos web en donde:

· Agregamos en la parte superior una lista del padre

· Agregamos en la parte inferior la lista con los hijos

· Conectamos los dos elementos web, vinculando el ID del elemento web de arriba con el Padre del elemento web de abajo.

¿Cómo tener un botón que dispare la creación un hijo para el padre seleccionado?

Para disparar la creación de un hijo, vamos a agregar un botón llamado “Nuevo” en cada fila de la lista padre. Este botón puede ser simplemente un enlace. En principio existen al menos tres enfoques para agregar este botón:

· Mediante un flujo de trabajo

· Mediante un manejador de eventos

· Mediante código JavaScript

En este caso vamos a trabajar con código JavaScript. ¿Por qué? Porque las dos primeras opciones son asincrónicas y puede generar la necesidad de que el usuario tenga que actualizar la pantalla luego del alta del padre, para poder ver el botón “Nuevo”. Esto es difícil de explicar al usuario final.

Nuestro enfoque consistirá en:

· Un elemento web de edición de contenido (CEWP) que ejecute código Java Script que reemplace la columna ID por el nuevo botón.

· Para ello trabajaremos con jQuery

· El contenido de la CEWP lo almacenaremos en un archivo en una librería, para facilitar futuros cambios: maestro_dedalle_boton_nuevo.html

A continuación vemos el código necesario.

 

<script type="text/javascript">

// Agregar esta CEWP debajo de la vista de la lista Padre

// Parámetros importantes

// Posición en que se encuentra la columna ID

var posicion_id = 3;

// Nombre de la lista hija

var lista_hija = "Registros SP";

// Texto para el botón o imagen

var texto_boton = "<img style='border: none;' src='/_layouts/images/itann.gif'/ title='Agregar registro' >";

// Estilo del botón nuevo

var estilo_boton = "";

// Título columna

var titulo_columna = "Agregar";

// Fin de Parámetros importantes

// Id de ítem

var identificador;

// URL del sitio

var sitio= window.location.href;

var origen = encodeURIComponent(sitio);

var posicion_listas = sitio.indexOf("Lists/");

sitio = sitio.substring(0, posicion_listas);

// URL de nuevo elemento en el hijo

var nuevo_hijo = sitio + "Lists/" + lista_hija + "/NewForm.aspx?source=" + origen + "&padre=";

// Cambiar Título de columna

$(".ms-listviewtable > tbody > tr > th #diidSortID").text(titulo_columna);

// Cambiar columna

// Asumo que la lista usa la vista standar que posee la clase .ms-listviewtable

$(".ms-listviewtable > tbody > tr > td:nth-child("+posicion_id+")").each(function( index ) {

// Obtengo el ID del elemento

identificador = $( this ).text();

// Cambio el ID por el botón nuevo

$( this ).html("<a style='" + estilo_boton + "' href='" + nuevo_hijo + identificador + "'>" + texto_boton + "</a>") ;

});

</script>

En la imagen, podemos ver cómo se ve la lista antes y cómo se ve luego:

clip_image002

¿Cómo crear un hijo sin tener que completar manualmente los datos del padre?

Dentro de la pantalla NewForm vamos a realizar lo siguiente:

· Completar el valor del campo Padre

· Ocultar el campo Padre (la fila completa)

A continuación el código necesario:

<script type="text/javascript">

// Agregar esta CEWP en la parte de abajo de la pantalla NewForm.aspx

// Para que se abra el editor, utilizar ?toolpaneview=2

// Parámetros importantes

// Nombre del campo Padre

var campo_padre = "ID.";

// Fin de Parámetros importantes

// Completamos el valor del campo Padre

var valor_padre = url_param("padre");

$('input[title="' + campo_padre + '"]').attr("value",valor_padre);

$('input[title="' + campo_padre + '"]').parent().parent().parent().css("display","none");

// Función para leer un valor de parámetro de URL

function url_param ( name ){

name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");

var regexS = "[\\?&]"+name+"=([^&#]*)";

var regex = new RegExp( regexS );

var results = regex.exec( window.location.href );

if( results == null )

return "";

else

return results[1];

}

</script>

¿Cómo ocultar los datos del padre en el momento de editar el hijo?

Esto aplica tanto a la pantalla de edición, como a la pantalla de display. A continuación el código requerido:

Para la pantalla DispForm:

<script type="text/javascript">

// Agregar esta CEWP en la parte de abajo de la pantalla DispForm.aspx

// Para que se abra el editor, utilizar ?toolpaneview=2

// Parámetros importantes

// Nombre del campo Padre

var campo_padre = "ID_x002e_";

// Fin de Parámetros importantes

// Ocultar la fila

$('a[name="SPBookmark_' + campo_padre + '"]').parent().parent().parent().css("display","none");

</script>

 

Para la pantalla EditForm:

<script type="text/javascript">

// Agregar esta CEWP en la parte de abajo de la pantalla EditForm.aspx

// Para que se abra el editor, utilizar ?toolpaneview=2

// Parámetros importantes

// Nombre del campo Padre

var campo_padre = "ID.";

// Fin de Parámetros importantes

// Ocultar la fila

$('input[title="' + campo_padre + '"]').parent().parent().parent().css("display","none");

</script>

Conclusión

Hemos visto un método bastante simple y efectivo para crear relaciones de maestro detalle en SharePoint 2007. No requiere programación del lado del servidor y soporta cambios futuros a las listas al no requerir la programación de pantallas a medida.

Espero les resulte útil. Hasta la próxima.

lunes, 28 de enero de 2013

Workflow en Project Server 2010 ¿Valores predeterminados en campos de empresa en una PDP?

Cuando trabajamos con PDPs en Project Server 2010, no es sencillo establecer un valor predeterminado para un campo de empresa de tipo obligatorio. Si bien la configuración de campos de empresa permite establecer valores predeterminados, estos funcionan en forma correcta en Project Pro, pero no en la forma esperada dentro de PWA.
Es por ello que en este breve artículo vamos a explicar como manejar los valores predeterminados utilizando un poco de JavaScript. El enfoque de trabajo es el siguiente:
  • Utilizar JavaScript para configurar el valor predeterminado de los campos, sólo si se trata de la PDP usada en una creación de proyecto.
  • Utilizar JavaScript para ocultar dichos campos.
Separaremos el código en dos archivos:
  • Un archivo con el contenido de la CEWP que se insertará en la PDP, debajo de los campos de empresa. .
  • Un archivo de constantes con los guids y demás valores de cada campo.

El código del archivo de contantes

/* Valor predeterminado para el campo Stage en la PDP Request */

STAGE_ID = "ctl00_m_g_80e4b936_45c6_442d_b8de_a93ac30efea1_ctl00_pfp_Repeater_ctl06_idCF_976b5670-7e3b-407d-ad53-1d0343fc3f0c";
STAGE_GUID = "966707bd-8f55-4f0e-97d1-8c94256c55a3";
STAGE_TEXTO = "Planned";

/* Valor predeterminado para el campo Program en la PDP Request */

PROGRAM_ID = "ctl00_m_g_80e4b936_45c6_442d_b8de_a93ac30efea1_ctl00_pfp_Repeater_ctl08_idCF_38852eb9-5126-4fb2-b1ef-45e6edfeb116";
PROGRAM_GUID = "d74da6ee-48ce-491a-ad6e-416da8c99ab2";
PROGRAM_TEXTO = "Yes";

El código de la CEWP 

<script src="/PWA/Internal/jquery-1.4.2.min.js" type="text/javascript"></script>
<script src="/PWA/Internal/constantes_workflow.js" type="text/javascript"></script>

<script type="text/javascript">

 $(document).ready(function() { 

     predeterminar_campo (STAGE_ID, STAGE_GUID, STAGE_TEXTO);
     predeterminar_campo (PROGRAM_ID, PROGRAM_GUID, PROGRAM_TEXTO);

   });


function predeterminar_campo ( id_campo, guid_valor, texto_valor ) {

     if ( workflow_url_param ( "NewProject" ) == "yes" ) {
    
         // Valor del campo
         $('#'+id_campo).attr("value",texto_valor);

         // ID del valor del campo
        $('#'+id_campo).attr("LTValue",guid_valor);
     
         }

     // Oculto la fila de la tabla que contiene el campo
    $('#'+id_campo).parent().parent().parent().parent().parent().parent().css("display","none");

}

function workflow_url_param ( name ){  
 name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); 
 var regexS = "[\\?&]"+name+"=([^&#]*)"; 
 var regex = new RegExp( regexS ); 
 var results = regex.exec( window.location.href ); 
 if( results == null ) 
   return "";
  else 
   return results[1];
}

</script>

Opción 2

Una segunda opción que he probado y me ha dado buenos (mejores) resultados consiste en buscar el atributo title en lugar del id. Los cambios con:

En el archivo de constantes:


STAGE_ID = "Stage";


En la CEWP:


$('input[title="'+id_campo+'"]').attr("value",texto_valor);
$('input[title="'+id_campo+'"]').attr("LTValue",guid_valor);
$('input[title="'+id_campo+'"]').parent().parent().parent().parent().parent().parent().css("display","none");


Conclusión

Esta ha sido una forma de resolver el inconveniente de los valores predeterminados en las PDPs de flujos de trabajo en Project Server 2010, utilizando código de cliente JavaScript. Espero les haya resultado útil.

domingo, 18 de noviembre de 2012

Galería de imágenes en SharePoint 2007 con jQuery

La necesidad de crear una galería de imágenes en SharePoint es bastante común. Estuve probando varias alternativas que encontré disponibles en la web y elegí una de Alexander Bautz por las siguientes razones:

  • Utiliza jQuery
  • Compatible con SharePoint 2007 y 2010
  • No requiere instalación del lado del servidor
  • He usado muchos componentes de Alexander y son muy robustos
  • Tienes varias opciones de configuración

Introducción

El componente y el artículo que lo explica lo pueden descargar desde este enlace, en donde encontrarán:

  • Una librería que contiene el código principal que no necesitan modificar, exceptuando que quieran cambiar algo respecto al idioma (los botones de navegación por ejemplo)
  • El código que deben insertar en la CEWP en donde desean ver la galería

El resultado es una galería como la siguiente:

IMG

Verán que tienen muchas opciones de configuración que a continuación transcribo:

  • listGuid: The GUID of the list you will pull information from – see below for instructions getting this GUID
  • listBaseUrl: The base URL (site URL, not list URL) of the site containing the list to pull from
  • listViewGuid: The GUID of the view you will pull information from – see below for instructions getting this GUID
  • viewFields: An array of all the fields you want to include – using FieldInternalName
  • viewFieldsStyle: An array that corresponds with the above array. Used to set an individual CSS style of the value
  • imageMax: Object literal with the parameters “height” and “width”. This represents the max-height OR the max-width of images that are either pulled from a picture library, or from a hyperlink field configured as “Image”. This does NOT apply to images embedded in a rich text field. Use only one parameter at the time to keep the image aspect ratio. The one not specified should have the value null
  • containerID: A unique ID (unique in the current page) for the slideshow container.
  • containerHeight: Height in pixles
  • containerWidth: Width in pixles
  • containerBorderStyle: CSS style for the border of the container
  • containerBgColor: Background color of the container
  • containerBgImg: Background image to use for the container
  • inDir: The direction to scroll in the content (n,nv,ne,s,sv,se,v,e)
  • outDir: The direction to scroll out the content (n,nv,ne,s,sv,se,v,e or fade)
  • displayTime: How long to display each slide – in milliseconds
  • slideTime: The slide time – in milliseconds
  • readMoreLink: true or false
  • readMoreText: If the above parameter is true – the text or image to click to go to DispForm for the specific item
  • addNewLink: true or false
  • addNewText: If the above parameter is true – the text or image to click to add a new item to the list
  • emptyCaution: If the list view contains no items – this is the text displayed in the first (and only) slide


Simplificación

Aún a costa de perder algunas opciones de configuración, me he tomado el atrevimiento de hacer una función que llame a este componente para que sea más fácil de utilizar por usuarios finales. La función también “embellece” un poco los estilos.

La función armada es la siguiente:

function galeria ( guid_lista, guid_vista, url_sitio, foto_ancho, foto_alto, id_contenedor) {

    var myScrSettings = {'listGuid':guid_lista,
    'listBaseUrl':url_sitio,
    'listViewGuid':guid_vista,
    'viewFields':[],   
    'viewFieldsStyle':['padding:5px;font-size:16px','padding:5px;font-style:italic','text-align:center'],
    'imageMax':{height:foto_alto,width:null},
    'containerID':id_contenedor,
    'containerHeight':foto_alto,
    'containerWidth':foto_ancho,
    'containerBorderStyle':'border:1px solid #aaaaaa; padding: 5px; background-color: #F9F9F9',
    'containerBgColor':'#F7F7F7',
    'containerBgImg':'',
    'inDir':'e',
    'outDir':'v',
    'displayTime':3000,
    'slideTime':1500,
    'readMoreLink':false,
    'readMoreText':"<img title='Go to item' src='/_layouts/images/magnify.gif' border='0'>",
    'addNewLink':false,
    'addNewText':"<img title='Add new item' src='/_layouts/images/newitem.gif' border='0'>",
    'emptyCaution':"<div style='height:100%;width:100%;padding-top:140px;text-align:center'>No existen imágenes para mostrar..."};
   
    init_fillScrollableDiv(myScrSettings);

}

Forma de uso

Los dos pasos para utilizar el componente son:

1. Insertar una CEWP (elemento web de edición de contenido)

image

image

2. Con el botón “Editor de Código Fuente” agregar el siguiente código

image

<script type="text/javascript" src="/sites/Intranet/Internal/SlideshowForSharePoint.js"></script>

<script type="text/javascript" src="/sites/Intranet/Internal/Generales.js"></script>

<script type="text/javascript">       
   galeria ('6DF5C04A-A196-4F9C-9521-66F3F2363D53', '250AA0DC-9E04-49DB-A112-23D403B8C0C9', '/sites/Intranet', 690, 509, 'gale1');
</script>

Importante: la función galería recibe 6 parámetros que se deben completar:

  1. ID de la lista (nuestra librería de imágenes)
  2. ID de la vista (la vista que muestra las imágenes)
  3. URL del sitio: la url del sitio, no de la lista
  4. El ancho de las imágenes
  5. El alto de las imágenes
  6. Un identificador para el componente (se puede poner siempre el mismo, salvo en los casos que necesitemos poner dos visores en la misma página, se explica más abajo)

¿Cómo se obtienen los datos para los tres primeros parámetros?

La forma más simple de hacerlo es ir a la vista de las imágenes que se quiere mostrar en SharePoint y con el botón derecho del mouse usar la opción “Ver código Fuente” (View Source) de Internet Explorer.

Una vez dentro del código fuente, buscar el texto “ctx.listName”. Aparecerá algo así:

ctx.listName = "{5452F855-04AD-4D66-8D82-023985BE89AD}";

Lo resaltado en rojo, es el GUID de la lista y constituye el primer parámetro

Luego buscamos “ctx.view” y aparecerá:

ctx.view = "{44C717B1-5027-4D34-8B12-3C596CAFE533}";

Lo que está en rojo es el segundo parámetro.

Finalmente buscamos “L_Menu_BaseUrl” y aparecerá algo así:

var L_Menu_BaseUrl="/sites/blablabla";

Lo resaltado en rojo es el tercer parámetro.

¿Cómo agregar más de una galería en la misma página?

Cambian dos cosas en la segunda galería:

  • No se requieren incluir las referencias a las librerías
  • Hay que cambiar el valor del último parámetro

Por ejemplo algo así:

<script type="text/javascript">
galeria ('6DF5C04A-A196-4F9C-9521-66F3F2363D53', '250AA0DC-9E04-49DB-A112-23D403B8C0C9', '/sites/Intranet', 690, 509, 'gale2');
</script>

 

Más información

Alexander publicó el artículo también en este enlace. Les puede ser útil especialmente por los comentarios con las dudas.

Eso es todo por hoy, cualquier duda sólo me consultan. Hasta la próxima!

viernes, 10 de agosto de 2012

Ajustar ancho de columnas de SharePoint 2007 con jQuery

Probablemente se hayan encontrado con situaciones en donde las vistas estándar de listas de SharePoint no ajusten las columnas de la forma más adecuada a nuestras necesidades. A continuación les dejo un script en jQuery que permite ensanchar una columna en particular.

A tener en cuenta:
  • El script asume que la vista de la lista está en el elemento web con id "WebPartWPQ4"
  • Asume que la clase utilizada para el estilo de la vista es ".ms-summarystandardbody"
  • Asume que la columna a ensanchar es la 3 y que un 60% es aceptable
Pueden ajustar estos valores según sus necesidades o incluso crear una función más genérica.

Código jQuery:

function ajustar_estilo () {

    // Header
    $('#WebPartWPQ4 .ms-summarystandardbody .ms-viewheadertr th:eq(2)').css("width","60%"); 

    // Filas
      $('#WebPartWPQ4 .ms-summarystandardbody tbody > tr').each(function(index) {
        $(this).children("td").each(function(index2) {
            if (index2 == 2)  { 
                $(this).css("width","60%"); 
                }
               });
           });
}

Código a ser insertado en una CEWP:

<script type="text/javascript" src="/Internal/jquery142min.js"></script>
<script type="text/javascript" src="/Internal/ajustar_estilo.js"></script>

<script type="text/javascript">
 ajustar_estilo ();
</script>

Espero les resulte útil. Hasta la próxima!

jueves, 19 de julio de 2012

Muro de fotos en SharePoint 2007

Imaginemos que tenemos una lista en SharePoint con un campo de tipo persona que muestra la imagen del usuario. Una vista estándar de lista de SharePoint nos mostraría una foto en cada renglón. ¿Pero cómo podríamos hacer para mostrar las fotos como en un muro, una al lado de la otra? Algo así:

image

Seguramente hay muchas formas de resolverlo con SharePoint Designer por ejemplo. Sin embargo, aquí vamos a mostrar una opción con jQuery y una CEWP. Espero les resulte interesante:

/*

Este script convierte una vista con estilo tabla basica con un sólo campo de usuario (con foto) en un muro de fotos

*/
function fotos () {

    // alert ('Controlo si hay fotos para mostrar');

    var hay_fotos = true;

    // Verifico si hay elementos a mostrar
    $("td:contains('No hay elementos que mostrar en esta vista de la'):last").each(function(index) {
        hay_fotos = false;
        });

    // Oculto la vista y el tìtulo de la vista
    document.writeln("<style> .ms-listviewtable {display: none;} .ms-listdescription {display: none;} </style>");

    // Si hay elementos, aplico formato
    if ( hay_fotos ) {

        // alert ('Busco las fotos');

        // Obtengo fotos de la lista
        var fotos = new Array();
        z = 0;
        $('.ms-listviewtable > tbody > tr > td > table > tbody > tr > td > a > img').each(function(index) {
            //alert ($(this).attr("src"));
            if ( !( $(this).attr("src") == '/_layouts/images/person.gif') ) {
                // Sólo tomo aquellos que usuarios que tengan foto
                fotos[z] = '<img OnError=\"foto_error()\" class=\"fotomuro\" src=\"' + $(this).attr("src") + '\" title=\"' + $(this).attr("alt").substring(8) + '\"></img>';
                z = z +1;
                }
            });

        // alert ('Armo el muro');

        // Armo el muro de fotos
        document.writeln ('<p class=\"muro\" >');
        document.writeln ('<div>¿Tu foto no está? <a title=\"\" href=\"/sites/Intranet/_layouts/MySite.aspx\" target=_blank>Subí tu foto</A></div></BR>');
        //for (i = 0; i < 5; i++) {
        for (i = 0; i < fotos.length; i++) {
            document.writeln (fotos[i]);
        }

        document.writeln ('</p></BR></BR>');

        // Un poco de estilo a las fotos
        document.writeln("<style> .muro {} .fotomuro { width:62px; height:62px; } </style>");
    }
}

function foto_error() {
    window.event.srcElement.style.display = "none";
}

El código de la CEWP sería:

<script type="text/javascript"
src="/sites/Intranet/Internal/jquery142min.js"></script>

<script type="text/javascript"
src="/sites/Intranet/Internal/fotos.js"></script>

<script type="text/javascript">

fotos();

</script>

Hasta el próximo truco jQuery! Nos vemos…

lunes, 13 de febrero de 2012

Obtener datos de perfil de usuario con #JavaScript en #SharePoint

Desde el blog de SharePoint Java Scripts nos muestran una utilidad para obtener datos de perfil de usuario como: ID, Name, Title, EMail, Department, JobTitle, Notes, Picture, IsSiteAdmin, Created, Author, Modified, Editor, SipAddress.

Como siempre, se trata de una combinación de CEWP con jQuery. Espero les resulte útil. Pueden obtener el código desde este artículo: http://sharepointjavascript.wordpress.com/2011/09/18/accessing-user-profile-information-in-sharepoint-with-javascript-updated-version/.

Saludos!

viernes, 20 de enero de 2012

Pantallas dinámicas en #Sharepoint

¿Qué pasaría si las pantallas de alta y modificación de listas pudieran variar la obligatoriedad o visibilidad de sus campos de acuerdo a una condición?


Pues esto es lo que propone Alexander en su blog. Les dejo el enlace:
http://sharepointjavascript.wordpress.com/2012/01/19/dynamic-forms-for-sharepoint/

Qué lo disfruten!

jueves, 19 de enero de 2012

Visualizar #PDF y #PPT en #SharePoint 2010

Imaginemos que necesitamos visualizar en nuestro browser documentos con formato PDF. O que necesitamos visualizar presentaciones Power Point y no disponemos de las Office Web Applications. A continuación les dejo un método sencillo para resolver este requerimiento:

1) Convertir el documento

En caso que se trate de una presentación PowrPoint, la salvamos como PDF y la subimos a una librería de SharePoint

2) Creamos una página con una CEWP

Creamos una página de elementos web y agregamos una CEWP (Content Editor Web Part) que apunte a un archivo en donde podamos almacenar nuestro código.

3) Insertamos un código cómo el siguiente en la CEWP

<object data='/SP/Help/Help/SP.pdf#pagemode=thumbs&navpanes=1'
        type='application/pdf'
        width='960px'
        height='560px'>

<p>It appears your Web browser is not configured to display PDF files.
No worries, just <a href='/SP/Help/Help/SP.pdf'>click here to download the PDF file.</a></p>

</object>

En este caso, además de visualizar el PDF, veremos un índice con las miniaturas y una barra de herramientas, tal como muestra la siguiente imagen:

image

4) Información adicional

A continuación les dejo algunos enlaces de interés para ampliar el tema:

Para que funcione, deben tener activado el complemento “Adobe PDF Reader” en Internet Explorer.

image

Espero les resulte útil!

jueves, 8 de diciembre de 2011

HTML en una columna dentro de una vista de #SharePoint con #JavaScript o #jQuery

Hace unos días preguntaban en un foro cómo agregar HTML dentro de una columna para generar cierto comportamiento en una vista. Hay varias soluciones y creo que dependen un poco del objetivo que se persiga.

Mi primera recomendación es el método mediante el cual se escribe el código HTML en una columna calculada y luego de hace el render mediante JavaScript o jQuery. Se usó mucho durante un tiempo, creo que por su facilidad de implementación y su potencial. La famosa HTML calculated column. Acá los enlaces:

http://blog.pathtosharepoint.com/2008/09/01/using-calculated-columns-to-write-html/

http://www.pathtosharepoint.com/HTMLcc/default.aspx

https://www.nothingbutsharepoint.com/sites/eusp/Pages/jquery-for-everyone-html-calculated-column-plugin.aspx

Si queremos profundizar un poco más, otras soluciones que no necesitan ser instaladas en el servidor pueden implementarse con jQuery o Client Object  Model. Un script muy básico de jQuery que se puede usar para tomar de base y luego hacerlo todo lo complejo que necesitemos se encuentra en: http://www.sharepointkings.com/2010/04/sharepoint-custom-so-called-kpi.html

Client Object Model es quizá lo más potente. Sólo funciona en SharePoint 2010. Acá les dejo una introducción: http://surpoint.blogspot.com/2011/10/introduccion-al-modelo-de-objetos-de.html

Espero que les sea útil. Pueden ver la discusión en el foro en este enlace: http://social.msdn.microsoft.com/Forums/es-ES/mossdeves/thread/42671890-3f5c-49ee-b432-17282c1e3e5a/ (Html en una custom list)

Hasta la próxima!

miércoles, 23 de noviembre de 2011

Colores en estados de vistas de SharePoint

Otra pregunta que suele aparecer en los foros es cómo manejar un color o un gráfico que indique el estado de los elementos en una vista de lista. Mi sugerencia en estos casos es utilizar lo propuesto en el blog de SharePoint Kings: http://www.sharepointkings.com/2010/04/sharepoint-custom-so-called-kpi.html

Es fácil de implementar con una CEWP y un poco de jQuery.

Aquí pueden encontrar la consulta en el foro: http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/38a64c42-e9b4-457e-9fe1-51c42e1fcf2e/ (police field values(the color))

Espero les sea  útil :-)

miércoles, 16 de noviembre de 2011

Crear un ítem y redireccionar a la pantalla del ítem creado

Una pregunta bastante común en los foros es si es posible que luego de crear un ítem en una lista, SharePoint nos redireccione en forma automática a la pantalla DispForm o EditForm del ítem creado.

Si bien este no es el comportamiento estándar de SharePoint, otra ves Alexander Bautz (http://sharepointjavascript.wordpress.com) nos propone una solución que a continuación resumo:

  • Agregar una CEWP en NewForm para realizar el direccionamiento a la pantalla DispForm o EditForm.
  • Agregar una CEWP en la página DispForm que sólo se ejecuta cuando el ID es 0. Lo que hace es buscar el último elemento creado por el usuario y enviarnos a la pantalla correspondiente.

Un enfoque muy interesante que pueden descargar desde el blog del autor en http://sharepointjavascript.wordpress.com/2011/04/23/redirect-from-newform-to-dispform-or-editform/.

Espero les sea útil. Hasta la próxima!

Establecer o leer valores en las pantallas estándar de SharePoint

Una de las problemáticas más comunes que interesan resolver en SharePoint es cómo establecer u obtener un valor en las pantallas estándar de SharePoint sin romperlas. Nos referimos a estas pantallas:

  • NewForm
  • EditForm
  • DispForm

Existen algunos enfoques para realizar esto utilizando código JavaScript. Uno de los más nombrados es aquel sobre el que escribimos hace mucho en este artículo: http://surpoint.blogspot.com/2010/04/preseleccionar-u-ocultar-valores-en-las.html (data del año 2007).

Existe otro enfoque, que aún no he tenido tiempo de probar, pero que está desarrollado por Alexander Bautz (http://sharepointjavascript.wordpress.com), un astro de JavaScript, jQuery y SharePoint desde mi humilde punto de vista.

El enfoque que propone Alexander es muy interesante especialmente por las opciones que utilizan sus funciones:

  • getFieldValue
  • setFieldValue

image

image

Los invito a leer el artículo y probar esta herramienta que pueden encontrar en:

http://sharepointjavascript.wordpress.com/2010/05/28/get-or-set-value-for-sharepoint-field-in-newform-editform-and-dispform-get-only-in-dispform/

Espero que les sea útil. Hasta la próxima!

lunes, 4 de julio de 2011

Ocultar o modificar el ancho de la columna de la derecha sin SharePoint Designer

A veces necesitamos ocultar o cambiar el ancho de una columna en la página principal de un sitio en SharePoint y no deseamos utilizar SharePoint Designer u hojas de estilos.

Existe una opción sencilla con una CEWP que ha sido publicada en el blog de Mike Smith. A continuación transcribo el código:

<script>

function ReformatWebPartZone()

{

  var x = document.getElementsByTagName("TD")
  var i=0;
  for (i=0;i<x.length;i++)
    {
      if (x[i].width=="30%")
        {
          x[i].style.width="50%";
        }
      if (x[i].width=="70%")
        {
          x[i].style.width="50%";
        }
  }

}

_spBodyOnLoadFunctionNames.push("ReformatWebPartZone")

</script>

Les recomiendo que lean el artículo completo original, ya que ofrece otras variantes que son interesantes de tener en cuenta: http://techtrainingnotes.blogspot.com/2008/11/sharepoint-how-to-hide-right-web-part.html.

Hasta la próxima!

viernes, 25 de febrero de 2011

Tabs for SharePoint Forms v2

Alexander Bautz publicó una nueva versión de su solución para agrupar columnas de SharePoint en solapas (muy útil). Habíamos hablado sobre las anteriores en el artículo "Embellecimiento" de los formularios de SharePoint.

Les dejo el enlace de esta nueva versión y una imagen para que vean de que se trata.

Qué les sea útil!

https://www.nothingbutsharepoint.com/sites/eusp/Pages/Tabs-for-SharePoint-forms.aspx

2011-01-17-TabsForSPForms-01.png

martes, 8 de febrero de 2011

Inline editing for SharePoint 2007

Desde el blog SharePoint JavaScripts nos llega nuevamente una pieza de código que combina jQuery y CEWP para lograr excelentes resultados, en este caso la edición en línea de listas en SharePoint 2007.

¿Una imagen vale más que mil palabras no?

image

Gracias Alexander Bautz por este nuevo aporte a la comunidad. Pueden leer el artículo completo y descargar el código desde: http://sharepointjavascript.wordpress.com/2011/02/08/inline-editing-for-sharepoint-2007/.

Que lo disfruten!

martes, 4 de enero de 2011

Comparación visual de dos formularios InfoPath

Hace poco un cliente nos planteó un requerimiento en el que deseaba hacer una comparación visual de dos formularios InfoPath en una página web en Office SharePoint Server 2007. La implementación debía llevarse a cabo sin instalar código de servidor.

Para resolver el pedido, creamos una página con las siguientes características:

  1. Una lista que permite seleccionar los documentos a comparar
  2. Dos IFRAMES en donde se muestran los formularios InfoPath
  3. Un conjunto de acciones que permiten:
    • Maximizar el espacio de trabajo para la comparación visual
    • Ver los documentos don distintas opciones de zoom (100%, 75% y 50%)
    • Borrar los filtros que el usuario pudo haber aplicado en la lista de selección

El resultado es una pantalla como la siguiente:

image

Pero, ¿cómo fue la implementación? …

 

Los IFRAMES

Lo primero es crear los IFRAMES en donde se muestran los documentos INFOPATH. Eso puede hacerse con una breve instrucción en JavaScript:

function crear_iframe(id_iframe) {

  document.write("<iframe id=" + id_iframe + " name='" + id_iframe +

  " 'width=100% height='530' frameborder='0'><p>Your browser does not

  support iframes.</p></iframe>");

}

La carga de los IFRAMES

El segundo paso es la creación de los botones que permitan al usuario cargar los IFRAMES con los documentos InfoPath:

image

Estos botones contienen un hipervínculo como el siguiente que hace posible la carga de los IFRAMES:

<DIV><A HREF='' onClick='javascript:document.all.IFrameUno.src="/Evaluaciones%20de%20Desempeo/Sebastian Torres - 2009.xml?OpenIn=Browser";return false;'><IMG SRC='\_layouts\Images\icongo02rtl.gif' TITLE='Agregar a la izquierda' BORDER='0'></A></DIV>

El hipervínculo no hace más que apuntar al documento XML que se desea mostrar. Es importante la utilización del parámetro OpenIn=Browser, caso contrario intentará abrir el documento en la herramienta cliente de InfoPath.

Para crear los botones sin utilizar código en el servidor, podemos utilizar la excelente funcionalidad de HTML Calculated Column creada por Christopher en su blog Path to SharePoint, que utiliza JavaScript para convertir una columna que tiene texto HTML en HTML “real”.

Para ello necesitamos crear dos campos calculados con esta fórmula:

=CONCATENATE("<DIV><A HREF='' onClick='javascript:document.all.IFrameUno.src=";CHAR(34);"/Evaluaciones%20de%20Desempeo/";Título;"?OpenIn=Browser";CHAR(34);";return false;'><IMG SRC='\_layouts\Images\icongo02rtl.gif' TITLE='Agregar a la izquierda' BORDER='0'></A></DIV>")

La función CHAR nos permite agregar un carácter especial, en este caso las comillas dobles. La columna Título es la que contiene el nombre del archivo XML.

Una vez creada las dos columnas calculadas para cargar los IFRAMES, sólo resta agregar el código de Christopher para convertir en texto en HTML.

 

Pantalla completa y zoom

La opción de pantalla completa lo que en realidad hace es agrandar el espacio de trabajo para que el usuario puede ver con mayor amplitud los documentos. Para ello se puede utilizar jQuery para modificar los estilos y ocultar algunas zonas. jQuery nos proporciona además algunos efectos “lindos” con la función hide.

imagefunction pantalla_completa() {
  $('.ms-pagetitleareaframe').hide("slow");
  $('#MSOZoneCell_WebPartWPQ3').hide("slow");
  $('#onetIdTopNavBarContainer').hide("slow");
  $('.ms-globalbreadcrumb').hide("slow");
  $('#boton_completa').hide("slow");
  $('#boton_normal').show("slow");
}

Para la opción de zoom podemos utilizar las bondades del IFRAME, que nos permite modificar el zoom con el cual estamos visualizando la página dentro del IFRAME:

imagefunction zoom75 () {
  $('#IFrameUno').attr('style', 'zoom:75%');
  $('#IFrameDos').attr('style', 'zoom:75%');
  $('#IFrameUno').attr('height','720');
  $('#IFrameDos').attr('height','720');
}

Por último, el borrado de filtros, es un simple link a la página sin los parámetros que SharePoint agrega en el momento de aplicar un filtro:

document.write("<a href='/internal/compare.aspx'><img src='/_layouts/Images/filteroff.gif' border='0' title='Borrar filtros'></a>");

Fin

Eso es todo por hoy amigos, si bien es un caso muy particular de requerimiento, me pareció importante compartirlo. Nunca se sabe si hay alguien del otro lado del mundo tratando de hacer lo mismo.

Hasta la próxima y no duden en comentar y sugerir mejoras.

lunes, 6 de diciembre de 2010

Encuestas en SharePoint 2007 con jQuery y CEWP

Estuve leyendo un interesante artículo de Alexander de su blog http://sharepointjavascript.wordpress.com en donde nos muestra como armar una encuesta simple y un resultado gráfico en colores con gráfico de barra, columna o torta.

Esta funcionalidad trabaja con una lista customizada, código jQuery, elementos web de edición de contenido (CEWP) y Google charts tools.

Lo interesante es que no necesita instalación en el servidor. Pueden ver en las imágenes adjuntas cómo se visualiza la encuesta. Cool!

El código completo lo pueden descargar desde el artículo original en http://sharepointjavascript.wordpress.com/2010/11/23/poll-for-sharepoint/.

image

Que les sea útil!

miércoles, 27 de octubre de 2010

Edición de propiedades de listas y cross site lookup

Recientemente en el blog SharePoint JavaScripts han actualizado esta interesante herramienta que nos permite desde modificar propiedades de las columnas de listas hasta crear un campo lookup con listas de otros sitios. Muy interesante en verdad. Transcribo sus principales funcionalidades y les recomiendo acceder al post original para bajar el código: http://sharepointjavascript.wordpress.com/2010/03/30/edit-sharepoint-field-properties-including-lookup-column-list-association-with-client-side-code-only/.

Ahh, me olvidaba, sólo JavaScriot, jQuery y CEWP!

List properties:

  • Hidden: Hide the list so that it does not appear on the Documents and Lists page, Quick Launch bar, Modify Site Content page, or Add Column page as an option for lookup fields.
  • ShowUser: Specify that names of users are shown in “Created by” and “Modified by” fields.
  • Ordered: Specify that the option to allow users to reorder items in the list is available on the Edit View page for the list.
  • Direction: LTR if the reading order is left-to-right, RTL if it is right-to-left.

Field properties:

  • Hidden: Specifies whether the field is displayed in the list.
  • ReadOnly: Specifies whether values in the field can be modified.
  • Required: Determines whether the field requires values.
  • Show In NewForm: Specifies whether the field is displayed in the form that is used to create list items.
  • Show In DispForm: Specifies whether the field is displayed in the form for displaying list items.
  • Show In EditForm: Specifies whether the field is displayed in the form that is used to edit list items.
  • Show In DIP: Specifies whether the field is displayed in the “Document Information Panel” in compatible Microsoft Office applications. Only available for document libraries.
  • Show In List Settings: Specifies whether the field is displayed in the page for customizing list settings.
  • Show In Version History: Specifies whether the field is displayed in the page for viewing list item versions.
  • Show In View Forms: Specifies whether the field is displayed in pages that are used to view list data.
  • Lookup column web and list association (cross site lookup): Change the web and list association for a lookup column – Note: If you do this, all existing elements in this column will be lost. The cross site option is only available for site collection administrators!

image

Que lo disfruten!

viernes, 8 de octubre de 2010

Mostrando tus seguidores y amigos de Twitter en SharePoint

Nuevamente SharePoint Kings nos deja unas breves líneas de código pata hacer cosas interesantes, en este caso mostrar tus seguidores y amigos de Twitter.

Una CEWP y jQuery, a esta altura una de las parejas mas taquilleras del mundo SharePoint.

El resultado:

image

Si les ha resultado interesante, pueden obtener el código desde aquí:

http://www.sharepointkings.com/2010/10/showing-twitter-followers-and-friends.html