@stemy/ngx-dynamic-form 19.9.8 → 19.9.10

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.
@@ -1,10 +1,10 @@
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, inject, Inject, Injectable, untracked, input, Renderer2, ElementRef, computed, signal, effect, HostBinding, Directive, Input, Pipe, Type, Component, output, Injector, ChangeDetectionStrategy, ViewEncapsulation, viewChild, makeEnvironmentProviders, NgModule } from '@angular/core';
1
3
  import * as i2 from '@stemy/ngx-utils';
2
4
  import { cachedFactory, ReflectUtils, ObjectUtils, LANGUAGE_SERVICE, ForbiddenZone, ArrayUtils, API_SERVICE, StringUtils, AsyncMethodBase, EventsService, NgxUtilsModule } from '@stemy/ngx-utils';
3
5
  import { of, merge, Observable, firstValueFrom, BehaviorSubject, combineLatestWith, switchMap, distinctUntilChanged, first, Subject, filter } from 'rxjs';
4
6
  import { debounceTime } from 'rxjs/operators';
5
7
  import { __decorate } from 'tslib';
6
- import * as i0 from '@angular/core';
7
- import { inject, Inject, Injectable, untracked, input, Renderer2, ElementRef, computed, signal, effect, HostBinding, Directive, Input, Pipe, Type, Component, output, Injector, ChangeDetectionStrategy, ViewEncapsulation, makeEnvironmentProviders, NgModule } from '@angular/core';
8
8
  import * as i1 from '@angular/forms';
9
9
  import { FormGroup as FormGroup$1, FormArray as FormArray$1, FormsModule, ReactiveFormsModule } from '@angular/forms';
10
10
  import { outputToObservable, toSignal, rxResource, outputFromObservable } from '@angular/core/rxjs-interop';
@@ -17,6 +17,8 @@ import { FormlySelectModule } from '@ngx-formly/core/select';
17
17
 
18
18
  // --- Basic frm constants ---
19
19
  const FORM_ROOT_ID = "__root";
20
+ // --- Module Configuration ---
21
+ const DEFAULT_NUMERIC_STEP = new InjectionToken("DEFAULT_NUMERIC_STEP");
20
22
 
21
23
  function customizeFormField(...providers) {
22
24
  const factory = cachedFactory(providers);
@@ -619,17 +621,20 @@ function getFormValidationErrors(controls, parentPath = "") {
619
621
  return errors;
620
622
  }
621
623
 
624
+ const customInputTypes = ["checkbox", "textarea", "wysiwyg", "password"];
622
625
  class DynamicFormBuilderService {
623
626
  injector;
624
627
  events;
625
628
  api;
626
629
  languages;
630
+ defaultNumericStep;
627
631
  language;
628
- constructor(injector, events, api, languages) {
632
+ constructor(injector, events, api, languages, defaultNumericStep) {
629
633
  this.injector = injector;
630
634
  this.events = events;
631
635
  this.api = api;
632
636
  this.languages = languages;
637
+ this.defaultNumericStep = defaultNumericStep;
633
638
  const lang = new BehaviorSubject(this.languages.currentLanguage);
634
639
  this.events.languageChanged.subscribe(value => lang.next(value));
635
640
  this.language = lang;
@@ -727,7 +732,7 @@ class DynamicFormBuilderService {
727
732
  type,
728
733
  autocomplete,
729
734
  pattern: ObjectUtils.isString(data.pattern) ? data.pattern : "",
730
- step: data.step,
735
+ step: convertToNumber(data.step, this.defaultNumericStep),
731
736
  cols: data.cols || null,
732
737
  rows: data.rows || 10,
733
738
  placeholder: data.placeholder || "",
@@ -755,7 +760,7 @@ class DynamicFormBuilderService {
755
760
  props.maxLength = isNaN(data.maxLength) ? MAX_INPUT_NUM : data.maxLength;
756
761
  break;
757
762
  }
758
- return this.createFormField(key, type === "checkbox" || type === "textarea" || type === "wysiwyg" ? type : "input", data, props, parent, options);
763
+ return this.createFormField(key, customInputTypes.includes(type) ? type : "input", data, props, parent, options);
759
764
  }
760
765
  createFormSelect(key, data, parent, options) {
761
766
  data = data || {};
@@ -1044,11 +1049,12 @@ class DynamicFormBuilderService {
1044
1049
  const idName = String(field.id || field.key || "").replace(/\./, "-");
1045
1050
  let baseName = `dynamic-form-fieldset dynamic-form-fieldset-${idName}`;
1046
1051
  if (!this.isFieldset(target)) {
1052
+ const labelAlign = target.props?.labelAlign || "before";
1047
1053
  const type = String(target.type || "group").replace("formly-", "");
1048
1054
  const typeName = ObjectUtils.isConstructor(type)
1049
1055
  ? `${target.type.name}`.toLowerCase().replace("component", "")
1050
1056
  : type;
1051
- baseName = `dynamic-form-field dynamic-form-field-${target.key} dynamic-form-${typeName}`;
1057
+ baseName = `dynamic-form-field dynamic-form-field-${target.key} dynamic-form-label-${labelAlign} dynamic-form-${typeName}`;
1052
1058
  }
1053
1059
  const classesName = Array.isArray(classes) ? classes : [classes];
1054
1060
  const layoutName = Array.isArray(layout) ? layout : [layout];
@@ -1078,7 +1084,7 @@ class DynamicFormBuilderService {
1078
1084
  });
1079
1085
  return field;
1080
1086
  }
1081
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: DynamicFormBuilderService, deps: [{ token: i0.Injector }, { token: i2.EventsService }, { token: API_SERVICE }, { token: LANGUAGE_SERVICE }], target: i0.ɵɵFactoryTarget.Injectable });
1087
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: DynamicFormBuilderService, deps: [{ token: i0.Injector }, { token: i2.EventsService }, { token: API_SERVICE }, { token: LANGUAGE_SERVICE }, { token: DEFAULT_NUMERIC_STEP }], target: i0.ɵɵFactoryTarget.Injectable });
1082
1088
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: DynamicFormBuilderService });
1083
1089
  }
1084
1090
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: DynamicFormBuilderService, decorators: [{
@@ -1089,6 +1095,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImpo
1089
1095
  }] }, { type: undefined, decorators: [{
1090
1096
  type: Inject,
1091
1097
  args: [LANGUAGE_SERVICE]
1098
+ }] }, { type: undefined, decorators: [{
1099
+ type: Inject,
1100
+ args: [DEFAULT_NUMERIC_STEP]
1092
1101
  }] }] });
1093
1102
 
1094
1103
  class DynamicFormSchemaService {
@@ -2123,6 +2132,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImpo
2123
2132
  args: [{ standalone: false, selector: "dynamic-form-chips", encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<chips [formControl]=\"formControl\"\n [type]=\"props.type\"\n [step]=\"props.step\"\n [minLength]=\"props.minLength\"\n [maxLength]=\"props.maxLength\"\n [min]=\"props.min\"\n [max]=\"props.max\"\n [multiple]=\"props.multiple\"\n [strict]=\"props.strict\"\n [options]=\"props.options | formlySelectOptions | async\"\n [testId]=\"field.testId\"\n [formlyAttributes]=\"field\">\n</chips>\n" }]
2124
2133
  }] });
2125
2134
 
2135
+ class DynamicFormPasswordComponent extends DynamicFieldType {
2136
+ type = signal("password");
2137
+ icon = computed(() => {
2138
+ return this.type() === "password" ? "eye" : "eye-slash";
2139
+ });
2140
+ input = viewChild.required("input");
2141
+ switchType() {
2142
+ const el = this.input().nativeElement;
2143
+ const start = el.selectionStart;
2144
+ const end = el.selectionEnd;
2145
+ this.type.update(value => value === "password" ? "text" : "password");
2146
+ requestAnimationFrame(() => {
2147
+ el.focus();
2148
+ el.setSelectionRange(start, end);
2149
+ });
2150
+ }
2151
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: DynamicFormPasswordComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
2152
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "19.2.19", type: DynamicFormPasswordComponent, isStandalone: false, selector: "dynamic-form-password", viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"form-password-group\">\n <input #input\n class=\"form-control\"\n [attr.type]=\"type()\"\n [attr.data-testid]=\"field.testId\"\n [formControl]=\"formControl\"\n [formlyAttributes]=\"field\" />\n <btn type=\"transparent\"\n [icon]=\"icon()\"\n [attr.data-testid]=\"field.testId + '-toggle'\"\n (mousedown)=\"switchType()\"></btn>\n</div>\n", styles: [".form-password-group{position:relative}.form-password-group btn{display:block;position:absolute;aspect-ratio:1;top:0;bottom:0;right:0}\n"], dependencies: [{ kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i2.BtnComponent, selector: "btn", inputs: ["label", "tooltip", "icon", "disabled", "type", "size"] }, { kind: "directive", type: i3.LegacyFormlyAttributes, selector: "[formlyAttributes]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2153
+ }
2154
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: DynamicFormPasswordComponent, decorators: [{
2155
+ type: Component,
2156
+ args: [{ standalone: false, selector: "dynamic-form-password", encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"form-password-group\">\n <input #input\n class=\"form-control\"\n [attr.type]=\"type()\"\n [attr.data-testid]=\"field.testId\"\n [formControl]=\"formControl\"\n [formlyAttributes]=\"field\" />\n <btn type=\"transparent\"\n [icon]=\"icon()\"\n [attr.data-testid]=\"field.testId + '-toggle'\"\n (mousedown)=\"switchType()\"></btn>\n</div>\n", styles: [".form-password-group{position:relative}.form-password-group btn{display:block;position:absolute;aspect-ratio:1;top:0;bottom:0;right:0}\n"] }]
2157
+ }] });
2158
+
2126
2159
  class DynamicFormStaticComponent extends DynamicFieldType {
2127
2160
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: DynamicFormStaticComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
2128
2161
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.19", type: DynamicFormStaticComponent, isStandalone: false, selector: "dynamic-form-chips", usesInheritance: true, ngImport: i0, template: "<unordered-list [listStyle]=\"props.style\" [ngClass]=\"{disabled: props.disabled}\"\n [data]=\"!props.properties ? {value: value} : props.properties | remap: value\">\n <ng-template [type]=\"!props.properties ? 'key' : null\" selector=\"level == 0\" let-item=\"item\"></ng-template>\n <ng-template type=\"value\" selector=\"valueType == 'date'\" let-item=\"item\">\n {{ item.value | date }}\n </ng-template>\n</unordered-list>\n", dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.UnorderedListTemplateDirective, selector: "ng-template[type][selector]", inputs: ["type", "selector"] }, { kind: "component", type: i2.UnorderedListComponent, selector: "unordered-list", inputs: ["data", "keyPrefix", "listStyle", "path", "level", "templates"] }, { kind: "pipe", type: i1$1.DatePipe, name: "date" }, { kind: "pipe", type: i2.RemapPipe, name: "remap" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
@@ -2235,6 +2268,7 @@ const components = [
2235
2268
  DynamicFormComponent,
2236
2269
  DynamicFormArrayComponent,
2237
2270
  DynamicFormChipsComponent,
2271
+ DynamicFormPasswordComponent,
2238
2272
  DynamicFormStaticComponent,
2239
2273
  DynamicFormTranslationComponent,
2240
2274
  DynamicFormUploadComponent,
@@ -2262,6 +2296,7 @@ class NgxDynamicFormModule {
2262
2296
  types: [
2263
2297
  { name: "array", component: DynamicFormArrayComponent },
2264
2298
  { name: "chips", component: DynamicFormChipsComponent },
2299
+ { name: "password", component: DynamicFormPasswordComponent },
2265
2300
  { name: "static", component: DynamicFormStaticComponent },
2266
2301
  { name: "translation", component: DynamicFormTranslationComponent },
2267
2302
  { name: "upload", component: DynamicFormUploadComponent },
@@ -2281,7 +2316,11 @@ class NgxDynamicFormModule {
2281
2316
  ...formlyConfigs,
2282
2317
  DynamicFormService,
2283
2318
  DynamicFormBuilderService,
2284
- DynamicFormSchemaService
2319
+ DynamicFormSchemaService,
2320
+ {
2321
+ provide: DEFAULT_NUMERIC_STEP,
2322
+ useValue: (config?.defaultNumericStep ?? 1)
2323
+ }
2285
2324
  ];
2286
2325
  }
2287
2326
  static forRoot(config) {
@@ -2294,12 +2333,12 @@ class NgxDynamicFormModule {
2294
2333
  return makeEnvironmentProviders(NgxDynamicFormModule.getProviders(config));
2295
2334
  }
2296
2335
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: NgxDynamicFormModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
2297
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.19", ngImport: i0, type: NgxDynamicFormModule, declarations: [DynamicFieldType, DynamicFormComponent, DynamicFormArrayComponent, DynamicFormChipsComponent, DynamicFormStaticComponent, DynamicFormTranslationComponent, DynamicFormUploadComponent, DynamicFormWysiwygComponent, DynamicFormAlertComponent, DynamicFormFieldComponent, DynamicFormFieldsetComponent, DynamicFormGroupComponent, AsyncSubmitDirective, DynamicFormTemplateDirective, DynamicFormTemplatePipe], imports: [CommonModule,
2336
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.19", ngImport: i0, type: NgxDynamicFormModule, declarations: [DynamicFieldType, DynamicFormComponent, DynamicFormArrayComponent, DynamicFormChipsComponent, DynamicFormPasswordComponent, DynamicFormStaticComponent, DynamicFormTranslationComponent, DynamicFormUploadComponent, DynamicFormWysiwygComponent, DynamicFormAlertComponent, DynamicFormFieldComponent, DynamicFormFieldsetComponent, DynamicFormGroupComponent, AsyncSubmitDirective, DynamicFormTemplateDirective, DynamicFormTemplatePipe], imports: [CommonModule,
2298
2337
  FormsModule,
2299
2338
  ReactiveFormsModule,
2300
2339
  NgxUtilsModule,
2301
2340
  FormlyModule,
2302
- FormlySelectModule], exports: [DynamicFieldType, DynamicFormComponent, DynamicFormArrayComponent, DynamicFormChipsComponent, DynamicFormStaticComponent, DynamicFormTranslationComponent, DynamicFormUploadComponent, DynamicFormWysiwygComponent, DynamicFormAlertComponent, DynamicFormFieldComponent, DynamicFormFieldsetComponent, DynamicFormGroupComponent, AsyncSubmitDirective, DynamicFormTemplateDirective, DynamicFormTemplatePipe, FormsModule,
2341
+ FormlySelectModule], exports: [DynamicFieldType, DynamicFormComponent, DynamicFormArrayComponent, DynamicFormChipsComponent, DynamicFormPasswordComponent, DynamicFormStaticComponent, DynamicFormTranslationComponent, DynamicFormUploadComponent, DynamicFormWysiwygComponent, DynamicFormAlertComponent, DynamicFormFieldComponent, DynamicFormFieldsetComponent, DynamicFormGroupComponent, AsyncSubmitDirective, DynamicFormTemplateDirective, DynamicFormTemplatePipe, FormsModule,
2303
2342
  ReactiveFormsModule,
2304
2343
  NgxUtilsModule,
2305
2344
  FormlyModule,
@@ -2353,5 +2392,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImpo
2353
2392
  * Generated bundle index. Do not edit.
2354
2393
  */
2355
2394
 
2356
- export { AsyncSubmitDirective, DynamicFieldType, DynamicFormAlertComponent, DynamicFormArrayComponent, DynamicFormBuilderService, DynamicFormChipsComponent, DynamicFormComponent, DynamicFormFieldComponent, DynamicFormFieldsetComponent, DynamicFormGroupComponent, DynamicFormSchemaService, DynamicFormService, DynamicFormStaticComponent, DynamicFormTemplateDirective, DynamicFormTemplatePipe, DynamicFormTemplateService, DynamicFormTranslationComponent, DynamicFormUploadComponent, DynamicFormWysiwygComponent, EDITOR_FORMATS, FORM_ROOT_ID, FormArray, FormFieldSet, FormGroup, FormInput, FormSelect, FormSerializable, FormStatic, FormUpload, MAX_INPUT_NUM, MIN_INPUT_NUM, NgxDynamicFormModule, RichTranslationModel, TranslationModel, addFieldValidators, arrayLengthValidation, clearFieldArray, controlStatus, controlValues, convertToDate, convertToDateFormat, convertToNumber, customizeFormField, emailValidation, getFieldByPath, getFieldsByKey, getFieldsByPredicate, getSelectOptions, insertToFieldArray, isFieldHidden, isFieldVisible, jsonValidation, maxLengthValidation, maxValueValidation, minLengthValidation, minValueValidation, phoneValidation, removeFieldValidators, removeFromFieldArray, replaceFieldArray, replaceSpecialChars, requiredValidation, setFieldDefault, setFieldDisabled, setFieldHidden, setFieldHooks, setFieldMinDate, setFieldProp, setFieldProps, setFieldSerialize, setFieldValue, translationValidation };
2395
+ export { AsyncSubmitDirective, DEFAULT_NUMERIC_STEP, DynamicFieldType, DynamicFormAlertComponent, DynamicFormArrayComponent, DynamicFormBuilderService, DynamicFormChipsComponent, DynamicFormComponent, DynamicFormFieldComponent, DynamicFormFieldsetComponent, DynamicFormGroupComponent, DynamicFormPasswordComponent, DynamicFormSchemaService, DynamicFormService, DynamicFormStaticComponent, DynamicFormTemplateDirective, DynamicFormTemplatePipe, DynamicFormTemplateService, DynamicFormTranslationComponent, DynamicFormUploadComponent, DynamicFormWysiwygComponent, EDITOR_FORMATS, FORM_ROOT_ID, FormArray, FormFieldSet, FormGroup, FormInput, FormSelect, FormSerializable, FormStatic, FormUpload, MAX_INPUT_NUM, MIN_INPUT_NUM, NgxDynamicFormModule, RichTranslationModel, TranslationModel, addFieldValidators, arrayLengthValidation, clearFieldArray, controlStatus, controlValues, convertToDate, convertToDateFormat, convertToNumber, customizeFormField, emailValidation, getFieldByPath, getFieldsByKey, getFieldsByPredicate, getSelectOptions, insertToFieldArray, isFieldHidden, isFieldVisible, jsonValidation, maxLengthValidation, maxValueValidation, minLengthValidation, minValueValidation, phoneValidation, removeFieldValidators, removeFromFieldArray, replaceFieldArray, replaceSpecialChars, requiredValidation, setFieldDefault, setFieldDisabled, setFieldHidden, setFieldHooks, setFieldMinDate, setFieldProp, setFieldProps, setFieldSerialize, setFieldValue, translationValidation };
2357
2396
  //# sourceMappingURL=stemy-ngx-dynamic-form.mjs.map