Thursday, October 9, 2008

URL en Títulos de Web Parts

Situación
El título de una web part contiene por default una URL. Cuando se trata de una "List View" web part, ese default lleva al usuario a ver la lista directamente, cosa que como diseñadores tal vez queremos evitar. El problema es que cuando intentamos borrar esa URL editando las propiedades de la Web Part/Appearance, SharePoint vuelve a poner el default cuando salimos del modo edición (un bug quizás?).

Solución
En lugar de intentar dejar vacía la URL, pegamos la URL de la página en la cual está la Web Part, con lo cual el efecto de que el usuario clickee sobre el título será simplemente un refresh de la página completa.



Friday, October 3, 2008

Visualización de Fechas

Situación
Cuando usamos la fecha de creación de un item en una lista, columna [Created], el formato standard que provee SharePoint incluye la fecha completa y la hora. No muy práctico para usar en vistas.

Solución
Agregando a la lista una columna calculada, con la fórmula =TEXT([Created],"mmmm-dd-yyyy") podemos convertir a un formato de fecha más amigable, que luego utilizamos en las vistas necesarias.



Thursday, October 2, 2008

Columnas dependientes en listas

Situación
En ocasiones necesitamos que el valor de una columna en una lista se derive del valor que el usuario registra en otra. Por ejemplo, si el usuario registra [Ciudad] el [Código Postal] debiera completarse automáticamente. Hay en Internet algunos artículos con títulos como "Cascaded Lookups" usando JavaScript, SharePoint Designer y otras customizaciones, pero en un ejemplo como el citado pueden resultar demasiado complejos

Solución
Si usamos una columna con el formato [Ciudad_CódigoPostal], que será la que se use en los forms, podemos luego separar ambas partes en otras dos columnas calculadas, que podremos utilizar en las vistas que deseemos crear. Las fórmulas para estas columnas serían:



[Ciudad] = LEFT([Ciudad_CódigoPostal];SEARCH("_";[Ciudad_CódigoPostal];1)-1)
[Código Postal] = MID([Ciudad_CódigoPostal];SEARCH("_";[Ciudad_CódigoPostal]+1;99)

Sunday, September 28, 2008

Validación de fechas en Forms

Situación
En un form de inserción de items en una lista, necesitamos validar que dos columnas con fechas sean correctamente ingresadas por el usuario (por ejemplo que EndDate no sea menor que StartDate).

Solución
Inspirado en las soluciones propuestas por Res Cogitans y por Autosponge y agregando una Content Editor Web Part oculta en la página NewForm.aspx (mediante el truco de agregar &ToolPaneView=2 al final de la URL)*, introducimos el siguiente código JavaScript:

<script type="text/javascript">
function PreSaveAction()
{

var date1 = getTagFromIdentifierAndTitle("INPUT","DateTimeFieldDate","StartDate");
var date2 = getTagFromIdentifierAndTitle("INPUT","DateTimeFieldDate","EndDate");
var arrDate1 = date1.value.split("/");
var useDate1 = new Date(arrDate1[2], arrDate1[1]-1, arrDate1[0]);
var arrDate2 = date2.value.split("/");
var useDate2 = new Date(arrDate2[2], arrDate2[1]-1, arrDate2[0]);
if(useDate1 > useDate2)
{

alert("La fecha EndDate no puede ser menor que StartDate");
return false; // Cancel the item save process
}

return true; // OK to proceed with the save item
}

function getTagFromIdentifierAndTitle(tagName, identifier, title)
{
var len = identifier.length;
var tags = document.getElementsByTagName(tagName);
for (var i=0; i < tags.length; i++)
{
var tempString = tags[i].id;
if (tags[i].title == title && (identifier == "" || tempString.indexOf(identifier) == tempString.length - len))
{
return tags[i];
}
}
return null;
}
</script>



Variante que valida que se registre una fecha futura y correspondiente a un dìa de la semana determinado, lunes en el ejemplo, dado que la función getDay() devuelve 1 para lunes, 2 para martes, ...:


<script type="text/javascript">
function PreSaveAction()
{
var date1 = getTagFromIdentifierAndTitle("INPUT","DateTimeFieldDate","StartDate");
var arrDate1 = date1.value.split("/");
var useDate1 = new Date(arrDate1[2], arrDate1[1]-1, arrDate1[0]);
var today = new Date();
var DiaSemana =useDate1.getDay();
if(DiaSemana != 1 || useDate1 < today)
{

alert("La fecha de inicio debe ser un Lunes futuro" + DiaSemana);
return false; // Cancel the item save process
}

return true; // OK to proceed with the save item
}

function getTagFromIdentifierAndTitle(tagName, identifier, title)
{
var len = identifier.length;
var tags = document.getElementsByTagName(tagName);
for (var i=0; i < tags.length; i++)
{
var tempString = tags[i].id;
if (tags[i].title == title && (identifier == "" || tempString.indexOf(identifier) == tempString.length - len))
{
return tags[i];
}
}
return null;
}
</script>


* El truco que menciono es el siguiente: clickear "New Item" sobre la lista con la cual se está trabajando. Sobre el final de la URL que muestra el browser, agregar &ToolPaneView=2... Magia! aparece la posibilidad de agregar web parts a la página!

Saturday, September 27, 2008

Crear Permisos de acceso customizados

Situación
Cuando se necesita que determinado grupo de usuarios pueda agregar documentos a una biblioteca o items a una lista, pero no que pueda editarlos o borrarlos. En otras palabras, los permisos standard que provee el sistema son en algún caso o muy restrictivos ("Read Only") o habilitan más cosas que las necesarias.

Solución
Se pueden definir "Niveles de Permisos" customizados y luego asignar uno de estos niveles a los grupo de usuarios que se necesite.
Tomando como ejemplo una lista a la cual queremos que un grupo pueda agregar items, debemos proceder del siguiente modo:

1) En Home/ Site Settings/ Permissions/ Permision Levels se puede seleccionar Edit Permission Level o New Permission level se define por ejemplo un nivel "AddToList" y se le asignan las opciones de Add items y Read items.

2) Una vez creado este nivel de permisos, se le asigna al grupo en el cual estamos interesados, ingresando en Home/ Site Settings/ People and Groups

3) Por último, en la lista a la cual queremos que ese grupo acceda, en List Settings/ List Permissions, agregamos el grupo, cuyos derechos aparecerán automáticamente asignados.

Tuesday, September 23, 2008

Menú de navegación con íconos y texto

Situación
Deseamos crear un menú de navegación con íconos "subtitulados".

Solución
La Content Editor Web Part nos habilita esta posibilidad. Se debe insertar una tabla HTML (se puede hacer usando el Rich Text Editor) que es la que contendrá un ícono y su respectivo texto en cada celda.

Para lograr el efecto de pasar el mouse sobre el ícono se resalte el texto bajo el mismo, el código dentro de cada celda de la tabla debe tener el siguiente formato:

_____________________________________________________________________________________

<TD width=150 height=121>
<STRONG>
<A title="" href="http://MyPagePath.aspx" target="">
<P align=center>
<IMG style="BORDER-RIGHT: 0px solid; BORDER-TOP: 0px solid; BORDER-LEFT: 0 px solid; WIDTH: 50px; BORDER-BOTTOM: 0px solid" src="http://MyImagePath.jpg" border=0>
</P>
<P align=center><STRONG>MYTITLE</STRONG></P>
</A>
<P align=center></STRONG>&nbsp;</P>
</TD>

____________________________________________________________________________________

Wednesday, September 17, 2008

SharePoint en Windows Vista!!!

Luego de trabajar algunas largas horas durante las noches, estudiando las distintas formas de instalar un ambiente de desarrollo para SharePoint en una PC, me decidí y logré instalar Windows SharePoint Services 3.0 en una laptop, con Windows Vista Business. Al momento no he avanzado mucho más en el uso del ambiente, pero la performance parece más que buena. Eso sí: obviamente Microsoft no soporta este tipo de instalaciones...

Para quien quiera intentarlo, transcribo los principales artículos y software en los que me basé:

Bamboo Solutions:

How to install Windows SharePoint Services 3.0 ...

(conviene leer atentamente todo el artículo antes de empezar a instalar, comentarios incluídos. TIP: se menciona en el artículo que el SQL Server es opcional, pero probablemente se trata de un error, dado que el instructivo está armado para usarlo).

Tambien comviene pegarle una mirada al siguiente artículo relativo a cómo instalar y configurar el SQL Sever:

Instrucciones para instalar SQLServer 2008 Express

En este proceso tuve que superar un error de instalación con la ayuda de este artículo, entre otros.

La secuencia para instalar el software en el equipo es la siguiente:

1) .NET Framework 3.5
2) Windows Installer 4.5
3) SQL Server 2008 Express

En este punto, se debe tener el WSS 3.0 ya bajado a disco, pero no intentar su instalación sino a través del:
4) Setup Helper de Bamboo Solutions

Si hay interés, puliré esta entrada brindando más detalles.

Monday, September 15, 2008

Regresar a una página específica luego de acceder a un Form de edición

Situación
Cuando accedemos desde un hyperlink insertado en una CEWP (Content Editor Web Part) de una web page a un formulario de agregado o edición de items de una lista, cuando el usuario clickea sobre "OK" o "CANCEL", por default SharePoint retorna a la vista default de la lista. A veces queremos que el navegador regrese a la página desde la cual partimos.

Solución
Para modificar este comportamiento default, sobre el final de la URL correspondiente al formulario de edición insertada en el hiperlink, hay que agregar lo siguiente:

?Source=mi página

Ejemplo de sintaxis:

http://MiDominio/sites/MiSite/Lists/ListaDePrueba/NewForm.aspx?Source=http://MiDominio/sites/MiSite/PaginasDelSite/PaginaPrincipal.aspx

OJO: ARMAR EL URL CON NOTEPAD Y LUEGO USAR RICH TEXT EDITOR para editar el hiperlink. SE DEBE ELIMINAR LA SECCION ?RootFolder Y LA DIRECCION DE RETORNO DEFAULT que aparece en la URL de la pàgina del Form de ediciòn.

Monday, August 25, 2008

Tips varios sobre Listas SharePoint

muchos de estos son a partir del aprendizaje por prueba y error...

* Para definir "Content Types" basados en columnaas de una lista:
- Todas las columnas del "Content Type" deben ser "Site Columns", por lo que conviene primero planificar y definir éstas y luego armar el Content Type

* Para definir KPIs:
Las columnas sobre las cuales se pueden obtener los KPI DEBEN ESTAR PRESENTES EN LA VISTA DEFINIDA COMO DEFAULT. Los valores que se obtengan de la columna elegida se tomarán DESDE LA VISTA INCLUIDA EN LA DEFINICION DEL KPI, que no necesariamente serán los de la vista default.

* La flexibilidad para definir vistas en una lista puede marearnos: si la estructura de columnas no es lo suficientemente estable, los cambios que vamos introduciendo afectan las vistas que hayamos definido y generan retrabajo. Conviene postergar el armado de esas vistas hasta último momento.

* Para que una biblioteca de imágenes o documentos esté disponible en todo el Site Collection deben ser guardadas en las carpetas correspondientes, de lo contrario pueden no estar disponibles cuando se las necesita en algún sub-site.

Saturday, August 23, 2008

Mi encuentro con MOSS 2007

Hace aproximadamente 1 mes, decubrí casi por casualidad que se había instalado recientemente MOSS 2007 en la empresa en que trabajo, y logré solicitar una cuenta como administrador de sitios.
A poco de investigar el producto, percibí un enorme potencial para crear soluciones de negocio y en base a necesidades puntuales que se me plantearon, logré desarrollar mis primeros prototipos con resultados muy prometedores.

Trabajo en IT como consultor, y no soy experto en lenguajes de desarrollo de sistemas. No me resulta factible instalar customizaciones en el servidor y, al menos por ahora, tampoco cuento con herramientas como SharePoint Designer u otras.

Esto me ha generado un doble desafío:
- Necesito utilizar al máximo posible las funcionalidades standard.
- Estoy casi obligado a explorar "workarounds" cuando esas funcionalidades no bastan.

Precisamente alrededor de estas dos restricciones intenta girar el contenido de este sitio, como recopilación de información que he utilizado en mi aprendizaje. Lo que descubrí sobre SharePoint en este proceso es que hay muchas formas de solucionar un mismo problema. Personalmente lo veo fascinante porque ayuda a despertar y aplicar nuestra creatividad, casi siempre con excelentes resultados.
Espero que la información aquí presentada sea de alguna utilidad para el lector.

NOTA: muchos de los links o artículos referidos en este blog están en inglés, entre otras razones por que la versión del producto de que dispongo está en ese idioma.

Tutoriales, Tips, Artículos (recopilación)

Lista de tutoriales recomendados