@stemy/ngx-dynamic-form 19.5.10 → 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"
@@ -778,7 +760,8 @@ class DynamicFormBuilderService {
778
760
  return display;
779
761
  },
780
762
  valid: target => {
781
- const valid = target.key ? target.formControl?.valid : true;
763
+ const control = target.formControl;
764
+ const valid = target.key && control ? control.disabled || control.valid : true;
782
765
  if (Array.isArray(target.fieldGroup) && target.fieldGroup.length) {
783
766
  return valid && target.fieldGroup.every(f => f.valid);
784
767
  }
@@ -788,7 +771,7 @@ class DynamicFormBuilderService {
788
771
  if (!target.display) {
789
772
  return `dynamic-form-field dynamic-form-hidden`;
790
773
  }
791
- const { classes, className } = target.additional || {};
774
+ const { classes, layout, className } = target.props || {};
792
775
  if (className) {
793
776
  return className;
794
777
  }
@@ -796,10 +779,7 @@ class DynamicFormBuilderService {
796
779
  const typeName = ObjectUtils.isConstructor(type)
797
780
  ? `${target.type.name}`.toLowerCase().replace("component", "")
798
781
  : type;
799
- return [`dynamic-form-field`, `dynamic-form-field-${target.key}`, `dynamic-form-${typeName}`].concat(Array.isArray(classes) ? classes : [classes || ""]).filter(c => c?.length > 0).join(" ");
800
- },
801
- additional: (target) => {
802
- 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(" ");
803
783
  },
804
784
  path: target => {
805
785
  const tp = target.parent;
@@ -853,10 +833,7 @@ class DynamicFormSchemaService {
853
833
  async getSchema(name) {
854
834
  return this.openApi.getSchema(name);
855
835
  }
856
- async getFormFieldsForSchema(name, parent, customizeOrOptions) {
857
- const schema = await this.getSchema(name);
858
- if (!schema)
859
- return [];
836
+ async getFormFieldsForSchema(schema, parent, customizeOrOptions) {
860
837
  const options = await toWrapOptions(customizeOrOptions, this.injector, schema);
861
838
  const keys = Object.keys(schema.properties || {});
862
839
  const fields = [];
@@ -874,7 +851,7 @@ class DynamicFormSchemaService {
874
851
  }
875
852
  async getFormFieldForProp(property, options, parent) {
876
853
  const $enum = property.items?.enum || property.enum;
877
- if (Array.isArray($enum) || isStringWithVal(property.optionsPath) || isStringWithVal(property.endpoint)) {
854
+ if (Array.isArray($enum) || ObjectUtils.isStringWithValue(property.optionsPath) || ObjectUtils.isStringWithValue(property.endpoint)) {
878
855
  return this.getFormSelectConfig($enum, property, options, parent);
879
856
  }
880
857
  switch (property.type) {
@@ -891,7 +868,8 @@ class DynamicFormSchemaService {
891
868
  // if (this.checkIsEditorProperty(property)) {
892
869
  // return this.getFormEditorConfig(property, options, parent);
893
870
  // }
894
- if (findRefs(property).length > 0) {
871
+ const refs = await this.openApi.getReferences(property, options.schema);
872
+ if (refs.length > 0) {
895
873
  return this.getFormGroupConfig(property, options, parent);
896
874
  }
897
875
  if (property.format == "file" || property.format == "upload") {
@@ -916,16 +894,21 @@ class DynamicFormSchemaService {
916
894
  return {
917
895
  hidden: property.hidden === true,
918
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,
919
902
  serialize: property.serialize === true,
920
- componentType: property.componentType,
921
903
  fieldSet: property.fieldSet,
922
- classes: property.classes,
904
+ componentType: property.componentType,
905
+ wrappers: property.wrappers,
923
906
  validators
924
907
  };
925
908
  }
926
909
  async getFormArrayConfig(property, options, parent) {
927
910
  return this.builder.createFormArray(property.id, async (sp) => {
928
- const subSchemas = findRefs(property);
911
+ const subSchemas = await this.openApi.getReferences(property, options.schema);
929
912
  if (subSchemas.length > 0) {
930
913
  const subModels = await Promise.all(subSchemas.map(s => this.getFormFieldsForSchema(s, sp, options)));
931
914
  return mergeFormFields(ObjectUtils.copy(subModels));
@@ -947,9 +930,9 @@ class DynamicFormSchemaService {
947
930
  }
948
931
  async getFormGroupConfig(property, options, parent) {
949
932
  return this.builder.createFormGroup(property.id, async (sp) => {
950
- const subSchemas = findRefs(property);
951
- const subModels = await Promise.all(subSchemas.map(s => this.getFormFieldsForSchema(s, sp, options)));
952
- 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);
953
936
  }, {
954
937
  ...this.getFormFieldData(property, options),
955
938
  }, parent, options);
@@ -998,7 +981,7 @@ class DynamicFormSchemaService {
998
981
  placeholder: property.placeholder || ""
999
982
  }, parent, options);
1000
983
  }
1001
- // getFormEditorConfig(property: IOpenApiSchemaProperty, options: ConfigForSchemaWrap): DynamicEditorModelConfig {
984
+ // getFormEditorConfig(property: OpenApiSchemaProperty, options: ConfigForSchemaWrap): DynamicEditorModelConfig {
1002
985
  // const sub = property.type == "array" ? property.items || property : property;
1003
986
  // return Object.assign(
1004
987
  // this.getFormControlConfig(property, options),
@@ -1033,6 +1016,7 @@ class DynamicFormSchemaService {
1033
1016
  type: property.format || "select",
1034
1017
  multiple: property.type == "array",
1035
1018
  groupBy: property.groupBy,
1019
+ invert: property.invert,
1036
1020
  allowEmpty: property.allowEmpty
1037
1021
  }, parent, options);
1038
1022
  }
@@ -1058,7 +1042,7 @@ class DynamicFormSchemaService {
1058
1042
  if (Array.isArray($enum)) {
1059
1043
  return this.getFormEnumOptions($enum, property.id, options, field);
1060
1044
  }
1061
- if (isStringWithVal(property.endpoint)) {
1045
+ if (ObjectUtils.isStringWithValue(property.endpoint)) {
1062
1046
  return this.getFormEndpointOptions(property, field);
1063
1047
  }
1064
1048
  return this.getFormPathOptions(property.optionsPath, field);
@@ -1080,8 +1064,10 @@ class DynamicFormSchemaService {
1080
1064
  const endpoint = entries.reduce((res, [key, control]) => {
1081
1065
  return this.replaceOptionsEndpoint(res, key, control.value);
1082
1066
  }, `${property.endpoint}`);
1083
- this.api.cache[endpoint] = this.api.cache[endpoint] || this.api.list(endpoint, this.api.makeListParams(1, -1));
1084
- 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
+ });
1085
1071
  const items = ObjectUtils.isArray(data)
1086
1072
  ? data
1087
1073
  : (ObjectUtils.isArray(data.items) ? data.items : []);
@@ -1225,7 +1211,7 @@ class DynamicFormService {
1225
1211
  };
1226
1212
  const schema = await this.fs.getSchema(name);
1227
1213
  const wrapOptions = await toWrapOptions(customizeOrOptions, this.injector, schema, `"DynamicFormService.${restrictedMethod}" is called from a customizer, which is not allowed. Please use DynamicFormSchemaService instead!`);
1228
- const fields = await this.fs.getFormFieldsForSchema(name, config, wrapOptions);
1214
+ const fields = await this.fs.getFormFieldsForSchema(schema, config, wrapOptions);
1229
1215
  const fieldGroup = [...fields];
1230
1216
  config.fieldGroup = fieldGroup;
1231
1217
  // There are no actual fields in the schema, or no schema exists
@@ -1577,9 +1563,7 @@ class DynamicFormComponent {
1577
1563
  label: "",
1578
1564
  useTabs: this.useTabs(),
1579
1565
  hidden: false,
1580
- additional: {
1581
- className: "dynamic-form-root-group"
1582
- }
1566
+ className: "dynamic-form-root-group"
1583
1567
  }, null, options)
1584
1568
  ];
1585
1569
  });
@@ -1645,7 +1629,7 @@ class DynamicFormArrayComponent extends FieldArrayType {
1645
1629
  this.currentTab.set(Math.min(this.currentTab(), length - 1));
1646
1630
  }
1647
1631
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DynamicFormArrayComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1648
- 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 });
1649
1633
  }
1650
1634
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DynamicFormArrayComponent, decorators: [{
1651
1635
  type: Component,
@@ -1661,6 +1645,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
1661
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" }]
1662
1646
  }] });
1663
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
+
1664
1669
  class DynamicFormFieldComponent extends FieldWrapper {
1665
1670
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DynamicFormFieldComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1666
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 });
@@ -1681,32 +1686,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
1681
1686
 
1682
1687
  class DynamicFormGroupComponent extends FieldWrapper {
1683
1688
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DynamicFormGroupComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1684
- 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 });
1685
1690
  }
1686
1691
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DynamicFormGroupComponent, decorators: [{
1687
1692
  type: Component,
1688
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"] }]
1689
1694
  }] });
1690
1695
 
1691
- class DynamicFormUploadComponent extends DynamicFieldType {
1692
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DynamicFormUploadComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
1693
- 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 });
1694
- }
1695
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DynamicFormUploadComponent, decorators: [{
1696
- type: Component,
1697
- 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" }]
1698
- }] });
1699
-
1700
1696
  // --- Components ---
1701
1697
  const components = [
1702
1698
  DynamicFieldType,
1703
1699
  DynamicFormComponent,
1704
1700
  DynamicFormArrayComponent,
1705
1701
  DynamicFormChipsComponent,
1702
+ DynamicFormUploadComponent,
1703
+ DynamicFormAlertComponent,
1706
1704
  DynamicFormFieldComponent,
1707
1705
  DynamicFormFieldsetComponent,
1708
1706
  DynamicFormGroupComponent,
1709
- DynamicFormUploadComponent
1710
1707
  ];
1711
1708
  // --- Directives ---
1712
1709
  const directives = [
@@ -1722,13 +1719,14 @@ class NgxDynamicFormModule {
1722
1719
  provideFormlyCore({
1723
1720
  types: [
1724
1721
  { name: "array", component: DynamicFormArrayComponent },
1725
- { name: "chips", component: DynamicFormChipsComponent, wrappers: ["form-field"] },
1726
- { name: "upload", component: DynamicFormUploadComponent, wrappers: ["form-field"] }
1722
+ { name: "chips", component: DynamicFormChipsComponent },
1723
+ { name: "upload", component: DynamicFormUploadComponent }
1727
1724
  ],
1728
1725
  wrappers: [
1726
+ { name: "form-alert", component: DynamicFormAlertComponent },
1729
1727
  { name: "form-field", component: DynamicFormFieldComponent },
1730
1728
  { name: "form-fieldset", component: DynamicFormFieldsetComponent },
1731
- { name: "form-group", component: DynamicFormGroupComponent }
1729
+ { name: "form-group", component: DynamicFormGroupComponent },
1732
1730
  ],
1733
1731
  extras: {
1734
1732
  resetFieldOnHide: false,
@@ -1751,11 +1749,11 @@ class NgxDynamicFormModule {
1751
1749
  return makeEnvironmentProviders(NgxDynamicFormModule.getProviders(config));
1752
1750
  }
1753
1751
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NgxDynamicFormModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1754
- 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,
1755
1753
  FormsModule,
1756
1754
  ReactiveFormsModule,
1757
1755
  NgxUtilsModule,
1758
- 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,
1759
1757
  ReactiveFormsModule,
1760
1758
  NgxUtilsModule,
1761
1759
  FormlyModule] });
@@ -1804,5 +1802,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
1804
1802
  * Generated bundle index. Do not edit.
1805
1803
  */
1806
1804
 
1807
- 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 };
1808
1806
  //# sourceMappingURL=stemy-ngx-dynamic-form.mjs.map