dsite.es
2Mar/1016

TinyTable v3 con jQuery Context Menu y Dialog UI

Introducción

Hace ya algún tiempo que en la Web de anieto2k encontré un interesante artículo sobre TinyTable v3.

TinyTable v3 es un script Javascript que agrega ordenación, búsqueda, promedios de columna y totales, paginación... en tablas HTML. Todo esto lo hace con tan sólo 7Kb!!

Partiendo de esta base y después de usar TinyTable en diferentes proyectos he visto la necesidad de extender sus funcionalidades, concretamente el uso de jQuery Context Menu y jQuery Dialog UI.

Librerías usadas

Listado de librerías usadas para este desarrollo:

  • JQuery 1.4.2
  • TinyTable v3
  • jQuery Context Menu
  • jQuery Dialog UI

Motor del sistema

Para poder controlar todas las acciones que intervienen en el Script programado he creado un "controller" para canalizarlas y así simplificar el código:

function Controller(action, el)
{
	//COLUMNA de TinyTable con el id principal
	var idColumn = 0;
	//COLUMNA de TinyTable con el nombre más destacado
	var nameColumn = 1;
	var ids = $(el).children('td').eq(idColumn).text();

	switch(action)
	{
		case "eliminarAction":
			alert("Eliminar "+$('#dialogTable #idEliminar').text());
			break;
		case "eliminar":
			$('#dialogTable').dialog('open');
			$('#dialogTable #nomEliminar').text($(el).children('td').eq(nameColumn).text());
			$('#dialogTable #idEliminar').text(ids);
			break;
		case "editar":
			alert("Eliminar fila: "+ids);
			break;
	}
}

Como queremos que el menú secundario aparezca en cada fila de la tabla, creamos un método para poder inicializar las propiedades de las fila "TR" al finalizar la carga de la página y al realizar una reordenación de la tabla.

function initFuncionsTaula()
{
//Iniciamos el menú secundario personalizado para las filas de la tabla
	$('#tableData tbody tr').contextMenu({
			menu: 'contextMenuElements',
			inSpeed: 10,
			outSpeed: 10
		},
		function(action, el, pos) {
			Controller(action, el)
		}
	);
//Permitimos que se pueda editar la fila con doble click de ratón.
	$('#tableData tbody tr').dblclick(
		function() {
			Controller('editar', this)
		}
	);
}

Modificaciones a Tiny Table v3

Tiny Table al ordenar y al hacer un reset en las filas, reescribe el contenido de ellas una vez ordenadas internamente, esto hace que las inicializaciones de initFunctionsTaula() no tengan efecto. Es por eso que he hecho unas pequeñas modificaciones a Tiny Table para que inicialice nuestros métodos cada vez que se cambia la estructura:

Fichero tinytable/script-new.js

[...]
TINY.table=function(){
	function sorter(n,t,p,r){this.n=n; this.id=t; this.p=p; if(r == undefined ) r = function(){}; this.r = r; if(this.p.init){this.init()}}
[...]

Ahora Tiny Table v3 tiene un cuarto parámetro que es una función que se llamará en sorter.prototype.reset y sorter.prototype.sort, como this.r().

Inicialización de Tiny Table y jQuery Dialog UI

Para finalizar nuestro código Javascrit para que todo funcione nos falta iniciar Tiny Table con el método initFunctionsTaula() y jQuery Dialog UI usando $(document).ready() de Jquery:

var sorter = null;
$(document).ready( function() {
	//INICIAR TINYTABLE
	sorter = new TINY.table.sorter('sorter','tableData',{
		headclass:'head',
		ascclass:'asc',
		descclass:'desc',
		evenclass:'evenrow',
		oddclass:'oddrow',
		evenselclass:'evenselected',
		oddselclass:'oddselected',
		paginate:true,
		size:10,
		colddid:'columns',
		currentid:'currentpage',
		totalid:'totalpages',
		startingrecid:'startrecord',
		endingrecid:'endrecord',
		totalrecid:'totalrecords',
		hoverid:'selectedrow',
		pageddid:'pagedropdown',
		navid:'tablenav',
		sortcolumn:1,
		sortdir:1,
		sum:[8],
		avg:[6,7,8,9],
		columns:[{index:7, format:'%', decimals:1},{index:8, format:'$', decimals:0}],
		init:true
		},
		function() {initFuncionsTaula()}
	);
	//INICIALIZAR EL MÓDULO DE DIALOGO
	$("#dialogTable").dialog({
		bgiframe: true,
		resizable: false,
		autoOpen: false,
		modal: true,
		overlay: {
			backgroundColor: '#000',
			opacity: 0.5
		},
		buttons: {
			'Cancelar': function() {
				$(this).dialog('close');
			},
			'Eliminar esta fila': function() {
				Controller('eliminarAction',this);
				$(this).dialog('close');
			}
		}
	});
});

Para el menú secundario ContextMenu será necesario algo como esto:


Y esto para el contenido del diálogo de eliminar:

 Está intentando eliminar la fila: ¿Está seguro que desea continuar?

Ejemplo y descarga

Aquí os dejo un ejemplo y el código para que lo podáis usar fácilmente.

Puedes ver un ejemplo aquí

Descargar código completo

  • Twitter
  • Facebook
  • Share/Bookmark
David Figueres Villaró

Acerca de David Figueres Villaró

Vilanova i la Geltrú, Barcelona
Comentarios (16) Trackbacks (1)
  1. Buen artículo! Gracias.

  2. buen articulo! ahora como hago para borrar la fila resaltada … gracias por el aporte

  3. buena ayuda, pero no se me podrian ayudar necesito seleccionar una fila al hacer clic con el mouse y obtener un dato o varios datos de la fila y dejarlo seleccionado y cuando seleccione otra fila hacer el mismo proceso del anterior y se desmarque y sobre las otras filas tenga la misma funcionalidad de tinytable me podrian decir donde puedo editar los archivos para hacer este proceso agradeceria mucho esta ayuda

  4. Hola Jorge, tengo una versión ampliada del código de este artículo que permite hacer lo que comentas. La semana que viene intentaré colgarlo y te aviso por email. Espero que puedas esperar hasta entonces.

    Saludos,

    David

  5. Hola David, cuando hago búsquedas con tiny table en un apellido con tilde, por ej. Villaró, si está cargado Villaro sin tilde no lo encuentra, hay forma de cambiarlo?

    Gracias!!!

  6. Hola Jorge, pues la verdad es que no lo he mirado. TinyTable esta desarrollado para el idioma ingles, que ya sabemos que lo tienen más fácil por el tema de los acentos. Puedo mirar que encuentro… pero no te aseguro nada.

    En cuando suba la próxima versión y comentaré como está el tema de los acentos.

  7. Hola david, estoy intentando utilizar tu version de tinytable con tablñas dinamicas generadas desde php y mysql, pero no logro iniciar el objeto, tienes alguna idea de por que pueda pasar?

  8. Hola de nuevo yo, ya logre resolver el problema, pero tengo una duda, si hago la tabla mas pequeña (720px), el menú contextual queda bastante desplazado a la derecha, como puedo evitarlo?

  9. Hola Daniel, me imagino que al aparecer de la posición del ratón a la derecha, el menú contextual puede salir de la pantalla o de la zona de la tabla. Voy a investigar cómo se puede controlar que salga hacia la derecha si queda fuera de la tabla… con esto bastaría?

  10. Si seria perfecto, yo sigo buscando alguan solucion pero todavia no doy una, gracias de antemano

  11. Hola Daniel, ya tengo la solución para lo que me pides.

    Debes modificar el fichero jquery.contextMenu.js y agregar estas líneas:

    var menuW = menu.width();
    var parentRightPosition = $(this).position().left+$(this).width();
    if((x+menuW) > parentRightPosition)
    {
    x -= menuW;
    }

    Este código lo tienes que poner antes de:
    $(menu).css({ top: y, left: x }).fadeIn(o.inSpeed);

    Una vez hayas puesto esto, al mostrar el menú contextual, si este sale más que el objeto parent en vez de mostrarse hacia la derecha, se mostrará hacia la izquierda.

    Saludos,

    David

  12. Hola Jorge, ya encontré la solución a los caracteres con tilde, puedes mirar mi post: http://www.dsite.es/buscar-y-ordenar-texto-con-acentos-en-tinytable-v3/

  13. Gracias David!!! Genio!!!

  14. Muchas gracias David, voy a probarlo

  15. Hola este es un gran trabajo, estoy tratando de usarlo para una aplicación en php, la cual recupera datos de mysql y los muestra al administrador.

    El problema es que no me da la funcion de repetir region, es decir, que a partir de una sola fila se generen todos los datos encontrados en mysql.

    Agradezco su ayuda.

  16. Hola, para iniciar la tabla desde MySQL y usando PHP debes hacer alguna cosa así:

    $rs = mysql_query(“SELECT id, nombre FROM datos”);
    while($row = mysql_fetch_array())
    {
    echo “
    “.$row['id'].” “.$row['nombre'].”

    “;
    }

    De hecho, no se si se puede cargar directamente los datos en la tabla de otra forma, ya que TinyTable formatea la tabla HTML.
    Igual, se pueden cargar los datos mediante AJAX. Pero no lo he desarrollado. Si lo encuentras espero que lo hagas público para todos ;-)


Deja un comentario