@stemy/ngx-dynamic-form 19.8.11 → 19.8.13

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.
@@ -118,134 +118,6 @@ function FormFieldSet(data) {
118
118
  };
119
119
  }
120
120
 
121
- function validationMessage(errorKey) {
122
- const key = `form.error.${errorKey}`;
123
- return (_, field) => {
124
- const injector = field.options.formState?.injector;
125
- const language = injector?.get(LANGUAGE_SERVICE);
126
- return !language ? key : language.getTranslationSync(key, field);
127
- };
128
- }
129
- function withName(fn, name) {
130
- fn.validatorName = name;
131
- return fn;
132
- }
133
- function validateEach(each, cb, name) {
134
- return withName((control) => {
135
- const value = control.value;
136
- return each ? Array.isArray(value) && value.every(cb) : cb(value);
137
- }, name);
138
- }
139
- function addFieldValidators(field, validators) {
140
- field.validators = field.validators || {};
141
- const validation = field.validation || {};
142
- const messages = validation.messages || {};
143
- if (Array.isArray(validators)) {
144
- validators.forEach((validator, ix) => {
145
- const name = validator.validatorName || `validator_${ix}`;
146
- field.validators[name] = validator;
147
- messages[name] = validationMessage(name);
148
- });
149
- }
150
- else if (validators) {
151
- Object.keys(validators).forEach(name => {
152
- field.validators[name] = validators[name];
153
- messages[name] = validationMessage(name);
154
- });
155
- }
156
- field.validation = {
157
- ...validation,
158
- messages
159
- };
160
- }
161
- function removeFieldValidators(field, ...names) {
162
- const validators = Object.assign({}, field.validators || {});
163
- const validation = field.validation || {};
164
- const messages = Object.assign({}, validation.messages || {});
165
- names.forEach(name => {
166
- delete validators[name];
167
- delete messages[name];
168
- });
169
- field.validators = validators;
170
- field.validation = {
171
- ...validation,
172
- messages
173
- };
174
- }
175
- function jsonValidation() {
176
- return withName((control) => {
177
- const value = control.value;
178
- if (!value)
179
- return false;
180
- try {
181
- JSON.parse(value);
182
- return true;
183
- }
184
- catch (e) {
185
- return false;
186
- }
187
- }, "json");
188
- }
189
- function requiredValidation() {
190
- return withName((control) => ObjectUtils.isString(control.value) ? control.value.length > 0 : ObjectUtils.isDefined(control.value), "required");
191
- }
192
- function translationValidation(langs = ["de", "en"]) {
193
- return withName((control) => {
194
- const value = control.value;
195
- if (!value || value.length == 0)
196
- return false;
197
- return value.findIndex(t => langs.includes(t.lang) && !t.translation) < 0;
198
- }, "translation");
199
- }
200
- function phoneValidation() {
201
- return withName((control) => {
202
- const value = control.value;
203
- if (!value)
204
- return true;
205
- const phoneRegexp = /^\d{10,12}$/;
206
- return phoneRegexp.test(value);
207
- }, "phone");
208
- }
209
- function emailValidation() {
210
- return withName((control) => {
211
- const value = control.value;
212
- if (!value)
213
- return true;
214
- const emailRegexp = /^[\w-.]+@([\w-]+\.)+[\w-]{2,4}$/g;
215
- return emailRegexp.test(value);
216
- }, "email");
217
- }
218
- function arrayLengthValidation(min = 1, max = Number.MAX_SAFE_INTEGER) {
219
- return withName((control) => {
220
- const value = control.value;
221
- return !Array.isArray(value) || (min <= value.length && value.length <= max);
222
- }, "arrayLength");
223
- }
224
- function minLengthValidation(minLength, each) {
225
- return validateEach(each, v => typeof v == "string" && v.length >= minLength, "minLength");
226
- }
227
- function maxLengthValidation(maxLength, each) {
228
- return validateEach(each, v => typeof v == "string" && v.length <= maxLength, "maxLength");
229
- }
230
- function minValueValidation(min, each) {
231
- return validateEach(each, v => {
232
- if (min instanceof Date) {
233
- const date = new Date(v);
234
- return isNaN(date) || date >= min;
235
- }
236
- return v == null || v >= min;
237
- }, "minValue");
238
- }
239
- function maxValueValidation(max, each) {
240
- return validateEach(each, v => {
241
- if (max instanceof Date) {
242
- const date = new Date(v);
243
- return isNaN(date) || date <= max;
244
- }
245
- return v == null || v <= max;
246
- }, "maxValue");
247
- }
248
-
249
121
  function replaceSpecialChars(str, to = "-") {
250
122
  return `${str}`.replace(/[&\/\\#, +()$~%.@'":*?<>{}]/g, to);
251
123
  }
@@ -405,10 +277,158 @@ function setFieldHooks(field, hooks) {
405
277
  : hooks[name];
406
278
  });
407
279
  }
280
+ function isFieldVisible(field) {
281
+ let visible = true;
282
+ let current = field;
283
+ while (current && visible) {
284
+ const hiddenFn = current.props?.__hidden;
285
+ const injector = field.options?.formState?.injector;
286
+ visible = visible && (!injector || !hiddenFn?.(current, injector));
287
+ current = current.parent;
288
+ }
289
+ if (Array.isArray(field.fieldGroup) && field.fieldGroup.length) {
290
+ return visible && field.fieldGroup.some(f => isFieldVisible(f));
291
+ }
292
+ return visible;
293
+ }
294
+ function isFieldHidden(field) {
295
+ return !isFieldVisible(field);
296
+ }
408
297
  const MIN_INPUT_NUM = -1999999999;
409
298
  const MAX_INPUT_NUM = 1999999999;
410
299
  const EDITOR_FORMATS = ["php", "json", "html", "css", "scss"];
411
300
 
301
+ function validationMessage(errorKey) {
302
+ const key = `form.error.${errorKey}`;
303
+ return (_, field) => {
304
+ const injector = field.options.formState?.injector;
305
+ const language = injector?.get(LANGUAGE_SERVICE);
306
+ return !language ? key : language.getTranslationSync(key, field);
307
+ };
308
+ }
309
+ function withName(fn, name) {
310
+ const mainFn = (control, field) => {
311
+ return isFieldHidden(field) || fn(control, field);
312
+ };
313
+ mainFn.validatorName = name;
314
+ return mainFn;
315
+ }
316
+ function validateEach(each, cb, name) {
317
+ return withName((control) => {
318
+ const value = control.value;
319
+ return each ? Array.isArray(value) && value.every(cb) : cb(value);
320
+ }, name);
321
+ }
322
+ function addFieldValidators(field, validators) {
323
+ field.validators = field.validators || {};
324
+ const validation = field.validation || {};
325
+ const messages = validation.messages || {};
326
+ if (Array.isArray(validators)) {
327
+ validators.forEach((validator, ix) => {
328
+ const name = validator.validatorName || `validator_${ix}`;
329
+ field.validators[name] = validator;
330
+ messages[name] = validationMessage(name);
331
+ });
332
+ }
333
+ else if (validators) {
334
+ Object.keys(validators).forEach(name => {
335
+ field.validators[name] = validators[name];
336
+ messages[name] = validationMessage(name);
337
+ });
338
+ }
339
+ field.validation = {
340
+ ...validation,
341
+ messages
342
+ };
343
+ }
344
+ function removeFieldValidators(field, ...names) {
345
+ const validators = Object.assign({}, field.validators || {});
346
+ const validation = field.validation || {};
347
+ const messages = Object.assign({}, validation.messages || {});
348
+ names.forEach(name => {
349
+ delete validators[name];
350
+ delete messages[name];
351
+ });
352
+ field.validators = validators;
353
+ field.validation = {
354
+ ...validation,
355
+ messages
356
+ };
357
+ }
358
+ function jsonValidation() {
359
+ return withName((control) => {
360
+ const value = control.value;
361
+ if (!value)
362
+ return false;
363
+ try {
364
+ JSON.parse(value);
365
+ return true;
366
+ }
367
+ catch (e) {
368
+ return false;
369
+ }
370
+ }, "json");
371
+ }
372
+ function requiredValidation() {
373
+ return withName((control) => ObjectUtils.isString(control.value) ? control.value.length > 0 : ObjectUtils.isDefined(control.value), "required");
374
+ }
375
+ function translationValidation(langs = ["de", "en"]) {
376
+ return withName((control) => {
377
+ const value = control.value;
378
+ if (!value || value.length == 0)
379
+ return false;
380
+ return value.findIndex(t => langs.includes(t.lang) && !t.translation) < 0;
381
+ }, "translation");
382
+ }
383
+ function phoneValidation() {
384
+ return withName((control) => {
385
+ const value = control.value;
386
+ if (!value)
387
+ return true;
388
+ const phoneRegexp = /^\d{10,12}$/;
389
+ return phoneRegexp.test(value);
390
+ }, "phone");
391
+ }
392
+ function emailValidation() {
393
+ return withName((control) => {
394
+ const value = control.value;
395
+ if (!value)
396
+ return true;
397
+ const emailRegexp = /^[\w-.]+@([\w-]+\.)+[\w-]{2,4}$/g;
398
+ return emailRegexp.test(value);
399
+ }, "email");
400
+ }
401
+ function arrayLengthValidation(min = 1, max = Number.MAX_SAFE_INTEGER) {
402
+ return withName((control) => {
403
+ const value = control.value;
404
+ return !Array.isArray(value) || (min <= value.length && value.length <= max);
405
+ }, "arrayLength");
406
+ }
407
+ function minLengthValidation(minLength, each) {
408
+ return validateEach(each, v => typeof v == "string" && v.length >= minLength, "minLength");
409
+ }
410
+ function maxLengthValidation(maxLength, each) {
411
+ return validateEach(each, v => typeof v == "string" && v.length <= maxLength, "maxLength");
412
+ }
413
+ function minValueValidation(min, each) {
414
+ return validateEach(each, v => {
415
+ if (min instanceof Date) {
416
+ const date = new Date(v);
417
+ return isNaN(date) || date >= min;
418
+ }
419
+ return v == null || v >= min;
420
+ }, "minValue");
421
+ }
422
+ function maxValueValidation(max, each) {
423
+ return validateEach(each, v => {
424
+ if (max instanceof Date) {
425
+ const date = new Date(v);
426
+ return isNaN(date) || date <= max;
427
+ }
428
+ return v == null || v <= max;
429
+ }, "maxValue");
430
+ }
431
+
412
432
  class ModelUtils {
413
433
  static getLanguages(language) {
414
434
  return async () => {
@@ -892,11 +912,13 @@ class DynamicFormBuilderService {
892
912
  options = options || { labelPrefix: "" };
893
913
  const labelPrefix = !ObjectUtils.isString(options.labelPrefix) ? `` : options.labelPrefix;
894
914
  if (ObjectUtils.isFunction(options.labelCustomizer)) {
895
- return options.labelCustomizer(key, label, parent, labelPrefix) || "";
915
+ const customLabel = options.labelCustomizer(key, label, parent, labelPrefix);
916
+ if (ObjectUtils.isString(customLabel))
917
+ return customLabel;
896
918
  }
897
919
  // Exceptional case, to be able to have an "empty" label element in the HTML just to fill the space.
898
920
  if (label === " ")
899
- return "\\s";
921
+ return "\u200B";
900
922
  const pathPrefix = options.legacyLabels
901
923
  ? String(legacyPrefix || labelPrefix)
902
924
  : String(parent?.props?.label || labelPrefix);
@@ -948,8 +970,7 @@ class DynamicFormBuilderService {
948
970
  return !!disabled(target, this.injector);
949
971
  },
950
972
  "props.hidden": target => {
951
- const hidden = target.props?.__hidden;
952
- return !!hidden(target, this.injector);
973
+ return isFieldHidden(target);
953
974
  }
954
975
  }
955
976
  };
@@ -963,13 +984,6 @@ class DynamicFormBuilderService {
963
984
  this.setExpressions(field, options);
964
985
  return field;
965
986
  }
966
- shouldDisplay(field) {
967
- const display = field.props?.hidden !== true;
968
- if (Array.isArray(field.fieldGroup) && field.fieldGroup.length) {
969
- return display && field.fieldGroup.some(f => this.shouldDisplay(f));
970
- }
971
- return display;
972
- }
973
987
  isValid(field) {
974
988
  const control = field.formControl;
975
989
  const valid = field.key && control ? (control.disabled || control.valid) !== false : true;
@@ -980,7 +994,7 @@ class DynamicFormBuilderService {
980
994
  }
981
995
  setExpressions(field, options) {
982
996
  const expressions = {
983
- display: target => this.shouldDisplay(target),
997
+ display: target => isFieldVisible(target),
984
998
  valid: target => this.isValid(target),
985
999
  className: (target) => {
986
1000
  if (!target.display) {
@@ -1777,9 +1791,11 @@ class DynamicFormComponent {
1777
1791
  legacyLabels: this.legacyLabels(),
1778
1792
  testId: this.testId(),
1779
1793
  };
1780
- const fields = this.fields() || this.builder.resolveFormFields(this.data()?.constructor, null, options);
1781
1794
  return [
1782
- this.builder.createFormGroup(null, () => fields, {
1795
+ this.builder.createFormGroup(null, parent => {
1796
+ const fields = this.fields() || this.builder.resolveFormFields(this.data()?.constructor, parent, options);
1797
+ return this.builder.createFieldSets(fields, parent, options);
1798
+ }, {
1783
1799
  label: "",
1784
1800
  useTabs: this.useTabs(),
1785
1801
  hidden: false,
@@ -2105,5 +2121,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.19", ngImpo
2105
2121
  * Generated bundle index. Do not edit.
2106
2122
  */
2107
2123
 
2108
- export { AsyncSubmitDirective, DynamicFieldType, DynamicFormAlertComponent, DynamicFormArrayComponent, DynamicFormBuilderService, DynamicFormChipsComponent, DynamicFormComponent, DynamicFormFieldComponent, DynamicFormFieldsetComponent, DynamicFormGroupComponent, DynamicFormSchemaService, DynamicFormService, DynamicFormStaticComponent, 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, jsonValidation, maxLengthValidation, maxValueValidation, minLengthValidation, minValueValidation, phoneValidation, removeFieldValidators, removeFromFieldArray, replaceFieldArray, replaceSpecialChars, requiredValidation, setFieldDefault, setFieldDisabled, setFieldHidden, setFieldHooks, setFieldProp, setFieldProps, setFieldValue, translationValidation };
2124
+ export { AsyncSubmitDirective, DynamicFieldType, DynamicFormAlertComponent, DynamicFormArrayComponent, DynamicFormBuilderService, DynamicFormChipsComponent, DynamicFormComponent, DynamicFormFieldComponent, DynamicFormFieldsetComponent, DynamicFormGroupComponent, DynamicFormSchemaService, DynamicFormService, DynamicFormStaticComponent, 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, setFieldProp, setFieldProps, setFieldValue, translationValidation };
2109
2125
  //# sourceMappingURL=stemy-ngx-dynamic-form.mjs.map