@valtimo/components 13.50.1 → 13.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -53,7 +53,7 @@ import { ComponentPortal, TemplatePortal } from '@angular/cdk/portal';
53
53
  import { trigger, transition, style, animate } from '@angular/animations';
54
54
  import * as i1$6 from '@angular/cdk/overlay';
55
55
  import { OverlayModule, Overlay } from '@angular/cdk/overlay';
56
- import Currency from '@tadashi/currency';
56
+ import AutoNumeric from 'autonumeric';
57
57
  import flatpickr from 'flatpickr';
58
58
  import { Dutch } from 'flatpickr/dist/l10n/nl';
59
59
  import createDOMPurify from 'dompurify';
@@ -10894,15 +10894,19 @@ class FormioComponent {
10894
10894
  this.options$.next(optionsValue);
10895
10895
  }
10896
10896
  set submission(submissionValue) {
10897
+ this.releaseSubmit();
10897
10898
  this.submission$.next(submissionValue);
10898
10899
  }
10899
10900
  set form(formValue) {
10901
+ this.releaseSubmit();
10900
10902
  this._form$.next(formValue);
10901
10903
  }
10902
10904
  set readOnly(readOnlyValue) {
10903
10905
  this.readOnly$.next(readOnlyValue);
10904
10906
  }
10905
10907
  set errors(errorsValue) {
10908
+ if (errorsValue?.length)
10909
+ this.failSubmit();
10906
10910
  this.errors$.next(errorsValue ?? []);
10907
10911
  }
10908
10912
  handleBeforeUnload() {
@@ -10920,6 +10924,7 @@ class FormioComponent {
10920
10924
  this.tagsService = tagsService;
10921
10925
  this.injector = injector;
10922
10926
  this.formioTranslationService = formioTranslationService;
10927
+ this.preventDoubleSubmit = false;
10923
10928
  // eslint-disable-next-line @angular-eslint/no-output-native
10924
10929
  this.submit = new EventEmitter();
10925
10930
  // eslint-disable-next-line @angular-eslint/no-output-native
@@ -10961,6 +10966,8 @@ class FormioComponent {
10961
10966
  this.tokenReady$ = this._storeTokenInLocalStorage
10962
10967
  ? this.localStorageService.tokenSetInLocalStorage$
10963
10968
  : this._inMemoryTokenSet$.asObservable();
10969
+ this._formioSource = null;
10970
+ this._submitting = false;
10964
10971
  this._subscriptions = new Subscription();
10965
10972
  this._tokenTimerSubscription = new Subscription();
10966
10973
  this.setOverrideOptions(this.configService.config);
@@ -10990,13 +10997,22 @@ class FormioComponent {
10990
10997
  this.localStorageService.clearTokenFromLocalStorage();
10991
10998
  }
10992
10999
  showErrors(errors) {
11000
+ this.failSubmit();
10993
11001
  this.errors$.next(errors);
10994
11002
  }
10995
11003
  onSubmit(submission) {
11004
+ if (this._submitting)
11005
+ return;
11006
+ if (this.preventDoubleSubmit && this.submit.observed)
11007
+ this._submitting = true;
10996
11008
  this.errors$.next([]);
10997
11009
  this.submit.emit(submission);
10998
11010
  }
11011
+ releaseSubmit() {
11012
+ this._submitting = false;
11013
+ }
10999
11014
  formReady(form) {
11015
+ this._formioSource = form;
11000
11016
  this.stateService.currentForm = form;
11001
11017
  }
11002
11018
  onChange(object) {
@@ -11011,6 +11027,12 @@ class FormioComponent {
11011
11027
  prevPage() {
11012
11028
  this.scrollToTop();
11013
11029
  }
11030
+ failSubmit() {
11031
+ if (!this._submitting)
11032
+ return;
11033
+ this.releaseSubmit();
11034
+ this._formioSource?.formio?.emit('submitError', '');
11035
+ }
11014
11036
  openReloadFormSubscription() {
11015
11037
  this._subscriptions.add(this.form$.subscribe(form => {
11016
11038
  this.refreshForm.emit({
@@ -11091,7 +11113,7 @@ class FormioComponent {
11091
11113
  this._overrideOptions$.next(config.formioOptions);
11092
11114
  }
11093
11115
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: FormioComponent, deps: [{ token: i6$1.UserProviderService }, { token: i4.NGXLogger }, { token: FormIoStateService }, { token: i1$3.ActivatedRoute }, { token: i1.TranslateService }, { token: FormIoLocalStorageService }, { token: ValtimoModalService }, { token: i1$2.ConfigService }, { token: FormIoTagsService }, { token: i0.Injector }, { token: FormioTranslationService }], target: i0.ɵɵFactoryTarget.Component }); }
11094
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: FormioComponent, isStandalone: false, selector: "valtimo-form-io", inputs: { options: "options", submission: "submission", form: "form", readOnly: "readOnly", errors: "errors", formRefresh$: "formRefresh$" }, outputs: { submit: "submit", change: "change", event: "event" }, host: { listeners: { "window:beforeunload": "handleBeforeUnload($event)" } }, providers: [FormIoLocalStorageService], usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n class=\"formio-carbon\"\n cdsLayer=\"1\"\n *ngIf=\"{\n currentLanguage: currentLanguage$ | async,\n formioOptions: formioOptions$ | async,\n renderOptions: renderOptions$ | async,\n submission: submission$ | async,\n readOnly: readOnly$ | async,\n form: form$ | async,\n errors: errors$ | async,\n tokenReady: tokenReady$ | async,\n } as obs\"\n>\n <div *ngIf=\"obs.errors.length > 0\" class=\"alert alert-danger pt-5 pb-5 mb-2\">\n <ol>\n <li *ngFor=\"let error of obs.errors\">\n {{ error }}\n </li>\n </ol>\n </div>\n\n <formio\n *ngIf=\"obs.formioOptions && obs.form && obs.tokenReady\"\n [form]=\"obs.form\"\n [language]=\"languageEventEmitter\"\n [options]=\"obs.formioOptions\"\n [readOnly]=\"obs.readOnly\"\n [refresh]=\"refreshForm\"\n [renderOptions]=\"obs.renderOptions\"\n [submission]=\"obs.submission\"\n (change)=\"onChange($event)\"\n (nextPage)=\"nextPage()\"\n (prevPage)=\"prevPage()\"\n (ready)=\"formReady($event)\"\n (submit)=\"onSubmit($event)\"\n (customEvent)=\"onCustomEvent($event)\"\n ></formio>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i9.FormioComponent, selector: "formio" }, { kind: "directive", type: i2$3.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }] }); }
11116
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: FormioComponent, isStandalone: false, selector: "valtimo-form-io", inputs: { options: "options", submission: "submission", form: "form", readOnly: "readOnly", errors: "errors", formRefresh$: "formRefresh$", preventDoubleSubmit: "preventDoubleSubmit" }, outputs: { submit: "submit", change: "change", event: "event" }, host: { listeners: { "window:beforeunload": "handleBeforeUnload($event)" } }, providers: [FormIoLocalStorageService], usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div\n class=\"formio-carbon\"\n cdsLayer=\"1\"\n *ngIf=\"{\n currentLanguage: currentLanguage$ | async,\n formioOptions: formioOptions$ | async,\n renderOptions: renderOptions$ | async,\n submission: submission$ | async,\n readOnly: readOnly$ | async,\n form: form$ | async,\n errors: errors$ | async,\n tokenReady: tokenReady$ | async,\n } as obs\"\n>\n <div *ngIf=\"obs.errors.length > 0\" class=\"alert alert-danger pt-5 pb-5 mb-2\">\n <ol>\n <li *ngFor=\"let error of obs.errors\">\n {{ error }}\n </li>\n </ol>\n </div>\n\n <formio\n *ngIf=\"obs.formioOptions && obs.form && obs.tokenReady\"\n [form]=\"obs.form\"\n [language]=\"languageEventEmitter\"\n [options]=\"obs.formioOptions\"\n [readOnly]=\"obs.readOnly\"\n [refresh]=\"refreshForm\"\n [renderOptions]=\"obs.renderOptions\"\n [submission]=\"obs.submission\"\n (change)=\"onChange($event)\"\n (nextPage)=\"nextPage()\"\n (prevPage)=\"prevPage()\"\n (ready)=\"formReady($event)\"\n (submit)=\"onSubmit($event)\"\n (customEvent)=\"onCustomEvent($event)\"\n ></formio>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i9.FormioComponent, selector: "formio" }, { kind: "directive", type: i2$3.LayerDirective, selector: "[cdsLayer], [ibmLayer]", inputs: ["ibmLayer", "cdsLayer"], exportAs: ["layer"] }, { kind: "pipe", type: i1$4.AsyncPipe, name: "async" }] }); }
11095
11117
  }
11096
11118
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: FormioComponent, decorators: [{
11097
11119
  type: Component,
@@ -11108,6 +11130,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
11108
11130
  type: Input
11109
11131
  }], formRefresh$: [{
11110
11132
  type: Input
11133
+ }], preventDoubleSubmit: [{
11134
+ type: Input
11111
11135
  }], submit: [{
11112
11136
  type: Output
11113
11137
  }], change: [{
@@ -12878,108 +12902,134 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImpo
12878
12902
  * See the License for the specific language governing permissions and
12879
12903
  * limitations under the License.
12880
12904
  */
12905
+ const DEFAULT_LOCALE = 'nl-NL';
12906
+ const DEFAULT_CURRENCY = 'EUR';
12907
+ const RAW_VALUE_MODIFIED_EVENT = 'autoNumeric:rawValueModified';
12881
12908
  /**
12882
12909
  * Custom formio component for currency number.
12883
12910
  */
12884
12911
  class FormIoCurrencyComponent {
12885
12912
  constructor() {
12886
- this.currencyForm = new FormGroup({
12887
- currencyValue: new FormControl(''),
12888
- });
12889
12913
  this._value = null;
12890
12914
  this.valueChange = new EventEmitter();
12891
- this._subscriptions = new Subscription();
12915
+ this._disabled = false;
12916
+ this._autoNumeric = null;
12917
+ this._rendering = false;
12918
+ this._rawValueModifiedListener = () => this.onRawValueModified();
12892
12919
  }
12893
12920
  get value() {
12894
12921
  return this._value;
12895
12922
  }
12896
12923
  set value(value) {
12897
- this._value = value;
12898
- // Rendering only — emitting here would write the rendered value back over the one form.io
12899
- // is about to hand a freshly redrawn component.
12900
- this.currencyForm.setValue({
12901
- currencyValue: Currency.masking(value, this.maskOpts),
12902
- }, { emitEvent: false });
12924
+ this._value = typeof value === 'number' ? value : null;
12925
+ this.renderValue();
12926
+ }
12927
+ get disabled() {
12928
+ return this._disabled;
12903
12929
  }
12904
12930
  set disabled(value) {
12905
- if (value) {
12906
- this.currencyForm.disable({ emitEvent: false });
12931
+ this._disabled = !!value;
12932
+ }
12933
+ ngAfterViewInit() {
12934
+ const element = this.currencyElement.nativeElement;
12935
+ this._autoNumeric = new AutoNumeric(element, this.autoNumericOptions);
12936
+ element.addEventListener(RAW_VALUE_MODIFIED_EVENT, this._rawValueModifiedListener);
12937
+ this.renderValue();
12938
+ }
12939
+ ngOnChanges(changes) {
12940
+ if (this._autoNumeric &&
12941
+ (changes.currencyLocale || changes.currencyCurrency || changes.allowEmptyValue)) {
12942
+ this.withoutEmitting(() => this._autoNumeric.update(this.autoNumericOptions));
12943
+ this.renderValue();
12907
12944
  }
12908
- else {
12909
- this.currencyForm.enable({ emitEvent: false });
12945
+ }
12946
+ ngOnDestroy() {
12947
+ if (!this._autoNumeric) {
12948
+ return;
12910
12949
  }
12950
+ this.currencyElement.nativeElement.removeEventListener(RAW_VALUE_MODIFIED_EVENT, this._rawValueModifiedListener);
12951
+ this._autoNumeric.remove();
12952
+ this._autoNumeric = null;
12911
12953
  }
12912
- // A fresh object every call: Currency's constructor sets viaInput on the options it is handed.
12913
- get maskOpts() {
12954
+ /**
12955
+ * Derives the AutoNumeric formatting from the Intl formatting of the configured locale and
12956
+ * currency, so the input renders amounts exactly as that locale writes them.
12957
+ */
12958
+ get autoNumericOptions() {
12959
+ const formatter = new Intl.NumberFormat(this.currencyLocale || DEFAULT_LOCALE, {
12960
+ style: 'currency',
12961
+ currency: this.currencyCurrency || DEFAULT_CURRENCY,
12962
+ });
12963
+ const parts = formatter.formatToParts(-1234567.89);
12964
+ const partValue = (type) => parts.find(part => part.type === type)?.value ?? '';
12965
+ const indexOf = (type) => parts.findIndex(part => part.type === type);
12966
+ const currencyIndex = indexOf('currency');
12967
+ const firstIntegerIndex = indexOf('integer');
12968
+ const minusSignIndex = indexOf('minusSign');
12969
+ const currencyIsPrefix = currencyIndex < firstIntegerIndex;
12970
+ const spacing = parts[currencyIsPrefix ? currencyIndex + 1 : currencyIndex - 1];
12971
+ const literal = spacing?.type === 'literal' ? spacing.value : '';
12972
+ const currencySymbol = currencyIsPrefix
12973
+ ? `${partValue('currency')}${literal}`
12974
+ : `${literal}${partValue('currency')}`;
12975
+ const negativePositiveSignPlacement = currencyIsPrefix
12976
+ ? minusSignIndex < currencyIndex
12977
+ ? 'l'
12978
+ : 'r'
12979
+ : minusSignIndex < firstIntegerIndex
12980
+ ? 'p'
12981
+ : minusSignIndex < currencyIndex
12982
+ ? 'l'
12983
+ : 's';
12914
12984
  return {
12915
- empty: this.allowEmptyValue || false,
12916
- locales: this.currencyLocale || 'nl-NL',
12917
- digits: 2,
12918
- options: {
12919
- style: 'currency',
12920
- currency: this.currencyCurrency || 'EUR',
12921
- },
12985
+ currencySymbol,
12986
+ currencySymbolPlacement: currencyIsPrefix ? 'p' : 's',
12987
+ negativePositiveSignPlacement,
12988
+ digitGroupSeparator: partValue('group'),
12989
+ decimalCharacter: partValue('decimal') || '.',
12990
+ decimalPlaces: formatter.resolvedOptions().maximumFractionDigits,
12991
+ emptyInputBehavior: 'always',
12992
+ modifyValueOnWheel: false,
12922
12993
  };
12923
12994
  }
12924
- ngOnInit() {
12925
- this._subscriptions.add(this.currencyForm.valueChanges.subscribe(() => {
12926
- // No mask yet: the value is being rendered, not typed, so there is nothing to write back.
12927
- if (!this._currencyInstance) {
12928
- return;
12929
- }
12930
- const unmasked = this._currencyInstance.getUnmasked(this.currencyForm.value.currencyValue);
12931
- if (unmasked === 0 && this.allowEmptyValue) {
12932
- this._value = null;
12933
- this.valueChange.emit(null);
12995
+ onRawValueModified() {
12996
+ if (this._rendering || !this._autoNumeric) {
12997
+ return;
12998
+ }
12999
+ const numericString = this._autoNumeric.getNumericString();
13000
+ const isEmpty = numericString === null || numericString === '';
13001
+ const value = isEmpty ? (this.allowEmptyValue ? null : 0) : Number(numericString);
13002
+ this._value = value;
13003
+ this.valueChange.emit(value);
13004
+ }
13005
+ renderValue() {
13006
+ if (!this._autoNumeric) {
13007
+ return;
13008
+ }
13009
+ this.withoutEmitting(() => {
13010
+ if (typeof this._value === 'number') {
13011
+ this._autoNumeric.set(this._value);
12934
13012
  }
12935
13013
  else {
12936
- this._value = unmasked;
12937
- this.valueChange.emit(unmasked);
13014
+ this._autoNumeric.clear();
12938
13015
  }
12939
- }));
12940
- }
12941
- ngOnDestroy() {
12942
- this._subscriptions.unsubscribe();
12943
- }
12944
- ngAfterViewInit() {
12945
- this._currencyInstance = new Currency(this.currencyElement.nativeElement, {
12946
- maskOpts: this.maskOpts,
12947
13016
  });
12948
- // A value can arrive before the view exists, so its render is redone here with the mask in
12949
- // place.
12950
- if (typeof this._value === 'number') {
12951
- this.renderValue();
12952
- }
12953
13017
  }
12954
- ngOnChanges(changes) {
12955
- if (changes.currencyLocale || changes.currencyCurrency || changes.allowEmptyValue) {
12956
- // ngOnChanges runs before ngAfterViewInit, which is where the mask is created from the
12957
- // current inputs, so there is nothing to update yet on the first run.
12958
- if (this._currencyInstance) {
12959
- if (typeof this.currencyLocale === 'string') {
12960
- this._currencyInstance.opts.maskOpts.locales = this.currencyLocale;
12961
- }
12962
- if (typeof this.currencyCurrency === 'string') {
12963
- this._currencyInstance.opts.maskOpts.options.currency = this.currencyCurrency;
12964
- }
12965
- if (typeof this.allowEmptyValue === 'boolean') {
12966
- this._currencyInstance.opts.maskOpts.empty = this.allowEmptyValue;
12967
- }
12968
- }
12969
- this.renderValue();
13018
+ withoutEmitting(action) {
13019
+ this._rendering = true;
13020
+ try {
13021
+ action();
13022
+ }
13023
+ finally {
13024
+ this._rendering = false;
12970
13025
  }
12971
- }
12972
- renderValue() {
12973
- this.currencyForm.setValue({
12974
- currencyValue: typeof this._value === 'number' ? Currency.masking(this._value, this.maskOpts) : '',
12975
- }, { emitEvent: false });
12976
13026
  }
12977
13027
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: FormIoCurrencyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12978
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: FormIoCurrencyComponent, isStandalone: false, selector: "valtimo-currency", inputs: { value: "value", disabled: "disabled", currencyLocale: "currencyLocale", currencyCurrency: "currencyCurrency", allowEmptyValue: "allowEmptyValue" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "currencyElement", first: true, predicate: ["currencyElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"currencyForm-container\" [formGroup]=\"currencyForm\">\n <div class=\"input-group\">\n <input #currencyElement id=\"currency\" formControlName=\"currencyValue\" class=\"form-control\" />\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] }); }
13028
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.25", type: FormIoCurrencyComponent, isStandalone: false, selector: "valtimo-currency", inputs: { value: "value", disabled: "disabled", currencyLocale: "currencyLocale", currencyCurrency: "currencyCurrency", allowEmptyValue: "allowEmptyValue" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "currencyElement", first: true, predicate: ["currencyElement"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"currencyForm-container\">\n <div class=\"input-group\">\n <input\n #currencyElement\n id=\"currency\"\n class=\"form-control\"\n inputmode=\"decimal\"\n [disabled]=\"disabled\"\n />\n </div>\n</div>\n" }); }
12979
13029
  }
12980
13030
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: FormIoCurrencyComponent, decorators: [{
12981
13031
  type: Component,
12982
- args: [{ selector: 'valtimo-currency', standalone: false, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"currencyForm-container\" [formGroup]=\"currencyForm\">\n <div class=\"input-group\">\n <input #currencyElement id=\"currency\" formControlName=\"currencyValue\" class=\"form-control\" />\n </div>\n</div>\n" }]
13032
+ args: [{ selector: 'valtimo-currency', standalone: false, template: "<!--\n ~ Copyright 2015-2025 Ritense BV, the Netherlands.\n ~\n ~ Licensed under EUPL, Version 1.2 (the \"License\");\n ~ you may not use this file except in compliance with the License.\n ~ You may obtain a copy of the License at\n ~\n ~ https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12\n ~\n ~ Unless required by applicable law or agreed to in writing, software\n ~ distributed under the License is distributed on an \"AS IS\" basis,\n ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n ~ See the License for the specific language governing permissions and\n ~ limitations under the License.\n -->\n\n<div class=\"currencyForm-container\">\n <div class=\"input-group\">\n <input\n #currencyElement\n id=\"currency\"\n class=\"form-control\"\n inputmode=\"decimal\"\n [disabled]=\"disabled\"\n />\n </div>\n</div>\n" }]
12983
13033
  }], propDecorators: { currencyElement: [{
12984
13034
  type: ViewChild,
12985
13035
  args: ['currencyElement']