73 lines
1.9 KiB
TypeScript
73 lines
1.9 KiB
TypeScript
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")
|
|
}
|