novo-elements 6.0.0-next.6 → 6.0.0-next.7

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 (36) hide show
  1. package/bundles/novo-elements.umd.js +96 -36
  2. package/bundles/novo-elements.umd.js.map +1 -1
  3. package/bundles/novo-elements.umd.min.js +1 -1
  4. package/bundles/novo-elements.umd.min.js.map +1 -1
  5. package/elements/chips/Chips.scss +7 -3
  6. package/elements/data-table/data-table.component.scss +4 -1
  7. package/elements/dropdown/Dropdown.scss +1 -0
  8. package/elements/form/Form.scss +1 -0
  9. package/elements/form/extras/address/Address.scss +9 -13
  10. package/elements/select/Select.scss +1 -78
  11. package/elements/table/Table.scss +2 -2
  12. package/esm2015/src/elements/chips/Chips.js +3 -2
  13. package/esm2015/src/elements/common/option/option.component.js +10 -12
  14. package/esm2015/src/elements/common/overlay/Overlay.js +7 -1
  15. package/esm2015/src/elements/data-table/cell-headers/data-table-header-cell.component.js +19 -8
  16. package/esm2015/src/elements/date-picker/DatePickerInput.js +2 -2
  17. package/esm2015/src/elements/dropdown/Dropdown.js +4 -1
  18. package/esm2015/src/elements/form/ControlGroup.js +8 -2
  19. package/esm2015/src/elements/form/NovoFormGroup.js +2 -2
  20. package/esm2015/src/elements/layout/content/layout-content.component.js +4 -1
  21. package/esm2015/src/elements/select/Select.js +47 -13
  22. package/esm2015/src/elements/table/Table.js +3 -3
  23. package/esm2015/src/elements/table/extras/TableExtras.module.js +3 -2
  24. package/esm2015/src/elements/table/extras/table-filter/TableFilter.js +1 -2
  25. package/esm2015/src/elements/table/extras/th-sortable/ThSortable.js +1 -2
  26. package/esm2015/src/elements/time-picker/TimePickerInput.js +4 -1
  27. package/esm2015/src/services/novo-label-service.js +5 -1
  28. package/fesm2015/novo-elements.js +105 -39
  29. package/fesm2015/novo-elements.js.map +1 -1
  30. package/package.json +1 -1
  31. package/schematics/package.json +1 -1
  32. package/src/elements/common/option/option.component.d.ts +3 -1
  33. package/src/elements/data-table/cell-headers/data-table-header-cell.component.d.ts +1 -0
  34. package/src/elements/form/ControlGroup.d.ts +2 -0
  35. package/src/elements/layout/content/layout-content.component.d.ts +1 -0
  36. package/src/services/novo-label-service.d.ts +2 -0
@@ -20913,7 +20913,7 @@
20913
20913
  }
20914
20914
  Object.defineProperty(NovoFormGroup.prototype, "value", {
20915
20915
  get: function () {
20916
- return this.getRawValue();
20916
+ return this.getRawValue(); // The value property on Angular form groups do not include disabled form control values. Find way to address this.
20917
20917
  },
20918
20918
  set: function (v) {
20919
20919
  this._value = v;
@@ -21019,6 +21019,7 @@
21019
21019
  this.noItems = 'There are no items';
21020
21020
  this.dateFormat = 'MM/dd/yyyy';
21021
21021
  this.dateFormatPlaceholder = 'MM/DD/YYYY';
21022
+ this.localDatePlaceholder = 'mm/dd/yyyy';
21022
21023
  this.timeFormatPlaceholderAM = 'hh:mm AM';
21023
21024
  this.timeFormatPlaceholder24Hour = 'HH:mm';
21024
21025
  this.timeFormatAM = 'AM';
@@ -21067,6 +21068,9 @@
21067
21068
  NovoLabelService.prototype.dateFormatString = function () {
21068
21069
  return this.dateFormat;
21069
21070
  };
21071
+ NovoLabelService.prototype.localizedDatePlaceholder = function () {
21072
+ return this.localDatePlaceholder;
21073
+ };
21070
21074
  NovoLabelService.prototype.tabbedGroupClearSuggestion = function (tabLabelPlural) {
21071
21075
  return "Clear your search to see all " + tabLabelPlural + ".";
21072
21076
  };
@@ -25437,9 +25441,12 @@
25437
25441
  /** Emits when the state of the option changes and any parents have to be notified. */
25438
25442
  this._stateChanges = new rxjs.Subject();
25439
25443
  // (click) is overridden when defined by user.
25440
- this._clickListener = rxjs.fromEvent(this._element.nativeElement, 'click', { capture: true }).subscribe(function (evt) {
25444
+ this._clickCapture = rxjs.fromEvent(this._element.nativeElement, 'click', { capture: true }).subscribe(function (evt) {
25441
25445
  _this._handleDisabledClick(evt);
25442
25446
  });
25447
+ this._clickPassive = rxjs.fromEvent(this._element.nativeElement, 'click').subscribe(function (evt) {
25448
+ setTimeout(function () { return _this._handlePassiveClick(evt); });
25449
+ });
25443
25450
  }
25444
25451
  Object.defineProperty(NovoOptionBase.prototype, "selectable", {
25445
25452
  /** If there is no parent then nothing is managing the selection. */
@@ -25554,25 +25561,19 @@
25554
25561
  return this.viewValue;
25555
25562
  };
25556
25563
  NovoOptionBase.prototype._handleDisabledClick = function (event) {
25557
- console.log('Captured click');
25558
25564
  if (this.disabled) {
25559
- console.log('disabled');
25560
25565
  event.preventDefault();
25561
25566
  event.stopPropagation();
25562
25567
  event.stopImmediatePropagation();
25563
25568
  }
25564
- else if (this.inert) {
25565
- // do nothing
25566
- console.log('this is inert');
25567
- }
25568
- else {
25569
- console.log('selecting');
25569
+ };
25570
+ NovoOptionBase.prototype._handlePassiveClick = function (event) {
25571
+ if (!this.inert) {
25570
25572
  this._selectViaInteraction();
25571
25573
  }
25572
25574
  };
25573
25575
  /** Ensures the option is selected when activated from the keyboard. */
25574
25576
  NovoOptionBase.prototype._handleKeydown = function (event) {
25575
- console.log('KEY DOWN');
25576
25577
  if (event.target instanceof HTMLInputElement && event.key === "Enter" /* Enter */) {
25577
25578
  this._emitSelectionChangeEvent(!this.keepOpen);
25578
25579
  }
@@ -25636,7 +25637,8 @@
25636
25637
  };
25637
25638
  NovoOptionBase.prototype.ngOnDestroy = function () {
25638
25639
  this._stateChanges.complete();
25639
- this._clickListener.unsubscribe();
25640
+ this._clickCapture.unsubscribe();
25641
+ this._clickPassive.unsubscribe();
25640
25642
  };
25641
25643
  /** Emits the selection change event. */
25642
25644
  NovoOptionBase.prototype._emitSelectionChangeEvent = function (isUserInput) {
@@ -26380,6 +26382,12 @@
26380
26382
  if (_this.overlayRef) {
26381
26383
  _this.overlayRef.updatePosition();
26382
26384
  _this.opening.emit(true);
26385
+ setTimeout(function () {
26386
+ // TODO: @charlesabarnes Remove this once we remove table
26387
+ if (_this.overlayRef) {
26388
+ _this.overlayRef.updatePosition();
26389
+ }
26390
+ });
26383
26391
  }
26384
26392
  });
26385
26393
  };
@@ -26752,6 +26760,9 @@
26752
26760
  }
26753
26761
  });
26754
26762
  }
26763
+ else if ("Escape" /* Escape */ === key) {
26764
+ this.closePanel();
26765
+ }
26755
26766
  else {
26756
26767
  var previouslyFocusedIndex = manager.activeItemIndex;
26757
26768
  manager.onKeydown(event);
@@ -33330,7 +33341,8 @@
33330
33341
  };
33331
33342
  /** Emits change event to set the model value. */
33332
33343
  NovoChipsElement.prototype._propagateChanges = function (fallbackValue) {
33333
- this.changed.emit({ value: this.value.length ? this.value : '', rawValue: this.items });
33344
+ var _a;
33345
+ this.changed.emit({ value: ((_a = this.value) === null || _a === void 0 ? void 0 : _a.length) ? this.value : '', rawValue: this.items });
33334
33346
  this.onModelChange(this.value);
33335
33347
  };
33336
33348
  /**
@@ -34977,7 +34989,6 @@
34977
34989
  this.checkSortFilterState({ filter: this.state.filter, sort: this.state.sort }, true);
34978
34990
  this.multiSelect = this.config.filterConfig && this.config.filterConfig.type ? this.config.filterConfig.type === 'multi-select' : false;
34979
34991
  if (this.multiSelect) {
34980
- console.log('is multiselect');
34981
34992
  this.multiSelectedOptions = this.filter ? __spread(this.filter) : [];
34982
34993
  }
34983
34994
  };
@@ -35128,6 +35139,12 @@
35128
35139
  }
35129
35140
  }
35130
35141
  };
35142
+ NovoDataTableCellHeader.prototype.handleEscapeKeydown = function (event) {
35143
+ if (!this.multiSelect) {
35144
+ this.error = false;
35145
+ this.dropdown.closePanel();
35146
+ }
35147
+ };
35131
35148
  NovoDataTableCellHeader.prototype.clearOptionFilter = function () {
35132
35149
  this.error = false;
35133
35150
  if (this.optionFilter.length > 0) {
@@ -35175,7 +35192,6 @@
35175
35192
  setTimeout(function () { return _this.filterInput.nativeElement.focus(); }, 0);
35176
35193
  }
35177
35194
  if (this.multiSelect && this.dropdown) {
35178
- console.log('focussing');
35179
35195
  this.dropdown._handleKeydown = function (event) {
35180
35196
  _this.multiSelectOptionFilterHandleKeydown(event);
35181
35197
  };
@@ -35247,7 +35263,7 @@
35247
35263
  NovoDataTableCellHeader.decorators = [
35248
35264
  { type: i0.Component, args: [{
35249
35265
  selector: '[novo-data-table-cell-config]',
35250
- template: "\n <i class=\"bhi-{{ labelIcon }} label-icon\" *ngIf=\"labelIcon\" data-automation-id=\"novo-data-table-header-icon\"></i>\n <label data-automation-id=\"novo-data-table-label\">{{ label }}</label>\n <div>\n <novo-sort-button\n *ngIf=\"config.sortable\"\n data-automation-id=\"novo-data-table-sort\"\n tooltipPosition=\"left\"\n [tooltip]=\"labels.sort\"\n [attr.data-feature-id]=\"'novo-data-table-sort-' + this.id\"\n (sortChange)=\"sort()\"\n [value]=\"sortValue\"\n ></novo-sort-button>\n <novo-dropdown\n *ngIf=\"config.filterable\"\n side=\"right\"\n parentScrollSelector=\".novo-data-table-container\"\n containerClass=\"data-table-dropdown\"\n data-automation-id=\"novo-data-table-filter\"\n [multiple]=\"multiSelect\"\n >\n <novo-icon\n dropdownTrigger\n class=\"filter-button\"\n [class.filter-active]=\"filterActive\"\n [tooltip]=\"labels.filters\"\n [tooltipPosition]=\"'left'\"\n [attr.data-feature-id]=\"'novo-data-table-filter-' + this.id\"\n (click)=\"focusInput()\"\n >filter</novo-icon\n >\n <div class=\"header\">\n <novo-label>{{ labels.filters }}</novo-label>\n <novo-button\n theme=\"dialogue\"\n color=\"negative\"\n size=\"small\"\n icon=\"times\"\n (click)=\"clearFilter()\"\n *ngIf=\"filter !== null && filter !== undefined && filter !== ''\"\n data-automation-id=\"novo-data-table-filter-clear\"\n >\n {{ labels.clear }}\n </novo-button>\n </div>\n <ng-container [ngSwitch]=\"config.filterConfig.type\">\n <novo-optgroup *ngSwitchCase=\"'date'\">\n <ng-container *ngIf=\"!showCustomRange\">\n <novo-option\n [class.active]=\"activeDateFilter === option.label\"\n *ngFor=\"let option of config.filterConfig.options\"\n (click)=\"filterData(option)\"\n [attr.data-automation-id]=\"'novo-data-table-filter-' + option.label\"\n >\n <span>{{ option.label }}</span>\n <novo-icon novoSuffix color=\"positive\" *ngIf=\"activeDateFilter === option.label\">check</novo-icon>\n </novo-option>\n </ng-container>\n <novo-option\n [class.active]=\"labels.customDateRange === activeDateFilter\"\n (click)=\"toggleCustomRange($event, true)\"\n *ngIf=\"config.filterConfig.allowCustomRange && !showCustomRange\"\n >\n <span>{{ labels.customDateRange }}</span>\n <novo-icon novoSuffix color=\"positive\" *ngIf=\"labels.customDateRange === activeDateFilter\">check</novo-icon>\n </novo-option>\n <novo-option class=\"calendar-container\" *ngIf=\"showCustomRange\" keepOpen>\n <novo-stack>\n <div class=\"back-link\" (click)=\"toggleCustomRange($event, false)\">\n <i class=\"bhi-previous\"></i>{{ labels.backToPresetFilters }}\n </div>\n <novo-date-picker (onSelect)=\"filterData($event)\" [(ngModel)]=\"filter\" range=\"true\"></novo-date-picker>\n </novo-stack>\n </novo-option>\n </novo-optgroup>\n <novo-optgroup *ngSwitchCase=\"'select'\">\n <novo-option\n [class.active]=\"filter === option\"\n *ngFor=\"let option of config.filterConfig.options\"\n (click)=\"filterData(option)\"\n [attr.data-automation-id]=\"'novo-data-table-filter-' + (option?.label || option)\"\n >\n <span>{{ option?.label || option }}</span>\n <novo-icon novoSuffix color=\"positive\" *ngIf=\"option.hasOwnProperty('value') ? filter === option.value : filter === option\"\n >check</novo-icon\n >\n </novo-option>\n </novo-optgroup>\n <ng-container *ngSwitchCase=\"'multi-select'\">\n <novo-optgroup class=\"dropdown-list-filter\" (keydown)=\"multiSelectOptionFilterHandleKeydown($event)\">\n <novo-option class=\"filter-search\" inert>\n <novo-field flex>\n <input\n novoInput\n [(ngModel)]=\"optionFilter\"\n (ngModelChange)=\"multiSelectOptionFilter($event)\"\n #optionFilterInput\n data-automation-id=\"novo-data-table-multi-select-option-filter-input\"\n />\n <novo-icon novoSuffix>search</novo-icon>\n <novo-error class=\"error-text\" [hidden]=\"!error || !multiSelectHasVisibleOptions()\">{{\n labels.selectFilterOptions\n }}</novo-error>\n </novo-field>\n </novo-option>\n </novo-optgroup>\n <novo-optgroup class=\"dropdown-list-options\">\n <novo-option\n *ngFor=\"let option of config.filterConfig.options\"\n [hidden]=\"multiSelectOptionIsHidden(option)\"\n (click)=\"toggleSelection(option)\"\n [attr.data-automation-id]=\"'novo-data-table-filter-' + (option?.label || option)\"\n >\n <span>{{ option?.label || option }}</span>\n <novo-icon novoSuffix color=\"positive\">{{\n isSelected(option, multiSelectedOptions) ? 'checkbox-filled' : 'checkbox-empty'\n }}</novo-icon>\n </novo-option>\n </novo-optgroup>\n <novo-option class=\"filter-null-results\" [hidden]=\"multiSelectHasVisibleOptions()\">{{ labels.pickerEmpty }}</novo-option>\n </ng-container>\n <novo-optgroup *ngSwitchCase=\"'custom'\">\n <novo-option class=\"filter-search\" inert>\n <ng-container *ngTemplateOutlet=\"filterTemplate; context: { $implicit: config }\"></ng-container>\n </novo-option>\n </novo-optgroup>\n <novo-optgroup *ngSwitchDefault>\n <novo-option class=\"filter-search\" inert>\n <novo-field flex fullWidth>\n <input\n novoInput\n [type]=\"config.filterConfig.type\"\n [(ngModel)]=\"filter\"\n (ngModelChange)=\"filterData($event)\"\n #filterInput\n data-automation-id=\"novo-data-table-filter-input\"\n />\n <novo-icon novoSuffix>search</novo-icon>\n </novo-field>\n </novo-option>\n </novo-optgroup>\n </ng-container>\n <div class=\"footer\" *ngIf=\"multiSelect\">\n <novo-button theme=\"dialogue\" color=\"dark\" (click)=\"cancel()\" data-automation-id=\"novo-data-table-multi-select-cancel\">\n {{ labels.cancel }}\n </novo-button>\n <novo-button\n theme=\"dialogue\"\n color=\"positive\"\n (click)=\"filterMultiSelect()\"\n data-automation-id=\"novo-data-table-multi-select-filter\"\n >\n {{ labels.filters }}\n </novo-button>\n </div>\n </novo-dropdown>\n </div>\n <div class=\"spacer\"></div>\n <div class=\"data-table-header-resizable\" *ngIf=\"config.resizable\"><span (mousedown)=\"startResize($event)\">&nbsp;</span></div>\n ",
35266
+ template: "\n <i class=\"bhi-{{ labelIcon }} label-icon\" *ngIf=\"labelIcon\" data-automation-id=\"novo-data-table-header-icon\"></i>\n <label data-automation-id=\"novo-data-table-label\">{{ label }}</label>\n <div>\n <novo-sort-button\n *ngIf=\"config.sortable\"\n data-automation-id=\"novo-data-table-sort\"\n tooltipPosition=\"left\"\n [tooltip]=\"labels.sort\"\n [attr.data-feature-id]=\"'novo-data-table-sort-' + this.id\"\n (sortChange)=\"sort()\"\n [value]=\"sortValue\"\n ></novo-sort-button>\n <novo-dropdown\n *ngIf=\"config.filterable\"\n side=\"right\"\n parentScrollSelector=\".novo-data-table-container\"\n containerClass=\"data-table-dropdown\"\n data-automation-id=\"novo-data-table-filter\"\n [multiple]=\"multiSelect\"\n >\n <novo-icon\n dropdownTrigger\n class=\"filter-button\"\n [class.filter-active]=\"filterActive\"\n [tooltip]=\"labels.filters\"\n [tooltipPosition]=\"'left'\"\n [attr.data-feature-id]=\"'novo-data-table-filter-' + this.id\"\n (click)=\"focusInput()\"\n >filter</novo-icon\n >\n <div class=\"header\">\n <novo-label>{{ labels.filters }}</novo-label>\n <novo-button\n theme=\"dialogue\"\n color=\"negative\"\n size=\"small\"\n icon=\"times\"\n (click)=\"clearFilter()\"\n *ngIf=\"filter !== null && filter !== undefined && filter !== ''\"\n data-automation-id=\"novo-data-table-filter-clear\"\n >\n {{ labels.clear }}\n </novo-button>\n </div>\n <ng-container [ngSwitch]=\"config.filterConfig.type\">\n <novo-optgroup *ngSwitchCase=\"'date'\" (keydown.escape)=\"handleEscapeKeydown($event)\">\n <ng-container *ngIf=\"!showCustomRange\">\n <novo-option\n [class.active]=\"activeDateFilter === option.label\"\n *ngFor=\"let option of config.filterConfig.options\"\n (click)=\"filterData(option)\"\n [attr.data-automation-id]=\"'novo-data-table-filter-' + option.label\"\n >\n <span>{{ option.label }}</span>\n <novo-icon novoSuffix color=\"positive\" *ngIf=\"activeDateFilter === option.label\">check</novo-icon>\n </novo-option>\n </ng-container>\n <novo-option\n [class.active]=\"labels.customDateRange === activeDateFilter\"\n (click)=\"toggleCustomRange($event, true)\"\n *ngIf=\"config.filterConfig.allowCustomRange && !showCustomRange\"\n >\n <span>{{ labels.customDateRange }}</span>\n <novo-icon novoSuffix color=\"positive\" *ngIf=\"labels.customDateRange === activeDateFilter\">check</novo-icon>\n </novo-option>\n <novo-option class=\"calendar-container\" *ngIf=\"showCustomRange\" keepOpen>\n <novo-stack>\n <div class=\"back-link\" (click)=\"toggleCustomRange($event, false)\">\n <i class=\"bhi-previous\"></i>{{ labels.backToPresetFilters }}\n </div>\n <novo-date-picker\n (onSelect)=\"filterData($event)\"\n [(ngModel)]=\"filter\"\n range=\"true\"\n (keydown.escape)=\"handleEscapeKeydown($event)\"\n ></novo-date-picker>\n </novo-stack>\n </novo-option>\n </novo-optgroup>\n <novo-optgroup *ngSwitchCase=\"'select'\">\n <novo-option\n [class.active]=\"filter === option\"\n *ngFor=\"let option of config.filterConfig.options\"\n (click)=\"filterData(option)\"\n [attr.data-automation-id]=\"'novo-data-table-filter-' + (option?.label || option)\"\n >\n <span>{{ option?.label || option }}</span>\n <novo-icon novoSuffix color=\"positive\" *ngIf=\"option.hasOwnProperty('value') ? filter === option.value : filter === option\"\n >check</novo-icon\n >\n </novo-option>\n </novo-optgroup>\n <ng-container *ngSwitchCase=\"'multi-select'\">\n <novo-optgroup class=\"dropdown-list-filter\" (keydown)=\"multiSelectOptionFilterHandleKeydown($event)\">\n <novo-option class=\"filter-search\" inert>\n <novo-field flex>\n <input\n novoInput\n [(ngModel)]=\"optionFilter\"\n (ngModelChange)=\"multiSelectOptionFilter($event)\"\n #optionFilterInput\n data-automation-id=\"novo-data-table-multi-select-option-filter-input\"\n />\n <novo-icon novoSuffix>search</novo-icon>\n <novo-error class=\"error-text\" [hidden]=\"!error || !multiSelectHasVisibleOptions()\">{{\n labels.selectFilterOptions\n }}</novo-error>\n </novo-field>\n </novo-option>\n </novo-optgroup>\n <novo-optgroup class=\"dropdown-list-options\" (keydown.escape)=\"handleEscapeKeydown($event)\">\n <novo-option\n *ngFor=\"let option of config.filterConfig.options\"\n [hidden]=\"multiSelectOptionIsHidden(option)\"\n (click)=\"toggleSelection(option)\"\n [attr.data-automation-id]=\"'novo-data-table-filter-' + (option?.label || option)\"\n >\n <span>{{ option?.label || option }}</span>\n <novo-icon novoSuffix color=\"positive\">{{\n isSelected(option, multiSelectedOptions) ? 'checkbox-filled' : 'checkbox-empty'\n }}</novo-icon>\n </novo-option>\n </novo-optgroup>\n <novo-option class=\"filter-null-results\" [hidden]=\"multiSelectHasVisibleOptions()\">{{ labels.pickerEmpty }}</novo-option>\n </ng-container>\n <novo-optgroup *ngSwitchCase=\"'custom'\">\n <novo-option class=\"filter-search\" inert>\n <ng-container *ngTemplateOutlet=\"filterTemplate; context: { $implicit: config }\"></ng-container>\n </novo-option>\n </novo-optgroup>\n <novo-optgroup *ngSwitchDefault (keydown.escape)=\"handleEscapeKeydown($event)\">\n <novo-option class=\"filter-search\" inert>\n <novo-field flex fullWidth>\n <input\n novoInput\n [type]=\"config.filterConfig.type\"\n [(ngModel)]=\"filter\"\n (ngModelChange)=\"filterData($event)\"\n #filterInput\n data-automation-id=\"novo-data-table-filter-input\"\n (keydown.escape)=\"handleEscapeKeydown($event)\"\n />\n <novo-icon novoSuffix>search</novo-icon>\n </novo-field>\n </novo-option>\n </novo-optgroup>\n </ng-container>\n <div class=\"footer\" *ngIf=\"multiSelect\">\n <novo-button theme=\"dialogue\" color=\"dark\" (click)=\"cancel()\" data-automation-id=\"novo-data-table-multi-select-cancel\">\n {{ labels.cancel }}\n </novo-button>\n <novo-button\n theme=\"dialogue\"\n color=\"positive\"\n (click)=\"filterMultiSelect()\"\n data-automation-id=\"novo-data-table-multi-select-filter\"\n >\n {{ labels.filters }}\n </novo-button>\n </div>\n </novo-dropdown>\n </div>\n <div class=\"spacer\"></div>\n <div class=\"data-table-header-resizable\" *ngIf=\"config.resizable\"><span (mousedown)=\"startResize($event)\">&nbsp;</span></div>\n ",
35251
35267
  changeDetection: i0.ChangeDetectionStrategy.OnPush
35252
35268
  },] }
35253
35269
  ];
@@ -35270,7 +35286,8 @@
35270
35286
  filterTemplate: [{ type: i0.Input }],
35271
35287
  resizable: [{ type: i0.HostBinding, args: ['class.resizable',] }],
35272
35288
  column: [{ type: i0.Input, args: ['novo-data-table-cell-config',] }],
35273
- multiSelectOptionFilterHandleKeydown: [{ type: i0.HostListener, args: ['keydown', ['$event'],] }]
35289
+ multiSelectOptionFilterHandleKeydown: [{ type: i0.HostListener, args: ['keydown', ['$event'],] }],
35290
+ handleEscapeKeydown: [{ type: i0.HostListener, args: ['keydown.escape', ['$event'],] }]
35274
35291
  };
35275
35292
 
35276
35293
  var DataTableSource = /** @class */ (function (_super) {
@@ -36978,7 +36995,7 @@
36978
36995
  this.blurEvent = new i0.EventEmitter();
36979
36996
  this.focusEvent = new i0.EventEmitter();
36980
36997
  this.changeEvent = new i0.EventEmitter();
36981
- this.placeholder = this.labels.dateFormatString().toUpperCase() || this.labels.dateFormatPlaceholder;
36998
+ this.placeholder = this.labels.localizedDatePlaceholder();
36982
36999
  }
36983
37000
  NovoDatePickerInputElement.prototype.ngOnInit = function () {
36984
37001
  this.userDefinedFormat = this.format ? !this.format.match(/^(DD\/MM\/YYYY|MM\/DD\/YYYY)$/g) : false;
@@ -38155,7 +38172,7 @@
38155
38172
  /** Function that maps an option's control value to its display value in the trigger. */
38156
38173
  _this.displayWith = null;
38157
38174
  /** * Function to compare the option values with the selected values. */
38158
- _this.compareWith = function (o1, o2) { return o1 === o2; };
38175
+ _this.compareWith = function (o1, o2) { return o1 === o2 || o1 === o2.id || (!Helpers.isEmpty(o1.id) && !Helpers.isEmpty(o2.id) && o1.id === o2.id); };
38159
38176
  _this.header = {
38160
38177
  open: false,
38161
38178
  valid: true,
@@ -38278,8 +38295,16 @@
38278
38295
  this._initializeSelection();
38279
38296
  // Listen to selection changes to select and deselect options
38280
38297
  this._selectionModel.changed.pipe(operators.takeUntil(this._destroy)).subscribe(function (event) {
38281
- event.added.forEach(function (option) { return option.select(); });
38282
- event.removed.forEach(function (option) { return option.deselect(); });
38298
+ event.added.forEach(function (option) {
38299
+ if (option.select) {
38300
+ option.select();
38301
+ }
38302
+ });
38303
+ event.removed.forEach(function (option) {
38304
+ if (option.deselect) {
38305
+ option.deselect();
38306
+ }
38307
+ });
38283
38308
  });
38284
38309
  // Listen to QueryList changes
38285
38310
  rxjs.merge(this.contentOptions.changes, this.viewOptions.changes)
@@ -38321,7 +38346,11 @@
38321
38346
  */
38322
38347
  NovoSelectElement.prototype._setSelectionByValue = function (value) {
38323
38348
  var _this = this;
38324
- this._selectionModel.selected.forEach(function (option) { return option.setInactiveStyles(); });
38349
+ this._selectionModel.selected.forEach(function (option) {
38350
+ if (option.setInactiveStyles) {
38351
+ option.setInactiveStyles();
38352
+ }
38353
+ });
38325
38354
  this._selectionModel.clear();
38326
38355
  if (this.multiple && value) {
38327
38356
  value.forEach(function (currentValue) { return _this._selectValue(currentValue); });
@@ -38355,11 +38384,25 @@
38355
38384
  if (_this._selectionModel.isSelected(option)) {
38356
38385
  return false;
38357
38386
  }
38358
- return option.value != null && _this.compareWith(option.value, value);
38387
+ return !Helpers.isEmpty(value) && !Helpers.isEmpty(option.value) && _this.compareWith(option.value, value);
38359
38388
  });
38360
38389
  if (correspondingOption) {
38361
38390
  this._selectionModel.select(correspondingOption);
38362
38391
  }
38392
+ else if (value && !correspondingOption) {
38393
+ // Double Check option not already added.
38394
+ var legacyOption = this.filteredOptions.find(function (it) { return it.value === value; });
38395
+ if (!legacyOption) {
38396
+ // Add a disabled option to the list and select it
38397
+ this.filteredOptions.push({
38398
+ disabled: true,
38399
+ tooltip: 'Value is not provided in list of valid options.',
38400
+ label: (value === null || value === void 0 ? void 0 : value.label) || value,
38401
+ value: value,
38402
+ });
38403
+ this.ref.detectChanges();
38404
+ }
38405
+ }
38363
38406
  return correspondingOption;
38364
38407
  };
38365
38408
  NovoSelectElement.prototype.select = function (option, i, fireEvents) {
@@ -38405,9 +38448,13 @@
38405
38448
  this._watchSelectionEvents();
38406
38449
  };
38407
38450
  NovoSelectElement.prototype._getDisplayValue = function (option) {
38408
- if (!option)
38451
+ if (!option) {
38409
38452
  return '';
38410
- var toDisplay = this.displayWith ? this.displayWith(option.value) : option.viewValue;
38453
+ }
38454
+ var toDisplay = option.viewValue;
38455
+ if (this.displayWith) {
38456
+ toDisplay = this.displayWith(option.value);
38457
+ }
38411
38458
  // Simply falling back to an empty string if the display value is falsy does not work properly.
38412
38459
  // The display value can also be the number zero and shouldn't fall back to an empty string.
38413
38460
  var displayValue = toDisplay != null ? toDisplay : '';
@@ -38487,6 +38534,9 @@
38487
38534
  }
38488
38535
  });
38489
38536
  }
38537
+ else if ("Escape" /* Escape */ === key) {
38538
+ this.closePanel();
38539
+ }
38490
38540
  else {
38491
38541
  var previouslyFocusedIndex = manager.activeItemIndex;
38492
38542
  manager.onKeydown(event);
@@ -38618,11 +38668,11 @@
38618
38668
  }
38619
38669
  else {
38620
38670
  this.filteredOptions = (this.options || [])
38621
- .filter(function (item) {
38622
- return !item.readOnly;
38671
+ .map(function (item) {
38672
+ return Object.assign(Object.assign({}, item), { disabled: item.readOnly || item.disabled });
38623
38673
  })
38624
- .map(function (element) {
38625
- return Object.assign(Object.assign({}, element), { active: false });
38674
+ .map(function (item) {
38675
+ return Object.assign(Object.assign({}, item), { active: false });
38626
38676
  });
38627
38677
  }
38628
38678
  };
@@ -38677,7 +38727,7 @@
38677
38727
  { provide: NovoFieldControl, useExisting: NovoSelectElement },
38678
38728
  { provide: NOVO_OPTION_PARENT_COMPONENT, useExisting: NovoSelectElement },
38679
38729
  ],
38680
- template: "\n <div class=\"novo-select-trigger\" #dropdownElement (click)=\"togglePanel(); (false)\" tabIndex=\"{{ disabled ? -1 : 0 }}\" type=\"button\">\n <span class=\"novo-select-placeholder\" *ngIf=\"empty\">{{ placeholder }}</span>\n <span class=\"novo-select-display-value\" *ngIf=\"!empty\">{{ displayValue }}</span>\n <i class=\"bhi-collapse\"></i>\n </div>\n <novo-overlay-template\n [parent]=\"elementRef\"\n [position]=\"position\"\n [width]=\"overlayWidth\"\n [height]=\"overlayHeight\"\n (closing)=\"dropdown.nativeElement.focus()\"\n >\n <div #panel class=\"novo-select-list\" tabIndex=\"-1\" [class.has-header]=\"headerConfig\" [class.active]=\"panelOpen\">\n <novo-option *ngIf=\"headerConfig\" class=\"select-header\" [class.open]=\"header.open\">\n <novo-button *ngIf=\"!header.open\" icon=\"add-thin\" (click)=\"toggleHeader($event); (false)\" tabIndex=\"-1\" class=\"header\">\n {{ headerConfig.label }}\n </novo-button>\n <div *ngIf=\"header.open\" [ngClass]=\"{ active: header.open }\">\n <input\n autofocus\n type=\"text\"\n [placeholder]=\"headerConfig.placeholder\"\n [attr.id]=\"name\"\n autocomplete=\"off\"\n [value]=\"header.value\"\n [ngClass]=\"{ invalid: !header.valid }\"\n />\n <footer>\n <novo-button (click)=\"toggleHeader($event, false)\">{{ labels.cancel }}</novo-button>\n <novo-button (click)=\"saveHeader()\" class=\"primary\">{{ labels.save }}</novo-button>\n </footer>\n </div>\n </novo-option>\n <!-- Declarative Content Goes Here -->\n <ng-content></ng-content>\n <!-- Data Driven Content Goes Here -->\n <ng-container *ngFor=\"let option of filteredOptions; let i = index\">\n <novo-option\n *ngIf=\"!option.divider; else divider\"\n class=\"select-item\"\n [class.active]=\"option.active\"\n [class.disabled]=\"option.disabled\"\n [attr.data-automation-value]=\"option.label\"\n [value]=\"option.value\"\n [tooltip]=\"option.tooltip\"\n [tooltipPosition]=\"option.tooltipPosition || 'right'\"\n >\n <span [innerHtml]=\"highlight(option.label, filterTerm)\"></span> <i *ngIf=\"option.active\" class=\"bhi-check\"></i>\n </novo-option>\n <ng-template #divider>\n <novo-divider class=\"select-item-divider\" [class.with-label]=\"option.label\" [class.without-label]=\"!option.label\">\n {{ option?.label }}\n </novo-divider>\n </ng-template>\n </ng-container>\n </div>\n </novo-overlay-template>\n "
38730
+ template: "\n <div class=\"novo-select-trigger\" #dropdownElement (click)=\"togglePanel(); (false)\" tabIndex=\"{{ disabled ? -1 : 0 }}\" type=\"button\">\n <span class=\"novo-select-placeholder\" *ngIf=\"empty\">{{ placeholder }}</span>\n <span class=\"novo-select-display-value\" *ngIf=\"!empty\">{{ displayValue }}</span>\n <i class=\"bhi-collapse\"></i>\n </div>\n <novo-overlay-template\n [parent]=\"elementRef\"\n [position]=\"position\"\n [width]=\"overlayWidth\"\n [height]=\"overlayHeight\"\n (closing)=\"dropdown.nativeElement.focus()\"\n >\n <div #panel class=\"novo-select-list\" tabIndex=\"-1\" [class.has-header]=\"headerConfig\" [class.active]=\"panelOpen\">\n <novo-option *ngIf=\"headerConfig\" class=\"select-header\" [class.open]=\"header.open\">\n <novo-button *ngIf=\"!header.open\" icon=\"add-thin\" (click)=\"toggleHeader($event); (false)\" tabIndex=\"-1\" class=\"header\">\n {{ headerConfig.label }}\n </novo-button>\n <div *ngIf=\"header.open\" [ngClass]=\"{ active: header.open }\">\n <input\n autofocus\n type=\"text\"\n [placeholder]=\"headerConfig.placeholder\"\n [attr.id]=\"name\"\n autocomplete=\"off\"\n [value]=\"header.value\"\n [ngClass]=\"{ invalid: !header.valid }\"\n />\n <footer>\n <novo-button (click)=\"toggleHeader($event, false)\">{{ labels.cancel }}</novo-button>\n <novo-button (click)=\"saveHeader()\" class=\"primary\">{{ labels.save }}</novo-button>\n </footer>\n </div>\n </novo-option>\n <!-- Declarative Content Goes Here -->\n <ng-content></ng-content>\n <!-- Data Driven Content Goes Here -->\n <ng-container *ngFor=\"let option of filteredOptions; let i = index\">\n <novo-option\n *ngIf=\"!option.divider; else divider\"\n class=\"select-item\"\n [disabled]=\"option.disabled\"\n [class.active]=\"option.active\"\n [attr.data-automation-value]=\"option.label\"\n [value]=\"option.value\"\n [tooltip]=\"option.tooltip\"\n [tooltipPosition]=\"option.tooltipPosition || 'right'\"\n >\n <span [innerHtml]=\"highlight(option.label, filterTerm)\"></span> <i *ngIf=\"option.active\" class=\"bhi-check\"></i>\n </novo-option>\n <ng-template #divider>\n <novo-divider class=\"select-item-divider\" [class.with-label]=\"option.label\" [class.without-label]=\"!option.label\">\n {{ option?.label }}\n </novo-divider>\n </ng-template>\n </ng-container>\n </div>\n </novo-overlay-template>\n "
38681
38731
  },] }
38682
38732
  ];
38683
38733
  NovoSelectElement.ctorParameters = function () { return [
@@ -41335,6 +41385,9 @@
41335
41385
  NovoTimePickerInputElement.prototype.dispatchOnChange = function (newValue, skip) {
41336
41386
  if (skip === void 0) { skip = false; }
41337
41387
  if (newValue !== this.value) {
41388
+ if (this.value instanceof Date && newValue instanceof Date && this.value.getTime() === newValue.getTime()) {
41389
+ return;
41390
+ }
41338
41391
  this._onChange(newValue);
41339
41392
  !skip && this.writeValue(newValue);
41340
41393
  }
@@ -43574,6 +43627,10 @@
43574
43627
  this._remove = false;
43575
43628
  this._edit = false;
43576
43629
  this._collapsible = false;
43630
+ // Edit icon at the end of each row (no bhi- prefix)
43631
+ this.editIcon = 'edit';
43632
+ // Remove icon at the end of each row (no bhi- prefix)
43633
+ this.removeIcon = 'delete-o';
43577
43634
  this.onRemove = new i0.EventEmitter();
43578
43635
  this.onEdit = new i0.EventEmitter();
43579
43636
  this.onAdd = new i0.EventEmitter();
@@ -43855,7 +43912,7 @@
43855
43912
  NovoControlGroup.decorators = [
43856
43913
  { type: i0.Component, args: [{
43857
43914
  selector: 'novo-control-group',
43858
- template: "<h6 class=\"novo-section-header\" *ngIf=\"label\">\n <span (click)=\"toggle($event)\" [class.clickable]=\"collapsible\">\n <i *ngIf=\"icon && !collapsible\" [ngClass]=\"icon\" [attr.data-automation-id]=\"'novo-control-group-icon-' + key\"></i>\n <i *ngIf=\"collapsible\" class=\"bhi-next\" [class.toggled]=\"toggled\"\n [attr.data-automation-id]=\"'novo-control-group-collapse-' + key\"></i>\n <span [attr.data-automation-id]=\"'novo-control-group-label-' + key\">{{ label }}</span>\n </span>\n <label class=\"novo-control-group-description\" *ngIf=\"description\"\n [attr.data-automation-id]=\"'novo-control-group-description-' + key\">{{ description }}</label>\n</h6>\n<div class=\"novo-control-group-controls\" [class.vertical]=\"vertical\" [class.horizontal]=\"!vertical\"\n [class.hidden]=\"collapsible && !toggled\">\n\n <ng-template #defaultTemplate let-index=\"index\" let-form=\"form\" let-key=\"key\">\n <div class=\"novo-control-group-control\">\n <div *ngFor=\"let c of controls\" class=\"novo-control-container {{c.key}}\"\n [class.is-label]=\"c.controlType === 'read-only'\" [style.max-width.px]=\"c.width\">\n <novo-control (change)=\"onChange()\" [form]=\"(form?.controls)[key]['controls'][index]\" [control]=\"c\"\n [condensed]=\"!vertical || c.controlType === 'read-only'\"></novo-control>\n </div>\n <div class=\"novo-control-container last\" *ngIf=\"edit && !vertical\">\n <novo-button class=\"control-group-action\" [disabled]=\"!disabledArray[index].edit\" type=\"button\"\n *ngIf=\"edit && !vertical\" theme=\"icon\" icon=\"edit\"\n (click)=\"editControl(index)\" [attr.data-automation-id]=\"'novo-control-group-edit-' + key\" index=\"-1\">\n </novo-button>\n </div>\n <div class=\"novo-control-container last\" *ngIf=\"remove && !vertical\">\n <novo-button class=\"control-group-action\" [disabled]=\"!disabledArray[index].remove\" type=\"button\"\n *ngIf=\"remove && !vertical\" theme=\"icon\"\n icon=\"delete-o\" (click)=\"removeControl(index)\"\n [attr.data-automation-id]=\"'novo-control-group-delete-' + key\"\n index=\"-1\">\n </novo-button>\n </div>\n </div>\n <novo-button class=\"control-group-action\" [disabled]=\"!disabledArray[index].edit\" type=\"button\"\n *ngIf=\"edit && vertical\"\n theme=\"icon\" icon=\"edit\"\n (click)=\"editControl(index)\" [attr.data-automation-id]=\"'novo-control-group-edit-' + key\" index=\"-1\">\n </novo-button>\n <novo-button class=\"control-group-action\" [disabled]=\"!disabledArray[index].remove\" type=\"button\"\n *ngIf=\"remove && vertical\" theme=\"icon\"\n icon=\"delete-o\" (click)=\"removeControl(index)\"\n [attr.data-automation-id]=\"'novo-control-group-delete-' + key\"\n index=\"-1\">\n </novo-button>\n </ng-template>\n\n <ng-template #defaultColumnLabelTemplate let-form=\"form\" let-key=\"key\">\n <div *ngFor=\"let label of controlLabels\"\n class=\"novo-control-group-control-label {{ label.key }}\"\n [class.novo-control-group-control-hidden]=\"label.hidden\"\n [style.max-width.px]=\"label.width\" [class.column-required]=\"label.required\">\n <span [attr.data-automation-id]=\"'novo-control-group-label-' + label.value\">{{ label.value }}</span>\n </div>\n <div class=\"novo-control-group-control-label last\" *ngIf=\"edit\"\n [attr.data-automation-id]=\"'novo-control-group-edit-' + key\"></div>\n <div class=\"novo-control-group-control-label last\" *ngIf=\"remove\"\n [attr.data-automation-id]=\"'novo-control-group-delete-' + key\"></div>\n </ng-template>\n\n <ng-container *ngIf=\"!vertical && (form?.controls)[key] && (form?.controls)[key]['controls'].length !== 0\">\n <div class=\"novo-control-group-labels\"\n *ngIf=\"!vertical && (form?.controls)[key] && (form?.controls)[key]['controls'].length !== 0\">\n <ng-template [ngTemplateOutlet]=\"columnLabelTemplate || defaultColumnLabelTemplate\"\n [ngTemplateOutletContext]=\"{ form: form, key: key, controlLabels: controlLabels }\">\n </ng-template>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(form?.controls)[key]\">\n <div class=\"novo-control-group-row\"\n *ngFor=\"let control of (form?.controls)[key]['controls']; let index = index\">\n <ng-template [ngTemplateOutlet]=\"rowTemplate || defaultTemplate\"\n [ngTemplateOutletContext]=\"{ form: form, formGroup: control, index: index, key: key, controls: controls }\">\n </ng-template>\n </div>\n </ng-container>\n\n <div class=\"novo-control-group-empty\"\n *ngIf=\"(form?.controls)[key] && (form?.controls)[key]['controls'].length === 0\"\n [attr.data-automation-id]=\"'novo-control-group-empty-' + key\">\n {{ emptyMessage }}\n </div>\n\n <div *ngIf=\"add\" class=\"novo-control-group-footer\">\n <novo-button type=\"button\" theme=\"dialogue\" icon=\"add-thin\" side=\"left\" (click)=\"onClickAdd()\"\n [attr.data-automation-id]=\"'novo-control-group-bottom-add-' + key\" index=\"-1\">\n {{ add?.label }}\n </novo-button>\n <!-- <novo-button *ngIf=\"editState==='editing'\" type=\"button\" theme=\"dialogue\" icon=\"close\" side=\"left\"\n (click)=\"onClickCancel()\" [attr.data-automation-id]=\"'novo-control-group-bottom-cancel-' + key\"\n index=\"-1\">\n {{ 'cancel' }}\n </novo-button>\n <novo-button *ngIf=\"editState==='editing'\" type=\"button\" theme=\"dialogue\" icon=\"check\" side=\"left\"\n (click)=\"onClickSave()\" [attr.data-automation-id]=\"'novo-control-group-bottom-save-' + key\"\n index=\"-1\">\n {{ add?.label }}\n </novo-button> -->\n </div>\n</div>",
43915
+ template: "<h6 class=\"novo-section-header\" *ngIf=\"label\">\n <span (click)=\"toggle($event)\" [class.clickable]=\"collapsible\">\n <i *ngIf=\"icon && !collapsible\" [ngClass]=\"icon\" [attr.data-automation-id]=\"'novo-control-group-icon-' + key\"></i>\n <i *ngIf=\"collapsible\" class=\"bhi-next\" [class.toggled]=\"toggled\"\n [attr.data-automation-id]=\"'novo-control-group-collapse-' + key\"></i>\n <span [attr.data-automation-id]=\"'novo-control-group-label-' + key\">{{ label }}</span>\n </span>\n <label class=\"novo-control-group-description\" *ngIf=\"description\"\n [attr.data-automation-id]=\"'novo-control-group-description-' + key\">{{ description }}</label>\n</h6>\n<div class=\"novo-control-group-controls\" [class.vertical]=\"vertical\" [class.horizontal]=\"!vertical\"\n [class.hidden]=\"collapsible && !toggled\">\n\n <ng-template #defaultTemplate let-index=\"index\" let-form=\"form\" let-key=\"key\">\n <div class=\"novo-control-group-control\">\n <div *ngFor=\"let c of controls\" class=\"novo-control-container {{c.key}}\"\n [class.is-label]=\"c.controlType === 'read-only'\" [style.max-width.px]=\"c.width\">\n <novo-control (change)=\"onChange()\" [form]=\"(form?.controls)[key]['controls'][index]\" [control]=\"c\"\n [condensed]=\"!vertical || c.controlType === 'read-only'\"></novo-control>\n </div>\n <div class=\"novo-control-container edit last\" *ngIf=\"edit && !vertical\">\n <novo-button class=\"control-group-action\" [disabled]=\"!disabledArray[index].edit\" type=\"button\"\n *ngIf=\"edit && !vertical\" theme=\"icon\" icon=\"editIcon\"\n (click)=\"editControl(index)\" [attr.data-automation-id]=\"'novo-control-group-edit-' + key\" index=\"-1\">\n </novo-button>\n </div>\n <div class=\"novo-control-container remove last\" *ngIf=\"remove && !vertical\">\n <novo-button class=\"control-group-action\" [disabled]=\"!disabledArray[index].remove\" type=\"button\"\n *ngIf=\"remove && !vertical\" theme=\"icon\"\n icon=\"removeIcon\" (click)=\"removeControl(index)\"\n [attr.data-automation-id]=\"'novo-control-group-delete-' + key\"\n index=\"-1\">\n </novo-button>\n </div>\n </div>\n <novo-button class=\"control-group-action\" [disabled]=\"!disabledArray[index].edit\" type=\"button\"\n *ngIf=\"edit && vertical\"\n theme=\"icon\" icon=\"editIcon\"\n (click)=\"editControl(index)\" [attr.data-automation-id]=\"'novo-control-group-edit-' + key\" index=\"-1\">\n </novo-button>\n <novo-button class=\"control-group-action\" [disabled]=\"!disabledArray[index].remove\" type=\"button\"\n *ngIf=\"remove && vertical\" theme=\"icon\"\n icon=\"removeIcon\" (click)=\"removeControl(index)\"\n [attr.data-automation-id]=\"'novo-control-group-delete-' + key\"\n index=\"-1\">\n </novo-button>\n </ng-template>\n\n <ng-template #defaultColumnLabelTemplate let-form=\"form\" let-key=\"key\">\n <div *ngFor=\"let label of controlLabels\"\n class=\"novo-control-group-control-label {{ label.key }}\"\n [class.novo-control-group-control-hidden]=\"label.hidden\"\n [style.max-width.px]=\"label.width\" [class.column-required]=\"label.required\">\n <span [attr.data-automation-id]=\"'novo-control-group-label-' + label.value\">{{ label.value }}</span>\n </div>\n <div class=\"novo-control-group-control-label edit last\" *ngIf=\"edit\"\n [attr.data-automation-id]=\"'novo-control-group-edit-' + key\"></div>\n <div class=\"novo-control-group-control-label remove last\" *ngIf=\"remove\"\n [attr.data-automation-id]=\"'novo-control-group-delete-' + key\"></div>\n </ng-template>\n\n <ng-container *ngIf=\"!vertical && (form?.controls)[key] && (form?.controls)[key]['controls'].length !== 0\">\n <div class=\"novo-control-group-labels\"\n *ngIf=\"!vertical && (form?.controls)[key] && (form?.controls)[key]['controls'].length !== 0\">\n <ng-template [ngTemplateOutlet]=\"columnLabelTemplate || defaultColumnLabelTemplate\"\n [ngTemplateOutletContext]=\"{ form: form, key: key, controlLabels: controlLabels }\">\n </ng-template>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"(form?.controls)[key]\">\n <div class=\"novo-control-group-row\"\n *ngFor=\"let control of (form?.controls)[key]['controls']; let index = index\">\n <ng-template [ngTemplateOutlet]=\"rowTemplate || defaultTemplate\"\n [ngTemplateOutletContext]=\"{ form: form, formGroup: control, index: index, key: key, controls: controls }\">\n </ng-template>\n </div>\n </ng-container>\n\n <div class=\"novo-control-group-empty\"\n *ngIf=\"(form?.controls)[key] && (form?.controls)[key]['controls'].length === 0\"\n [attr.data-automation-id]=\"'novo-control-group-empty-' + key\">\n {{ emptyMessage }}\n </div>\n\n <div *ngIf=\"add\" class=\"novo-control-group-footer\">\n <novo-button type=\"button\" theme=\"dialogue\" icon=\"add-thin\" side=\"left\" (click)=\"onClickAdd()\"\n [attr.data-automation-id]=\"'novo-control-group-bottom-add-' + key\" index=\"-1\">\n {{ add?.label }}\n </novo-button>\n <!-- <novo-button *ngIf=\"editState==='editing'\" type=\"button\" theme=\"dialogue\" icon=\"close\" side=\"left\"\n (click)=\"onClickCancel()\" [attr.data-automation-id]=\"'novo-control-group-bottom-cancel-' + key\"\n index=\"-1\">\n {{ 'cancel' }}\n </novo-button>\n <novo-button *ngIf=\"editState==='editing'\" type=\"button\" theme=\"dialogue\" icon=\"check\" side=\"left\"\n (click)=\"onClickSave()\" [attr.data-automation-id]=\"'novo-control-group-bottom-save-' + key\"\n index=\"-1\">\n {{ add?.label }}\n </novo-button> -->\n </div>\n</div>",
43859
43916
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
43860
43917
  host: {
43861
43918
  '[class.novo-control-group-appearance-card]': "appearance=='card'",
@@ -43883,6 +43940,8 @@
43883
43940
  description: [{ type: i0.Input }],
43884
43941
  emptyMessage: [{ type: i0.Input }],
43885
43942
  icon: [{ type: i0.Input }],
43943
+ editIcon: [{ type: i0.Input }],
43944
+ removeIcon: [{ type: i0.Input }],
43886
43945
  initialValue: [{ type: i0.Input }],
43887
43946
  canEdit: [{ type: i0.Input }],
43888
43947
  canRemove: [{ type: i0.Input }],
@@ -45740,6 +45799,9 @@
45740
45799
  _this._changeDetectorRef.markForCheck();
45741
45800
  });
45742
45801
  };
45802
+ NovoLayoutContent.prototype.getHostElement = function () {
45803
+ return this.elementRef.nativeElement;
45804
+ };
45743
45805
  return NovoLayoutContent;
45744
45806
  }(i1.CdkScrollable));
45745
45807
  NovoLayoutContent.decorators = [
@@ -52098,7 +52160,6 @@
52098
52160
  }
52099
52161
  };
52100
52162
  TableFilter.prototype.onClick = function (event) {
52101
- console.log('hmmm');
52102
52163
  Helpers.swallowEvent(event);
52103
52164
  };
52104
52165
  return TableFilter;
@@ -52279,7 +52340,6 @@
52279
52340
  }
52280
52341
  ThSortable.prototype.onToggleSort = function (event) {
52281
52342
  if (event) {
52282
- console.log('sorting');
52283
52343
  // event.preventDefault();
52284
52344
  }
52285
52345
  if (this.config && this.column && this.config.sorting !== false && this.column.sorting !== false) {
@@ -52318,7 +52378,7 @@
52318
52378
  }());
52319
52379
  NovoTableExtrasModule.decorators = [
52320
52380
  { type: i0.NgModule, args: [{
52321
- imports: [common.CommonModule, forms.FormsModule, NovoSelectModule, NovoDropdownModule, NovoButtonModule],
52381
+ imports: [common.CommonModule, forms.FormsModule, NovoSelectModule, NovoDropdownModule, NovoButtonModule, NovoCommonModule],
52322
52382
  declarations: [
52323
52383
  NovoTableHeaderElement,
52324
52384
  NovoTableFooterElement,
@@ -52528,6 +52588,7 @@
52528
52588
  });
52529
52589
  NovoTableElement.prototype.onDropdownToggled = function (event, column) {
52530
52590
  this.toggledDropdownMap[column] = event;
52591
+ this.cdr.markForCheck();
52531
52592
  };
52532
52593
  NovoTableElement.prototype.focusInput = function () {
52533
52594
  if (this.filterInputs && this.filterInputs.length) {
@@ -52582,7 +52643,6 @@
52582
52643
  return tableFormRows.controls[i];
52583
52644
  };
52584
52645
  NovoTableElement.prototype.onFilterClick = function (column, filter) {
52585
- console.log('clicking filter', filter);
52586
52646
  if (filter.range && !column.calendarShow) {
52587
52647
  column.calenderShow = true;
52588
52648
  return;
@@ -53173,7 +53233,7 @@
53173
53233
  '[class.novo-table-loading]': 'loading',
53174
53234
  },
53175
53235
  // directives: [],
53176
- template: "\n <header *ngIf=\"columns.length\">\n <ng-content select=\"novo-table-header\"></ng-content>\n <div class=\"header-actions\">\n <novo-pagination\n *ngIf=\"config.paging && !(dataProvider.isEmpty() && !dataProvider.isFiltered())\"\n [rowOptions]=\"config.paging.rowOptions\"\n [disablePageSelection]=\"config.paging.disablePageSelection\"\n [(page)]=\"dataProvider.page\"\n [(itemsPerPage)]=\"dataProvider.pageSize\"\n [totalItems]=\"dataProvider.total\"\n (onPageChange)=\"onPageChange($event)\"\n >\n </novo-pagination>\n <ng-content select=\"novo-table-actions\"></ng-content>\n </div>\n </header>\n <div class=\"novo-table-loading-overlay\" *ngIf=\"loading || dataProvider.isLoading()\">\n <novo-loading></novo-loading>\n </div>\n <novo-toast *ngIf=\"toast\" [theme]=\"toast?.theme\" [icon]=\"toast?.icon\" [message]=\"toast?.message\"></novo-toast>\n <div class=\"table-container\" *ngIf=\"!grossFlagToAvoidTheTableFromBeingUglyWhenHidingTheToast\">\n <novo-form hideHeader=\"true\" [form]=\"tableForm\">\n <table class=\"table table-striped dataTable\" [class.table-details]=\"config.hasDetails\" role=\"grid\">\n <!-- skipSortAndFilterClear is a hack right now, will be removed once Canvas is refactored -->\n <thead *ngIf=\"columns.length && (!dataProvider.isEmpty() || dataProvider.isFiltered() || skipSortAndFilterClear || editing)\">\n <tr role=\"row\">\n <!-- DETAILS -->\n <th class=\"row-actions\" *ngIf=\"config.hasDetails\">\n <novo-button\n theme=\"icon\"\n icon=\"next\"\n (click)=\"expandAllOnPage(config.expandAll)\"\n *ngIf=\"!config.expandAll\"\n data-automation-id=\"expand-all\"\n ></novo-button>\n <novo-button\n theme=\"icon\"\n icon=\"sort-desc\"\n (click)=\"expandAllOnPage(config.expandAll)\"\n *ngIf=\"config.expandAll\"\n data-automation-id=\"collapse-all\"\n ></novo-button>\n </th>\n <!-- CHECKBOX -->\n <th class=\"row-actions checkbox mass-action\" *ngIf=\"config.rowSelectionStyle === 'checkbox'\">\n <novo-checkbox\n [(ngModel)]=\"master\"\n [indeterminate]=\"pageSelected.length > 0 && pageSelected.length < pagedData.length\"\n (ngModelChange)=\"selectPage($event)\"\n data-automation-id=\"select-all-checkbox\"\n [tooltip]=\"master ? labels.deselectAll : labels.selectAllOnPage\"\n tooltipPosition=\"right\"\n ></novo-checkbox>\n </th>\n <!-- TABLE HEADERS -->\n <th\n *ngFor=\"let column of columns\"\n [ngClass]=\"{\n 'mass-action': config?.rowSelectionStyle === 'checkbox',\n actions: column?.actions?.items?.length > 0,\n preview: column?.name === 'preview'\n }\"\n [novoThOrderable]=\"column\"\n (onOrderChange)=\"onOrderChange($event)\"\n [hidden]=\"isColumnHidden(column)\"\n >\n <div class=\"th-group\" [attr.data-automation-id]=\"column.id || column.name\" *ngIf=\"!column.hideHeader\">\n <!-- LABEL & SORT ARROWS -->\n <div\n class=\"th-title\"\n [ngClass]=\"config.sorting !== false && column.sorting !== false ? 'sortable' : ''\"\n [novoThSortable]=\"config\"\n [column]=\"column\"\n (onSortChange)=\"onSortChange($event)\"\n >\n <label>{{ column.title || column.label }}</label>\n <div\n class=\"table-sort-icons\"\n tooltipPosition=\"bottom\"\n [tooltip]=\"labels.sort\"\n [ngClass]=\"column.sort || ''\"\n *ngIf=\"config.sorting !== false && column.sorting !== false\"\n >\n <i class=\"bhi-arrow-up\"></i>\n <i class=\"bhi-arrow-down\"></i>\n </div>\n </div>\n <!-- FILTER DROP-DOWN -->\n <novo-dropdown\n side=\"right\"\n *ngIf=\"config.filtering !== false && column.filtering !== false\"\n class=\"column-filters\"\n (toggled)=\"onDropdownToggled($event, column.name)\"\n parentScrollSelector=\".table-container\"\n containerClass=\"table-dropdown\"\n >\n <novo-button\n type=\"button\"\n theme=\"icon\"\n icon=\"filter\"\n tooltipPosition=\"bottom\"\n [tooltip]=\"labels.filters\"\n [class.filtered]=\"column.filter || column.filter === false\"\n (click)=\"focusInput()\"\n ></novo-button>\n <!-- FILTER OPTIONS LIST -->\n <novo-optgroup\n *ngIf=\"\n (column?.options?.length || column?.originalOptions?.length) &&\n column?.type !== 'date' &&\n toggledDropdownMap[column.name]\n \"\n >\n <novo-option class=\"filter-search\" inert>\n <div class=\"header\">\n <span>{{ labels.filters }}</span>\n <novo-button\n theme=\"dialogue\"\n color=\"negative\"\n icon=\"times\"\n (click)=\"onFilterClear(column)\"\n *ngIf=\"column.filter || column.filter === false\"\n >\n {{ labels.clear }}\n </novo-button>\n </div>\n <input\n type=\"text\"\n *ngIf=\"!!column.allowCustomTextOption\"\n [attr.id]=\"column.name + '-input'\"\n [novoTableFilter]=\"column\"\n (onFilterChange)=\"onFilterKeywords($event)\"\n [(ngModel)]=\"column.freetextFilter\"\n keepFilterFocused\n #filterInput\n />\n </novo-option>\n <novo-option\n [ngClass]=\"{ active: isFilterActive(column, option) }\"\n *ngFor=\"let option of column.options\"\n (click)=\"onFilterClick(column, option)\"\n [attr.data-automation-id]=\"getOptionDataAutomationId(option)\"\n >\n <span>{{ option?.label || option }}</span> <i class=\"bhi-check\" *ngIf=\"isFilterActive(column, option)\"></i>\n </novo-option>\n </novo-optgroup>\n <!-- FILTER SEARCH INPUT -->\n <novo-optgroup *ngIf=\"!(column?.options?.length || column?.originalOptions?.length) && toggledDropdownMap[column.name]\">\n <novo-option class=\"filter-search\" inert>\n <div class=\"header\">\n <span>{{ labels.filters }}</span>\n <novo-button theme=\"dialogue\" color=\"negative\" icon=\"times\" (click)=\"onFilterClear(column)\" *ngIf=\"column.filter\">\n {{ labels.clear }}\n </novo-button>\n </div>\n <input\n type=\"text\"\n [attr.id]=\"column.name + '-input'\"\n [novoTableFilter]=\"column\"\n (onFilterChange)=\"onFilterChange($event)\"\n [(ngModel)]=\"column.filter\"\n keepFilterFocused\n #filterInput\n />\n </novo-option>\n </novo-optgroup>\n <!-- FILTER DATE OPTIONS -->\n <novo-optgroup *ngIf=\"column?.options?.length && column?.type === 'date' && toggledDropdownMap[column.name]\">\n <novo-option class=\"filter-search\" *ngIf=\"!column.calenderShow\" inert>\n <div class=\"header\">\n <span>{{ labels.filters }}</span>\n <novo-button theme=\"dialogue\" color=\"negative\" icon=\"times\" (click)=\"onFilterClear(column)\" *ngIf=\"column.filter\">\n {{ labels.clear }}\n </novo-button>\n </div>\n </novo-option>\n <novo-option\n [class.active]=\"isFilterActive(column, option)\"\n *ngFor=\"let option of column.options\"\n (click)=\"onFilterClick(column, option)\"\n [keepOpen]=\"option.range\"\n [hidden]=\"column.calenderShow\"\n [attr.data-automation-id]=\"option?.label || option\"\n >\n {{ option?.label || option }}\n <novo-icon novoSuffix color=\"positive\" *ngIf=\"isFilterActive(column, option)\">check</novo-icon>\n </novo-option>\n <novo-option class=\"calendar-container\" *ngIf=\"column.calenderShow\" keepOpen inert>\n <novo-stack>\n <div class=\"back-link\" (click)=\"column.calenderShow = false\">\n <i class=\"bhi-previous\"></i>{{ labels.backToPresetFilters }}\n </div>\n <novo-date-picker\n (onSelect)=\"onCalenderSelect(column, $event)\"\n [(ngModel)]=\"column.filter\"\n mode=\"range\"\n ></novo-date-picker>\n </novo-stack>\n </novo-option>\n </novo-optgroup>\n </novo-dropdown>\n </div>\n </th>\n </tr>\n </thead>\n <!-- TABLE DATA -->\n <tbody *ngIf=\"!dataProvider.isEmpty() || editing\">\n <tr\n class=\"table-selection-row\"\n *ngIf=\"config.rowSelectionStyle === 'checkbox' && showSelectAllMessage && config.selectAllEnabled\"\n data-automation-id=\"table-selection-row\"\n >\n <td colspan=\"100%\">\n {{ labels.selectedRecords(selected.length) }}\n <a (click)=\"selectAll(true)\" data-automation-id=\"all-matching-records\">{{ labels.totalRecords(dataProvider.total) }}</a>\n </td>\n </tr>\n <ng-template ngFor let-row=\"$implicit\" let-i=\"index\" [ngForOf]=\"rows\">\n <tr\n class=\"table-row\"\n [ngClass]=\"row.customClass || ''\"\n [id]=\"name + '-' + row[rowIdentifier]\"\n [attr.data-automation-id]=\"row.id\"\n (click)=\"rowClickHandler(row)\"\n [class.active]=\"row.id === activeId\"\n >\n <td class=\"row-actions\" *ngIf=\"config.hasDetails\">\n <novo-button theme=\"icon\" icon=\"next\" (click)=\"row._expanded = !row._expanded\" *ngIf=\"!row._expanded\"></novo-button>\n <novo-button theme=\"icon\" icon=\"sort-desc\" (click)=\"row._expanded = !row._expanded\" *ngIf=\"row._expanded\"></novo-button>\n </td>\n <td class=\"row-actions checkbox\" *ngIf=\"config.rowSelectionStyle === 'checkbox'\">\n <novo-checkbox\n [(ngModel)]=\"row._selected\"\n (ngModelChange)=\"rowSelectHandler(row)\"\n data-automation-id=\"select-row-checkbox\"\n ></novo-checkbox>\n </td>\n <td\n *ngFor=\"let column of columns\"\n [attr.data-automation-id]=\"column.id || column.name\"\n [class.novo-form-row]=\"editable\"\n [hidden]=\"isColumnHidden(column)\"\n >\n <novo-table-cell\n *ngIf=\"row._editing && !row._editing[column.name]\"\n [hasEditor]=\"editable\"\n [column]=\"column\"\n [row]=\"row\"\n [form]=\"getRowControlForm(i)\"\n ></novo-table-cell>\n <novo-control\n *ngIf=\"row._editing && row._editing[column.name]\"\n condensed=\"true\"\n [form]=\"getRowControlForm(i)\"\n [control]=\"row.controls[column.name]\"\n ></novo-control>\n </td>\n </tr>\n <tr\n class=\"details-row\"\n *ngIf=\"config.hasDetails\"\n [hidden]=\"!row._expanded\"\n [attr.data-automation-id]=\"'details-row-' + row.id\"\n >\n <td class=\"row-actions\"></td>\n <td [attr.colspan]=\"config.rowSelectionStyle === 'checkbox' ? columns.length + 1 : columns.length\">\n <novo-row-details [data]=\"row\" [renderer]=\"config.detailsRenderer\"></novo-row-details>\n </td>\n </tr>\n </ng-template>\n </tbody>\n <!-- NO TABLE DATA PLACEHOLDER -->\n <tbody\n class=\"table-message\"\n *ngIf=\"dataProvider.isEmpty() && !dataProvider.isFiltered() && !editing\"\n data-automation-id=\"empty-table\"\n >\n <tr>\n <td colspan=\"100%\">\n <div #emptymessage><ng-content select=\"[table-empty-message]\"></ng-content></div>\n <div class=\"table-empty-message\" *ngIf=\"emptymessage.childNodes.length == 0\">\n <h4><i class=\"bhi-search-question\"></i> {{ labels.emptyTableMessage }}</h4>\n </div>\n </td>\n </tr>\n </tbody>\n <!-- NO MATCHING RECORDS -->\n <tbody class=\"table-message\" *ngIf=\"dataProvider.isEmpty() && dataProvider.isFiltered()\" data-automation-id=\"empty-table\">\n <tr>\n <td colspan=\"100%\">\n <div #nomatchmessage><ng-content select=\"[table-no-matching-records-message]\"></ng-content></div>\n <div class=\"no-matching-records\" *ngIf=\"nomatchmessage.childNodes.length == 0\">\n <h4><i class=\"bhi-search-question\"></i> {{ labels.noMatchingRecordsMessage }}</h4>\n </div>\n </td>\n </tr>\n </tbody>\n <!-- TABLE DATA ERROR PLACEHOLDER -->\n <tbody class=\"table-message\" *ngIf=\"dataProvider.hasErrors()\" data-automation-id=\"table-errors\">\n <tr>\n <td colspan=\"100%\">\n <div #errormessage><ng-content select=\"[table-error-message]\"></ng-content></div>\n <div class=\"table-error-message\" *ngIf=\"errormessage.childNodes.length == 0\">\n <h4><i class=\"bhi-caution\"></i> {{ labels.erroredTableMessage }}</h4>\n </div>\n </td>\n </tr>\n </tbody>\n <tfoot *ngIf=\"!config.footers\" [ngClass]=\"dataProvider.length % 2 == 0 ? 'odd' : 'even'\">\n <tr>\n <td colspan=\"100%\">\n <ng-content select=\"novo-table-footer\"></ng-content>\n </td>\n </tr>\n </tfoot>\n <tfoot *ngFor=\"let footer of footers; let i = index\" class=\"novo-table-total-footer\">\n <tr>\n <td *ngFor=\"let column of columns\" [attr.data-automation-id]=\"(column.id || column.name) + '-total-' + i\">\n {{ footer[column.name] }}\n </td>\n </tr>\n </tfoot>\n </table>\n </novo-form>\n </div>\n "
53236
+ template: "\n <header *ngIf=\"columns.length\">\n <ng-content select=\"novo-table-header\"></ng-content>\n <div class=\"header-actions\">\n <novo-pagination\n *ngIf=\"config.paging && !(dataProvider.isEmpty() && !dataProvider.isFiltered())\"\n [rowOptions]=\"config.paging.rowOptions\"\n [disablePageSelection]=\"config.paging.disablePageSelection\"\n [(page)]=\"dataProvider.page\"\n [(itemsPerPage)]=\"dataProvider.pageSize\"\n [totalItems]=\"dataProvider.total\"\n (onPageChange)=\"onPageChange($event)\"\n >\n </novo-pagination>\n <ng-content select=\"novo-table-actions\"></ng-content>\n </div>\n </header>\n <div class=\"novo-table-loading-overlay\" *ngIf=\"loading || dataProvider.isLoading()\">\n <novo-loading></novo-loading>\n </div>\n <novo-toast *ngIf=\"toast\" [theme]=\"toast?.theme\" [icon]=\"toast?.icon\" [message]=\"toast?.message\"></novo-toast>\n <div class=\"table-container\" *ngIf=\"!grossFlagToAvoidTheTableFromBeingUglyWhenHidingTheToast\">\n <novo-form hideHeader=\"true\" [form]=\"tableForm\">\n <table class=\"table table-striped dataTable\" [class.table-details]=\"config.hasDetails\" role=\"grid\">\n <!-- skipSortAndFilterClear is a hack right now, will be removed once Canvas is refactored -->\n <thead *ngIf=\"columns.length && (!dataProvider.isEmpty() || dataProvider.isFiltered() || skipSortAndFilterClear || editing)\">\n <tr role=\"row\">\n <!-- DETAILS -->\n <th class=\"row-actions\" *ngIf=\"config.hasDetails\">\n <novo-button\n theme=\"icon\"\n icon=\"next\"\n (click)=\"expandAllOnPage(config.expandAll)\"\n *ngIf=\"!config.expandAll\"\n data-automation-id=\"expand-all\"\n ></novo-button>\n <novo-button\n theme=\"icon\"\n icon=\"sort-desc\"\n (click)=\"expandAllOnPage(config.expandAll)\"\n *ngIf=\"config.expandAll\"\n data-automation-id=\"collapse-all\"\n ></novo-button>\n </th>\n <!-- CHECKBOX -->\n <th class=\"row-actions checkbox mass-action\" *ngIf=\"config.rowSelectionStyle === 'checkbox'\">\n <novo-checkbox\n [(ngModel)]=\"master\"\n [indeterminate]=\"pageSelected.length > 0 && pageSelected.length < pagedData.length\"\n (ngModelChange)=\"selectPage($event)\"\n data-automation-id=\"select-all-checkbox\"\n [tooltip]=\"master ? labels.deselectAll : labels.selectAllOnPage\"\n tooltipPosition=\"right\"\n ></novo-checkbox>\n </th>\n <!-- TABLE HEADERS -->\n <th\n *ngFor=\"let column of columns\"\n [ngClass]=\"{\n 'mass-action': config?.rowSelectionStyle === 'checkbox',\n actions: column?.actions?.items?.length > 0,\n preview: column?.name === 'preview'\n }\"\n [novoThOrderable]=\"column\"\n (onOrderChange)=\"onOrderChange($event)\"\n [hidden]=\"isColumnHidden(column)\"\n >\n <div class=\"th-group\" [attr.data-automation-id]=\"column.id || column.name\" *ngIf=\"!column.hideHeader\">\n <!-- LABEL & SORT ARROWS -->\n <div\n class=\"th-title\"\n [ngClass]=\"config.sorting !== false && column.sorting !== false ? 'sortable' : ''\"\n [novoThSortable]=\"config\"\n [column]=\"column\"\n (onSortChange)=\"onSortChange($event)\"\n >\n <label>{{ column.title || column.label }}</label>\n <div\n class=\"table-sort-icons\"\n tooltipPosition=\"bottom\"\n [tooltip]=\"labels.sort\"\n [ngClass]=\"column.sort || ''\"\n *ngIf=\"config.sorting !== false && column.sorting !== false\"\n >\n <i class=\"bhi-arrow-up\"></i>\n <i class=\"bhi-arrow-down\"></i>\n </div>\n </div>\n <!-- FILTER DROP-DOWN -->\n <novo-dropdown\n side=\"default\"\n *ngIf=\"config.filtering !== false && column.filtering !== false\"\n class=\"column-filters\"\n (toggled)=\"onDropdownToggled($event, column.name)\"\n parentScrollSelector=\".table-container\"\n containerClass=\"table-dropdown\"\n >\n <novo-button\n type=\"button\"\n theme=\"icon\"\n icon=\"filter\"\n tooltipPosition=\"bottom\"\n [tooltip]=\"labels.filters\"\n [class.filtered]=\"column.filter || column.filter === false\"\n (click)=\"focusInput()\"\n ></novo-button>\n <!-- FILTER OPTIONS LIST -->\n <novo-optgroup\n *ngIf=\"\n (column?.options?.length || column?.originalOptions?.length) &&\n column?.type !== 'date' &&\n toggledDropdownMap[column.name]\n \"\n >\n <novo-option class=\"filter-search\" inert>\n <div class=\"header\">\n <span>{{ labels.filters }}</span>\n <novo-button\n theme=\"dialogue\"\n color=\"negative\"\n icon=\"times\"\n (click)=\"onFilterClear(column)\"\n *ngIf=\"column.filter || column.filter === false\"\n >\n {{ labels.clear }}\n </novo-button>\n </div>\n <input\n type=\"text\"\n *ngIf=\"!!column.allowCustomTextOption\"\n [attr.id]=\"column.name + '-input'\"\n [novoTableFilter]=\"column\"\n (onFilterChange)=\"onFilterKeywords($event)\"\n [(ngModel)]=\"column.freetextFilter\"\n keepFilterFocused\n #filterInput\n />\n </novo-option>\n <novo-option\n [ngClass]=\"{ active: isFilterActive(column, option) }\"\n *ngFor=\"let option of column.options\"\n (click)=\"onFilterClick(column, option)\"\n [attr.data-automation-id]=\"getOptionDataAutomationId(option)\"\n >\n <span>{{ option?.label || option }}</span> <i class=\"bhi-check\" *ngIf=\"isFilterActive(column, option)\"></i>\n </novo-option>\n </novo-optgroup>\n <!-- FILTER SEARCH INPUT -->\n <novo-optgroup *ngIf=\"!(column?.options?.length || column?.originalOptions?.length) && toggledDropdownMap[column.name]\">\n <novo-option class=\"filter-search\" inert>\n <div class=\"header\">\n <span>{{ labels.filters }}</span>\n <novo-button theme=\"dialogue\" color=\"negative\" icon=\"times\" (click)=\"onFilterClear(column)\" *ngIf=\"column.filter\">\n {{ labels.clear }}\n </novo-button>\n </div>\n <input\n type=\"text\"\n [attr.id]=\"column.name + '-input'\"\n [novoTableFilter]=\"column\"\n (onFilterChange)=\"onFilterChange($event)\"\n [(ngModel)]=\"column.filter\"\n keepFilterFocused\n #filterInput\n />\n </novo-option>\n </novo-optgroup>\n <!-- FILTER DATE OPTIONS -->\n <novo-optgroup *ngIf=\"column?.options?.length && column?.type === 'date' && toggledDropdownMap[column.name]\">\n <novo-option class=\"filter-search\" *ngIf=\"!column.calenderShow\" inert>\n <div class=\"header\">\n <span>{{ labels.filters }}</span>\n <novo-button theme=\"dialogue\" color=\"negative\" icon=\"times\" (click)=\"onFilterClear(column)\" *ngIf=\"column.filter\">\n {{ labels.clear }}\n </novo-button>\n </div>\n </novo-option>\n <novo-option\n [class.active]=\"isFilterActive(column, option)\"\n *ngFor=\"let option of column.options\"\n (click)=\"onFilterClick(column, option)\"\n [keepOpen]=\"option.range\"\n [hidden]=\"column.calenderShow\"\n [attr.data-automation-id]=\"option?.label || option\"\n >\n {{ option?.label || option }}\n <novo-icon novoSuffix color=\"positive\" *ngIf=\"isFilterActive(column, option)\">check</novo-icon>\n </novo-option>\n <novo-option class=\"calendar-container\" *ngIf=\"column.calenderShow\" keepOpen inert>\n <novo-stack>\n <div class=\"back-link\" (click)=\"column.calenderShow = false\">\n <i class=\"bhi-previous\"></i>{{ labels.backToPresetFilters }}\n </div>\n <novo-date-picker\n (onSelect)=\"onCalenderSelect(column, $event)\"\n [(ngModel)]=\"column.filter\"\n mode=\"range\"\n ></novo-date-picker>\n </novo-stack>\n </novo-option>\n </novo-optgroup>\n </novo-dropdown>\n </div>\n </th>\n </tr>\n </thead>\n <!-- TABLE DATA -->\n <tbody *ngIf=\"!dataProvider.isEmpty() || editing\">\n <tr\n class=\"table-selection-row\"\n *ngIf=\"config.rowSelectionStyle === 'checkbox' && showSelectAllMessage && config.selectAllEnabled\"\n data-automation-id=\"table-selection-row\"\n >\n <td colspan=\"100%\">\n {{ labels.selectedRecords(selected.length) }}\n <a (click)=\"selectAll(true)\" data-automation-id=\"all-matching-records\">{{ labels.totalRecords(dataProvider.total) }}</a>\n </td>\n </tr>\n <ng-template ngFor let-row=\"$implicit\" let-i=\"index\" [ngForOf]=\"rows\">\n <tr\n class=\"table-row\"\n [ngClass]=\"row.customClass || ''\"\n [id]=\"name + '-' + row[rowIdentifier]\"\n [attr.data-automation-id]=\"row.id\"\n (click)=\"rowClickHandler(row)\"\n [class.active]=\"row.id === activeId\"\n >\n <td class=\"row-actions\" *ngIf=\"config.hasDetails\">\n <novo-button theme=\"icon\" icon=\"next\" (click)=\"row._expanded = !row._expanded\" *ngIf=\"!row._expanded\"></novo-button>\n <novo-button theme=\"icon\" icon=\"sort-desc\" (click)=\"row._expanded = !row._expanded\" *ngIf=\"row._expanded\"></novo-button>\n </td>\n <td class=\"row-actions checkbox\" *ngIf=\"config.rowSelectionStyle === 'checkbox'\">\n <novo-checkbox\n [(ngModel)]=\"row._selected\"\n (ngModelChange)=\"rowSelectHandler(row)\"\n data-automation-id=\"select-row-checkbox\"\n ></novo-checkbox>\n </td>\n <td\n *ngFor=\"let column of columns\"\n [attr.data-automation-id]=\"column.id || column.name\"\n [class.novo-form-row]=\"editable\"\n [hidden]=\"isColumnHidden(column)\"\n >\n <novo-table-cell\n *ngIf=\"row._editing && !row._editing[column.name]\"\n [hasEditor]=\"editable\"\n [column]=\"column\"\n [row]=\"row\"\n [form]=\"getRowControlForm(i)\"\n ></novo-table-cell>\n <novo-control\n *ngIf=\"row._editing && row._editing[column.name]\"\n condensed=\"true\"\n [form]=\"getRowControlForm(i)\"\n [control]=\"row.controls[column.name]\"\n ></novo-control>\n </td>\n </tr>\n <tr\n class=\"details-row\"\n *ngIf=\"config.hasDetails\"\n [hidden]=\"!row._expanded\"\n [attr.data-automation-id]=\"'details-row-' + row.id\"\n >\n <td class=\"row-actions\"></td>\n <td [attr.colspan]=\"config.rowSelectionStyle === 'checkbox' ? columns.length + 1 : columns.length\">\n <novo-row-details [data]=\"row\" [renderer]=\"config.detailsRenderer\"></novo-row-details>\n </td>\n </tr>\n </ng-template>\n </tbody>\n <!-- NO TABLE DATA PLACEHOLDER -->\n <tbody\n class=\"table-message\"\n *ngIf=\"dataProvider.isEmpty() && !dataProvider.isFiltered() && !editing\"\n data-automation-id=\"empty-table\"\n >\n <tr>\n <td colspan=\"100%\">\n <div #emptymessage><ng-content select=\"[table-empty-message]\"></ng-content></div>\n <div class=\"table-empty-message\" *ngIf=\"emptymessage.childNodes.length == 0\">\n <h4><i class=\"bhi-search-question\"></i> {{ labels.emptyTableMessage }}</h4>\n </div>\n </td>\n </tr>\n </tbody>\n <!-- NO MATCHING RECORDS -->\n <tbody class=\"table-message\" *ngIf=\"dataProvider.isEmpty() && dataProvider.isFiltered()\" data-automation-id=\"empty-table\">\n <tr>\n <td colspan=\"100%\">\n <div #nomatchmessage><ng-content select=\"[table-no-matching-records-message]\"></ng-content></div>\n <div class=\"no-matching-records\" *ngIf=\"nomatchmessage.childNodes.length == 0\">\n <h4><i class=\"bhi-search-question\"></i> {{ labels.noMatchingRecordsMessage }}</h4>\n </div>\n </td>\n </tr>\n </tbody>\n <!-- TABLE DATA ERROR PLACEHOLDER -->\n <tbody class=\"table-message\" *ngIf=\"dataProvider.hasErrors()\" data-automation-id=\"table-errors\">\n <tr>\n <td colspan=\"100%\">\n <div #errormessage><ng-content select=\"[table-error-message]\"></ng-content></div>\n <div class=\"table-error-message\" *ngIf=\"errormessage.childNodes.length == 0\">\n <h4><i class=\"bhi-caution\"></i> {{ labels.erroredTableMessage }}</h4>\n </div>\n </td>\n </tr>\n </tbody>\n <tfoot *ngIf=\"!config.footers\" [ngClass]=\"dataProvider.length % 2 == 0 ? 'odd' : 'even'\">\n <tr>\n <td colspan=\"100%\">\n <ng-content select=\"novo-table-footer\"></ng-content>\n </td>\n </tr>\n </tfoot>\n <tfoot *ngFor=\"let footer of footers; let i = index\" class=\"novo-table-total-footer\">\n <tr>\n <td *ngFor=\"let column of columns\" [attr.data-automation-id]=\"(column.id || column.name) + '-total-' + i\">\n {{ footer[column.name] }}\n </td>\n </tr>\n </tfoot>\n </table>\n </novo-form>\n </div>\n "
53177
53237
  },] }
53178
53238
  ];
53179
53239
  NovoTableElement.ctorParameters = function () { return [