@klippa/ngx-enhancy-forms 5.0.0 → 5.2.1

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.
@@ -31,6 +31,9 @@
31
31
  }
32
32
  return s.substring(0, length) + '...';
33
33
  }
34
+ function arrayIsSetAndFilled(arr) {
35
+ return arr !== null && arr !== undefined && arr.length > 0;
36
+ }
34
37
 
35
38
  var invalidFieldsSymbol = Symbol('Not all fields are valid');
36
39
  var SubFormDirective = /** @class */ (function () {
@@ -225,6 +228,7 @@
225
228
  this.customMessages = customMessages;
226
229
  this.direction = 'horizontal';
227
230
  this.captionSpacing = 'percentages';
231
+ this.spaceDistribution = '40-60';
228
232
  this.swapInputAndCaption = false;
229
233
  this.errorMessages = DEFAULT_ERROR_MESSAGES;
230
234
  this.customErrorHandlers = [];
@@ -234,9 +238,11 @@
234
238
  return msg.replace("%" + key + "%", parameters[key]);
235
239
  }, message);
236
240
  };
237
- FormElementComponent.prototype.registerControl = function (formControl) {
241
+ FormElementComponent.prototype.registerControl = function (formControl, input) {
242
+ if (input === void 0) { input = null; }
238
243
  this.attachedControl = formControl;
239
244
  this.parent.registerControl(formControl, this);
245
+ this.input = input;
240
246
  };
241
247
  FormElementComponent.prototype.unregisterControl = function (formControl) {
242
248
  this.attachedControl = null;
@@ -281,6 +287,12 @@
281
287
  // to give some breathing room, we scroll 100px more to the top
282
288
  (_a = this.getScrollableParent(this.internalComponentRef.nativeElement)) === null || _a === void 0 ? void 0 : _a.scrollBy(0, -100);
283
289
  };
290
+ FormElementComponent.prototype.isRequired = function () {
291
+ if (isValueSet(this.input)) {
292
+ return this.input.hasValidator('required');
293
+ }
294
+ return false;
295
+ };
284
296
  FormElementComponent.prototype.getErrorMessage = function (key) {
285
297
  var _a, _b, _c;
286
298
  return (_c = (_b = (_a = this.customMessages) === null || _a === void 0 ? void 0 : _a[key]) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : this.errorMessages[key];
@@ -290,8 +302,8 @@
290
302
  FormElementComponent.decorators = [
291
303
  { type: core.Component, args: [{
292
304
  selector: 'klp-form-element',
293
- template: "<ng-template #errorRef>\n\t<div *ngIf=\"getErrorToShow()\" class=\"errorContainer\">\n\t\t<div *ngIf=\"showDefaultError('min')\">{{substituteParameters(getErrorMessage(\"min\"), {min: attachedControl.errors.min.min})}}</div>\n\t\t<div *ngIf=\"showDefaultError('max')\">{{substituteParameters(getErrorMessage(\"max\"), {max: attachedControl.errors.max.max})}}</div>\n\t\t<div *ngIf=\"showDefaultError('required')\">{{getErrorMessage(\"required\")}}</div>\n\t\t<div *ngIf=\"showDefaultError('email')\">{{getErrorMessage(\"email\")}}</div>\n\t\t<div *ngIf=\"showDefaultError('minlength')\">{{substituteParameters(getErrorMessage(\"minLength\"), {minLength: attachedControl.errors.minlength.requiredLength})}}</div>\n\t\t<div *ngIf=\"showDefaultError('maxlength')\">{{substituteParameters(getErrorMessage(\"maxLength\"), {maxLength: attachedControl.errors.maxlength.requiredLength})}}</div>\n\t\t<div *ngIf=\"showDefaultError('pattern')\">{{getErrorMessage(\"pattern\")}}</div>\n\t\t<div *ngIf=\"showDefaultError('MatchPassword')\">{{getErrorMessage(\"matchPassword\")}}</div>\n\t\t<div *ngIf=\"showDefaultError('date')\">{{getErrorMessage(\"date\")}}</div>\n\t\t<div *ngIf=\"showDefaultError('message')\">{{attachedControl.errors.message.value}}</div>\n\t\t<div [ngTemplateOutlet]=\"getCustomErrorHandler(getErrorToShow())?.templateRef\"></div>\n\t</div>\n</ng-template>\n<ng-container *ngIf=\"direction === 'horizontal'\" [ngTemplateOutlet]=\"errorRef\"></ng-container>\n<div *ngIf=\"attachedControl\" class=\"componentContainer\" [ngClass]=\"{vertical: direction === 'vertical', reverseOrder: swapInputAndCaption}\" #internalComponentRef>\n\t<div class=\"caption\" [ngClass]=\"{ hasErrors: getErrorToShow() && attachedControl.touched, percentageSpacing: captionSpacing === 'percentages' }\">\n\t\t<div *ngIf=\"captionRef\" [ngTemplateOutlet]=\"captionRef\"></div>\n\t\t<div *ngIf=\"!captionRef\">{{caption}}</div>\n\t</div>\n\t<ng-container *ngIf=\"direction === 'vertical'\" [ngTemplateOutlet]=\"errorRef\"></ng-container>\n\t<div class=\"inputContainer\" [ngClass]=\"{ percentageSpacing: captionSpacing === 'percentages' }\">\n\t\t<ng-content></ng-content>\n\t</div>\n</div>\n",
294
- styles: [":host{display:block;margin-top:1.25rem}.componentContainer{align-items:center;display:flex}.componentContainer.reverseOrder{flex-direction:row-reverse;justify-content:flex-end}.componentContainer.vertical{display:block;margin-bottom:1rem}.componentContainer.vertical .inputContainer{margin-top:.3125rem}.componentContainer.vertical .errorContainer{margin-left:0}.caption{color:#515365;flex:0 0 auto;font-weight:700}.caption.percentageSpacing{flex:0 0 40%}.caption.hasErrors{color:#ff8000}.inputContainer{flex:0 0 auto}.inputContainer.percentageSpacing{flex:0 0 60%}.errorContainer{color:#ff8000;margin-left:40%}"]
305
+ template: "<ng-template #errorRef>\n\t<div *ngIf=\"getErrorToShow()\" class=\"errorContainer\">\n\t\t<div *ngIf=\"showDefaultError('min')\">{{substituteParameters(getErrorMessage(\"min\"), {min: attachedControl.errors.min.min})}}</div>\n\t\t<div *ngIf=\"showDefaultError('max')\">{{substituteParameters(getErrorMessage(\"max\"), {max: attachedControl.errors.max.max})}}</div>\n\t\t<div *ngIf=\"showDefaultError('required')\">{{getErrorMessage(\"required\")}}</div>\n\t\t<div *ngIf=\"showDefaultError('email')\">{{getErrorMessage(\"email\")}}</div>\n\t\t<div *ngIf=\"showDefaultError('minlength')\">{{substituteParameters(getErrorMessage(\"minLength\"), {minLength: attachedControl.errors.minlength.requiredLength})}}</div>\n\t\t<div *ngIf=\"showDefaultError('maxlength')\">{{substituteParameters(getErrorMessage(\"maxLength\"), {maxLength: attachedControl.errors.maxlength.requiredLength})}}</div>\n\t\t<div *ngIf=\"showDefaultError('pattern')\">{{getErrorMessage(\"pattern\")}}</div>\n\t\t<div *ngIf=\"showDefaultError('MatchPassword')\">{{getErrorMessage(\"matchPassword\")}}</div>\n\t\t<div *ngIf=\"showDefaultError('date')\">{{getErrorMessage(\"date\")}}</div>\n\t\t<div *ngIf=\"showDefaultError('message')\">{{attachedControl.errors.message.value}}</div>\n\t\t<div [ngTemplateOutlet]=\"getCustomErrorHandler(getErrorToShow())?.templateRef\"></div>\n\t</div>\n</ng-template>\n<ng-container *ngIf=\"direction === 'horizontal'\" [ngTemplateOutlet]=\"errorRef\"></ng-container>\n<div class=\"componentContainer\" [ngClass]=\"{vertical: direction === 'vertical', reverseOrder: swapInputAndCaption}\" #internalComponentRef>\n\t<div class=\"caption\" *ngIf=\"caption || captionRef\" [ngClass]=\"{ hasErrors: getErrorToShow() && attachedControl.touched, percentageSpacing: captionSpacing === 'percentages', 'd30-70': spaceDistribution === '30-70' }\">\n\t\t<div *ngIf=\"captionRef\" class=\"captionRefContainer\">\n\t\t\t<ng-container [ngTemplateOutlet]=\"captionRef\"></ng-container>\n\t\t\t<div *ngIf=\"isRequired()\">&nbsp;*</div>\n\t\t</div>\n\t\t<div *ngIf=\"!captionRef\">{{caption}}<span *ngIf=\"isRequired()\">&nbsp;*</span></div>\n\t</div>\n\t<ng-container *ngIf=\"direction === 'vertical'\" [ngTemplateOutlet]=\"errorRef\"></ng-container>\n\t<div class=\"inputContainer\" [ngClass]=\"{ percentageSpacing: captionSpacing === 'percentages', 'd30-70': spaceDistribution === '30-70' }\">\n\t\t<ng-content></ng-content>\n\t</div>\n</div>\n",
306
+ styles: [":host{display:block}.componentContainer{align-items:center;display:flex}.componentContainer.reverseOrder{flex-direction:row-reverse;justify-content:flex-end}.componentContainer.vertical{display:block;margin-bottom:1rem}.componentContainer.vertical .inputContainer{margin-top:.3125rem}.componentContainer.vertical .errorContainer{margin-left:0}.captionRefContainer{display:flex}.caption{color:#515365;flex:0 0 auto;font-weight:700}.caption.percentageSpacing{flex:0 0 40%}.caption.percentageSpacing.d30-70{flex-basis:30%}.caption.hasErrors{color:#ff8000}.inputContainer{flex:1}.inputContainer.percentageSpacing{flex:0 0 60%}.inputContainer.percentageSpacing.d30-70{flex-basis:70%}.errorContainer{color:#ff8000;margin-left:40%}.errorContainer.d30-70{margin-left:30%}"]
295
307
  },] }
296
308
  ];
297
309
  FormElementComponent.ctorParameters = function () { return [
@@ -302,6 +314,7 @@
302
314
  caption: [{ type: core.Input }],
303
315
  direction: [{ type: core.Input }],
304
316
  captionSpacing: [{ type: core.Input }],
317
+ spaceDistribution: [{ type: core.Input }],
305
318
  swapInputAndCaption: [{ type: core.Input }],
306
319
  internalComponentRef: [{ type: core.ViewChild, args: ['internalComponentRef',] }]
307
320
  };
@@ -325,10 +338,12 @@
325
338
  // we support both providing just the formControlName and the full formControl
326
339
  this.formControlName = null;
327
340
  this.formControl = null;
341
+ this.onTouch = new core.EventEmitter();
342
+ this.validators = [];
328
343
  }
329
344
  ValueAccessorBase.prototype.ngOnInit = function () {
330
345
  var _this = this;
331
- var _a, _b, _c;
346
+ var _a, _b, _c, _d;
332
347
  if (this.formControl) {
333
348
  this.attachedFormControl = this.formControl;
334
349
  }
@@ -343,7 +358,16 @@
343
358
  this.attachedFormControl.statusChanges.subscribe(function () {
344
359
  _this.disabled = _this.attachedFormControl.disabled;
345
360
  });
346
- (_c = this.parent) === null || _c === void 0 ? void 0 : _c.registerControl(this.attachedFormControl);
361
+ (_c = this.parent) === null || _c === void 0 ? void 0 : _c.registerControl(this.attachedFormControl, this);
362
+ if ((_d = this.attachedFormControl) === null || _d === void 0 ? void 0 : _d.validator) {
363
+ var vals = this.attachedFormControl.validator({});
364
+ if (isValueSet(vals)) {
365
+ this.validators = Object.keys(vals);
366
+ }
367
+ else {
368
+ this.validators = [];
369
+ }
370
+ }
347
371
  }
348
372
  };
349
373
  ValueAccessorBase.prototype.isInErrorState = function () {
@@ -374,6 +398,12 @@
374
398
  ValueAccessorBase.prototype.resetToNull = function () {
375
399
  this.setInnerValueAndNotify(null);
376
400
  };
401
+ ValueAccessorBase.prototype.hasValidator = function (validatorName) {
402
+ if (arrayIsSetAndFilled(this.validators)) {
403
+ return this.validators.includes(validatorName);
404
+ }
405
+ return false;
406
+ };
377
407
  return ValueAccessorBase;
378
408
  }());
379
409
  ValueAccessorBase.decorators = [
@@ -389,7 +419,8 @@
389
419
  ValueAccessorBase.propDecorators = {
390
420
  disabled: [{ type: core.Input }],
391
421
  formControlName: [{ type: core.Input }],
392
- formControl: [{ type: core.Input }]
422
+ formControl: [{ type: core.Input }],
423
+ onTouch: [{ type: core.Output }]
393
424
  };
394
425
 
395
426
  var ButtonComponent = /** @class */ (function () {
@@ -873,10 +904,9 @@
873
904
  this.onSearch.emit(value);
874
905
  };
875
906
  SelectComponent.prototype.getDefaultTranslation = function (key) {
876
- var _this = this;
877
907
  switch (key) {
878
908
  case 'placeholder':
879
- return function () { var _a; return (_a = _this.placeholder) !== null && _a !== void 0 ? _a : 'Pick an option'; };
909
+ return function () { return 'Pick an option'; };
880
910
  case 'amountSelected':
881
911
  return function (amount) { return amount + " selected"; };
882
912
  }
@@ -884,6 +914,9 @@
884
914
  SelectComponent.prototype.getTranslation = function (key, params) {
885
915
  if (params === void 0) { params = null; }
886
916
  var _a, _b, _c;
917
+ if (key === 'placeholder' && stringIsSetAndFilled(this.placeholder)) {
918
+ return this.placeholder;
919
+ }
887
920
  return (_c = (_b = (_a = this.translations) === null || _a === void 0 ? void 0 : _a[key]) === null || _b === void 0 ? void 0 : _b.call(_a, params)) !== null && _c !== void 0 ? _c : this.getDefaultTranslation(key)(params);
888
921
  };
889
922
  return SelectComponent;
@@ -1283,10 +1316,9 @@
1283
1316
  }
1284
1317
  };
1285
1318
  DatePickerComponent.prototype.getDefaultTranslation = function (key) {
1286
- var _this = this;
1287
1319
  switch (key) {
1288
1320
  case 'placeholder':
1289
- return function () { var _a; return (_a = _this.placeholder) !== null && _a !== void 0 ? _a : 'Select date'; };
1321
+ return function () { return 'Select date'; };
1290
1322
  }
1291
1323
  };
1292
1324
  DatePickerComponent.prototype.getTranslation = function (key, params) {
@@ -1295,6 +1327,9 @@
1295
1327
  if (key === 'placeholder' && this.multiple) {
1296
1328
  return '';
1297
1329
  }
1330
+ if (key === 'placeholder' && stringIsSetAndFilled(this.placeholder)) {
1331
+ return this.placeholder;
1332
+ }
1298
1333
  return (_c = (_b = (_a = this.translations) === null || _a === void 0 ? void 0 : _a[key]) === null || _b === void 0 ? void 0 : _b.call(_a, params)) !== null && _c !== void 0 ? _c : this.getDefaultTranslation(key)(params);
1299
1334
  };
1300
1335
  return DatePickerComponent;
@@ -1572,10 +1607,9 @@
1572
1607
  }
1573
1608
  };
1574
1609
  DateTimePickerComponent.prototype.getDefaultTranslation = function (key) {
1575
- var _this = this;
1576
1610
  switch (key) {
1577
1611
  case 'placeholder':
1578
- return function () { var _a; return (_a = _this.placeholder) !== null && _a !== void 0 ? _a : 'Select date'; };
1612
+ return function () { return 'Select date'; };
1579
1613
  case 'selectDays':
1580
1614
  return function () { return 'Select day(s)'; };
1581
1615
  case 'selectedDate':
@@ -1592,6 +1626,9 @@
1592
1626
  if (key === 'placeholder' && this.multiple) {
1593
1627
  return '';
1594
1628
  }
1629
+ if (key === 'placeholder' && stringIsSetAndFilled(this.placeholder)) {
1630
+ return this.placeholder;
1631
+ }
1595
1632
  return (_c = (_b = (_a = this.translations) === null || _a === void 0 ? void 0 : _a[key]) === null || _b === void 0 ? void 0 : _b.call(_a, params)) !== null && _c !== void 0 ? _c : this.getDefaultTranslation(key)(params);
1596
1633
  };
1597
1634
  return DateTimePickerComponent;