feat(ui) : gabarit fantome de saisie + saisie clavier DateTime + fix clear (#MUI-43)
- gabarit fantome progressif sur la famille Date editable (Date, DateTime) : le format s'affiche en gris et se remplit au fil de la saisie (overlay ghost) - separateurs (/, espace, :) poses automatiquement (maska eager) - espace insecable pour eviter le collage « 12/12/1999HH:MM » - CalendarField : prop placeholderTemplate (masque maska derive), remplace mask - fix : la croix reinitialise la saisie clavier meme apres une date invalide - tests + COMPONENTS.md + CHANGELOG.md Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -354,6 +354,55 @@ describe('MalioDate', () => {
|
||||
})
|
||||
})
|
||||
|
||||
describe('gabarit de saisie (editable)', () => {
|
||||
it('affiche le gabarit complet en gris quand editable + focus + vide', async () => {
|
||||
const wrapper = mountDate({editable: true})
|
||||
await wrapper.get('[data-test="date-input"]').trigger('focus')
|
||||
const ghost = wrapper.get('[data-test="format-ghost"]')
|
||||
expect(ghost.text()).toBe('JJ/MM/AAAA')
|
||||
expect(wrapper.get('[data-test="ghost-remaining"]').classes()).toContain('text-m-muted')
|
||||
})
|
||||
|
||||
it('remplit le gabarit au fur et à mesure de la saisie', async () => {
|
||||
const wrapper = mountDate({editable: true})
|
||||
const input = wrapper.get('[data-test="date-input"]')
|
||||
await input.trigger('focus')
|
||||
await input.setValue('19')
|
||||
// eager : le séparateur se pose dès que le groupe est complet (« 19 » → « 19/ »)
|
||||
expect(wrapper.get('[data-test="format-ghost"]').text()).toBe('19/MM/AAAA')
|
||||
expect(wrapper.get('[data-test="ghost-typed"]').text()).toBe('19/')
|
||||
expect(wrapper.get('[data-test="ghost-typed"]').classes()).toContain('text-black')
|
||||
})
|
||||
|
||||
it('pose le séparateur automatiquement dès qu\'un groupe est complet (eager)', async () => {
|
||||
const wrapper = mountDate({editable: true})
|
||||
const input = wrapper.get('[data-test="date-input"]')
|
||||
await input.setValue('1905')
|
||||
expect((input.element as HTMLInputElement).value).toBe('19/05/')
|
||||
})
|
||||
|
||||
it('n\'affiche pas de gabarit en mode non editable', async () => {
|
||||
const wrapper = mountDate({modelValue: '2026-05-19'})
|
||||
await wrapper.get('[data-test="date-input"]').trigger('click')
|
||||
expect(wrapper.find('[data-test="format-ghost"]').exists()).toBe(false)
|
||||
})
|
||||
|
||||
it('n\'affiche pas de gabarit quand editable mais vide et non focus', () => {
|
||||
const wrapper = mountDate({editable: true})
|
||||
expect(wrapper.find('[data-test="format-ghost"]').exists()).toBe(false)
|
||||
})
|
||||
|
||||
it('vide le champ au clic sur la croix même après une saisie invalide (modelValue déjà null)', async () => {
|
||||
const wrapper = mountDate({editable: true})
|
||||
const input = wrapper.get('[data-test="date-input"]')
|
||||
await input.setValue('32/13/2026')
|
||||
await input.trigger('blur')
|
||||
expect((input.element as HTMLInputElement).value).toBe('32/13/2026')
|
||||
await wrapper.get('[data-test="clear"]').trigger('click')
|
||||
expect((input.element as HTMLInputElement).value).toBe('')
|
||||
})
|
||||
})
|
||||
|
||||
describe('état de validité (update:valid)', () => {
|
||||
it('émet valid=true au montage avec une valeur valide', () => {
|
||||
const wrapper = mountDate({modelValue: '2026-05-19'})
|
||||
|
||||
Reference in New Issue
Block a user