2023-01-12 18:34:45 +01:00
|
|
|
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;
|
2023-10-16 10:58:11 +02:00
|
|
|
const value = this.formatList(target.value);
|
|
|
|
replaceValue(target, value);
|
2023-01-12 18:34:45 +01:00
|
|
|
});
|
|
|
|
break;
|
|
|
|
case 'iban':
|
|
|
|
this.on('input', (event) => {
|
|
|
|
const target = event.target as HTMLInputElement;
|
2023-10-16 10:58:11 +02:00
|
|
|
const value = this.formatIBAN(target.value);
|
|
|
|
replaceValue(target, value);
|
2023-01-12 18:34:45 +01:00
|
|
|
});
|
2023-05-30 14:42:36 +02:00
|
|
|
break;
|
|
|
|
case 'integer':
|
|
|
|
this.on('input', (event) => {
|
|
|
|
const target = event.target as HTMLInputElement;
|
2023-10-16 10:58:11 +02:00
|
|
|
const value = this.formatInteger(target.value);
|
|
|
|
replaceValue(target, value);
|
2023-05-30 14:42:36 +02:00
|
|
|
});
|
2023-09-26 16:31:35 +02:00
|
|
|
break;
|
|
|
|
case 'decimal':
|
|
|
|
this.on('input', (event) => {
|
|
|
|
const target = event.target as HTMLInputElement;
|
2023-10-16 10:58:11 +02:00
|
|
|
const value = this.formatDecimal(target.value);
|
|
|
|
replaceValue(target, value);
|
2023-09-26 16:31:35 +02:00
|
|
|
});
|
|
|
|
break;
|
2023-01-12 18:34:45 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private formatList(value: string) {
|
|
|
|
return value.replace(/;/g, ',');
|
|
|
|
}
|
|
|
|
|
|
|
|
private formatIBAN(value: string) {
|
|
|
|
return value
|
2023-07-17 16:42:37 +02:00
|
|
|
.replace(/[^\dA-Z]/gi, '')
|
2023-01-12 18:34:45 +01:00
|
|
|
.replace(/(.{4})/g, '$1 ')
|
2023-07-17 16:42:37 +02:00
|
|
|
.trim()
|
|
|
|
.toUpperCase();
|
2023-01-12 18:34:45 +01:00
|
|
|
}
|
2023-05-30 14:42:36 +02:00
|
|
|
|
|
|
|
private formatInteger(value: string) {
|
2023-10-06 14:27:50 +02:00
|
|
|
return value.replace(/[^-?\d]/g, '');
|
2023-05-30 14:42:36 +02:00
|
|
|
}
|
2023-09-26 16:31:35 +02:00
|
|
|
|
|
|
|
private formatDecimal(value: string) {
|
2023-10-16 10:58:11 +02:00
|
|
|
const decimalSeparator = getDecimalSeparator(value);
|
|
|
|
const number =
|
|
|
|
decimalSeparator == ','
|
|
|
|
? value.replace(/\./g, '').replace(/,/g, '.')
|
|
|
|
: value.replace(/,/g, '');
|
|
|
|
return number.replace(new RegExp(`[^-?\\d.]`, 'g'), '');
|
|
|
|
}
|
|
|
|
}
|
2023-09-26 16:31:35 +02:00
|
|
|
|
2023-10-16 10:58:11 +02:00
|
|
|
function replaceValue(target: HTMLInputElement, value: string) {
|
|
|
|
const delta = target.value.length - value.length;
|
|
|
|
const start = target.selectionStart;
|
|
|
|
const end = target.selectionStart;
|
|
|
|
const dir = target.selectionDirection;
|
|
|
|
target.value = value;
|
|
|
|
target.selectionStart = start ? start - delta : 0;
|
|
|
|
target.selectionEnd = end ? end - delta : 0;
|
|
|
|
target.selectionDirection = dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
function getDecimalSeparator(value: string) {
|
|
|
|
if (value.indexOf('.') != -1 && value.indexOf(',') != -1) {
|
|
|
|
if (value.lastIndexOf('.') < value.lastIndexOf(',')) {
|
|
|
|
return ',';
|
|
|
|
}
|
|
|
|
return '.';
|
|
|
|
} else if (value.indexOf(',') != -1) {
|
|
|
|
return ',';
|
2023-09-26 16:31:35 +02:00
|
|
|
}
|
2023-10-16 10:58:11 +02:00
|
|
|
return (1.1).toLocaleString().indexOf('.') != -1 ? '.' : ',';
|
2023-01-12 18:34:45 +01:00
|
|
|
}
|