feat: melhoria componentes de data

This commit is contained in:
MarcioJRGodoi 2026-06-24 13:51:05 -03:00
parent 84383c3bbf
commit 642ccf4c1a
21 changed files with 6888 additions and 4607 deletions

View file

@ -0,0 +1,73 @@
import dayjs from "dayjs"
import type { CelulaCalendario, EntradaDataHora } from "./useDataHora"
/**
* Gera as 42 células (6 semanas) do calendário para o mês de referência.
* Preenche dias do mês anterior, atual e posterior para alinhar a grade.
*/
export function gerarCelulas(
referencia: dayjs.Dayjs,
diaSelecionado: dayjs.Dayjs | null,
min?: string,
max?: string,
): CelulaCalendario[] {
const inicio = referencia.startOf("month")
const fim = referencia.endOf("month")
const hoje = dayjs()
const minDt = min ? dayjs(min).startOf("day") : null
const maxDt = max ? dayjs(max).startOf("day") : null
const lista: CelulaCalendario[] = []
for (let i = inicio.day() - 1; i >= 0; i--) {
const d = inicio.subtract(i + 1, "day")
lista.push({
dia: d.date(),
data: d,
atual: false,
hoje: false,
selecionado: false,
desabilitado: true,
})
}
for (let d = inicio; d.isBefore(fim) || d.isSame(fim, "day"); d = d.add(1, "day")) {
lista.push({
dia: d.date(),
data: d,
atual: true,
hoje: d.isSame(hoje, "day"),
selecionado: diaSelecionado !== null && d.isSame(diaSelecionado, "day"),
desabilitado: (minDt !== null && d.isBefore(minDt)) || (maxDt !== null && d.isAfter(maxDt)),
})
}
let extra = 1
while (lista.length < 42) {
const d = fim.add(extra++, "day")
lista.push({
dia: d.date(),
data: d,
atual: false,
hoje: false,
selecionado: false,
desabilitado: true,
})
}
return lista
}
/**
* Formata um valor ISO para exibição no campo.
* @param valor - string ISO 8601 ou null
* @param modo - "data" exibe apenas a data, "dataHora" inclui hora
*/
export function formatarValor(
valor: string | null,
modo: EntradaDataHora["opcoes"]["modo"],
): string {
if (!valor) return ""
return modo === "data"
? dayjs(valor).format("DD/MM/YYYY")
: dayjs(valor).format("DD/MM/YYYY HH:mm")
}