fix(date): show correct format based on browser locale

This commit is contained in:
Paul Chavard 2023-11-28 20:00:16 +00:00
parent 1efd54d429
commit dd24a935bf
3 changed files with 51 additions and 2 deletions

View file

@ -18,7 +18,7 @@
= t('.check_content_rebased')
- if hint?
%span.fr-hint-text= hint
%span.fr-hint-text{ data: { controller: 'date-input-hint' } }= hint
- if @champ.description.present?
%span.fr-hint-text{ id: @champ.describedby_id }= render SimpleFormatComponent.new(@champ.description, allow_a: true)

View file

@ -3,4 +3,4 @@
aria: { describedby: @champ.describedby_id },
value: @champ.value,
required: @champ.required?,
placeholder: 'aaaa-mm-jj', class: "width-33-desktop")
class: "width-33-desktop")

View file

@ -0,0 +1,49 @@
import { ApplicationController } from './application_controller';
const DATE_PLACEHOLDER_REGEXP = /[jJmMdD]{2}\/[jJmMdD]{2}\/[aAyY]{4}/;
const DATE_EXAMPLE_REGEXP = /\d{1,2}\/\d{1,2}\/\d{4}/;
const PARTS = {
fr: {
'15': 'JJ',
'10': 'MM',
'2022': 'AAAA'
},
en: {
'15': 'dd',
'10': 'mm',
'2022': 'yyyy'
}
};
export class DateInputHintController extends ApplicationController {
connect() {
this.fixDateFormat(this.element);
}
private fixDateFormat(input: Element) {
const text = input.textContent ?? '';
const match = text.match(DATE_PLACEHOLDER_REGEXP);
if (match) {
const [placeholder, example] = this.translatePlaceholder();
// This component behaviour can be had to test and debug. We keep a (debug) log here to help.
console.debug(`Replace ${match[0]} with ${placeholder} and ${example}`);
input.textContent = text
.replace(DATE_PLACEHOLDER_REGEXP, placeholder)
.replace(DATE_EXAMPLE_REGEXP, example);
}
}
private translatePlaceholder() {
const locale = document.documentElement.lang as 'fr' | 'en';
const parts = PARTS[locale];
const example = new Date(2022, 9, 15).toLocaleDateString();
return [
Object.entries(parts).reduce(
(text, [part, str]) => text.replace(part, str),
example
),
example
];
}
}