Skip to content

Instantly share code, notes, and snippets.

@maese
Last active August 29, 2015 14:20
Show Gist options
  • Save maese/03529710e6972158d288 to your computer and use it in GitHub Desktop.
Save maese/03529710e6972158d288 to your computer and use it in GitHub Desktop.
/**
* Construye paginador
* Pad: pag. seleccionada + items alrededor de ella.
* En el caso de un número grande de páginas:
* y pag. seleccionada en posición central: aparece rodeada de puntitos.
* " izquierda: aparecen puntitos solo a la derecha
* " derecha: aparecen puntitos solo a la izquierda
* En el caso de un número pequeño de páginas:
* no aparecen puntitos
*
* @param {number} actualPag
* @param {number} maxPag
* @returns {string} html del paginador
*/
function paginator(actualPag, maxPag) {
var resultadosPaginador = []; // Array donde se van almacenando los nodos que se pintaran
var numSideElems = 2; // Número de items a mostrar en cada lado del seleccionado
var numCentralElems = numSideElems*2 + 1; // Número de items a los lados del seleccionado + seleccionado.
var prev = actualPag - 1;
var next = actualPag + 1;
var leftLimitPad = actualPag - numSideElems;
var rightLimitPad = actualPag + numSideElems;
// i para bucle = limite izquierdo del pad.
// ejem: < 1 .. 5 6 x 8 9 .. 20 > limite izquierdo del pad es 5
var i = leftLimitPad;
if (leftLimitPad <= 1) {
i = 1; // i del bucle = 1
} else if (rightLimitPad > maxPag) {
i = leftLimitPad; // i del bucle = maxPag-numSideElems
if (i<=0) i=1; // i del bucle = 1 ya que el total de...
}
// Pinta enlace de anterior. Se desactiva si la página actual es la primera
var prev_active = (actualPag > 1) ? '' : ' inactive';
resultadosPaginador.push('<a href="#" class="pag-prev' + prev_active + '" data-page="'+prev+'">Anterior</a>');
if (leftLimitPad > 1) resultadosPaginador.push('<a href="#">1</a>'); // 1 siempre debe aparecer. Si no lo pinta el bucle entonces pintarlo manualmente
if (leftLimitPad > 2) resultadosPaginador.push('<span>...</span>'); // Lo puntos se pintan entre 1 y leftLimitPad cuando leftLimitPad es mayor que 2
// Pinta items. Empieza limite izquierdo hasta limite derecho o limite derecho sea menor o igual a maxPag
for (; i <= rightLimitPad && i <= maxPag; i++) {
var aux = (actualPag == i) ? ' class="on"' : '';
resultadosPaginador.push('<a href="#"' + aux + '>' + i + '</a>');
};
if (rightLimitPad+1 < maxPag) resultadosPaginador.push('<span>...</span>');
if (rightLimitPad < maxPag) resultadosPaginador.push('<a href="#">'+ maxPag +'</a>');
// Pinta enlace de siguiente. Se desactiva si la página actual es la última
var next_active = (actualPag < maxPag) ? '' : ' inactive';
resultadosPaginador.push('<a href="#" class="pag-next' + next_active + '" data-page="'+next+'">Siguiente</a>');
// return string con todos los nodos almacenados en el array
return resultadosPaginador.join('');
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment