Las reglas (en negrita a continuación) son bastante pocas, creo, para que el código a implementar no sea una máquina de vapor. Pero doy muchas precisiones y ejemplos, para que cada uno pueda hacerse una idea y detectar comportamientos que no serían pertinentes. ¡Estoy abierto a sus comentarios para afinar!
====== Navegación con las flechas : ======
- Cuando se hace clic en la flecha izquierda, el período mostrado se desplaza un período hacia el pasado (la nueva fecha de fin es la antigua fecha de inicio)
- Cuando se hace clic en la flecha derecha, el período mostrado se desplaza un período hacia el futuro (la nueva fecha de inicio es la antigua fecha de fin)
Nota: Dos acciones sucesivas de flecha izquierda y luego flecha derecha (o al revés) son ‹ simétricas ›; esto devuelve el eje de las abscisas exactamente al mismo período
Caso particular: Si la fecha de fin es >= ahora, la flecha de navegación derecha se desactiva (para no ir a explorar el futuro que aún no tiene datos)
====== Cambio de modo ‹ regular/deslizante ›: ======
En modo regular, los períodos se definen de la siguiente manera:
- 1h: el período es una hora completa, por ejemplo de 8h a 9h
- 12h: el período es media jornada completa, es decir de 0h a 12h o de 12h a 24h
- 24h: el período es un día completo, de 0h a 24h
- 7 días: el período es una semana completa, de lunes 0h a domingo 24h
- 1 mes: el período es un mes completo, por ejemplo del 1/1 0h al 31/1 24h, o del 1/2 0h al 28/2 24h.
- 3 meses: el período es un trimestre calendario completo, por ejemplo del 1/4 0h al 30/6 24h
- 1 año: el período es un año completo, del 1/1 0h al 31/12 24h
Cuando se pasa al modo ‹ regular ›: el nuevo período incluye la fecha de fin anterior (por lo tanto, se desplaza un poco hacia el futuro)
- Ej1 para un período de ‹ 1 día ›: la visualización de « 2/4 18h25 a 3/4 18h25 » se convierte en « 3/4 0h a 3/4 24h »
- Ej2 para un período de 7 días: la visualización de « 27/3 18h25 a 3/4 18h25 » se convierte en « 31/3 0h a 6/4 24h » (= de lunes a domingo incluyendo el 3/4)
Cuando se pasa al modo ‹ deslizante ›: el nuevo período « se alinea » con el día y la hora actuales (por lo tanto, se desplaza un poco hacia el pasado)
Precisión: la nueva fecha de fin será la más reciente posible, sin superar la fecha de fin anterior
nota: el alineamiento con el día y la hora actuales permite volver a ‹ ahora › cuando se navegue con la flecha derecha…
El alineamiento del final del período se hace de la siguiente manera, según el tipo de período (tomando como ejemplo que la fecha actual es jueves 3 de abril 18h25):
- 1h: el final del período se alineará en xh25
- 12h: el final del período se alineará en 18h25
- 24h: el final del período se alineará en 18h25
- 7 días: el final del período se alineará en jueves 18h25
- 1 mes: el final del período se alineará en 3/x 18h25
- 3 meses: el final del período se alineará en 3/x 18h25, pero con x desplazado por un múltiplo de 3 con el mes actual (por lo tanto enero, abril, julio o septiembre en mi ejemplo)
- 1 año: el final del período se alineará en 3/4 18h25
Ejemplos:
- Ej1 para un período de ‹ 1 día ›: la visualización de « 3/4 0h a 3/4 24h » se convierte en « 2/4 18h25 a 3/4 18h25 »
- Ej2 para un período de 7 días: la visualización de « 31/3 0h a 6/4 24h » se convierte en « 27/3 18h25 a 3/4 18h25 » (para terminar un jueves)
- Ej3 para un período de 1 mes: la visualización de « 1/4 0h a 30/4 24h » se convierte en « 3/3 18h25 a 3/4 18h25 » (para terminar un 3 del mes)
====== Cambio de tipo de período: ======
Cuando se cambia el período para ampliarlo:
- en modo ‹ deslizante ›, la fecha de fin no se modifica
- en modo ‹ regular ›, el nuevo período incluye la fecha de fin anterior
Nota: en general el nuevo período más amplio incluye completamente el período anterior, excepto a veces cuando se parte de un período de ‹ 7 días ›
- Ej1: si se muestra un período de ‹ 1 día › que es un miércoles, el período de ‹ 7 días › irá del lunes al domingo incluyendo ese miércoles
- Ej2: si se muestra un período de ‹ 7 días › que va de lunes 17/2 a domingo 23/2, el paso a período de ‹ 1 mes › irá del 1/2 al 28/2 (incluyendo por lo tanto el domingo 23/2)
- Ej3 (menos intuitivo): si se muestra un período de ‹ 7 días › que va de lunes 24/2 a domingo 2/3, el paso a período de ‹ 1 mes › irá del 1/3 al 31/3 (incluyendo por lo tanto el domingo 2/3)
Cuando se cambia el período para reducirlo:
- en modo ‹ deslizante ›, la fecha de fin no se modifica
- en modo ‹ regular ›, el nuevo período incluye la fecha de fin anterior.
Caso particular: si este cambio sitúa el nuevo período completamente en el futuro, entonces el nuevo período será en realidad el que incluye ‹ ahora ›.
Nota: en general el nuevo período más reducido está completamente incluido en el período anterior, excepto a veces cuando se va hacia un período de ‹ 7 días ›
- Ej1: si se muestra un período de ‹ 7 días › que va de lunes a domingo, completamente pasado, entonces el paso a período de ‹ 1 día › mostrará el domingo.
- Ej2: si se muestra un período de ‹ 7 días › que va de lunes a domingo, pero hoy es el miércoles de esa semana, entonces el paso a período de ‹ 1 día › mostrará el miércoles
- Ej3: si se muestra un período de ‹ 1 mes › que va de sábado 1/2 a viernes 28/2, el paso a período de ‹ 7 días › irá de lunes 24/2 a domingo 2/3 (incluyendo por lo tanto el viernes 28/2)
Un pequeño defecto con la navegación en ‹ zigzag › en al menos 2 casos:
- En modo ‹ regular ›, si se parte de una fecha bastante antigua y se encadenan los cambios de período ‹ 7 días ›-‹ 1 mes ›, se irá desplazando progresivamente hacia el futuro porque los meses no siempre terminan en domingo
Por ejemplo: 6-12/1 => 1-31/1 => 27/1-2/2 => 1-28/2 => 24/2-2/3 => 1-31/3 … Pero el caso es raro, y se acabará ‹ topando › con un domingo de fin de mes o con ‹ ahora ›, por lo que no me parece muy grave…
- Igual si se alterna ‹ 7 días ›-‹ 1 año ›. Pero es aún más raro…