182 lines
No EOL
4.9 KiB
Vue
182 lines
No EOL
4.9 KiB
Vue
<template>
|
|
<section class="stack">
|
|
<h2>EliDataHora (entrada de data e hora)</h2>
|
|
|
|
<h3 class="mt-2">Novo padrão (EliEntradaDataHora: value + opcoes)</h3>
|
|
|
|
<div class="grid">
|
|
<EliEntradaDataHora
|
|
v-model:value="dataHora"
|
|
:opcoes="{
|
|
rotulo: 'Data e hora (novo)',
|
|
placeholder: 'Selecione',
|
|
modo: 'dataHora',
|
|
}"
|
|
/>
|
|
|
|
<EliEntradaDataHora
|
|
v-model:value="somenteData"
|
|
:opcoes="{
|
|
rotulo: 'Somente data (novo)',
|
|
modo: 'data',
|
|
dica: 'Emite ISO com offset local às 00:00:00',
|
|
dicaPersistente: true,
|
|
}"
|
|
/>
|
|
|
|
<EliEntradaDataHora
|
|
v-model:value="dataHoraComLimite"
|
|
:opcoes="{
|
|
rotulo: 'Agendamento (novo, com limite)',
|
|
modo: 'dataHora',
|
|
min,
|
|
max,
|
|
limpavel: true,
|
|
dica: 'Escolha um horário dentro do intervalo',
|
|
dicaPersistente: true,
|
|
}"
|
|
/>
|
|
</div>
|
|
|
|
<v-divider class="my-6" />
|
|
|
|
<h3 class="mt-2">Compat (API antiga usando o mesmo componente)</h3>
|
|
|
|
<div class="grid">
|
|
<!-- variação 1: padrão (API antiga via props) -->
|
|
<EliEntradaDataHora v-model="dataHora" />
|
|
|
|
<!-- variação 1a: somente data -->
|
|
<EliEntradaDataHora
|
|
v-model="somenteData"
|
|
modo="data"
|
|
rotulo="Somente data"
|
|
dica="Emite ISO com offset local às 00:00:00"
|
|
dica-persistente
|
|
/>
|
|
|
|
<!-- variação 1b: recebendo UTC (Z) e exibindo local -->
|
|
<EliEntradaDataHora
|
|
v-model="dataHoraUtcEntrada"
|
|
rotulo="Entrada vinda do backend (UTC/Z)"
|
|
dica="O valor chega em UTC, mas o campo mostra em horário local"
|
|
dica-persistente
|
|
/>
|
|
|
|
<!-- variação 2: com limites min/max -->
|
|
<EliEntradaDataHora
|
|
v-model="dataHoraComLimite"
|
|
rotulo="Agendamento (com limite)"
|
|
:min="min"
|
|
:max="max"
|
|
dica="Escolha um horário dentro do intervalo"
|
|
dica-persistente
|
|
limpavel
|
|
/>
|
|
|
|
<!-- variação 3: estado de erro + desabilitado -->
|
|
<EliEntradaDataHora
|
|
v-model="dataHoraObrigatoria"
|
|
rotulo="Obrigatório"
|
|
:erro="!dataHoraObrigatoria"
|
|
:mensagens-erro="!dataHoraObrigatoria ? ['Obrigatório'] : []"
|
|
/>
|
|
|
|
<EliEntradaDataHora v-model="dataHoraDesabilitado" rotulo="Desabilitado" desabilitado />
|
|
|
|
<!-- variação 4: saída sempre em ISO com offset local -->
|
|
<EliEntradaDataHora
|
|
v-model="dataHoraUtcEmitida"
|
|
rotulo="Emitindo ISO com offset local"
|
|
dica="Ao alterar, o v-model vira ISO 8601 com offset do seu fuso"
|
|
dica-persistente
|
|
/>
|
|
</div>
|
|
|
|
<pre class="debug">{{ debug }}</pre>
|
|
</section>
|
|
</template>
|
|
|
|
<script lang="ts">
|
|
import { computed, defineComponent, ref } from "vue";
|
|
import { EliEntradaDataHora } from "@/componentes/EliEntrada";
|
|
import { VDivider } from "vuetify/components";
|
|
|
|
export default defineComponent({
|
|
name: "DataHoraPlayground",
|
|
components: { EliEntradaDataHora, VDivider },
|
|
setup() {
|
|
const dataHora = ref<string | null>("2026-01-09T13:15:00-03:00");
|
|
|
|
const somenteData = ref<string | null>("2026-01-09T00:00:00-03:00");
|
|
|
|
// Valor vindo do backend em UTC/Z (exibir local, manter como UTC no estado)
|
|
const dataHoraUtcEntrada = ref<string | null>("2026-01-09T16:15:00Z");
|
|
|
|
// Exemplo com min/max
|
|
const min = ref("2026-01-09T08:00:00-03:00");
|
|
const max = ref("2026-01-09T18:00:00-03:00");
|
|
const dataHoraComLimite = ref<string | null>("2026-01-09T09:00:00-03:00");
|
|
|
|
// Obrigatório (mostra erro quando null)
|
|
const dataHoraObrigatoria = ref<string | null>(null);
|
|
|
|
// Desabilitado
|
|
const dataHoraDesabilitado = ref<string | null>("2026-01-09T10:30:00-03:00");
|
|
|
|
// Saída: sempre ISO com offset local
|
|
const dataHoraUtcEmitida = ref<string | null>("2026-01-09T16:15:00Z");
|
|
|
|
const debug = computed(() =>
|
|
JSON.stringify(
|
|
{
|
|
dataHora: dataHora.value,
|
|
somenteData: somenteData.value,
|
|
dataHoraUtcEntrada: dataHoraUtcEntrada.value,
|
|
dataHoraComLimite: dataHoraComLimite.value,
|
|
dataHoraObrigatoria: dataHoraObrigatoria.value,
|
|
dataHoraDesabilitado: dataHoraDesabilitado.value,
|
|
dataHoraUtcEmitida: dataHoraUtcEmitida.value,
|
|
min: min.value,
|
|
max: max.value,
|
|
},
|
|
null,
|
|
2
|
|
)
|
|
);
|
|
|
|
return {
|
|
dataHora,
|
|
somenteData,
|
|
dataHoraUtcEntrada,
|
|
min,
|
|
max,
|
|
dataHoraComLimite,
|
|
dataHoraObrigatoria,
|
|
dataHoraDesabilitado,
|
|
dataHoraUtcEmitida,
|
|
debug,
|
|
};
|
|
},
|
|
});
|
|
</script>
|
|
|
|
<style scoped>
|
|
.stack {
|
|
display: grid;
|
|
gap: 16px;
|
|
}
|
|
|
|
.grid {
|
|
display: grid;
|
|
gap: 12px;
|
|
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
|
|
}
|
|
|
|
.debug {
|
|
padding: 12px;
|
|
background: rgba(0, 0, 0, 0.04);
|
|
border-radius: 8px;
|
|
overflow: auto;
|
|
}
|
|
</style> |