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>

____________________________________________________________________________________