@colijnit/corecomponents_v12 12.2.4 → 12.2.6

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.
Files changed (26) hide show
  1. package/bundles/colijnit-corecomponents_v12.umd.js +501 -134
  2. package/bundles/colijnit-corecomponents_v12.umd.js.map +1 -1
  3. package/colijnit-corecomponents_v12.d.ts +0 -2
  4. package/colijnit-corecomponents_v12.metadata.json +1 -1
  5. package/esm2015/colijnit-corecomponents_v12.js +1 -3
  6. package/esm2015/lib/components/base/base-input.component.js +52 -43
  7. package/esm2015/lib/components/button/button.component.js +27 -20
  8. package/esm2015/lib/components/filter-item/filter-item.component.js +10 -5
  9. package/esm2015/lib/components/input-date-picker/input-date-picker.component.js +3 -1
  10. package/esm2015/lib/components/list-of-values/list-of-values.component.js +14 -6
  11. package/esm2015/lib/directives/screen-configuration/screen-configuration.directive.js +123 -33
  12. package/esm2015/lib/directives/screen-configuration/screen-configuration.module.js +4 -6
  13. package/esm2015/lib/service/base-module-screen-config.service.js +205 -0
  14. package/esm2015/lib/service/base-module.service.js +42 -0
  15. package/esm2015/public-api.js +4 -1
  16. package/fesm2015/colijnit-corecomponents_v12.js +453 -125
  17. package/fesm2015/colijnit-corecomponents_v12.js.map +1 -1
  18. package/lib/components/base/base-input.component.d.ts +5 -3
  19. package/lib/components/button/button.component.d.ts +11 -3
  20. package/lib/directives/screen-configuration/screen-configuration.directive.d.ts +25 -9
  21. package/lib/service/base-module-screen-config.service.d.ts +47 -0
  22. package/lib/service/base-module.service.d.ts +22 -0
  23. package/package.json +5 -4
  24. package/public-api.d.ts +3 -0
  25. package/esm2015/lib/directives/screen-configuration/screen-config-component-wrapper.component.js +0 -30
  26. package/lib/directives/screen-configuration/screen-config-component-wrapper.component.d.ts +0 -11
@@ -1,8 +1,8 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/forms'), require('rxjs'), require('@angular/platform-browser'), require('@angular/animations'), require('@angular/common'), require('@angular/common/http'), require('rxjs/operators'), require('three'), require('three/examples/jsm/renderers/CSS3DRenderer'), require('@tweenjs/tween.js'), require('hammerjs'), require('@angular/cdk/overlay'), require('@angular/cdk/portal'), require('@angular/cdk/drag-drop'), require('@angular/cdk/scrolling')) :
3
- typeof define === 'function' && define.amd ? define('@colijnit/corecomponents_v12', ['exports', '@angular/core', '@angular/forms', 'rxjs', '@angular/platform-browser', '@angular/animations', '@angular/common', '@angular/common/http', 'rxjs/operators', 'three', 'three/examples/jsm/renderers/CSS3DRenderer', '@tweenjs/tween.js', 'hammerjs', '@angular/cdk/overlay', '@angular/cdk/portal', '@angular/cdk/drag-drop', '@angular/cdk/scrolling'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.colijnit = global.colijnit || {}, global.colijnit.corecomponents_v12 = {}), global.ng.core, global.ng.forms, global.rxjs, global.ng.platformBrowser, global.ng.animations, global.ng.common, global.ng.common.http, global.rxjs.operators, global.three, global.CSS3DRenderer, global.TWEEN, null, global.ng.cdk.overlay, global.ng.cdk.portal, global.ng.cdk.dragDrop, global.ng.cdk.scrolling));
5
- })(this, (function (exports, i0, forms, rxjs, platformBrowser, animations, common, http, operators, three, CSS3DRenderer, TWEEN, hammerjs, overlay, portal, dragDrop, scrolling) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/forms'), require('rxjs'), require('@angular/platform-browser'), require('@angular/animations'), require('@angular/common'), require('@angular/common/http'), require('rxjs/operators'), require('three'), require('three/examples/jsm/renderers/CSS3DRenderer'), require('@tweenjs/tween.js'), require('hammerjs'), require('@angular/cdk/overlay'), require('@angular/cdk/portal'), require('@angular/cdk/drag-drop'), require('@angular/cdk/scrolling'), require('@colijnit/ioneconnector/build/utils/array-utils'), require('@colijnit/ioneconnector/build/model/default-get-object-configurations-params'), require('@colijnit/ioneconnector/build/model/object-configuration')) :
3
+ typeof define === 'function' && define.amd ? define('@colijnit/corecomponents_v12', ['exports', '@angular/core', '@angular/forms', 'rxjs', '@angular/platform-browser', '@angular/animations', '@angular/common', '@angular/common/http', 'rxjs/operators', 'three', 'three/examples/jsm/renderers/CSS3DRenderer', '@tweenjs/tween.js', 'hammerjs', '@angular/cdk/overlay', '@angular/cdk/portal', '@angular/cdk/drag-drop', '@angular/cdk/scrolling', '@colijnit/ioneconnector/build/utils/array-utils', '@colijnit/ioneconnector/build/model/default-get-object-configurations-params', '@colijnit/ioneconnector/build/model/object-configuration'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.colijnit = global.colijnit || {}, global.colijnit.corecomponents_v12 = {}), global.ng.core, global.ng.forms, global.rxjs, global.ng.platformBrowser, global.ng.animations, global.ng.common, global.ng.common.http, global.rxjs.operators, global.three, global.CSS3DRenderer, global.TWEEN, null, global.ng.cdk.overlay, global.ng.cdk.portal, global.ng.cdk.dragDrop, global.ng.cdk.scrolling, global.arrayUtils, global.defaultGetObjectConfigurationsParams, global.objectConfiguration));
5
+ })(this, (function (exports, i0, forms, rxjs, platformBrowser, animations, common, http, operators, three, CSS3DRenderer, TWEEN, hammerjs, overlay, portal, dragDrop, scrolling, arrayUtils, defaultGetObjectConfigurationsParams, objectConfiguration) { 'use strict';
6
6
 
7
7
  function _interopNamespace(e) {
8
8
  if (e && e.__esModule) return e;
@@ -2246,6 +2246,7 @@
2246
2246
  this.forceRequired = false; // a force outside of [cfgName]'s influence
2247
2247
  // Goal: ability to emulate the red background of input fields (form-submitted invalid state)
2248
2248
  this.redErrorBackground = false;
2249
+ this.commitOnBlur = true;
2249
2250
  // @Output()
2250
2251
  // public commit: EventEmitter<any> = new EventEmitter<any>();
2251
2252
  this.nativeBlur = new i0.EventEmitter();
@@ -2273,6 +2274,7 @@
2273
2274
  this._markedAsUserTouched = false;
2274
2275
  this._destroyed = false;
2275
2276
  this._hasOnPushCdStrategy = false;
2277
+ this._modelDirtyForCommit = false;
2276
2278
  this._initialModelSet = false;
2277
2279
  this._forceReadonly = undefined;
2278
2280
  this._validators = [];
@@ -2315,6 +2317,7 @@
2315
2317
  }
2316
2318
  this._model = value;
2317
2319
  this.canSaveOrCancel = this._model !== this._initialModel;
2320
+ this._modelDirtyForCommit = this._model !== this._initialModel;
2318
2321
  this._clearErrorComponent();
2319
2322
  this.modelSet();
2320
2323
  },
@@ -2607,7 +2610,7 @@
2607
2610
  committing: false,
2608
2611
  commitFinished: false
2609
2612
  }, {
2610
- commitClick: function (event) { return _this.commitClick(event); },
2613
+ commitClick: function (event) { return _this._handleCommit(event); },
2611
2614
  cancelClick: function (event) { return _this.cancelClick(event); }
2612
2615
  });
2613
2616
  }
@@ -2673,32 +2676,6 @@
2673
2676
  this.changeDetector = undefined;
2674
2677
  this.input = undefined;
2675
2678
  };
2676
- BaseInputComponent.prototype.commitClick = function (event) {
2677
- return __awaiter(this, void 0, void 0, function () {
2678
- var success;
2679
- return __generator(this, function (_a) {
2680
- switch (_a.label) {
2681
- case 0:
2682
- this.keepFocus = true;
2683
- if (this._commitButtonsComponentRef) {
2684
- this._commitButtonsComponentRef.instance.commitFinished = false;
2685
- this._commitButtonsComponentRef.instance.committing = true;
2686
- }
2687
- return [4 /*yield*/, this.commit(this.model)];
2688
- case 1:
2689
- success = _a.sent();
2690
- this.keepFocus = false;
2691
- return [4 /*yield*/, this._commitFinished()];
2692
- case 2:
2693
- _a.sent();
2694
- if (success) {
2695
- this.doBlur(event);
2696
- }
2697
- return [2 /*return*/, success];
2698
- }
2699
- });
2700
- });
2701
- };
2702
2679
  BaseInputComponent.prototype.cancelClick = function (event) {
2703
2680
  this.keepFocus = true;
2704
2681
  if (this._initialModelSet) {
@@ -2752,24 +2729,39 @@
2752
2729
  }
2753
2730
  this.focus.next();
2754
2731
  };
2755
- BaseInputComponent.prototype.doBlur = function (event) {
2756
- var _this = this;
2757
- setTimeout(function () {
2758
- if (_this.keepFocus || _this.keepFocussed) {
2759
- if (event) {
2760
- event.preventDefault;
2732
+ BaseInputComponent.prototype.doBlur = function (event, handleCommit) {
2733
+ if (handleCommit === void 0) { handleCommit = true; }
2734
+ return __awaiter(this, void 0, void 0, function () {
2735
+ var _this = this;
2736
+ return __generator(this, function (_a) {
2737
+ switch (_a.label) {
2738
+ case 0:
2739
+ if (!(this.showSaveCancel && handleCommit)) return [3 /*break*/, 2];
2740
+ return [4 /*yield*/, this._handleCommit(event, false)];
2741
+ case 1:
2742
+ _a.sent();
2743
+ _a.label = 2;
2744
+ case 2:
2745
+ setTimeout(function () {
2746
+ if (_this.keepFocus || _this.keepFocussed) {
2747
+ if (event) {
2748
+ event.preventDefault;
2749
+ }
2750
+ return false;
2751
+ }
2752
+ _this.focused = false;
2753
+ if (_this._hasOnPushCdStrategy) {
2754
+ _this.markForCheck();
2755
+ }
2756
+ if (_this.input) {
2757
+ _this.input.blur();
2758
+ }
2759
+ _this.blur.next();
2760
+ }, 200);
2761
+ return [2 /*return*/];
2761
2762
  }
2762
- return false;
2763
- }
2764
- _this.focused = false;
2765
- if (_this._hasOnPushCdStrategy) {
2766
- _this.markForCheck();
2767
- }
2768
- if (_this.input) {
2769
- _this.input.blur();
2770
- }
2771
- _this.blur.next();
2772
- }, 200);
2763
+ });
2764
+ });
2773
2765
  };
2774
2766
  BaseInputComponent.prototype.detectChanges = function () {
2775
2767
  if (!this._destroyed) {
@@ -2882,6 +2874,37 @@
2882
2874
  this.control.updateValueAndValidity();
2883
2875
  }
2884
2876
  };
2877
+ BaseInputComponent.prototype._handleCommit = function (event, doBlur) {
2878
+ if (doBlur === void 0) { doBlur = true; }
2879
+ return __awaiter(this, void 0, void 0, function () {
2880
+ var success;
2881
+ return __generator(this, function (_a) {
2882
+ switch (_a.label) {
2883
+ case 0:
2884
+ if (!this.showSaveCancel || (!this._modelDirtyForCommit)) {
2885
+ return [2 /*return*/, true];
2886
+ }
2887
+ this.keepFocus = true;
2888
+ if (this._commitButtonsComponentRef) {
2889
+ this._commitButtonsComponentRef.instance.commitFinished = false;
2890
+ this._commitButtonsComponentRef.instance.committing = true;
2891
+ }
2892
+ return [4 /*yield*/, this.commit(this.model)];
2893
+ case 1:
2894
+ success = _a.sent();
2895
+ this.keepFocus = false;
2896
+ return [4 /*yield*/, this._commitFinished()];
2897
+ case 2:
2898
+ _a.sent();
2899
+ this._modelDirtyForCommit = false;
2900
+ if (success && doBlur) {
2901
+ this.doBlur(event, false);
2902
+ }
2903
+ return [2 /*return*/, success];
2904
+ }
2905
+ });
2906
+ });
2907
+ };
2885
2908
  BaseInputComponent.prototype._commitFinished = function () {
2886
2909
  var _this = this;
2887
2910
  return new Promise(function (resolve) {
@@ -2894,17 +2917,13 @@
2894
2917
  resolve();
2895
2918
  }, 800);
2896
2919
  }
2920
+ else {
2921
+ resolve();
2922
+ }
2897
2923
  });
2898
2924
  };
2899
2925
  BaseInputComponent.prototype._clearErrorComponent = function () {
2900
2926
  this.overlayService.removeComponent(this._validationComponentRef);
2901
- // if (this.validationErrorContainer) {
2902
- // this.validationErrorContainer.clear();
2903
- // if (this._errorValidationComponent) {
2904
- // this._errorValidationComponent.destroy();
2905
- // this._errorValidationComponent = undefined;
2906
- // }
2907
- // }
2908
2927
  };
2909
2928
  // whether this.ngModel.control has safe access
2910
2929
  BaseInputComponent.prototype._controlExists = function () {
@@ -3012,7 +3031,7 @@
3012
3031
  case 1:
3013
3032
  if (!!event.shiftKey) return [3 /*break*/, 3];
3014
3033
  event.preventDefault();
3015
- return [4 /*yield*/, this.commitClick()];
3034
+ return [4 /*yield*/, this._handleCommit()];
3016
3035
  case 2:
3017
3036
  _b.sent();
3018
3037
  return [2 /*return*/, false];
@@ -3020,7 +3039,7 @@
3020
3039
  case 4:
3021
3040
  nextSiblingToFocus = event.shiftKey ? event.currentTarget.previousSibling : event.currentTarget.nextSibling;
3022
3041
  event.preventDefault();
3023
- return [4 /*yield*/, this.commitClick()];
3042
+ return [4 /*yield*/, this._handleCommit()];
3024
3043
  case 5:
3025
3044
  success = _b.sent();
3026
3045
  if (success) {
@@ -3111,6 +3130,7 @@
3111
3130
  customCssClass: [{ type: i0.Input }],
3112
3131
  redErrorBackground: [{ type: i0.Input }, { type: i0.HostBinding, args: ["class.cc-red-error-background",] }],
3113
3132
  myFormInputInstance: [{ type: i0.Input }],
3133
+ commitOnBlur: [{ type: i0.Input }],
3114
3134
  nativeBlur: [{ type: i0.Output }],
3115
3135
  blur: [{ type: i0.Output }],
3116
3136
  enter: [{ type: i0.Output }],
@@ -3845,6 +3865,9 @@
3845
3865
  EventUtils._passiveCapture = undefined;
3846
3866
  EventUtils._passiveBubble = undefined;
3847
3867
 
3868
+ // Enables "DI for interfaces" (see ConfigNameDirective injected .hostComponent).
3869
+ var SCREEN_CONFIG_ADAPTER_COMPONENT_INTERFACE_NAME = new i0.InjectionToken("ScreenConfigAdapterComponent");
3870
+
3848
3871
  var ButtonComponent = /** @class */ (function () {
3849
3872
  function ButtonComponent(_elementRef) {
3850
3873
  this._elementRef = _elementRef;
@@ -3865,7 +3888,7 @@
3865
3888
  configurable: true
3866
3889
  });
3867
3890
  ButtonComponent.prototype.onHostClick = function (event) {
3868
- if (this.disabled) {
3891
+ if (this.readonly || this.disabled) {
3869
3892
  this.clickedWhileDisabled.emit(event);
3870
3893
  EventUtils.KillEvent(event);
3871
3894
  }
@@ -3887,11 +3910,16 @@
3887
3910
  }());
3888
3911
  ButtonComponent.decorators = [
3889
3912
  { type: i0.Component, args: [{
3890
- selector: "co-button",
3891
- template: "\n <co-icon *ngIf=\"!!iconData\" [iconData]=\"iconData\"></co-icon>\n <span *ngIf=\"!!label\" class=\"label\">{{ label }}</span>\n <co-icon *ngIf=\"!!iconDataRight\" [iconData]=\"iconDataRight\"></co-icon>\n <div class=\"rippler\" md-ripple [mdRippleDisabled]=\"disabled\"></div>\n ",
3913
+ selector: 'co-button',
3914
+ template: "\n <co-icon *ngIf=\"!!iconData\" [iconData]=\"iconData\"></co-icon>\n <span *ngIf=\"!!label\" class=\"label\">{{ label }}</span>\n <co-icon *ngIf=\"!!iconDataRight\" [iconData]=\"iconDataRight\"></co-icon>\n <div class=\"rippler\" md-ripple [mdRippleDisabled]=\"disabled\"></div>\n ",
3892
3915
  host: {
3893
- tabindex: "0"
3916
+ tabindex: '0'
3894
3917
  },
3918
+ providers: [{
3919
+ provide: SCREEN_CONFIG_ADAPTER_COMPONENT_INTERFACE_NAME,
3920
+ useExisting: i0.forwardRef(function () { return ButtonComponent; })
3921
+ }
3922
+ ],
3895
3923
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
3896
3924
  encapsulation: i0.ViewEncapsulation.None
3897
3925
  },] }
@@ -3900,19 +3928,20 @@
3900
3928
  { type: i0.ElementRef }
3901
3929
  ]; };
3902
3930
  ButtonComponent.propDecorators = {
3903
- label: [{ type: i0.HostBinding, args: ["class.has-label",] }, { type: i0.Input }],
3904
- iconData: [{ type: i0.HostBinding, args: ["class.has-left-icon",] }, { type: i0.Input }],
3905
- iconDataRight: [{ type: i0.HostBinding, args: ["class.has-right-icon",] }, { type: i0.Input }],
3931
+ label: [{ type: i0.HostBinding, args: ['class.has-label',] }, { type: i0.Input }],
3932
+ iconData: [{ type: i0.HostBinding, args: ['class.has-left-icon',] }, { type: i0.Input }],
3933
+ iconDataRight: [{ type: i0.HostBinding, args: ['class.has-right-icon',] }, { type: i0.Input }],
3906
3934
  isToggleButton: [{ type: i0.Input }],
3907
- isToggled: [{ type: i0.Input }, { type: i0.HostBinding, args: ["class.toggled",] }],
3908
- hidden: [{ type: i0.Input }, { type: i0.HostBinding, args: ["class.co-hidden",] }],
3909
- disabled: [{ type: i0.Input }, { type: i0.HostBinding, args: ["class.disabled",] }],
3910
- showClass: [{ type: i0.HostBinding, args: ["class.co-button",] }],
3935
+ isToggled: [{ type: i0.Input }, { type: i0.HostBinding, args: ['class.toggled',] }],
3936
+ hidden: [{ type: i0.Input }, { type: i0.HostBinding, args: ['class.co-hidden',] }],
3937
+ disabled: [{ type: i0.Input }, { type: i0.HostBinding, args: ['class.disabled',] }],
3938
+ showClass: [{ type: i0.HostBinding, args: ['class.co-button',] }],
3911
3939
  onClick: [{ type: i0.Output }],
3912
3940
  clickedWhileDisabled: [{ type: i0.Output }],
3913
3941
  isToggledChange: [{ type: i0.Output }],
3914
- hasIcon: [{ type: i0.HostBinding, args: ["class.has-icon",] }],
3915
- onHostClick: [{ type: i0.HostListener, args: ["click", ["$event"],] }]
3942
+ hasIcon: [{ type: i0.HostBinding, args: ['class.has-icon',] }],
3943
+ onHostClick: [{ type: i0.HostListener, args: ['click', ['$event'],] }],
3944
+ readonly: [{ type: i0.HostBinding, args: ["class.read-only",] }]
3916
3945
  };
3917
3946
 
3918
3947
  var ButtonModule = /** @class */ (function () {
@@ -5725,9 +5754,6 @@
5725
5754
  },] }
5726
5755
  ];
5727
5756
 
5728
- // Enables "DI for interfaces" (see ConfigNameDirective injected .hostComponent).
5729
- var SCREEN_CONFIG_ADAPTER_COMPONENT_INTERFACE_NAME = new i0.InjectionToken("ScreenConfigAdapterComponent");
5730
-
5731
5757
  var InputCheckboxComponent = /** @class */ (function (_super) {
5732
5758
  __extends(InputCheckboxComponent, _super);
5733
5759
  function InputCheckboxComponent(formComponent, iconCacheService, changeDetector, overlayService, componentFactoryResolver, formUserChangeListener, ngZoneWrapper, elementRef) {
@@ -5928,7 +5954,7 @@
5928
5954
  InputDatePickerComponent.decorators = [
5929
5955
  { type: i0.Component, args: [{
5930
5956
  selector: 'co-input-date',
5931
- template: "\n <co-input-text (clickOutside)=\"toggleCalendar(false)\" overlayParent #parentForOverlay=\"overlayParent\"\n [(model)]=\"modelAsString\"\n [rightIcon]=\"rightIcon\"\n [leftIcon]=\"leftIcon\"\n [leftIconData]=\"leftIconData\"\n [pattern]=\"'yyyy-MM-dd'\"\n [type]=\"'date'\"\n [placeholder]=\"placeholder\"\n (rightIconClick)=\"toggleCalendar(true)\"\n (blur)=\"handleDateChange(modelAsString)\"\n (clearIconClick)=\"handleClearIconClicked()\"\n ></co-input-text>\n ",
5957
+ template: "\n <co-input-text (clickOutside)=\"toggleCalendar(false)\" overlayParent #parentForOverlay=\"overlayParent\"\n [hidden]=\"hidden\"\n [readonly]=\"readonly\"\n [(model)]=\"modelAsString\"\n [rightIcon]=\"rightIcon\"\n [leftIcon]=\"leftIcon\"\n [leftIconData]=\"leftIconData\"\n [pattern]=\"'yyyy-MM-dd'\"\n [type]=\"'date'\"\n [placeholder]=\"placeholder\"\n (rightIconClick)=\"toggleCalendar(true)\"\n (blur)=\"handleDateChange(modelAsString)\"\n (clearIconClick)=\"handleClearIconClicked()\"\n ></co-input-text>\n ",
5932
5958
  providers: [
5933
5959
  OverlayService, {
5934
5960
  provide: SCREEN_CONFIG_ADAPTER_COMPONENT_INTERFACE_NAME, useExisting: i0.forwardRef(function () { return InputDatePickerComponent; })
@@ -11202,8 +11228,11 @@
11202
11228
  if (this._lovPopupComponentRef) {
11203
11229
  this._lovPopupComponentRef.instance.searchTerm = model;
11204
11230
  }
11205
- if (!this.selectedModel && model) {
11206
- this.openPopup();
11231
+ else {
11232
+ if (!this.selectedModel && model) {
11233
+ this.openPopup();
11234
+ this._lovPopupComponentRef.instance.searchTerm = model;
11235
+ }
11207
11236
  }
11208
11237
  this.selectedModel = model;
11209
11238
  };
@@ -11326,7 +11355,7 @@
11326
11355
  this.selectedModel = this.model[this.displayField];
11327
11356
  }
11328
11357
  else {
11329
- this.selectedModel = "";
11358
+ this.selectedModel = '';
11330
11359
  }
11331
11360
  }
11332
11361
  };
@@ -11337,7 +11366,11 @@
11337
11366
  selector: 'co-list-of-values',
11338
11367
  template: "\n <co-input-text aria-haspopup=\"listbox\" [attr.aria-expanded]=\"isSelectOpen\" aria-controls=\"lov-popup\" role=\"combobox\"\n class=\"no-focus-line\"\n overlayParent\n #parentForOverlay=\"overlayParent\" type=\"text\" [id]=\"label\"\n [model]=\"multiselect ? selectedModels : selectedModel\"\n [placeholder]=\"label\"\n [readonly]=\"readonly\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [noClickFocus]=\"false\"\n [leftIconData]=\"leftIconData\"\n [rightIcon]=\"isSelectOpen ? icons.ChevronUpRegular : icons.ChevronDownRegular\"\n [showClearButton]=\"true\"\n [useContent]=\"multiselect\"\n [customHeight]=\"multiselect\"\n [keepFocussed]=\"keepFocussed\"\n (modelChange)=\"handleInputModelChange($event)\"\n (click)=\"openPopup()\"\n (rightIconClick)=\"toggleSelect()\"\n (keydown)=\"handleInputKeyDown($event)\"\n (clearIconClick)=\"clearModel($event)\"\n (blur)=\"checkModel()\"\n >\n <ng-container *ngIf=\"multiselect\">\n <div class=\"multiselect-chips-wrapper\">\n <div class=\"chips\" *ngFor=\"let chip of model\">\n <span class=\"chips-description\" [textContent]=\"chip[displayField]\"></span>\n <co-icon class=\"remove-chip-icon\" [icon]=\"icons.CrossSkinny\" (click)=\"removeOptionFromModel(chip)\"></co-icon>\n </div>\n </div>\n </ng-container>\n </co-input-text>\n ",
11339
11368
  providers: [
11340
- OverlayService
11369
+ OverlayService,
11370
+ {
11371
+ provide: SCREEN_CONFIG_ADAPTER_COMPONENT_INTERFACE_NAME,
11372
+ useExisting: i0.forwardRef(function () { return ListOfValuesComponent; })
11373
+ }
11341
11374
  ],
11342
11375
  encapsulation: i0.ViewEncapsulation.None
11343
11376
  },] }
@@ -11903,6 +11936,8 @@
11903
11936
  this.sliderMax = !!this.sliderMax ? this.sliderMax : this.sliderDefaultMax;
11904
11937
  var trueLowerBound = Math.min(this.sliderMin, this.sliderMax);
11905
11938
  var trueUpperBound = Math.max(this.sliderMin, this.sliderMax);
11939
+ this.sliderMin = trueLowerBound;
11940
+ this.sliderMax = trueUpperBound;
11906
11941
  this._model = trueLowerBound + " - " + trueUpperBound;
11907
11942
  };
11908
11943
  FilterItemComponent.prototype._createModelForCheckboxToText = function () {
@@ -12094,7 +12129,7 @@
12094
12129
  FilterItemComponent.decorators = [
12095
12130
  { type: i0.Component, args: [{
12096
12131
  selector: "co-filter-item",
12097
- template: "\n <div class=\"co-filter-item-header\">\n <co-collapsible\n [headerTitle]=\"placeholder\"\n [expandButtonLast]=\"true\"\n [iconData]=\"iconService.getIcon(icons.ArrowPointDown)\"\n [expanded]=\"expanded\"\n [showButton]=\"showButton\"\n [buttonText]=\"filterButtonLabel\"\n (buttonClicked)=\"onButtonClicked()\"\n >\n <div class=\"co-filter-item-collapsable-content\">\n <div class=\"co-filter-item-custom-content\" *ngIf=\"customContent; else collectionContent\"\n (keydown)=\"showButton=true\" (mousedown)=\"showButton=true\">\n <ng-content></ng-content>\n </div>\n <ng-template #collectionContent>\n <div class=\"co-filter-item-collection-content\" *ngIf=\"mode === modes.Filterlist || mode === modes.SingleSelectList\n || mode === modes.SelectListWithNumberOutput || mode === modes.SelectListWithStringCollectionOutput\">\n <co-input-text\n *ngIf=\"collection?.length > 10 || minSearchCharsToLoadCollection\"\n [placeholder]=\"searchPlaceholder\"\n [model]=\"filterText\"\n (modelChange)=\"applyFilter($event)\"\n >\n </co-input-text>\n <div class=\"no-results\" *ngIf=\"filteredCollection?.length === 0\">\n <span [textContent]=\"noResultsLabel\"></span>\n </div>\n <div class=\"co-filter-item-collection-results\">\n <ng-container\n *ngFor=\"let option of filteredCollection; let index = index\">\n <div class=\"co-filter-item-collection-result-item\" *ngIf=\"index < limitTo || showAllResults\">\n <co-input-checkbox *ngIf=\"mode !== modes.SingleSelectList\"\n [label]=\"option.description\"\n [model]=\"option.checked\"\n [clickableLabel]=\"false\"\n (modelChange)=\"handleModelChange(option)\"\n ></co-input-checkbox>\n <co-input-radio-button *ngIf=\"mode === modes.SingleSelectList\"\n [label]=\"option.description\"\n [model]=\"option.checked\"\n (modelChange)=\"handleModelChange(option)\"\n ></co-input-radio-button>\n <div class=\"co-filter-item-amount\" *ngIf=\"option.count\"\n [textContent]=\"option.count.toString() | append: ')' | prepend: ' ('\"\n ></div>\n </div>\n\n </ng-container>\n </div>\n <div class=\"co-filter-show-more-or-less\" *ngIf=\"!showAllResults\">\n <div class=\"co-filter-show-more clickable\"\n *ngIf=\"moreToShow()\">\n <a (click)=\"increaseLimit()\">\n <co-icon [iconData]=\"iconService.getIcon(icons.ArrowPointDown)\"></co-icon>\n <span [textContent]=\"showMoreLabel\"></span>\n </a>\n </div>\n <div class=\"co-filter-show-less clickable\"\n *ngIf=\"lessToShow()\">\n <a (click)=\"setToInitialLimit()\">\n <co-icon [iconData]=\"iconService.getIcon(icons.ArrowPointUp)\"></co-icon>\n <span [textContent]=\"showLessLabel\"></span>\n </a>\n </div>\n </div>\n </div>\n <div class=\"co-filter-item-slider-content\" *ngIf=\"mode === modes.Slider\">\n <co-input-text\n class=\"slider-from\"\n [type]=\"'number'\"\n [digitsOnly]=\"true\"\n [hideArrowButtons]=\"true\"\n [excludePlusMinus]=\"true\"\n [label]=\"'FROM' | localize\"\n [(model)]=\"sliderMin\"\n (modelChange)=\"handleModelChange($event)\"\n ></co-input-text>\n <co-input-text\n class=\"slider-to\"\n [type]=\"'number'\"\n [digitsOnly]=\"true\"\n [hideArrowButtons]=\"true\"\n [excludePlusMinus]=\"true\"\n [label]=\"'TO' | localize\"\n [(model)]=\"sliderMax\"\n (modelChange)=\"handleModelChange($event)\"\n ></co-input-text>\n </div>\n <div class=\"co-filter-item-checkbox-content\" *ngIf=\"mode === modes.Checkbox \">\n <co-input-checkbox\n [(model)]=\"model\"\n (modelChange)=\"handleModelChange($event)\"></co-input-checkbox>\n </div>\n <div class=\"co-filter-item-checkbox-content\"\n *ngIf=\"mode === modes.CheckboxToText || mode === modes.CheckboxToSimpleText || mode === modes.CheckboxToBinary\">\n <co-input-checkbox\n [(model)]=\"checkBoxToTextModel\"\n (modelChange)=\"handleModelChange($event)\"></co-input-checkbox>\n </div>\n <div class=\"co-filter-item-textfield-content\" *ngIf=\"mode === modes.TextField\">\n <co-input-text\n [(model)]=\"model\"\n (modelChange)=\"handleModelChange($event)\"></co-input-text>\n </div>\n <div class=\"co-filter-item-dateField-content\" *ngIf=\"mode === modes.DateField\">\n <co-input-date\n [(model)]=\"model\"\n (modelChange)=\"handleModelChange($event)\"\n ></co-input-date>\n </div>\n <div class=\"co-filter-item-dateField-content\" *ngIf=\"mode === modes.DateRangeField\">\n <co-input-date-range\n [model]=\"[dateRangeStart, dateRangeEnd]\"\n (modelChange)=\"handleModelChange($event)\"\n [placeholder]=\"'SELECT_DATE' | localize\">\n </co-input-date-range>\n </div>\n </ng-template>\n </div>\n </co-collapsible>\n </div>\n\n ",
12132
+ template: "\n <div class=\"co-filter-item-header\">\n <co-collapsible\n [headerTitle]=\"placeholder\"\n [expandButtonLast]=\"true\"\n [iconData]=\"iconService.getIcon(icons.ArrowPointDown)\"\n [expanded]=\"expanded\"\n [showButton]=\"showButton\"\n [buttonText]=\"filterButtonLabel\"\n (buttonClicked)=\"onButtonClicked()\"\n >\n <div class=\"co-filter-item-collapsable-content\">\n <div class=\"co-filter-item-custom-content\" *ngIf=\"customContent; else collectionContent\"\n (keydown)=\"showButton=true\" (mousedown)=\"showButton=true\">\n <ng-content></ng-content>\n </div>\n <ng-template #collectionContent>\n <div class=\"co-filter-item-collection-content\" *ngIf=\"mode === modes.Filterlist || mode === modes.SingleSelectList\n || mode === modes.SelectListWithNumberOutput || mode === modes.SelectListWithStringCollectionOutput\">\n <co-input-text\n *ngIf=\"collection?.length > 10 || minSearchCharsToLoadCollection\"\n [placeholder]=\"searchPlaceholder\"\n [model]=\"filterText\"\n (modelChange)=\"applyFilter($event)\"\n >\n </co-input-text>\n <div class=\"no-results\" *ngIf=\"filteredCollection?.length === 0\">\n <span [textContent]=\"noResultsLabel\"></span>\n </div>\n <div class=\"co-filter-item-collection-results\">\n <ng-container\n *ngFor=\"let option of filteredCollection; let index = index\">\n <div class=\"co-filter-item-collection-result-item\" *ngIf=\"index < limitTo || showAllResults\">\n <co-input-checkbox *ngIf=\"mode !== modes.SingleSelectList\"\n [label]=\"option.description\"\n [model]=\"option.checked\"\n [clickableLabel]=\"false\"\n (modelChange)=\"handleModelChange(option)\"\n ></co-input-checkbox>\n <co-input-radio-button *ngIf=\"mode === modes.SingleSelectList\"\n [label]=\"option.description\"\n [model]=\"option.checked\"\n (modelChange)=\"handleModelChange(option)\"\n ></co-input-radio-button>\n <div class=\"co-filter-item-amount\" *ngIf=\"option.count\"\n [textContent]=\"option.count.toString() | append: ')' | prepend: ' ('\"\n ></div>\n </div>\n\n </ng-container>\n </div>\n <div class=\"co-filter-show-more-or-less\" *ngIf=\"!showAllResults\">\n <div class=\"co-filter-show-more clickable\"\n *ngIf=\"moreToShow()\">\n <a (click)=\"increaseLimit()\">\n <co-icon [iconData]=\"iconService.getIcon(icons.ArrowPointDown)\"></co-icon>\n <span [textContent]=\"showMoreLabel\"></span>\n </a>\n </div>\n <div class=\"co-filter-show-less clickable\"\n *ngIf=\"lessToShow()\">\n <a (click)=\"setToInitialLimit()\">\n <co-icon [iconData]=\"iconService.getIcon(icons.ArrowPointUp)\"></co-icon>\n <span [textContent]=\"showLessLabel\"></span>\n </a>\n </div>\n </div>\n </div>\n <div class=\"co-filter-item-slider-content\" *ngIf=\"mode === modes.Slider\">\n <co-input-text\n class=\"slider-from\"\n [type]=\"'number'\"\n [digitsOnly]=\"true\"\n [hideArrowButtons]=\"true\"\n [excludePlusMinus]=\"true\"\n [label]=\"'FROM' | localize\"\n [(model)]=\"sliderMin\"\n (focusout)=\"handleModelChange(sliderMin)\"\n ></co-input-text>\n <co-input-text\n class=\"slider-to\"\n [type]=\"'number'\"\n [digitsOnly]=\"true\"\n [hideArrowButtons]=\"true\"\n [excludePlusMinus]=\"true\"\n [label]=\"'TO' | localize\"\n [(model)]=\"sliderMax\"\n (focusout)=\"handleModelChange(sliderMax)\"\n ></co-input-text>\n </div>\n <div class=\"co-filter-item-checkbox-content\" *ngIf=\"mode === modes.Checkbox \">\n <co-input-checkbox\n [(model)]=\"model\"\n (modelChange)=\"handleModelChange($event)\"\n [label]=\"placeholder\">\n </co-input-checkbox>\n </div>\n <div class=\"co-filter-item-checkbox-content\"\n *ngIf=\"mode === modes.CheckboxToText || mode === modes.CheckboxToSimpleText || mode === modes.CheckboxToBinary\">\n <co-input-checkbox\n [(model)]=\"checkBoxToTextModel\"\n (modelChange)=\"handleModelChange($event)\"\n [label]=\"placeholder\"></co-input-checkbox>\n </div>\n <div class=\"co-filter-item-textfield-content\" *ngIf=\"mode === modes.TextField\">\n <co-input-text\n [(model)]=\"model\"\n (modelChange)=\"handleModelChange($event)\"></co-input-text>\n </div>\n <div class=\"co-filter-item-dateField-content\" *ngIf=\"mode === modes.DateField\">\n <co-input-date\n [(model)]=\"model\"\n (modelChange)=\"handleModelChange($event)\"\n ></co-input-date>\n </div>\n <div class=\"co-filter-item-dateField-content\" *ngIf=\"mode === modes.DateRangeField\">\n <co-input-date-range\n [model]=\"[dateRangeStart, dateRangeEnd]\"\n (modelChange)=\"handleModelChange($event)\"\n [placeholder]=\"'SELECT_DATE' | localize\">\n </co-input-date-range>\n </div>\n </ng-template>\n </div>\n </co-collapsible>\n </div>\n\n ",
12098
12133
  encapsulation: i0.ViewEncapsulation.None,
12099
12134
  changeDetection: i0.ChangeDetectionStrategy.OnPush
12100
12135
  },] }
@@ -12496,81 +12531,406 @@
12496
12531
  },] }
12497
12532
  ];
12498
12533
 
12499
- var ScreenConfigComponentWrapper = /** @class */ (function () {
12500
- function ScreenConfigComponentWrapper(_elementRef) {
12501
- this._elementRef = _elementRef;
12502
- this._visibleOnViewInit = true;
12534
+ var BaseModuleScreenConfigService = /** @class */ (function () {
12535
+ function BaseModuleScreenConfigService() {
12536
+ // emits the params of the loaded config, each time when a new config was loaded
12537
+ this.configSet = new rxjs.BehaviorSubject([]);
12538
+ this._configObjects = [];
12539
+ // key: configName, value: the ObjectConfiguration with that configName. For faster ObjectConfiguration lookups, given a configName string (vs. array).
12540
+ this._objectConfigsMap = new Map();
12503
12541
  }
12504
- ScreenConfigComponentWrapper.prototype.setWrapperContent = function (element, visibleOnViewInit) {
12505
- this._contentNativeElement = element;
12506
- this._visibleOnViewInit = visibleOnViewInit;
12542
+ Object.defineProperty(BaseModuleScreenConfigService.prototype, "configObjects", {
12543
+ get: function () {
12544
+ return this._configObjects;
12545
+ },
12546
+ enumerable: false,
12547
+ configurable: true
12548
+ });
12549
+ // POST: this.configObjects are loaded. Returns the loaded config objects.
12550
+ BaseModuleScreenConfigService.prototype.loadConfig = function (params, insertRights) {
12551
+ if (params === void 0) { params = defaultGetObjectConfigurationsParams.DEFAULT_GET_OBJECT_CONFIGURATION_PARAMS; }
12552
+ return __awaiter(this, void 0, void 0, function () {
12553
+ var configObjects;
12554
+ return __generator(this, function (_a) {
12555
+ switch (_a.label) {
12556
+ case 0: return [4 /*yield*/, this.loadConfigForModule(params, insertRights)];
12557
+ case 1:
12558
+ configObjects = _a.sent();
12559
+ this._configObjects = configObjects;
12560
+ if (configObjects && Array.isArray(configObjects)) {
12561
+ this._buildScreenConfigMap();
12562
+ this.configSet.next(params);
12563
+ }
12564
+ return [2 /*return*/, this._configObjects];
12565
+ }
12566
+ });
12567
+ });
12568
+ };
12569
+ BaseModuleScreenConfigService.prototype.lazyLoadConfig = function () {
12570
+ return __awaiter(this, void 0, void 0, function () {
12571
+ return __generator(this, function (_a) {
12572
+ switch (_a.label) {
12573
+ case 0:
12574
+ if (!!this.configObjects.length) return [3 /*break*/, 2];
12575
+ return [4 /*yield*/, this.loadConfig()];
12576
+ case 1:
12577
+ _a.sent();
12578
+ _a.label = 2;
12579
+ case 2: return [2 /*return*/];
12580
+ }
12581
+ });
12582
+ });
12583
+ };
12584
+ BaseModuleScreenConfigService.prototype.isActiveFieldValidationObject = function (configObject) {
12585
+ if (configObject) {
12586
+ return configObject.isActiveFieldValidationObject() && !this.isDataNameHiddenByAnyOfItsParentRubrics(configObject.dataName);
12587
+ }
12588
+ };
12589
+ BaseModuleScreenConfigService.prototype.isBoValid = function (bo) {
12590
+ if (this.controlValidityByBoMap && !arrayUtils.ArrayUtils.IsEmptyArray(this.controlValidityByBoMap)) {
12591
+ var mapEntry = this.controlValidityByBoMap.find(function (value) { return value.bo === bo && value.valid === false; });
12592
+ if (mapEntry) {
12593
+ return mapEntry.valid;
12594
+ }
12595
+ }
12596
+ return true;
12597
+ };
12598
+ BaseModuleScreenConfigService.prototype.getObjectConfigurationFor = function (configName) {
12599
+ var configuration = this._objectConfigsMap.get(configName);
12600
+ // If configuration not found by configname, try by data name
12601
+ if (!!this._objectConfigsMap.size && !configuration && configName) {
12602
+ var configNameByDataName = this._getConfigNameByDataName(configName);
12603
+ if (this._objectConfigsMap.get(configNameByDataName)) {
12604
+ return this._objectConfigsMap.get(configNameByDataName);
12605
+ } /*else if (!environment.production) {
12606
+ console.warn("No configuration object was found by the name of: ", configName, " or dataname ", configNameByDataName);
12607
+ }*/
12608
+ }
12609
+ return configuration;
12610
+ };
12611
+ BaseModuleScreenConfigService.prototype.setObjectConfigurationFor = function (configName, configObject) {
12612
+ this._objectConfigsMap.set(configName, configObject);
12613
+ };
12614
+ // Whether the user may read the component that's associated with given config object (visibility).
12615
+ BaseModuleScreenConfigService.prototype.mayRead = function (configName) {
12616
+ var objectConfig = this._objectConfigsMap.get(configName);
12617
+ return objectConfig ? objectConfig.mayRead() : false;
12618
+ };
12619
+ BaseModuleScreenConfigService.prototype.isReadonly = function (configName) {
12620
+ return !this.mayWrite(configName);
12621
+ };
12622
+ // Whether the user may write onto the component that's associated with given config object.
12623
+ BaseModuleScreenConfigService.prototype.mayWrite = function (configName) {
12624
+ var objectConfig = this._objectConfigsMap.get(configName);
12625
+ return objectConfig ? objectConfig.mayWrite() : false;
12626
+ };
12627
+ // Whether the component associated with given config object should, from the start, be visible to the user.
12628
+ BaseModuleScreenConfigService.prototype.immediatelyVisible = function (configName) {
12629
+ var objectConfig = this._objectConfigsMap.get(configName);
12630
+ return objectConfig ? objectConfig.immediatelyVisible() : false;
12631
+ };
12632
+ // Whether the component associated with given config object should, from the start, be visible to the user.
12633
+ BaseModuleScreenConfigService.prototype.immediatelyHidden = function (configName) {
12634
+ var objectConfig = this._objectConfigsMap.get(configName);
12635
+ return objectConfig ? objectConfig.immediatelyHidden() : false;
12636
+ };
12637
+ BaseModuleScreenConfigService.prototype.noRights = function (configName) {
12638
+ var objectConfig = this._objectConfigsMap.get(configName);
12639
+ return objectConfig ? objectConfig.noRights() : false;
12640
+ };
12641
+ BaseModuleScreenConfigService.prototype.isHidden = function (configName) {
12642
+ return !this.immediatelyVisible(configName);
12643
+ };
12644
+ BaseModuleScreenConfigService.prototype.isRequired = function (configName) {
12645
+ var objectConfig = this._objectConfigsMap.get(configName);
12646
+ return objectConfig ? !objectConfig.nullable : false;
12647
+ };
12648
+ BaseModuleScreenConfigService.prototype.getDefaultValue = function (configName) {
12649
+ var objectConfig = this._objectConfigsMap.get(configName);
12650
+ return objectConfig ? objectConfig.getDefaultValue() : undefined;
12651
+ };
12652
+ BaseModuleScreenConfigService.prototype.getDefaultStringValue = function (configName) {
12653
+ var objectConfig = this._objectConfigsMap.get(configName);
12654
+ return objectConfig ? objectConfig.getDefaultStringValue() : undefined;
12655
+ };
12656
+ BaseModuleScreenConfigService.prototype.getDefaultNumberValue = function (configName) {
12657
+ var objectConfig = this._objectConfigsMap.get(configName);
12658
+ return objectConfig ? objectConfig.getDefaultNumberValue() : undefined;
12659
+ };
12660
+ BaseModuleScreenConfigService.prototype.getMaxLength = function (configName) {
12661
+ var objectConfig = this._objectConfigsMap.get(configName);
12662
+ return objectConfig ? objectConfig.maxLength : undefined;
12663
+ };
12664
+ BaseModuleScreenConfigService.prototype.getDecimals = function (configName) {
12665
+ var objectConfig = this._objectConfigsMap.get(configName);
12666
+ return objectConfig ? objectConfig.scale : undefined;
12667
+ };
12668
+ BaseModuleScreenConfigService.prototype.hasConfigObjects = function () {
12669
+ return this._configObjects && this._configObjects.length > 0 && this._objectConfigsMap.size > 0;
12670
+ };
12671
+ BaseModuleScreenConfigService.prototype.isKind = function (configName, kind) {
12672
+ var objectConfig = this._objectConfigsMap.get(configName);
12673
+ return objectConfig ? objectConfig.isKind(kind) : false;
12674
+ };
12675
+ BaseModuleScreenConfigService.prototype.isDataNameHiddenByItselfOrAnyOfItsParentRubrics = function (dataName) {
12676
+ var isHiddenItself = arrayUtils.ArrayUtils.ContainsAnElementFoundBy(this._configObjects, (function (item) {
12677
+ return item.dataName === dataName && item.isHidden();
12678
+ }));
12679
+ if (isHiddenItself) {
12680
+ return true;
12681
+ }
12682
+ else {
12683
+ return this.isDataNameHiddenByAnyOfItsParentRubrics(dataName);
12684
+ }
12685
+ };
12686
+ BaseModuleScreenConfigService.prototype.isDataNameHiddenByAnyOfItsParentRubrics = function (dataName) {
12687
+ // if (this._hardCodedConfigStructure) {
12688
+ // const parentConfigNames: string[] = this._hardCodedConfigStructure.getParentConfigNamesOfFieldConfigName(this._getConfigNameByDataName(dataName));
12689
+ // if (parentConfigNames) {
12690
+ // for (let i: number = 0, len: number = parentConfigNames.length; i < len; i++) {
12691
+ // const parentConfigObj: ObjectConfiguration = this.getObjectConfigurationFor(parentConfigNames[i]);
12692
+ // if (parentConfigObj && parentConfigObj.isHidden()) {
12693
+ // return true;
12694
+ // }
12695
+ // }
12696
+ // }
12697
+ // return false;
12698
+ // }
12699
+ return false;
12507
12700
  };
12508
- ScreenConfigComponentWrapper.prototype.ngAfterViewInit = function () {
12509
- if (this.screenConfigComponentWrapper) {
12510
- this.screenConfigComponentWrapper.nativeElement.appendChild(this._contentNativeElement);
12511
- this.hidden = !this._visibleOnViewInit;
12701
+ // return the first found config name for given data name
12702
+ BaseModuleScreenConfigService.prototype._getConfigNameByDataName = function (dataName) {
12703
+ var itsConfigObject = this._getConfigObjectByDataName(dataName);
12704
+ if (itsConfigObject) {
12705
+ return itsConfigObject.configName;
12512
12706
  }
12513
12707
  };
12514
- return ScreenConfigComponentWrapper;
12708
+ // return the first found config object with given data name
12709
+ BaseModuleScreenConfigService.prototype._getConfigObjectByDataName = function (dataName) {
12710
+ return arrayUtils.ArrayUtils.Find(this._configObjects, function (cfgObj) {
12711
+ return cfgObj.dataName === dataName;
12712
+ });
12713
+ };
12714
+ // PRE: this.configObjects is loaded. POST: this._objectConfigsMap contains the latest map of configName -> to -> ObjectConfiguration for a live screen module.
12715
+ BaseModuleScreenConfigService.prototype._buildScreenConfigMap = function () {
12716
+ var _this = this;
12717
+ this._objectConfigsMap.clear();
12718
+ this.configObjects.forEach(function (item) { return _this._objectConfigsMap.set(item.configName, item); });
12719
+ };
12720
+ BaseModuleScreenConfigService.prototype.setScreenConfigurationObjectsReadOnly = function (value) {
12721
+ var _this = this;
12722
+ this.configObjects.forEach(function (object) {
12723
+ var copy = Object.assign(new objectConfiguration.ObjectConfiguration(), object);
12724
+ copy.variableReadOnly = value;
12725
+ _this.setObjectConfigurationFor(object.configName, copy);
12726
+ });
12727
+ };
12728
+ BaseModuleScreenConfigService.prototype.setScreenConfigurationObjectsRedErrorBackground = function (errorValidation, setAllFalse) {
12729
+ var _this = this;
12730
+ if (setAllFalse === void 0) { setAllFalse = false; }
12731
+ if (setAllFalse) {
12732
+ this.configObjects.forEach(function (object) {
12733
+ var copy = Object.assign(new objectConfiguration.ObjectConfiguration(), object);
12734
+ copy.redErrorBackground = false;
12735
+ _this.setObjectConfigurationFor(object.configName, copy);
12736
+ });
12737
+ }
12738
+ else if (errorValidation) {
12739
+ var errorMessages = errorValidation.getAllErrorMessagesOfMyValidationFields();
12740
+ var _loop_1 = function (i, len) {
12741
+ var errorMsg = errorMessages[i];
12742
+ var configObject = this_1.configObjects.find(function (object) { return object.configName === errorMsg.fieldId; });
12743
+ if (configObject) {
12744
+ var copy = Object.assign(new objectConfiguration.ObjectConfiguration(), configObject);
12745
+ copy.redErrorBackground = false;
12746
+ this_1.setObjectConfigurationFor(configObject.configName, copy);
12747
+ }
12748
+ };
12749
+ var this_1 = this;
12750
+ for (var i = 0, len = errorMessages.length; i < len; i++) {
12751
+ _loop_1(i, len);
12752
+ }
12753
+ }
12754
+ };
12755
+ return BaseModuleScreenConfigService;
12515
12756
  }());
12516
- ScreenConfigComponentWrapper.decorators = [
12517
- { type: i0.Component, args: [{
12518
- selector: "screen-config-component-wrapper",
12519
- template: "<div *ngIf=\"!hidden\" #screenConfigComponentWrapper></div>"
12520
- },] }
12757
+ BaseModuleScreenConfigService.decorators = [
12758
+ { type: i0.Injectable }
12759
+ ];
12760
+
12761
+ /**
12762
+ * Base class for top-level services of CRUD-style iOne modules (the Relation, Article and Transaction modules).
12763
+ * What sets these modules apart, is the concept of a relatively bulky, 'single businessobject' being manipulated throughout all the tabs.
12764
+ *
12765
+ * Many other (smaller?) iOne modules work with multiple LISTS of different business object types instead.
12766
+ */
12767
+ var BaseModuleService = /** @class */ (function () {
12768
+ function BaseModuleService(screenConfigService) {
12769
+ var _this = this;
12770
+ this.screenConfigService = screenConfigService;
12771
+ this.readonlyChange = new rxjs.Subject();
12772
+ // Emits this each time a new error validation was received. (there will be zero error tooltips on the screen after this fires)
12773
+ this.errorValidationReceived = new rxjs.Subject();
12774
+ // Emits once after succesful BO update (i.e. there were no errors)
12775
+ this.successfulUpdate = new rxjs.Subject();
12776
+ this._readonly = true;
12777
+ this._subscriptions = [];
12778
+ this._subscriptions.push(this.errorValidationReceived.subscribe(function (errorValidation) { return _this.screenConfigService.setScreenConfigurationObjectsRedErrorBackground(errorValidation); }), this.successfulUpdate.subscribe(function () { return _this.screenConfigService.setScreenConfigurationObjectsRedErrorBackground(null, true); }), this.readonlyChange.subscribe(function (readOnly) { return _this.screenConfigService.setScreenConfigurationObjectsReadOnly(readOnly); }));
12779
+ }
12780
+ Object.defineProperty(BaseModuleService.prototype, "readonly", {
12781
+ // Whether the module is in readonly modus or not. Input fields etc. will be readonly throughout the module.
12782
+ get: function () {
12783
+ return this._readonly;
12784
+ },
12785
+ set: function (readonly) {
12786
+ if (this._readonly !== readonly) {
12787
+ this._readonly = readonly;
12788
+ this.readonlyChange.next(this._readonly);
12789
+ }
12790
+ },
12791
+ enumerable: false,
12792
+ configurable: true
12793
+ });
12794
+ BaseModuleService.prototype.ngOnDestroy = function () {
12795
+ this._subscriptions.forEach(function (subscription) { return subscription.unsubscribe(); });
12796
+ };
12797
+ return BaseModuleService;
12798
+ }());
12799
+ BaseModuleService.decorators = [
12800
+ { type: i0.Injectable }
12521
12801
  ];
12522
- ScreenConfigComponentWrapper.ctorParameters = function () { return [
12523
- { type: i0.ElementRef }
12524
- ]; };
12525
- ScreenConfigComponentWrapper.propDecorators = {
12526
- screenConfigComponentWrapper: [{ type: i0.ViewChild, args: ['screenConfigComponentWrapper',] }]
12527
- };
12802
+ BaseModuleService.ctorParameters = function () { return [
12803
+ { type: BaseModuleScreenConfigService }
12804
+ ]; };
12528
12805
 
12529
12806
  // Directive to represents the marker of "screen config name ID's" of components within a module.
12530
12807
  // Manipulates visibility, readonly and other dynamic states of an input element according to its db-fetched screen configuration object.
12531
12808
  var ScreenConfigurationDirective = /** @class */ (function () {
12532
- function ScreenConfigurationDirective(hostComponent, _viewContainerRef, _componentFactoryResolver) {
12809
+ function ScreenConfigurationDirective(hostComponent, _element,
12810
+ // we must always have a config service to fetch config objects with
12811
+ _configService, _renderer,
12812
+ // to make host readonly when MODULE switches to readonly:
12813
+ _moduleService) {
12814
+ var _this = this;
12533
12815
  this.hostComponent = hostComponent;
12534
- this._viewContainerRef = _viewContainerRef;
12535
- this._componentFactoryResolver = _componentFactoryResolver;
12816
+ this._element = _element;
12817
+ this._configService = _configService;
12818
+ this._renderer = _renderer;
12819
+ this._moduleService = _moduleService;
12820
+ this.screenConfigNativeElement = false;
12536
12821
  this.noModuleService = false;
12822
+ // feature toggle for devs so you can see the whole screen with all inputs etc by temporarily turning off the hiding effects of this directive on its host
12823
+ this._isTurnedOff = false;
12824
+ this._subs = [];
12825
+ this._subs.push(this._configService.configSet.subscribe(function (configObjects) {
12826
+ if (configObjects && configObjects.length > 0) {
12827
+ _this._updateHost();
12828
+ }
12829
+ }));
12830
+ if (this._moduleService && !this.noModuleService) {
12831
+ this._subs.push(this._moduleService.readonlyChange.subscribe(function (moduleInReadonlyState) {
12832
+ if (_this.hostComponent) {
12833
+ _this.hostComponent.readonly = _this.hostComponent.forceReadonly || moduleInReadonlyState;
12834
+ }
12835
+ }), this._moduleService.errorValidationReceived.subscribe(function (validationResult) {
12836
+ _this._setErrorRedBackgroundAfterScrCfgValidate(validationResult);
12837
+ }), this._moduleService.successfulUpdate.subscribe(function () {
12838
+ if (_this.hostComponent) {
12839
+ _this.hostComponent.redErrorBackground = false;
12840
+ }
12841
+ }));
12842
+ }
12537
12843
  }
12538
12844
  Object.defineProperty(ScreenConfigurationDirective.prototype, "screenConfigurationObject", {
12539
12845
  get: function () {
12540
12846
  return this._screenConfigurationObject;
12541
12847
  },
12542
- set: function (screenConfigurationObject) {
12543
- if (screenConfigurationObject) {
12544
- this._screenConfigurationObject = screenConfigurationObject;
12545
- this._initWrapperComponent();
12848
+ set: function (value) {
12849
+ if (value) {
12850
+ this._screenConfigurationObject = value;
12546
12851
  this._updateHost();
12547
12852
  }
12548
12853
  },
12549
12854
  enumerable: false,
12550
12855
  configurable: true
12551
12856
  });
12857
+ ScreenConfigurationDirective.prototype.ngOnInit = function () {
12858
+ this._updateHost();
12859
+ // this._updateHeaderStateOnHostComponent(true);
12860
+ // show initial error message if any
12861
+ if (!this.noModuleService) {
12862
+ // this._setErrorRedBackgroundAfterScrCfgValidate(this._moduleService.lastError);
12863
+ }
12864
+ };
12552
12865
  ScreenConfigurationDirective.prototype.ngOnDestroy = function () {
12866
+ this._subs.forEach(function (sub) { return sub.unsubscribe(); });
12867
+ if (this._isHeader) {
12868
+ // this._doubleClickHeaders.handleCollapseableDestroy(this.screenConfigurationObject);
12869
+ }
12870
+ this._element = undefined;
12553
12871
  this.hostComponent = undefined;
12554
- this._wrapperComponentInstance = undefined;
12555
12872
  };
12556
- ScreenConfigurationDirective.prototype._initWrapperComponent = function () {
12557
- if (!this._wrapperComponentInstance) {
12558
- var componentFactory = this._componentFactoryResolver.resolveComponentFactory(ScreenConfigComponentWrapper);
12559
- var componentRef = this._viewContainerRef.createComponent(componentFactory);
12560
- var visibleOnViewInit = !!this.screenConfigurationObject ? this.screenConfigurationObject.immediatelyVisible() : false;
12561
- this._wrapperComponentInstance = componentRef.instance;
12562
- this._wrapperComponentInstance.setWrapperContent(this._viewContainerRef.element.nativeElement, visibleOnViewInit);
12873
+ // Sets host component visibility, required, readonly etc. if specified in backend screen config OR module readonly status.
12874
+ ScreenConfigurationDirective.prototype._updateHost = function () {
12875
+ if (this._mayUpdateHost() || this.screenConfigNativeElement) {
12876
+ if (!this.screenConfigNativeElement) {
12877
+ this.hostComponent.objectConfigName = this.screenConfigurationObject;
12878
+ }
12879
+ var myCfgObj = this._configService.getObjectConfigurationFor(this.screenConfigurationObject);
12880
+ if (myCfgObj) {
12881
+ this._setHostVisible(myCfgObj.immediatelyVisible());
12882
+ // if (this.hostComponent instanceof GridColumnComponent) {
12883
+ // this.hostComponent.rights = myCfgObj.rights;
12884
+ // }
12885
+ if (!this.screenConfigNativeElement) {
12886
+ this.hostComponent.required = myCfgObj.isRequired();
12887
+ this.hostComponent.readonly = this.hostComponent.forceReadonly || this._moduleInReadonlyMode() || myCfgObj.isReadonly();
12888
+ this.hostComponent.decimals = myCfgObj.scale;
12889
+ this.hostComponent.maxLength = myCfgObj.maxLength;
12890
+ }
12891
+ }
12892
+ else {
12893
+ this._setHostVisible(false);
12894
+ if (!this.screenConfigNativeElement) {
12895
+ this.hostComponent.readonly = this._moduleInReadonlyMode();
12896
+ }
12897
+ }
12563
12898
  }
12564
12899
  };
12565
- ScreenConfigurationDirective.prototype._updateHost = function () {
12566
- if (!!this.hostComponent && !!this._screenConfigurationObject) {
12567
- this.hostComponent.objectConfigName = this.screenConfigurationObject.configName;
12568
- if (this.screenConfigurationObject) {
12569
- this.hostComponent.required = this.screenConfigurationObject.isRequired();
12570
- // readonly based on forced boolean, based on rights value or based on variable value affected by module read only state
12571
- this.hostComponent.readonly = this.hostComponent.forceReadonly || this.screenConfigurationObject.isReadonly() || this.screenConfigurationObject.variableReadOnly;
12572
- this.hostComponent.decimals = this.screenConfigurationObject.scale;
12573
- this.hostComponent.maxLength = this.screenConfigurationObject.maxLength;
12900
+ /**
12901
+ * Spawn error message tooltip onto our host comp, if any error was meant for the host (found by screenConfigurationObject);
12902
+ * @param errorValidation A top-level full validation result, either from the backend or from some client-side validation error.
12903
+ */
12904
+ ScreenConfigurationDirective.prototype._setErrorRedBackgroundAfterScrCfgValidate = function (errorValidation) {
12905
+ if (this.hostComponent && errorValidation) {
12906
+ var errorMessages = errorValidation.getAllErrorMessagesOfMyValidationFields();
12907
+ for (var i = 0, len = errorMessages.length; i < len; i++) {
12908
+ var errorMsg = errorMessages[i];
12909
+ var configName = this.dataName ? this.dataName : this.screenConfigurationObject;
12910
+ if (errorMsg.fieldId === configName && this._element /*&& this._properHost(errorMsg.boId)*/) {
12911
+ this.hostComponent.redErrorBackground = true;
12912
+ }
12913
+ }
12914
+ }
12915
+ };
12916
+ ScreenConfigurationDirective.prototype._moduleInReadonlyMode = function () {
12917
+ return !this.noModuleService ? (this._moduleService ? this._moduleService.readonly : false) : false;
12918
+ };
12919
+ ScreenConfigurationDirective.prototype._mayUpdateHost = function () {
12920
+ return !!this.hostComponent && !this._isTurnedOff && !!this.screenConfigurationObject;
12921
+ };
12922
+ ScreenConfigurationDirective.prototype._setHostVisible = function (visible) {
12923
+ if (!this.screenConfigNativeElement) {
12924
+ this.hostComponent.hidden = !visible;
12925
+ }
12926
+ else {
12927
+ if (this._element && this._element.nativeElement) {
12928
+ if (!visible) {
12929
+ this._renderer.addClass(this._element.nativeElement, 'hidden');
12930
+ }
12931
+ else {
12932
+ this._renderer.removeClass(this._element.nativeElement, 'hidden');
12933
+ }
12574
12934
  }
12575
12935
  }
12576
12936
  };
@@ -12578,18 +12938,25 @@
12578
12938
  }());
12579
12939
  ScreenConfigurationDirective.decorators = [
12580
12940
  { type: i0.Directive, args: [{
12581
- selector: "[screenConfigurationObject]"
12941
+ selector: '[screenConfigurationObject]'
12582
12942
  },] }
12583
12943
  ];
12584
12944
  ScreenConfigurationDirective.ctorParameters = function () { return [
12585
12945
  { type: undefined, decorators: [{ type: i0.Inject, args: [SCREEN_CONFIG_ADAPTER_COMPONENT_INTERFACE_NAME,] }] },
12586
- { type: i0.ViewContainerRef },
12587
- { type: i0.ComponentFactoryResolver }
12946
+ { type: i0.ElementRef },
12947
+ { type: BaseModuleScreenConfigService },
12948
+ { type: i0.Renderer2 },
12949
+ { type: BaseModuleService }
12588
12950
  ]; };
12589
12951
  ScreenConfigurationDirective.propDecorators = {
12590
- screenConfigurationObject: [{ type: i0.Input }],
12952
+ screenConfigurationObject: [{ type: i0.Input, args: ['screenConfigurationObject',] }],
12953
+ dataName: [{ type: i0.Input }],
12954
+ screenConfigNativeElement: [{ type: i0.Input }],
12591
12955
  noModuleService: [{ type: i0.Input }]
12592
12956
  };
12957
+ __decorate([
12958
+ InputBoolean()
12959
+ ], ScreenConfigurationDirective.prototype, "screenConfigNativeElement", void 0);
12593
12960
  __decorate([
12594
12961
  InputBoolean()
12595
12962
  ], ScreenConfigurationDirective.prototype, "noModuleService", void 0);
@@ -12605,8 +12972,7 @@
12605
12972
  common.CommonModule
12606
12973
  ],
12607
12974
  declarations: [
12608
- ScreenConfigurationDirective,
12609
- ScreenConfigComponentWrapper
12975
+ ScreenConfigurationDirective
12610
12976
  ],
12611
12977
  exports: [
12612
12978
  ScreenConfigurationDirective,
@@ -12672,6 +13038,8 @@
12672
13038
  exports.ArticleTileModule = ArticleTileModule;
12673
13039
  exports.BaseInputComponent = BaseInputComponent;
12674
13040
  exports.BaseInputDatePickerDirective = BaseInputDatePickerDirective;
13041
+ exports.BaseModuleScreenConfigService = BaseModuleScreenConfigService;
13042
+ exports.BaseModuleService = BaseModuleService;
12675
13043
  exports.ButtonComponent = ButtonComponent;
12676
13044
  exports.ButtonModule = ButtonModule;
12677
13045
  exports.CalendarComponent = CalendarComponent;
@@ -12757,6 +13125,7 @@
12757
13125
  exports.ResponsiveTextComponent = ResponsiveTextComponent;
12758
13126
  exports.ResponsiveTextModule = ResponsiveTextModule;
12759
13127
  exports.SCREEN_CONFIG_ADAPTER_COMPONENT_INTERFACE_NAME = SCREEN_CONFIG_ADAPTER_COMPONENT_INTERFACE_NAME;
13128
+ exports.ScreenConfigurationDirective = ScreenConfigurationDirective;
12760
13129
  exports.ScreenConfigurationModule = ScreenConfigurationModule;
12761
13130
  exports.SimpleGridColumnDirective = SimpleGridColumnDirective;
12762
13131
  exports.SimpleGridComponent = SimpleGridComponent;
@@ -12787,8 +13156,6 @@
12787
13156
  exports["ɵbh"] = TooltipComponent;
12788
13157
  exports["ɵbi"] = TooltipDirective;
12789
13158
  exports["ɵbj"] = CheckmarkOverlayComponent;
12790
- exports["ɵbk"] = ScreenConfigurationDirective;
12791
- exports["ɵbl"] = ScreenConfigComponentWrapper;
12792
13159
  exports["ɵc"] = MD_RIPPLE_GLOBAL_OPTIONS;
12793
13160
  exports["ɵd"] = CoRippleDirective;
12794
13161
  exports["ɵe"] = CoViewportRulerService;