refactor(js): make generic format controller

This commit is contained in:
Paul Chavard 2023-01-12 18:34:45 +01:00
parent bdd0ab0a22
commit 5f192f93e0
6 changed files with 35 additions and 25 deletions

View file

@ -3,6 +3,6 @@
placeholder: t(".placeholder"), placeholder: t(".placeholder"),
required: @champ.required?, required: @champ.required?,
aria: { describedby: @champ.describedby_id }, aria: { describedby: @champ.describedby_id },
data: { controller: 'iban-input'}, data: { controller: 'format', format: 'iban' },
class: "width-66-desktop", class: "width-66-desktop",
maxlength: 34 + 9 # count space separator of 4 digits-groups maxlength: 34 + 9 # count space separator of 4 digits-groups

View file

@ -0,0 +1,31 @@
import { ApplicationController } from './application_controller';
export class FormatController extends ApplicationController {
connect() {
const format = this.element.getAttribute('data-format');
switch (format) {
case 'list':
this.on('change', (event) => {
const target = event.target as HTMLInputElement;
target.value = this.formatList(target.value);
});
break;
case 'iban':
this.on('input', (event) => {
const target = event.target as HTMLInputElement;
target.value = this.formatIBAN(target.value);
});
}
}
private formatList(value: string) {
return value.replace(/;/g, ',');
}
private formatIBAN(value: string) {
return value
.replace(/[^\dA-Z]/g, '')
.replace(/(.{4})/g, '$1 ')
.trim();
}
}

View file

@ -1,13 +0,0 @@
import { ApplicationController } from './application_controller';
export class IBANInputController extends ApplicationController {
connect() {
this.on('input', (event) => {
const target = event.target as HTMLInputElement;
target.value = target.value
.replace(/[^\dA-Z]/g, '')
.replace(/(.{4})/g, '$1 ')
.trim();
});
}
}

View file

@ -15,10 +15,7 @@ import '../new_design/form-validation';
import '../new_design/procedure-context'; import '../new_design/procedure-context';
import '../new_design/procedure-form'; import '../new_design/procedure-form';
import { import { toggleCondidentielExplanation } from '../new_design/avis';
toggleCondidentielExplanation,
replaceSemicolonByComma
} from '../new_design/avis';
import { import {
showMotivation, showMotivation,
motivationCancel, motivationCancel,
@ -36,8 +33,7 @@ const DS = {
motivationCancel, motivationCancel,
showImportJustificatif, showImportJustificatif,
showFusion, showFusion,
showNewAccount, showNewAccount
replaceSemicolonByComma
}; };
// Start Rails helpers // Start Rails helpers

View file

@ -3,7 +3,3 @@ import { toggle } from '@utils';
export function toggleCondidentielExplanation() { export function toggleCondidentielExplanation() {
toggle(document.querySelector('.confidentiel-explanation')); toggle(document.querySelector('.confidentiel-explanation'));
} }
export function replaceSemicolonByComma(event) {
event.target.value = event.target.value.replace(/;/g, ',');
}

View file

@ -3,7 +3,7 @@
%p.avis-notice Les invités pourront consulter le dossier, donner un avis et contribuer au fil de messagerie. Ils ne pourront pas modifier le dossier. %p.avis-notice Les invités pourront consulter le dossier, donner un avis et contribuer au fil de messagerie. Ils ne pourront pas modifier le dossier.
= form_for avis, url: url, html: { class: 'form' } do |f| = form_for avis, url: url, html: { class: 'form' } do |f|
= f.email_field :emails, placeholder: 'Adresses email, séparées par des virgules', required: true, multiple: true, onchange: "javascript:DS.replaceSemicolonByComma(event);" = f.email_field :emails, placeholder: 'Adresses email, séparées par des virgules', required: true, multiple: true, data: { controller: 'format', format: 'list' }
= f.text_area :introduction, rows: 3, value: avis.introduction || 'Bonjour, merci de me donner votre avis sur ce dossier.', required: true = f.text_area :introduction, rows: 3, value: avis.introduction || 'Bonjour, merci de me donner votre avis sur ce dossier.', required: true
%p.tab-title Ajouter une pièce jointe %p.tab-title Ajouter une pièce jointe
.form-group .form-group