hrms-manual/node_modules/vue-currency-input/dist/index.cjs
2023-09-06 14:51:44 +07:00

550 lines
26 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Vue Currency Input 3.0.5
* (c) 2018-2023 Matthias Stiller
* @license MIT
*/
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var vue = require('vue');
exports.CurrencyDisplay = void 0;
(function (CurrencyDisplay) {
CurrencyDisplay["symbol"] = "symbol";
CurrencyDisplay["narrowSymbol"] = "narrowSymbol";
CurrencyDisplay["code"] = "code";
CurrencyDisplay["name"] = "name";
CurrencyDisplay["hidden"] = "hidden";
})(exports.CurrencyDisplay || (exports.CurrencyDisplay = {}));
exports.ValueScaling = void 0;
(function (ValueScaling) {
ValueScaling["precision"] = "precision";
ValueScaling["thousands"] = "thousands";
ValueScaling["millions"] = "millions";
ValueScaling["billions"] = "billions";
})(exports.ValueScaling || (exports.ValueScaling = {}));
const escapeRegExp = (str) => {
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
};
const removeLeadingZeros = (str) => {
return str.replace(/^0+(0$|[^0])/, '$1');
};
const count = (str, search) => {
return (str.match(new RegExp(escapeRegExp(search), 'g')) || []).length;
};
const substringBefore = (str, search) => {
return str.substring(0, str.indexOf(search));
};
const DECIMAL_SEPARATORS = [',', '.', '٫'];
const INTEGER_PATTERN = '(0|[1-9]\\d*)';
class CurrencyFormat {
constructor(options) {
var _a, _b, _c, _d, _e, _f;
const { currency, currencyDisplay, locale, precision, accountingSign, useGrouping } = options;
this.locale = locale;
this.options = {
currency,
useGrouping,
style: 'currency',
currencySign: accountingSign ? 'accounting' : undefined,
currencyDisplay: currencyDisplay !== exports.CurrencyDisplay.hidden ? currencyDisplay : undefined
};
const numberFormat = new Intl.NumberFormat(locale, this.options);
const formatParts = numberFormat.formatToParts(123456);
this.currency = (_a = formatParts.find(({ type }) => type === 'currency')) === null || _a === void 0 ? void 0 : _a.value;
this.digits = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map((i) => i.toLocaleString(locale));
this.decimalSymbol = (_b = formatParts.find(({ type }) => type === 'decimal')) === null || _b === void 0 ? void 0 : _b.value;
this.groupingSymbol = (_c = formatParts.find(({ type }) => type === 'group')) === null || _c === void 0 ? void 0 : _c.value;
this.minusSign = (_d = numberFormat.formatToParts(-1).find(({ type }) => type === 'minusSign')) === null || _d === void 0 ? void 0 : _d.value;
if (this.decimalSymbol === undefined) {
this.minimumFractionDigits = this.maximumFractionDigits = 0;
}
else if (typeof precision === 'number') {
this.minimumFractionDigits = this.maximumFractionDigits = precision;
}
else {
this.minimumFractionDigits = (_e = precision === null || precision === void 0 ? void 0 : precision.min) !== null && _e !== void 0 ? _e : numberFormat.resolvedOptions().minimumFractionDigits;
this.maximumFractionDigits = (_f = precision === null || precision === void 0 ? void 0 : precision.max) !== null && _f !== void 0 ? _f : numberFormat.resolvedOptions().maximumFractionDigits;
}
const getPrefix = (str) => {
return substringBefore(str, this.digits[1]);
};
const getSuffix = (str) => {
return str.substring(str.lastIndexOf(this.decimalSymbol ? this.digits[0] : this.digits[1]) + 1);
};
this.prefix = getPrefix(numberFormat.format(1));
this.suffix = getSuffix(numberFormat.format(1));
this.negativePrefix = getPrefix(numberFormat.format(-1));
this.negativeSuffix = getSuffix(numberFormat.format(-1));
}
parse(str) {
if (str) {
const negative = this.isNegative(str);
str = this.normalizeDigits(str);
str = this.stripCurrency(str, negative);
str = this.stripSignLiterals(str);
const fraction = this.decimalSymbol ? `(?:${escapeRegExp(this.decimalSymbol)}(\\d*))?` : '';
const match = this.stripGroupingSeparator(str).match(new RegExp(`^${INTEGER_PATTERN}${fraction}$`));
if (match && this.isValidIntegerFormat(this.decimalSymbol ? str.split(this.decimalSymbol)[0] : str, Number(match[1]))) {
return Number(`${negative ? '-' : ''}${this.onlyDigits(match[1])}.${this.onlyDigits(match[2] || '')}`);
}
}
return null;
}
isValidIntegerFormat(formattedNumber, integerNumber) {
const options = { ...this.options, minimumFractionDigits: 0 };
return [
this.stripCurrency(this.normalizeDigits(integerNumber.toLocaleString(this.locale, { ...options, useGrouping: true })), false),
this.stripCurrency(this.normalizeDigits(integerNumber.toLocaleString(this.locale, { ...options, useGrouping: false })), false)
].includes(formattedNumber);
}
format(value, options = {
minimumFractionDigits: this.minimumFractionDigits,
maximumFractionDigits: this.maximumFractionDigits
}) {
return value != null ? value.toLocaleString(this.locale, { ...this.options, ...options }) : '';
}
toFraction(str) {
return `${this.digits[0]}${this.decimalSymbol}${this.onlyLocaleDigits(str.substr(1)).substr(0, this.maximumFractionDigits)}`;
}
isFractionIncomplete(str) {
return !!this.normalizeDigits(this.stripGroupingSeparator(str)).match(new RegExp(`^${INTEGER_PATTERN}${escapeRegExp(this.decimalSymbol)}$`));
}
isNegative(str) {
return (str.startsWith(this.negativePrefix) ||
(this.minusSign === undefined && (str.startsWith('(') || str.startsWith('-'))) ||
(this.minusSign !== undefined && str.replace('-', this.minusSign).startsWith(this.minusSign)));
}
insertCurrency(str, negative) {
return `${negative ? this.negativePrefix : this.prefix}${str}${negative ? this.negativeSuffix : this.suffix}`;
}
stripGroupingSeparator(str) {
return this.groupingSymbol !== undefined ? str.replace(new RegExp(escapeRegExp(this.groupingSymbol), 'g'), '') : str;
}
stripSignLiterals(str) {
if (this.minusSign !== undefined) {
return str.replace('-', this.minusSign).replace(this.minusSign, '');
}
else {
return str.replace(/[-()]/g, '');
}
}
stripCurrency(str, negative) {
return str.replace(negative ? this.negativePrefix : this.prefix, '').replace(negative ? this.negativeSuffix : this.suffix, '');
}
normalizeDecimalSeparator(str, from) {
DECIMAL_SEPARATORS.forEach((s) => {
str = str.substr(0, from) + str.substr(from).replace(s, this.decimalSymbol);
});
return str;
}
normalizeDigits(str) {
if (this.digits[0] !== '0') {
this.digits.forEach((digit, index) => {
str = str.replace(new RegExp(digit, 'g'), String(index));
});
}
return str;
}
onlyDigits(str) {
return this.normalizeDigits(str).replace(/\D+/g, '');
}
onlyLocaleDigits(str) {
return str.replace(new RegExp(`[^${this.digits.join('')}]*`, 'g'), '');
}
}
class AbstractInputMask {
constructor(currencyFormat) {
this.currencyFormat = currencyFormat;
}
}
class DefaultInputMask extends AbstractInputMask {
conformToMask(str, previousConformedValue = '') {
const negative = this.currencyFormat.isNegative(str);
const isEmptyNegativeValue = (str) => str === '' &&
negative &&
!(this.currencyFormat.minusSign === undefined
? previousConformedValue === this.currencyFormat.negativePrefix + this.currencyFormat.negativeSuffix
: previousConformedValue === this.currencyFormat.negativePrefix);
const checkIncompleteValue = (str) => {
if (isEmptyNegativeValue(str)) {
return '';
}
else if (this.currencyFormat.maximumFractionDigits > 0) {
if (this.currencyFormat.isFractionIncomplete(str)) {
return str;
}
else if (str.startsWith(this.currencyFormat.decimalSymbol)) {
return this.currencyFormat.toFraction(str);
}
}
return null;
};
let value = str;
value = this.currencyFormat.stripCurrency(value, negative);
value = this.currencyFormat.stripSignLiterals(value);
const incompleteValue = checkIncompleteValue(value);
if (incompleteValue != null) {
return this.currencyFormat.insertCurrency(incompleteValue, negative);
}
const [integer, ...fraction] = value.split(this.currencyFormat.decimalSymbol);
const integerDigits = removeLeadingZeros(this.currencyFormat.onlyDigits(integer));
const fractionDigits = this.currencyFormat.onlyDigits(fraction.join('')).substr(0, this.currencyFormat.maximumFractionDigits);
const invalidFraction = fraction.length > 0 && fractionDigits.length === 0;
const invalidNegativeValue = integerDigits === '' &&
negative &&
(this.currencyFormat.minusSign === undefined
? previousConformedValue === str.slice(0, -2) + this.currencyFormat.negativeSuffix
: previousConformedValue === str.slice(0, -1));
if (invalidFraction || invalidNegativeValue || isEmptyNegativeValue(integerDigits)) {
return previousConformedValue;
}
else if (integerDigits.match(/\d+/)) {
return {
numberValue: Number(`${negative ? '-' : ''}${integerDigits}.${fractionDigits}`),
fractionDigits
};
}
else {
return '';
}
}
}
class AutoDecimalDigitsInputMask extends AbstractInputMask {
conformToMask(str, previousConformedValue = '') {
if (str === '' ||
(this.currencyFormat.parse(previousConformedValue) === 0 &&
this.currencyFormat.stripCurrency(previousConformedValue, true).slice(0, -1) === this.currencyFormat.stripCurrency(str, true))) {
return '';
}
const negative = this.currencyFormat.isNegative(str);
const numberValue = this.currencyFormat.stripSignLiterals(str) === ''
? -0
: Number(`${negative ? '-' : ''}${removeLeadingZeros(this.currencyFormat.onlyDigits(str))}`) / Math.pow(10, this.currencyFormat.maximumFractionDigits);
return {
numberValue,
fractionDigits: numberValue.toFixed(this.currencyFormat.maximumFractionDigits).slice(-this.currencyFormat.maximumFractionDigits)
};
}
}
const DEFAULT_OPTIONS = {
locale: undefined,
currency: undefined,
currencyDisplay: undefined,
hideGroupingSeparatorOnFocus: true,
hideCurrencySymbolOnFocus: true,
hideNegligibleDecimalDigitsOnFocus: true,
precision: undefined,
autoDecimalDigits: false,
valueRange: undefined,
useGrouping: undefined,
valueScaling: undefined
};
class CurrencyInput {
constructor(args) {
this.el = args.el;
this.onInput = args.onInput;
this.onChange = args.onChange;
this.addEventListener();
this.init(args.options);
}
setOptions(options) {
this.init(options);
this.format(this.currencyFormat.format(this.validateValueRange(this.numberValue)));
this.onChange(this.getValue());
}
getValue() {
const numberValue = this.valueScaling && this.numberValue != null ? this.toInteger(this.numberValue, this.valueScaling) : this.numberValue;
return { number: numberValue, formatted: this.formattedValue };
}
setValue(value) {
const newValue = this.valueScaling !== undefined && value != null ? this.toFloat(value, this.valueScaling) : value;
if (newValue !== this.numberValue) {
this.format(this.currencyFormat.format(this.validateValueRange(newValue)));
this.onChange(this.getValue());
}
}
init(options) {
this.options = {
...DEFAULT_OPTIONS,
...options
};
if (this.options.autoDecimalDigits) {
this.options.hideNegligibleDecimalDigitsOnFocus = false;
}
if (!this.el.getAttribute('inputmode')) {
this.el.setAttribute('inputmode', this.options.autoDecimalDigits ? 'numeric' : 'decimal');
}
this.currencyFormat = new CurrencyFormat(this.options);
this.numberMask = this.options.autoDecimalDigits ? new AutoDecimalDigitsInputMask(this.currencyFormat) : new DefaultInputMask(this.currencyFormat);
const valueScalingOptions = {
[exports.ValueScaling.precision]: this.currencyFormat.maximumFractionDigits,
[exports.ValueScaling.thousands]: 3,
[exports.ValueScaling.millions]: 6,
[exports.ValueScaling.billions]: 9
};
this.valueScaling = this.options.valueScaling ? valueScalingOptions[this.options.valueScaling] : undefined;
this.valueScalingFractionDigits =
this.valueScaling !== undefined && this.options.valueScaling !== exports.ValueScaling.precision
? this.valueScaling + this.currencyFormat.maximumFractionDigits
: this.currencyFormat.maximumFractionDigits;
this.minValue = this.getMinValue();
this.maxValue = this.getMaxValue();
}
getMinValue() {
var _a, _b;
let min = this.toFloat(-Number.MAX_SAFE_INTEGER);
if (((_a = this.options.valueRange) === null || _a === void 0 ? void 0 : _a.min) !== undefined) {
min = Math.max((_b = this.options.valueRange) === null || _b === void 0 ? void 0 : _b.min, this.toFloat(-Number.MAX_SAFE_INTEGER));
}
return min;
}
getMaxValue() {
var _a, _b;
let max = this.toFloat(Number.MAX_SAFE_INTEGER);
if (((_a = this.options.valueRange) === null || _a === void 0 ? void 0 : _a.max) !== undefined) {
max = Math.min((_b = this.options.valueRange) === null || _b === void 0 ? void 0 : _b.max, this.toFloat(Number.MAX_SAFE_INTEGER));
}
return max;
}
toFloat(value, maxFractionDigits) {
return value / Math.pow(10, maxFractionDigits !== null && maxFractionDigits !== void 0 ? maxFractionDigits : this.valueScalingFractionDigits);
}
toInteger(value, maxFractionDigits) {
return Number(value
.toFixed(maxFractionDigits !== null && maxFractionDigits !== void 0 ? maxFractionDigits : this.valueScalingFractionDigits)
.split('.')
.join(''));
}
validateValueRange(value) {
return value != null ? Math.min(Math.max(value, this.minValue), this.maxValue) : value;
}
format(value, hideNegligibleDecimalDigits = false) {
if (value != null) {
if (this.decimalSymbolInsertedAt !== undefined) {
value = this.currencyFormat.normalizeDecimalSeparator(value, this.decimalSymbolInsertedAt);
this.decimalSymbolInsertedAt = undefined;
}
const conformedValue = this.numberMask.conformToMask(value, this.formattedValue);
let formattedValue;
if (typeof conformedValue === 'object') {
const { numberValue, fractionDigits } = conformedValue;
let { maximumFractionDigits, minimumFractionDigits } = this.currencyFormat;
if (this.focus) {
minimumFractionDigits = hideNegligibleDecimalDigits
? fractionDigits.replace(/0+$/, '').length
: Math.min(maximumFractionDigits, fractionDigits.length);
}
else if (Number.isInteger(numberValue) && !this.options.autoDecimalDigits && (this.options.precision === undefined || minimumFractionDigits === 0)) {
minimumFractionDigits = maximumFractionDigits = 0;
}
formattedValue =
this.toInteger(Math.abs(numberValue)) > Number.MAX_SAFE_INTEGER
? this.formattedValue
: this.currencyFormat.format(numberValue, {
useGrouping: this.options.useGrouping !== false && !(this.focus && this.options.hideGroupingSeparatorOnFocus),
minimumFractionDigits,
maximumFractionDigits
});
}
else {
formattedValue = conformedValue;
}
if (this.maxValue <= 0 && !this.currencyFormat.isNegative(formattedValue) && this.currencyFormat.parse(formattedValue) !== 0) {
formattedValue = formattedValue.replace(this.currencyFormat.prefix, this.currencyFormat.negativePrefix);
}
if (this.minValue >= 0) {
formattedValue = formattedValue.replace(this.currencyFormat.negativePrefix, this.currencyFormat.prefix);
}
if (this.options.currencyDisplay === exports.CurrencyDisplay.hidden || (this.focus && this.options.hideCurrencySymbolOnFocus)) {
formattedValue = formattedValue
.replace(this.currencyFormat.negativePrefix, this.currencyFormat.minusSign !== undefined ? this.currencyFormat.minusSign : '(')
.replace(this.currencyFormat.negativeSuffix, this.currencyFormat.minusSign !== undefined ? '' : ')')
.replace(this.currencyFormat.prefix, '')
.replace(this.currencyFormat.suffix, '');
}
this.el.value = formattedValue;
this.numberValue = this.currencyFormat.parse(formattedValue);
}
else {
this.el.value = '';
this.numberValue = null;
}
this.formattedValue = this.el.value;
this.onInput(this.getValue());
}
addEventListener() {
this.el.addEventListener('input', (e) => {
const { value, selectionStart } = this.el;
const inputEvent = e;
if (selectionStart && inputEvent.data && DECIMAL_SEPARATORS.includes(inputEvent.data)) {
this.decimalSymbolInsertedAt = selectionStart - 1;
}
this.format(value);
if (this.focus && selectionStart != null) {
const getCaretPositionAfterFormat = () => {
const { prefix, suffix, decimalSymbol, maximumFractionDigits, groupingSymbol } = this.currencyFormat;
let caretPositionFromLeft = value.length - selectionStart;
const newValueLength = this.formattedValue.length;
if (this.currencyFormat.minusSign === undefined && (value.startsWith('(') || value.startsWith('-')) && !value.endsWith(')')) {
return newValueLength - this.currencyFormat.negativeSuffix.length > 1 ? this.formattedValue.substring(selectionStart).length : 1;
}
if (this.formattedValue.substr(selectionStart, 1) === groupingSymbol &&
count(this.formattedValue, groupingSymbol) === count(value, groupingSymbol) + 1) {
return newValueLength - caretPositionFromLeft - 1;
}
if (newValueLength < caretPositionFromLeft) {
return selectionStart;
}
if (decimalSymbol !== undefined && value.indexOf(decimalSymbol) !== -1) {
const decimalSymbolPosition = value.indexOf(decimalSymbol) + 1;
if (Math.abs(newValueLength - value.length) > 1 && selectionStart <= decimalSymbolPosition) {
return this.formattedValue.indexOf(decimalSymbol) + 1;
}
else {
if (!this.options.autoDecimalDigits && selectionStart > decimalSymbolPosition) {
if (this.currencyFormat.onlyDigits(value.substr(decimalSymbolPosition)).length - 1 === maximumFractionDigits) {
caretPositionFromLeft -= 1;
}
}
}
}
return this.options.hideCurrencySymbolOnFocus || this.options.currencyDisplay === exports.CurrencyDisplay.hidden
? newValueLength - caretPositionFromLeft
: Math.max(newValueLength - Math.max(caretPositionFromLeft, suffix.length), prefix.length);
};
this.setCaretPosition(getCaretPositionAfterFormat());
}
});
this.el.addEventListener('focus', () => {
this.focus = true;
this.numberValueOnFocus = this.numberValue;
setTimeout(() => {
const { value, selectionStart, selectionEnd } = this.el;
this.format(value, this.options.hideNegligibleDecimalDigitsOnFocus);
if (selectionStart != null && selectionEnd != null && Math.abs(selectionStart - selectionEnd) > 0) {
this.setCaretPosition(0, this.el.value.length);
}
else if (selectionStart != null) {
const caretPositionOnFocus = this.getCaretPositionOnFocus(value, selectionStart);
this.setCaretPosition(caretPositionOnFocus);
}
});
});
this.el.addEventListener('blur', () => {
this.focus = false;
this.format(this.currencyFormat.format(this.validateValueRange(this.numberValue)));
if (this.numberValueOnFocus !== this.numberValue) {
this.onChange(this.getValue());
}
});
}
getCaretPositionOnFocus(value, selectionStart) {
if (this.numberValue == null) {
return selectionStart;
}
const { prefix, negativePrefix, suffix, negativeSuffix, groupingSymbol, currency } = this.currencyFormat;
const isNegative = this.numberValue < 0;
const currentPrefix = isNegative ? negativePrefix : prefix;
const prefixLength = currentPrefix.length;
if (this.options.hideCurrencySymbolOnFocus || this.options.currencyDisplay === exports.CurrencyDisplay.hidden) {
if (isNegative) {
if (selectionStart <= 1) {
return 1;
}
else if (value.endsWith(')') && selectionStart > value.indexOf(')')) {
return this.formattedValue.length - 1;
}
}
}
else {
const suffixLength = isNegative ? negativeSuffix.length : suffix.length;
if (selectionStart >= value.length - suffixLength) {
return this.formattedValue.length - suffixLength;
}
else if (selectionStart < prefixLength) {
return prefixLength;
}
}
let result = selectionStart;
if (this.options.hideCurrencySymbolOnFocus &&
this.options.currencyDisplay !== exports.CurrencyDisplay.hidden &&
selectionStart >= prefixLength &&
currency !== undefined &&
currentPrefix.includes(currency)) {
result -= prefixLength;
if (isNegative) {
result += 1;
}
}
if (this.options.hideGroupingSeparatorOnFocus && groupingSymbol !== undefined) {
result -= count(value.substring(0, selectionStart), groupingSymbol);
}
return result;
}
setCaretPosition(start, end = start) {
this.el.setSelectionRange(start, end);
}
}
const findInput = (el) => ((el === null || el === void 0 ? void 0 : el.matches('input')) ? el : el === null || el === void 0 ? void 0 : el.querySelector('input'));
function useCurrencyInput(options, autoEmit) {
var _a, _b, _c, _d;
let currencyInput;
const inputRef = vue.ref(null);
const formattedValue = vue.ref(null);
const numberValue = vue.ref(null);
const vm = vue.getCurrentInstance();
const emit = (vm === null || vm === void 0 ? void 0 : vm.emit) || ((_b = (_a = vm === null || vm === void 0 ? void 0 : vm.proxy) === null || _a === void 0 ? void 0 : _a.$emit) === null || _b === void 0 ? void 0 : _b.bind(vm === null || vm === void 0 ? void 0 : vm.proxy));
const props = ((vm === null || vm === void 0 ? void 0 : vm.props) || ((_c = vm === null || vm === void 0 ? void 0 : vm.proxy) === null || _c === void 0 ? void 0 : _c.$props));
const isVue3 = vue.version.startsWith('3');
const lazyModel = isVue3 && ((_d = vm === null || vm === void 0 ? void 0 : vm.attrs.modelModifiers) === null || _d === void 0 ? void 0 : _d.lazy);
const modelValue = vue.computed(() => props === null || props === void 0 ? void 0 : props[isVue3 ? 'modelValue' : 'value']);
const inputEvent = isVue3 ? 'update:modelValue' : 'input';
const changeEvent = lazyModel ? 'update:modelValue' : 'change';
vue.watch(inputRef, (value) => {
var _a;
if (value) {
const el = findInput((_a = value === null || value === void 0 ? void 0 : value.$el) !== null && _a !== void 0 ? _a : value);
if (el) {
currencyInput = new CurrencyInput({
el,
options,
onInput: (value) => {
if (!lazyModel && autoEmit !== false && modelValue.value !== value.number) {
emit === null || emit === void 0 ? void 0 : emit(inputEvent, value.number);
}
numberValue.value = value.number;
formattedValue.value = value.formatted;
},
onChange: (value) => {
if (autoEmit !== false) {
emit === null || emit === void 0 ? void 0 : emit(changeEvent, value.number);
}
}
});
currencyInput.setValue(modelValue.value);
}
else {
console.error('No input element found. Please make sure that the "inputRef" template ref is properly assigned.');
}
}
else {
currencyInput = null;
}
});
return {
inputRef,
numberValue,
formattedValue,
setValue: (value) => currencyInput === null || currencyInput === void 0 ? void 0 : currencyInput.setValue(value),
setOptions: (options) => currencyInput === null || currencyInput === void 0 ? void 0 : currencyInput.setOptions(options)
};
}
exports.useCurrencyInput = useCurrencyInput;