@stemy/ngx-dynamic-form 19.5.11 → 19.6.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.
@@ -324,13 +324,6 @@ function setFieldHooks(field, hooks) {
324
324
  : hooks[name];
325
325
  });
326
326
  }
327
- function additionalFieldValue(field, path) {
328
- return ObjectUtils.getValue(field.additional, path, null, false);
329
- }
330
- function additionalFieldValues(field, values) {
331
- const additional = field.props?.additional || {};
332
- setFieldProp(field, "additional", ObjectUtils.assign(additional, values || {}));
333
- }
334
327
  const MIN_INPUT_NUM = -1999999999;
335
328
  const MAX_INPUT_NUM = 1999999999;
336
329
  const EDITOR_FORMATS = ["php", "json", "html", "css", "scss"];
@@ -401,15 +394,6 @@ function convertToDate(value) {
401
394
  function handleConfigs(configs) {
402
395
  return Array.isArray(configs) ? configs : [configs];
403
396
  }
404
- function isStringWithVal(val) {
405
- return typeof val == "string" && val.length > 0;
406
- }
407
- function findRefs(property) {
408
- const refs = Array.isArray(property.allOf)
409
- ? property.allOf.map(o => o.$ref).filter(isStringWithVal)
410
- : [property.items?.$ref, property.$ref].filter(isStringWithVal);
411
- return refs.map(t => t.split("/").pop());
412
- }
413
397
  function arrayItemActionToExpression(actionName) {
414
398
  return (field) => {
415
399
  const action = field.parent?.props?.[actionName];
@@ -515,7 +499,7 @@ class DynamicFormBuilderService {
515
499
  group.push(field);
516
500
  continue;
517
501
  }
518
- // Otherwise just push the fields to the others
502
+ // Otherwise, push the fields to the others
519
503
  others.push(field);
520
504
  }
521
505
  // Create a field-set wrapper for each group and concat the other fields to the end
@@ -529,9 +513,7 @@ class DynamicFormBuilderService {
529
513
  props: {
530
514
  label: this.getLabel(key, key, parent, options),
531
515
  hidden: false,
532
- additional: {
533
- className: `dynamic-form-fieldset dynamic-form-fieldset-${id}`
534
- }
516
+ className: `dynamic-form-fieldset dynamic-form-fieldset-${id}`
535
517
  },
536
518
  hooks: {},
537
519
  expressions: {}
@@ -578,9 +560,10 @@ class DynamicFormBuilderService {
578
560
  const type = `${data.type || "select"}`;
579
561
  const field = this.createFormField(key, type === "radio" ? type : "select", data, {
580
562
  type,
581
- multiple: data.multiple,
563
+ multiple: data.multiple === true,
564
+ allowEmpty: data.allowEmpty === true,
582
565
  groupBy: data.groupBy,
583
- allowEmpty: data.allowEmpty
566
+ invert: data.invert === true
584
567
  }, parent, options);
585
568
  setFieldHooks(field, {
586
569
  onInit: target => {
@@ -622,7 +605,6 @@ class DynamicFormBuilderService {
622
605
  useTabs: data.useTabs === true,
623
606
  }, parent, options);
624
607
  group.defaultValue = {};
625
- group.wrappers = ["form-group"];
626
608
  const result = fields(group);
627
609
  const handleGroup = (fieldGroup) => {
628
610
  group.fieldGroup = fieldGroup;
@@ -658,11 +640,7 @@ class DynamicFormBuilderService {
658
640
  array.fieldArray = {
659
641
  wrappers: ["form-group"],
660
642
  fieldGroup: items,
661
- props: {
662
- additional: {
663
- className: "dynamic-form-field dynamic-form-group",
664
- }
665
- },
643
+ className: "dynamic-form-field dynamic-form-group",
666
644
  defaultValue: [],
667
645
  hooks: {},
668
646
  expressions
@@ -703,7 +681,7 @@ class DynamicFormBuilderService {
703
681
  options = await Promise.all(options.map(async (option) => {
704
682
  const classes = Array.isArray(option.classes) ? option.classes : [`${option.classes}`];
705
683
  option = Object.assign({}, option);
706
- option.className = classes.filter(isStringWithVal).join(" ");
684
+ option.className = classes.filter(ObjectUtils.isStringWithValue).join(" ");
707
685
  option.label = await this.languages.getTranslation(option.label);
708
686
  option.value = option.value ?? option.id;
709
687
  option.id = option.id ?? option.value;
@@ -725,8 +703,13 @@ class DynamicFormBuilderService {
725
703
  return labelItems.filter(l => l.length > 0).join(".");
726
704
  }
727
705
  createFormField(key, type, data, props, parent, options) {
706
+ const wrappers = Array.isArray(data.wrappers) ? Array.from(data.wrappers) : [];
707
+ if (type !== "array") {
708
+ wrappers.unshift(!type ? "form-group" : "form-field");
709
+ }
728
710
  const field = {
729
711
  key,
712
+ wrappers,
730
713
  type: data.componentType || type,
731
714
  fieldSet: String(data.fieldSet || ""),
732
715
  resetOnHide: false,
@@ -739,13 +722,12 @@ class DynamicFormBuilderService {
739
722
  label: options.labelCustomizer?.(key, data.label, parent, options.labelPrefix)
740
723
  ?? this.getLabel(key, data.label, parent, options),
741
724
  hideLabel: data.hideLabel === true,
725
+ classes: data.classes || [],
726
+ layout: data.layout || [],
727
+ className: data.className || "",
742
728
  hideRequiredMarker: data.hideRequiredMarker === true,
743
729
  formCheck: "nolabel",
744
- labelPosition: "before",
745
- additional: {
746
- ...(data.additional || {}),
747
- classes: data.classes || []
748
- }
730
+ labelPosition: "before"
749
731
  },
750
732
  modelOptions: {
751
733
  updateOn: "change"
@@ -789,7 +771,7 @@ class DynamicFormBuilderService {
789
771
  if (!target.display) {
790
772
  return `dynamic-form-field dynamic-form-hidden`;
791
773
  }
792
- const { classes, className } = target.additional || {};
774
+ const { classes, layout, className } = target.props || {};
793
775
  if (className) {
794
776
  return className;
795
777
  }
@@ -797,10 +779,7 @@ class DynamicFormBuilderService {
797
779
  const typeName = ObjectUtils.isConstructor(type)
798
780
  ? `${target.type.name}`.toLowerCase().replace("component", "")
799
781
  : type;
800
- return [`dynamic-form-field`, `dynamic-form-field-${target.key}`, `dynamic-form-${typeName}`].concat(Array.isArray(classes) ? classes : [classes || ""]).filter(c => c?.length > 0).join(" ");
801
- },
802
- additional: (target) => {
803
- return target.props?.additional || {};
782
+ return [`dynamic-form-field`, `dynamic-form-field-${target.key}`, `dynamic-form-${typeName}`].concat(Array.isArray(classes) ? classes : [classes || ""], (Array.isArray(layout) ? layout : [layout || ""]).map(layout => `dynamic-form-layout-${layout}`)).filter(c => c?.length > 0).join(" ");
804
783
  },
805
784
  path: target => {
806
785
  const tp = target.parent;
@@ -854,10 +833,7 @@ class DynamicFormSchemaService {
854
833
  async getSchema(name) {
855
834
  return this.openApi.getSchema(name);
856
835
  }
857
- async getFormFieldsForSchema(name, parent, customizeOrOptions) {
858
- const schema = await this.getSchema(name);
859
- if (!schema)
860
- return [];
836
+ async getFormFieldsForSchema(schema, parent, customizeOrOptions) {
861
837
  const options = await toWrapOptions(customizeOrOptions, this.injector, schema);
862
838
  const keys = Object.keys(schema.properties || {});
863
839
  const fields = [];
@@ -875,7 +851,7 @@ class DynamicFormSchemaService {
875
851
  }
876
852
  async getFormFieldForProp(property, options, parent) {
877
853
  const $enum = property.items?.enum || property.enum;
878
- if (Array.isArray($enum) || isStringWithVal(property.optionsPath) || isStringWithVal(property.endpoint)) {
854
+ if (Array.isArray($enum) || ObjectUtils.isStringWithValue(property.optionsPath) || ObjectUtils.isStringWithValue(property.endpoint)) {
879
855
  return this.getFormSelectConfig($enum, property, options, parent);
880
856
  }
881
857
  switch (property.type) {
@@ -892,7 +868,8 @@ class DynamicFormSchemaService {
892
868
  // if (this.checkIsEditorProperty(property)) {
893
869
  // return this.getFormEditorConfig(property, options, parent);
894
870
  // }
895
- if (findRefs(property).length > 0) {
871
+ const refs = await this.openApi.getReferences(property, options.schema);
872
+ if (refs.length > 0) {
896
873
  return this.getFormGroupConfig(property, options, parent);
897
874
  }
898
875
  if (property.format == "file" || property.format == "upload") {
@@ -917,16 +894,21 @@ class DynamicFormSchemaService {
917
894
  return {
918
895
  hidden: property.hidden === true,
919
896
  disabled: property.disabled === true,
897
+ label: property.label,
898
+ hideRequiredMarker: property.hideRequiredMarker === true,
899
+ hideLabel: property.hideLabel === true,
900
+ classes: property.classes,
901
+ layout: property.layout,
920
902
  serialize: property.serialize === true,
921
- componentType: property.componentType,
922
903
  fieldSet: property.fieldSet,
923
- classes: property.classes,
904
+ componentType: property.componentType,
905
+ wrappers: property.wrappers,
924
906
  validators
925
907
  };
926
908
  }
927
909
  async getFormArrayConfig(property, options, parent) {
928
910
  return this.builder.createFormArray(property.id, async (sp) => {
929
- const subSchemas = findRefs(property);
911
+ const subSchemas = await this.openApi.getReferences(property, options.schema);
930
912
  if (subSchemas.length > 0) {
931
913
  const subModels = await Promise.all(subSchemas.map(s => this.getFormFieldsForSchema(s, sp, options)));
932
914
  return mergeFormFields(ObjectUtils.copy(subModels));
@@ -948,9 +930,9 @@ class DynamicFormSchemaService {
948
930
  }
949
931
  async getFormGroupConfig(property, options, parent) {
950
932
  return this.builder.createFormGroup(property.id, async (sp) => {
951
- const subSchemas = findRefs(property);
952
- const subModels = await Promise.all(subSchemas.map(s => this.getFormFieldsForSchema(s, sp, options)));
953
- return mergeFormFields(subModels);
933
+ const subSchemas = await this.openApi.getReferences(property, options.schema);
934
+ const subFields = await Promise.all(subSchemas.map(s => this.getFormFieldsForSchema(s, sp, options)));
935
+ return mergeFormFields(subFields);
954
936
  }, {
955
937
  ...this.getFormFieldData(property, options),
956
938
  }, parent, options);
@@ -999,7 +981,7 @@ class DynamicFormSchemaService {
999
981
  placeholder: property.placeholder || ""
1000
982
  }, parent, options);
1001
983
  }
1002
- // getFormEditorConfig(property: IOpenApiSchemaProperty, options: ConfigForSchemaWrap): DynamicEditorModelConfig {
984
+ // getFormEditorConfig(property: OpenApiSchemaProperty, options: ConfigForSchemaWrap): DynamicEditorModelConfig {
1003
985
  // const sub = property.type == "array" ? property.items || property : property;
1004
986
  // return Object.assign(
1005
987
  // this.getFormControlConfig(property, options),
@@ -1034,6 +1016,7 @@ class DynamicFormSchemaService {
1034
1016
  type: property.format || "select",
1035
1017
  multiple: property.type == "array",
1036
1018
  groupBy: property.groupBy,
1019
+ invert: property.invert,
1037
1020
  allowEmpty: property.allowEmpty
1038
1021
  }, parent, options);
1039
1022
  }
@@ -1059,7 +1042,7 @@ class DynamicFormSchemaService {
1059
1042
  if (Array.isArray($enum)) {
1060
1043
  return this.getFormEnumOptions($enum, property.id, options, field);
1061
1044
  }
1062
- if (isStringWithVal(property.endpoint)) {
1045
+ if (ObjectUtils.isStringWithValue(property.endpoint)) {
1063
1046
  return this.getFormEndpointOptions(property, field);
1064
1047
  }
1065
1048
  return this.getFormPathOptions(property.optionsPath, field);
@@ -1081,8 +1064,10 @@ class DynamicFormSchemaService {
1081
1064
  const endpoint = entries.reduce((res, [key, control]) => {
1082
1065
  return this.replaceOptionsEndpoint(res, key, control.value);
1083
1066
  }, `${property.endpoint}`);
1084
- this.api.cache[endpoint] = this.api.cache[endpoint] || this.api.list(endpoint, this.api.makeListParams(1, -1));
1085
- const data = await this.api.cache[endpoint];
1067
+ const data = await this.api.list(endpoint, this.api.makeListParams(1, -1), {
1068
+ cache: this.api.cached(property.cache),
1069
+ read: String(property.responseProperty || "")
1070
+ });
1086
1071
  const items = ObjectUtils.isArray(data)
1087
1072
  ? data
1088
1073
  : (ObjectUtils.isArray(data.items) ? data.items : []);
@@ -1226,7 +1211,7 @@ class DynamicFormService {
1226
1211
  };
1227
1212
  const schema = await this.fs.getSchema(name);
1228
1213
  const wrapOptions = await toWrapOptions(customizeOrOptions, this.injector, schema, `"DynamicFormService.${restrictedMethod}" is called from a customizer, which is not allowed. Please use DynamicFormSchemaService instead!`);
1229
- const fields = await this.fs.getFormFieldsForSchema(name, config, wrapOptions);
1214
+ const fields = await this.fs.getFormFieldsForSchema(schema, config, wrapOptions);
1230
1215
  const fieldGroup = [...fields];
1231
1216
  config.fieldGroup = fieldGroup;
1232
1217
  // There are no actual fields in the schema, or no schema exists
@@ -1578,9 +1563,7 @@ class DynamicFormComponent {
1578
1563
  label: "",
1579
1564
  useTabs: this.useTabs(),
1580
1565
  hidden: false,
1581
- additional: {
1582
- className: "dynamic-form-root-group"
1583
- }
1566
+ className: "dynamic-form-root-group"
1584
1567
  }, null, options)
1585
1568
  ];
1586
1569
  });
@@ -1646,7 +1629,7 @@ class DynamicFormArrayComponent extends FieldArrayType {
1646
1629
  this.currentTab.set(Math.min(this.currentTab(), length - 1));
1647
1630
  }
1648
1631
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DynamicFormArrayComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1649
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: DynamicFormArrayComponent, isStandalone: false, selector: "dynamic-form-array", usesInheritance: true, ngImport: i0, template: "@if (field.display) {\n @if (props.label && props.hideLabel !== true) {\n <label class=\"field-label\">\n {{ props.label | translate }}\n <p class=\"field-description\" *ngIf=\"props.description\">{{ props.description | translate }}</p>\n </label>\n }\n <div class=\"field-container\">\n <tabs class=\"form-array-items\" [(value)]=\"currentTab\">\n @for (itemField of field.fieldGroup; track itemField.key; let ix = $index) {\n <ng-template #fieldContent>\n <div class=\"form-array-buttons\">\n @if (itemField.removeItem) {\n <btn icon=\"trash\" (click)=\"removeItem(ix)\"></btn>\n }\n @if (itemField.insertItem) {\n <btn icon=\"plus\" (click)=\"addItem(ix)\"></btn>\n }\n </div>\n <formly-field [field]=\"itemField\"></formly-field>\n </ng-template>\n @if (props.useTabs) {\n <div class=\"form-array-item\"\n [tabsItem]=\"ix\"\n [label]=\"(itemField.formControl.value | getValue : props.tabsLabel) || ix + 1\">\n <ng-container [ngTemplateOutlet]=\"fieldContent\"></ng-container>\n </div>\n } @else {\n <div class=\"form-array-item\">\n <ng-container [ngTemplateOutlet]=\"fieldContent\"></ng-container>\n </div>\n }\n }\n </tabs>\n\n <div class=\"form-array-buttons\">\n @if (props.clearItems) {\n <btn icon=\"trash\" label=\"button.clear-items\" (click)=\"clearItems()\"></btn>\n }\n @if (props.addItem) {\n <btn icon=\"plus\" label=\"button.insert-item\" (click)=\"addItem()\"></btn>\n }\n </div>\n </div>\n}\n", styles: [".form-array-item.hidden-tab{display:none}.form-array-buttons{display:flex;gap:5px;margin-bottom:5px}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.TabsItemDirective, selector: "[tabsItem]", inputs: ["tabsItem", "label", "tooltip", "icon", "disabled", "classes"] }, { kind: "component", type: i2.BtnComponent, selector: "btn", inputs: ["label", "tooltip", "icon", "disabled", "type", "size"] }, { kind: "component", type: i2.TabsComponent, selector: "tabs", inputs: ["value", "options", "type", "size"], outputs: ["valueChange"] }, { kind: "component", type: i3.LegacyFormlyField, selector: "formly-field" }, { kind: "pipe", type: i2.GetValuePipe, name: "getValue" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None });
1632
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: DynamicFormArrayComponent, isStandalone: false, selector: "dynamic-form-array", usesInheritance: true, ngImport: i0, template: "@if (field.display) {\n @if (props.label && props.hideLabel !== true) {\n <label class=\"field-label\">\n {{ props.label | translate }}\n <p class=\"field-description\" *ngIf=\"props.description\">{{ props.description | translate }}</p>\n </label>\n }\n <div class=\"field-container\">\n <tabs class=\"form-array-items\" [(value)]=\"currentTab\">\n @for (itemField of field.fieldGroup; track itemField.key; let ix = $index) {\n <ng-template #fieldContent>\n <div class=\"form-array-buttons\">\n @if (itemField.removeItem) {\n <btn icon=\"trash\" (click)=\"removeItem(ix)\"></btn>\n }\n @if (itemField.insertItem) {\n <btn icon=\"plus\" (click)=\"addItem(ix)\"></btn>\n }\n </div>\n <formly-field [field]=\"itemField\"></formly-field>\n </ng-template>\n @if (props.useTabs) {\n <div class=\"form-array-item\"\n [tabsItem]=\"ix\"\n [label]=\"(itemField.formControl.value | getValue : props.tabsLabel) || ix + 1\">\n <ng-container [ngTemplateOutlet]=\"fieldContent\"></ng-container>\n </div>\n } @else {\n <div class=\"form-array-item\">\n <ng-container [ngTemplateOutlet]=\"fieldContent\"></ng-container>\n </div>\n }\n }\n </tabs>\n\n <div class=\"form-array-buttons\">\n @if (props.clearItems) {\n <btn icon=\"trash\" label=\"button.clear-items\" (click)=\"clearItems()\"></btn>\n }\n @if (props.addItem) {\n <btn icon=\"plus\" label=\"button.insert-item\" (click)=\"addItem()\"></btn>\n }\n </div>\n </div>\n}\n", styles: [".form-array-item.hidden-tab{display:none}.form-array-buttons{display:flex;gap:5px;margin-bottom:5px}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.TabsItemDirective, selector: "[tabsItem]", inputs: ["tabsItem", "label", "tooltip", "icon", "disabled", "classes"] }, { kind: "component", type: i2.BtnComponent, selector: "btn", inputs: ["label", "tooltip", "icon", "disabled", "type", "size"] }, { kind: "component", type: i2.TabsComponent, selector: "tabs", inputs: ["value", "options", "type", "size", "testId", "tabsClass"], outputs: ["valueChange", "selectedChange"] }, { kind: "component", type: i3.LegacyFormlyField, selector: "formly-field" }, { kind: "pipe", type: i2.GetValuePipe, name: "getValue" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None });
1650
1633
  }
1651
1634
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DynamicFormArrayComponent, decorators: [{
1652
1635
  type: Component,
@@ -1662,6 +1645,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
1662
1645
  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 [formlyAttributes]=\"field\">\n</chips>\n" }]
1663
1646
  }] });
1664
1647
 
1648
+ class DynamicFormUploadComponent extends DynamicFieldType {
1649
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DynamicFormUploadComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1650
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: DynamicFormUploadComponent, isStandalone: false, selector: "dynamic-form-upload", usesInheritance: true, ngImport: i0, template: "<upload [formControl]=\"formControl\"\n [multiple]=\"props.multiple\"\n [inline]=\"props.inline\"\n [accept]=\"props.accept\"\n [baseUrl]=\"props.url\"\n [makeUpload]=\"props.createUploadData\"\n [formlyAttributes]=\"field\">\n</upload>\n", dependencies: [{ 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.UploadComponent, selector: "upload", inputs: ["value", "disabled", "inline", "accept", "baseUrl", "message", "multiple", "buttonText", "makeUpload", "preProcess"], outputs: ["onUploaded", "onRemove"] }, { kind: "directive", type: i3.LegacyFormlyAttributes, selector: "[formlyAttributes]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1651
+ }
1652
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DynamicFormUploadComponent, decorators: [{
1653
+ type: Component,
1654
+ args: [{ standalone: false, selector: "dynamic-form-upload", encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<upload [formControl]=\"formControl\"\n [multiple]=\"props.multiple\"\n [inline]=\"props.inline\"\n [accept]=\"props.accept\"\n [baseUrl]=\"props.url\"\n [makeUpload]=\"props.createUploadData\"\n [formlyAttributes]=\"field\">\n</upload>\n" }]
1655
+ }] });
1656
+
1657
+ /**
1658
+ * This is just a test wrapper component
1659
+ */
1660
+ class DynamicFormAlertComponent extends FieldWrapper {
1661
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DynamicFormAlertComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1662
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: DynamicFormAlertComponent, isStandalone: false, selector: "dynamic-form-alert", usesInheritance: true, ngImport: i0, template: "<div class=\"dynamic-form-alert\">\n <ng-container #fieldComponent></ng-container>\n</div>\n", styles: [".dynamic-form-alert{border:2px dashed red;width:100%}\n"], encapsulation: i0.ViewEncapsulation.None });
1663
+ }
1664
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DynamicFormAlertComponent, decorators: [{
1665
+ type: Component,
1666
+ args: [{ standalone: false, selector: "dynamic-form-alert", encapsulation: ViewEncapsulation.None, template: "<div class=\"dynamic-form-alert\">\n <ng-container #fieldComponent></ng-container>\n</div>\n", styles: [".dynamic-form-alert{border:2px dashed red;width:100%}\n"] }]
1667
+ }] });
1668
+
1665
1669
  class DynamicFormFieldComponent extends FieldWrapper {
1666
1670
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DynamicFormFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1667
1671
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: DynamicFormFieldComponent, isStandalone: false, selector: "dynamic-form-field", usesInheritance: true, ngImport: i0, template: "@if (props.label && props.hideLabel !== true) {\n <label class=\"field-label\" [for]=\"id\">\n {{ props.label | translate }}\n <p class=\"field-description\" *ngIf=\"props.description\">{{ props.description | translate }}</p>\n @if (props.required && props.hideRequiredMarker !== true) {\n <span class=\"field-required\" aria-hidden=\"true\">*</span>\n }\n </label>\n}\n<div class=\"field-container\">\n <ng-container #fieldComponent></ng-container>\n <div *ngIf=\"showError\" class=\"field-errors invalid-feedback\">\n <formly-validation-message\n [field]=\"field\"\n id=\"{{ id }}-formly-validation-error\"\n role=\"alert\"\n ></formly-validation-message>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.LegacyFormlyValidationMessage, selector: "formly-validation-message" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None });
@@ -1682,32 +1686,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
1682
1686
 
1683
1687
  class DynamicFormGroupComponent extends FieldWrapper {
1684
1688
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DynamicFormGroupComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1685
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: DynamicFormGroupComponent, isStandalone: false, selector: "dynamic-form-group", usesInheritance: true, ngImport: i0, template: "@if (field.display) {\n @if (props.label && props.hideLabel !== true) {\n <label class=\"field-label\">\n {{ props.label | translate }}\n <p class=\"field-description\" *ngIf=\"props.description\">{{ props.description | translate }}</p>\n </label>\n }\n <tabs class=\"field-container\">\n @for (itemField of field.fieldGroup; track itemField; let ix = $index) {\n @if (itemField.display) {\n @if (props.useTabs && itemField.wrappers | includes: 'form-fieldset') {\n <div class=\"form-fieldset-item\"\n [tabsItem]=\"ix\"\n [classes]=\"['form-fieldset-tab', itemField.valid ? 'valid' : 'invalid']\"\n [label]=\"itemField.props.label\">\n <formly-field [field]=\"itemField\"></formly-field>\n </div>\n } @else {\n <formly-field [field]=\"itemField\"></formly-field>\n }\n }\n }\n </tabs>\n}\n", styles: [".form-fieldset-item.hidden-tab{display:none}.form-fieldset-tab{position:relative;--invalid-bg: rgba(184, 38, 38, 1);--invalid-border: rgba(184, 38, 38, .6);--invalid-color: #ececec;--invalid-box-size: 15px;--invalid-box-pull: -3px}.form-fieldset-tab.invalid>btn .async-target{border:1px solid var(--invalid-border)}.form-fieldset-tab.invalid:after{background:var(--invalid-bg);color:var(--invalid-color);font-size:10px;line-height:var(--invalid-box-size);width:var(--invalid-box-size);height:var(--invalid-box-size);text-align:center;border-radius:5px;content:\"!\";display:block;position:absolute;top:var(--invalid-box-pull);right:var(--invalid-box-pull)}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.TabsItemDirective, selector: "[tabsItem]", inputs: ["tabsItem", "label", "tooltip", "icon", "disabled", "classes"] }, { kind: "component", type: i2.TabsComponent, selector: "tabs", inputs: ["value", "options", "type", "size"], outputs: ["valueChange"] }, { kind: "component", type: i3.LegacyFormlyField, selector: "formly-field" }, { kind: "pipe", type: i2.IncludesPipe, name: "includes" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None });
1689
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: DynamicFormGroupComponent, isStandalone: false, selector: "dynamic-form-group", usesInheritance: true, ngImport: i0, template: "@if (field.display) {\n @if (props.label && props.hideLabel !== true) {\n <label class=\"field-label\">\n {{ props.label | translate }}\n <p class=\"field-description\" *ngIf=\"props.description\">{{ props.description | translate }}</p>\n </label>\n }\n <tabs class=\"field-container\">\n @for (itemField of field.fieldGroup; track itemField; let ix = $index) {\n @if (itemField.display) {\n @if (props.useTabs && itemField.wrappers | includes: 'form-fieldset') {\n <div class=\"form-fieldset-item\"\n [tabsItem]=\"ix\"\n [classes]=\"['form-fieldset-tab', itemField.valid ? 'valid' : 'invalid']\"\n [label]=\"itemField.props.label\">\n <formly-field [field]=\"itemField\"></formly-field>\n </div>\n } @else {\n <formly-field [field]=\"itemField\"></formly-field>\n }\n }\n }\n </tabs>\n}\n", styles: [".form-fieldset-item.hidden-tab{display:none}.form-fieldset-tab{position:relative;--invalid-bg: rgba(184, 38, 38, 1);--invalid-border: rgba(184, 38, 38, .6);--invalid-color: #ececec;--invalid-box-size: 15px;--invalid-box-pull: -3px}.form-fieldset-tab.invalid>btn .async-target{border:1px solid var(--invalid-border)}.form-fieldset-tab.invalid:after{background:var(--invalid-bg);color:var(--invalid-color);font-size:10px;line-height:var(--invalid-box-size);width:var(--invalid-box-size);height:var(--invalid-box-size);text-align:center;border-radius:5px;content:\"!\";display:block;position:absolute;top:var(--invalid-box-pull);right:var(--invalid-box-pull)}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.TabsItemDirective, selector: "[tabsItem]", inputs: ["tabsItem", "label", "tooltip", "icon", "disabled", "classes"] }, { kind: "component", type: i2.TabsComponent, selector: "tabs", inputs: ["value", "options", "type", "size", "testId", "tabsClass"], outputs: ["valueChange", "selectedChange"] }, { kind: "component", type: i3.LegacyFormlyField, selector: "formly-field" }, { kind: "pipe", type: i2.IncludesPipe, name: "includes" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None });
1686
1690
  }
1687
1691
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DynamicFormGroupComponent, decorators: [{
1688
1692
  type: Component,
1689
1693
  args: [{ standalone: false, selector: "dynamic-form-group", encapsulation: ViewEncapsulation.None, template: "@if (field.display) {\n @if (props.label && props.hideLabel !== true) {\n <label class=\"field-label\">\n {{ props.label | translate }}\n <p class=\"field-description\" *ngIf=\"props.description\">{{ props.description | translate }}</p>\n </label>\n }\n <tabs class=\"field-container\">\n @for (itemField of field.fieldGroup; track itemField; let ix = $index) {\n @if (itemField.display) {\n @if (props.useTabs && itemField.wrappers | includes: 'form-fieldset') {\n <div class=\"form-fieldset-item\"\n [tabsItem]=\"ix\"\n [classes]=\"['form-fieldset-tab', itemField.valid ? 'valid' : 'invalid']\"\n [label]=\"itemField.props.label\">\n <formly-field [field]=\"itemField\"></formly-field>\n </div>\n } @else {\n <formly-field [field]=\"itemField\"></formly-field>\n }\n }\n }\n </tabs>\n}\n", styles: [".form-fieldset-item.hidden-tab{display:none}.form-fieldset-tab{position:relative;--invalid-bg: rgba(184, 38, 38, 1);--invalid-border: rgba(184, 38, 38, .6);--invalid-color: #ececec;--invalid-box-size: 15px;--invalid-box-pull: -3px}.form-fieldset-tab.invalid>btn .async-target{border:1px solid var(--invalid-border)}.form-fieldset-tab.invalid:after{background:var(--invalid-bg);color:var(--invalid-color);font-size:10px;line-height:var(--invalid-box-size);width:var(--invalid-box-size);height:var(--invalid-box-size);text-align:center;border-radius:5px;content:\"!\";display:block;position:absolute;top:var(--invalid-box-pull);right:var(--invalid-box-pull)}\n"] }]
1690
1694
  }] });
1691
1695
 
1692
- class DynamicFormUploadComponent extends DynamicFieldType {
1693
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DynamicFormUploadComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1694
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: DynamicFormUploadComponent, isStandalone: false, selector: "dynamic-form-upload", usesInheritance: true, ngImport: i0, template: "<upload [formControl]=\"formControl\"\n [multiple]=\"props.multiple\"\n [inline]=\"props.inline\"\n [accept]=\"props.accept\"\n [baseUrl]=\"props.url\"\n [makeUpload]=\"props.createUploadData\"\n [formlyAttributes]=\"field\">\n</upload>\n", dependencies: [{ 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.UploadComponent, selector: "upload", inputs: ["value", "disabled", "inline", "accept", "baseUrl", "message", "multiple", "buttonText", "makeUpload", "preProcess"], outputs: ["onUploaded", "onRemove"] }, { kind: "directive", type: i3.LegacyFormlyAttributes, selector: "[formlyAttributes]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
1695
- }
1696
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DynamicFormUploadComponent, decorators: [{
1697
- type: Component,
1698
- args: [{ standalone: false, selector: "dynamic-form-upload", encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<upload [formControl]=\"formControl\"\n [multiple]=\"props.multiple\"\n [inline]=\"props.inline\"\n [accept]=\"props.accept\"\n [baseUrl]=\"props.url\"\n [makeUpload]=\"props.createUploadData\"\n [formlyAttributes]=\"field\">\n</upload>\n" }]
1699
- }] });
1700
-
1701
1696
  // --- Components ---
1702
1697
  const components = [
1703
1698
  DynamicFieldType,
1704
1699
  DynamicFormComponent,
1705
1700
  DynamicFormArrayComponent,
1706
1701
  DynamicFormChipsComponent,
1702
+ DynamicFormUploadComponent,
1703
+ DynamicFormAlertComponent,
1707
1704
  DynamicFormFieldComponent,
1708
1705
  DynamicFormFieldsetComponent,
1709
1706
  DynamicFormGroupComponent,
1710
- DynamicFormUploadComponent
1711
1707
  ];
1712
1708
  // --- Directives ---
1713
1709
  const directives = [
@@ -1723,13 +1719,14 @@ class NgxDynamicFormModule {
1723
1719
  provideFormlyCore({
1724
1720
  types: [
1725
1721
  { name: "array", component: DynamicFormArrayComponent },
1726
- { name: "chips", component: DynamicFormChipsComponent, wrappers: ["form-field"] },
1727
- { name: "upload", component: DynamicFormUploadComponent, wrappers: ["form-field"] }
1722
+ { name: "chips", component: DynamicFormChipsComponent },
1723
+ { name: "upload", component: DynamicFormUploadComponent }
1728
1724
  ],
1729
1725
  wrappers: [
1726
+ { name: "form-alert", component: DynamicFormAlertComponent },
1730
1727
  { name: "form-field", component: DynamicFormFieldComponent },
1731
1728
  { name: "form-fieldset", component: DynamicFormFieldsetComponent },
1732
- { name: "form-group", component: DynamicFormGroupComponent }
1729
+ { name: "form-group", component: DynamicFormGroupComponent },
1733
1730
  ],
1734
1731
  extras: {
1735
1732
  resetFieldOnHide: false,
@@ -1752,11 +1749,11 @@ class NgxDynamicFormModule {
1752
1749
  return makeEnvironmentProviders(NgxDynamicFormModule.getProviders(config));
1753
1750
  }
1754
1751
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgxDynamicFormModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1755
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: NgxDynamicFormModule, declarations: [DynamicFieldType, DynamicFormComponent, DynamicFormArrayComponent, DynamicFormChipsComponent, DynamicFormFieldComponent, DynamicFormFieldsetComponent, DynamicFormGroupComponent, DynamicFormUploadComponent, AsyncSubmitDirective], imports: [CommonModule,
1752
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: NgxDynamicFormModule, declarations: [DynamicFieldType, DynamicFormComponent, DynamicFormArrayComponent, DynamicFormChipsComponent, DynamicFormUploadComponent, DynamicFormAlertComponent, DynamicFormFieldComponent, DynamicFormFieldsetComponent, DynamicFormGroupComponent, AsyncSubmitDirective], imports: [CommonModule,
1756
1753
  FormsModule,
1757
1754
  ReactiveFormsModule,
1758
1755
  NgxUtilsModule,
1759
- FormlyModule], exports: [DynamicFieldType, DynamicFormComponent, DynamicFormArrayComponent, DynamicFormChipsComponent, DynamicFormFieldComponent, DynamicFormFieldsetComponent, DynamicFormGroupComponent, DynamicFormUploadComponent, AsyncSubmitDirective, FormsModule,
1756
+ FormlyModule], exports: [DynamicFieldType, DynamicFormComponent, DynamicFormArrayComponent, DynamicFormChipsComponent, DynamicFormUploadComponent, DynamicFormAlertComponent, DynamicFormFieldComponent, DynamicFormFieldsetComponent, DynamicFormGroupComponent, AsyncSubmitDirective, FormsModule,
1760
1757
  ReactiveFormsModule,
1761
1758
  NgxUtilsModule,
1762
1759
  FormlyModule] });
@@ -1805,5 +1802,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
1805
1802
  * Generated bundle index. Do not edit.
1806
1803
  */
1807
1804
 
1808
- export { AsyncSubmitDirective, DynamicFieldType, DynamicFormArrayComponent, DynamicFormBuilderService, DynamicFormChipsComponent, DynamicFormComponent, DynamicFormFieldComponent, DynamicFormFieldsetComponent, DynamicFormGroupComponent, DynamicFormSchemaService, DynamicFormService, DynamicFormUploadComponent, EDITOR_FORMATS, FORM_ROOT_ID, FormFile, FormGroup, FormInput, FormModel, FormSelect, FormSerializable, FormUpload, MAX_INPUT_NUM, MIN_INPUT_NUM, NgxDynamicFormModule, addFieldValidators, additionalFieldValue, additionalFieldValues, clearFieldArray, controlStatus, controlValues, customizeFormField, emailValidation, getFieldByPath, getFieldsByKey, getFieldsByPredicate, getSelectOptions, insertToFieldArray, jsonValidation, maxLengthValidation, maxValueValidation, minLengthValidation, minValueValidation, phoneValidation, removeFieldValidators, removeFromFieldArray, replaceFieldArray, replaceSpecialChars, requiredValidation, setFieldDisabled, setFieldHidden, setFieldHooks, setFieldProp, translationValidation };
1805
+ export { AsyncSubmitDirective, DynamicFieldType, DynamicFormAlertComponent, DynamicFormArrayComponent, DynamicFormBuilderService, DynamicFormChipsComponent, DynamicFormComponent, DynamicFormFieldComponent, DynamicFormFieldsetComponent, DynamicFormGroupComponent, DynamicFormSchemaService, DynamicFormService, DynamicFormUploadComponent, EDITOR_FORMATS, FORM_ROOT_ID, FormFile, FormGroup, FormInput, FormModel, FormSelect, FormSerializable, FormUpload, MAX_INPUT_NUM, MIN_INPUT_NUM, NgxDynamicFormModule, addFieldValidators, clearFieldArray, controlStatus, controlValues, customizeFormField, emailValidation, getFieldByPath, getFieldsByKey, getFieldsByPredicate, getSelectOptions, insertToFieldArray, jsonValidation, maxLengthValidation, maxValueValidation, minLengthValidation, minValueValidation, phoneValidation, removeFieldValidators, removeFromFieldArray, replaceFieldArray, replaceSpecialChars, requiredValidation, setFieldDisabled, setFieldHidden, setFieldHooks, setFieldProp, translationValidation };
1809
1806
  //# sourceMappingURL=stemy-ngx-dynamic-form.mjs.map