@stemy/ngx-dynamic-form 19.9.8 → 19.9.9
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.
- package/fesm2022/stemy-ngx-dynamic-form.mjs +48 -10
- package/fesm2022/stemy-ngx-dynamic-form.mjs.map +1 -1
- package/ngx-dynamic-form/common-types.d.ts +3 -1
- package/ngx-dynamic-form/components/dynamic-form-password/dynamic-form-password.component.d.ts +11 -0
- package/ngx-dynamic-form/ngx-dynamic-form.imports.d.ts +1 -1
- package/ngx-dynamic-form/ngx-dynamic-form.module.d.ts +18 -17
- package/ngx-dynamic-form/services/dynamic-form-builder.service.d.ts +2 -1
- package/package.json +1 -1
- package/public_api.d.ts +2 -1
|
@@ -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
|
|
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 || {};
|
|
@@ -1078,7 +1083,7 @@ class DynamicFormBuilderService {
|
|
|
1078
1083
|
});
|
|
1079
1084
|
return field;
|
|
1080
1085
|
}
|
|
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 });
|
|
1086
|
+
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
1087
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: DynamicFormBuilderService });
|
|
1083
1088
|
}
|
|
1084
1089
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: DynamicFormBuilderService, decorators: [{
|
|
@@ -1089,6 +1094,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImpo
|
|
|
1089
1094
|
}] }, { type: undefined, decorators: [{
|
|
1090
1095
|
type: Inject,
|
|
1091
1096
|
args: [LANGUAGE_SERVICE]
|
|
1097
|
+
}] }, { type: undefined, decorators: [{
|
|
1098
|
+
type: Inject,
|
|
1099
|
+
args: [DEFAULT_NUMERIC_STEP]
|
|
1092
1100
|
}] }] });
|
|
1093
1101
|
|
|
1094
1102
|
class DynamicFormSchemaService {
|
|
@@ -2123,6 +2131,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImpo
|
|
|
2123
2131
|
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
2132
|
}] });
|
|
2125
2133
|
|
|
2134
|
+
class DynamicFormPasswordComponent extends DynamicFieldType {
|
|
2135
|
+
type = signal("password");
|
|
2136
|
+
icon = computed(() => {
|
|
2137
|
+
return this.type() === "password" ? "eye" : "eye-slash";
|
|
2138
|
+
});
|
|
2139
|
+
input = viewChild.required("input");
|
|
2140
|
+
switchType() {
|
|
2141
|
+
const el = this.input().nativeElement;
|
|
2142
|
+
const start = el.selectionStart;
|
|
2143
|
+
const end = el.selectionEnd;
|
|
2144
|
+
this.type.update(value => value === "password" ? "text" : "password");
|
|
2145
|
+
requestAnimationFrame(() => {
|
|
2146
|
+
el.focus();
|
|
2147
|
+
el.setSelectionRange(start, end);
|
|
2148
|
+
});
|
|
2149
|
+
}
|
|
2150
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: DynamicFormPasswordComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
2151
|
+
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 });
|
|
2152
|
+
}
|
|
2153
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: DynamicFormPasswordComponent, decorators: [{
|
|
2154
|
+
type: Component,
|
|
2155
|
+
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"] }]
|
|
2156
|
+
}] });
|
|
2157
|
+
|
|
2126
2158
|
class DynamicFormStaticComponent extends DynamicFieldType {
|
|
2127
2159
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.19", ngImport: i0, type: DynamicFormStaticComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
2128
2160
|
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 +2267,7 @@ const components = [
|
|
|
2235
2267
|
DynamicFormComponent,
|
|
2236
2268
|
DynamicFormArrayComponent,
|
|
2237
2269
|
DynamicFormChipsComponent,
|
|
2270
|
+
DynamicFormPasswordComponent,
|
|
2238
2271
|
DynamicFormStaticComponent,
|
|
2239
2272
|
DynamicFormTranslationComponent,
|
|
2240
2273
|
DynamicFormUploadComponent,
|
|
@@ -2262,6 +2295,7 @@ class NgxDynamicFormModule {
|
|
|
2262
2295
|
types: [
|
|
2263
2296
|
{ name: "array", component: DynamicFormArrayComponent },
|
|
2264
2297
|
{ name: "chips", component: DynamicFormChipsComponent },
|
|
2298
|
+
{ name: "password", component: DynamicFormPasswordComponent },
|
|
2265
2299
|
{ name: "static", component: DynamicFormStaticComponent },
|
|
2266
2300
|
{ name: "translation", component: DynamicFormTranslationComponent },
|
|
2267
2301
|
{ name: "upload", component: DynamicFormUploadComponent },
|
|
@@ -2281,7 +2315,11 @@ class NgxDynamicFormModule {
|
|
|
2281
2315
|
...formlyConfigs,
|
|
2282
2316
|
DynamicFormService,
|
|
2283
2317
|
DynamicFormBuilderService,
|
|
2284
|
-
DynamicFormSchemaService
|
|
2318
|
+
DynamicFormSchemaService,
|
|
2319
|
+
{
|
|
2320
|
+
provide: DEFAULT_NUMERIC_STEP,
|
|
2321
|
+
useValue: (config?.defaultNumericStep ?? 1)
|
|
2322
|
+
}
|
|
2285
2323
|
];
|
|
2286
2324
|
}
|
|
2287
2325
|
static forRoot(config) {
|
|
@@ -2294,12 +2332,12 @@ class NgxDynamicFormModule {
|
|
|
2294
2332
|
return makeEnvironmentProviders(NgxDynamicFormModule.getProviders(config));
|
|
2295
2333
|
}
|
|
2296
2334
|
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,
|
|
2335
|
+
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
2336
|
FormsModule,
|
|
2299
2337
|
ReactiveFormsModule,
|
|
2300
2338
|
NgxUtilsModule,
|
|
2301
2339
|
FormlyModule,
|
|
2302
|
-
FormlySelectModule], exports: [DynamicFieldType, DynamicFormComponent, DynamicFormArrayComponent, DynamicFormChipsComponent, DynamicFormStaticComponent, DynamicFormTranslationComponent, DynamicFormUploadComponent, DynamicFormWysiwygComponent, DynamicFormAlertComponent, DynamicFormFieldComponent, DynamicFormFieldsetComponent, DynamicFormGroupComponent, AsyncSubmitDirective, DynamicFormTemplateDirective, DynamicFormTemplatePipe, FormsModule,
|
|
2340
|
+
FormlySelectModule], exports: [DynamicFieldType, DynamicFormComponent, DynamicFormArrayComponent, DynamicFormChipsComponent, DynamicFormPasswordComponent, DynamicFormStaticComponent, DynamicFormTranslationComponent, DynamicFormUploadComponent, DynamicFormWysiwygComponent, DynamicFormAlertComponent, DynamicFormFieldComponent, DynamicFormFieldsetComponent, DynamicFormGroupComponent, AsyncSubmitDirective, DynamicFormTemplateDirective, DynamicFormTemplatePipe, FormsModule,
|
|
2303
2341
|
ReactiveFormsModule,
|
|
2304
2342
|
NgxUtilsModule,
|
|
2305
2343
|
FormlyModule,
|
|
@@ -2353,5 +2391,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImpo
|
|
|
2353
2391
|
* Generated bundle index. Do not edit.
|
|
2354
2392
|
*/
|
|
2355
2393
|
|
|
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 };
|
|
2394
|
+
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
2395
|
//# sourceMappingURL=stemy-ngx-dynamic-form.mjs.map
|