novo-elements 5.7.0 → 5.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/bundles/novo-elements.umd.js +333 -243
  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/data-table/cell-headers/data-table-checkbox-header-cell.component.d.ts +5 -1
  6. package/elements/data-table/cells/data-table-checkbox-cell.component.d.ts +3 -0
  7. package/elements/data-table/data-table-clear-button.component.d.ts +2 -0
  8. package/elements/data-table/data-table.component.d.ts +3 -1
  9. package/elements/data-table/data-table.component.scss +5 -1
  10. package/elements/data-table/interfaces.d.ts +3 -0
  11. package/elements/data-table/state/data-table-state.service.d.ts +6 -2
  12. package/elements/date-picker/DatePicker.d.ts +1 -0
  13. package/elements/date-picker/DatePickerInput.d.ts +1 -0
  14. package/elements/date-time-picker/DateTimePicker.d.ts +1 -0
  15. package/elements/date-time-picker/DateTimePickerInput.d.ts +1 -0
  16. package/elements/form/FormInterfaces.d.ts +1 -0
  17. package/elements/form/NovoFormControl.d.ts +1 -0
  18. package/elements/form/controls/BaseControl.d.ts +1 -0
  19. package/esm2015/elements/data-table/cell-headers/data-table-checkbox-header-cell.component.js +26 -6
  20. package/esm2015/elements/data-table/cells/data-table-checkbox-cell.component.js +16 -5
  21. package/esm2015/elements/data-table/data-table-clear-button.component.js +9 -1
  22. package/esm2015/elements/data-table/data-table.component.js +8 -3
  23. package/esm2015/elements/data-table/data-table.source.js +5 -2
  24. package/esm2015/elements/data-table/interfaces.js +1 -1
  25. package/esm2015/elements/data-table/pagination/data-table-pagination.component.js +4 -1
  26. package/esm2015/elements/data-table/sort-filter/sort-filter.directive.js +3 -1
  27. package/esm2015/elements/data-table/state/data-table-state.service.js +31 -7
  28. package/esm2015/elements/date-picker/DatePicker.js +3 -2
  29. package/esm2015/elements/date-picker/DatePickerInput.js +3 -1
  30. package/esm2015/elements/date-time-picker/DateTimePicker.js +3 -1
  31. package/esm2015/elements/date-time-picker/DateTimePickerInput.js +3 -1
  32. package/esm2015/elements/form/ControlTemplates.js +2 -2
  33. package/esm2015/elements/form/FormInterfaces.js +1 -1
  34. package/esm2015/elements/form/NovoFormControl.js +2 -1
  35. package/esm2015/elements/form/controls/BaseControl.js +2 -1
  36. package/esm2015/elements/form/extras/address/Address.js +5 -1
  37. package/esm2015/index.js +1 -1
  38. package/esm2015/services/novo-label-service.js +2 -1
  39. package/esm2015/utils/form-utils/FormUtils.js +18 -17
  40. package/fesm2015/novo-elements.js +322 -232
  41. package/fesm2015/novo-elements.js.map +1 -1
  42. package/index.d.ts +1 -1
  43. package/novo-elements.metadata.json +1 -1
  44. package/package.json +1 -1
  45. package/services/novo-label-service.d.ts +1 -0
  46. package/utils/form-utils/FormUtils.d.ts +3 -3
@@ -3128,6 +3128,7 @@
3128
3128
  this.clearAllNormalCase = 'Clear All';
3129
3129
  this.clearSort = 'Clear Sort';
3130
3130
  this.clearFilter = 'Clear Filter';
3131
+ this.clearSelected = 'Clear Selected';
3131
3132
  this.today = 'Today';
3132
3133
  this.now = 'Now';
3133
3134
  this.isRequired = 'is required';
@@ -6997,6 +6998,7 @@
6997
6998
  this.expandedRows = new Set();
6998
6999
  this.isForceRefresh = false;
6999
7000
  this.updates = new core.EventEmitter();
7001
+ this.retainSelected = false;
7000
7002
  }
7001
7003
  Object.defineProperty(DataTableState.prototype, "userFiltered", {
7002
7004
  get: function () {
@@ -7027,9 +7029,12 @@
7027
7029
  this.filter = undefined;
7028
7030
  }
7029
7031
  this.page = 0;
7030
- this.selectedRows.clear();
7031
- this.resetSource.next();
7032
+ if (!this.retainSelected) {
7033
+ this.selectedRows.clear();
7034
+ this.resetSource.next();
7035
+ }
7032
7036
  this.onSortFilterChange();
7037
+ this.retainSelected = false;
7033
7038
  if (fireUpdate) {
7034
7039
  this.updates.emit({
7035
7040
  sort: this.sort,
@@ -7042,8 +7047,8 @@
7042
7047
  if (fireUpdate === void 0) { fireUpdate = true; }
7043
7048
  this.sort = undefined;
7044
7049
  this.page = 0;
7045
- this.selectedRows.clear();
7046
- this.resetSource.next();
7050
+ this.checkRetainment('sort');
7051
+ this.reset(fireUpdate, true);
7047
7052
  this.onSortFilterChange();
7048
7053
  if (fireUpdate) {
7049
7054
  this.updates.emit({
@@ -7058,8 +7063,8 @@
7058
7063
  this.filter = undefined;
7059
7064
  this.globalSearch = undefined;
7060
7065
  this.page = 0;
7061
- this.selectedRows.clear();
7062
- this.resetSource.next();
7066
+ this.checkRetainment('filter');
7067
+ this.reset(fireUpdate, true);
7063
7068
  this.onSortFilterChange();
7064
7069
  if (fireUpdate) {
7065
7070
  this.updates.emit({
@@ -7069,6 +7074,20 @@
7069
7074
  });
7070
7075
  }
7071
7076
  };
7077
+ DataTableState.prototype.clearSelected = function (fireUpdate) {
7078
+ if (fireUpdate === void 0) { fireUpdate = true; }
7079
+ this.globalSearch = undefined;
7080
+ this.page = 0;
7081
+ this.reset(fireUpdate, true);
7082
+ this.onSelectionChange();
7083
+ if (fireUpdate) {
7084
+ this.updates.emit({
7085
+ sort: this.sort,
7086
+ filter: this.filter,
7087
+ globalSearch: this.globalSearch,
7088
+ });
7089
+ }
7090
+ };
7072
7091
  DataTableState.prototype.onSelectionChange = function () {
7073
7092
  this.selectionSource.next();
7074
7093
  };
@@ -7076,9 +7095,12 @@
7076
7095
  this.expandSource.next(targetId);
7077
7096
  };
7078
7097
  DataTableState.prototype.onPaginationChange = function (isPageSizeChange, pageSize) {
7098
+ this.checkRetainment('page');
7079
7099
  this.paginationSource.next({ isPageSizeChange: isPageSizeChange, pageSize: pageSize });
7080
7100
  };
7081
7101
  DataTableState.prototype.onSortFilterChange = function () {
7102
+ this.checkRetainment('sort');
7103
+ this.checkRetainment('filter');
7082
7104
  this.sortFilterSource.next({
7083
7105
  sort: this.sort,
7084
7106
  filter: this.filter,
@@ -7102,6 +7124,10 @@
7102
7124
  }
7103
7125
  }
7104
7126
  };
7127
+ DataTableState.prototype.checkRetainment = function (caller) {
7128
+ var _a;
7129
+ this.retainSelected = ((_a = this.selectionOptions) === null || _a === void 0 ? void 0 : _a.some(function (option) { return option.label === caller; })) || this.retainSelected;
7130
+ };
7105
7131
  return DataTableState;
7106
7132
  }());
7107
7133
  DataTableState.decorators = [
@@ -7113,6 +7139,7 @@
7113
7139
  this.state = state;
7114
7140
  this.ref = ref;
7115
7141
  this.labels = labels;
7142
+ this.selectedClear = new core.EventEmitter();
7116
7143
  this.sortClear = new core.EventEmitter();
7117
7144
  this.filterClear = new core.EventEmitter();
7118
7145
  this.allClear = new core.EventEmitter();
@@ -7125,9 +7152,14 @@
7125
7152
  this.state.clearFilter();
7126
7153
  this.filterClear.emit(true);
7127
7154
  };
7155
+ NovoDataTableClearButton.prototype.clearSelected = function () {
7156
+ this.state.clearSelected();
7157
+ this.selectedClear.emit(true);
7158
+ };
7128
7159
  NovoDataTableClearButton.prototype.clearAll = function () {
7129
7160
  this.state.reset();
7130
7161
  this.allClear.emit(true);
7162
+ this.selectedClear.emit(true);
7131
7163
  this.sortClear.emit(true);
7132
7164
  this.filterClear.emit(true);
7133
7165
  };
@@ -7136,7 +7168,7 @@
7136
7168
  NovoDataTableClearButton.decorators = [
7137
7169
  { type: core.Component, args: [{
7138
7170
  selector: 'novo-data-table-clear-button',
7139
- template: "\n <novo-dropdown side=\"bottom-right\" class=\"novo-data-table-clear-button\" data-automation-id=\"novo-data-table-clear-dropdown\">\n <button type=\"button\" theme=\"primary\" color=\"negative\" icon=\"collapse\" data-automation-id=\"novo-data-table-clear-dropdown-btn\">{{ labels.clear }}</button>\n <list>\n <item *ngIf=\"state.sort\" (click)=\"clearSort()\" data-automation-id=\"novo-data-table-clear-dropdown-clear-sort\">{{ labels.clearSort }}</item>\n <item *ngIf=\"state.filter\" (click)=\"clearFilter()\" data-automation-id=\"novo-data-table-clear-dropdown-clear-filter\">{{ labels.clearFilter }}</item>\n <item *ngIf=\"state.sort && state.filter\" (click)=\"clearAll()\" data-automation-id=\"novo-data-table-clear-dropdown-clear-all\">{{ labels.clearAllNormalCase }}</item>\n </list>\n </novo-dropdown>\n ",
7171
+ template: "\n <novo-dropdown side=\"bottom-right\" class=\"novo-data-table-clear-button\" data-automation-id=\"novo-data-table-clear-dropdown\">\n <button type=\"button\" theme=\"primary\" color=\"negative\" icon=\"collapse\" data-automation-id=\"novo-data-table-clear-dropdown-btn\">{{ labels.clear }}</button>\n <list>\n <item *ngIf=\"state.selected.length > 0\" (click)=\"clearSelected()\" data-automation-id=\"novo-data-table-clear-dropdown-clear-selected\">{{ labels.clearSelected }}</item>\n <item *ngIf=\"state.sort\" (click)=\"clearSort()\" data-automation-id=\"novo-data-table-clear-dropdown-clear-sort\">{{ labels.clearSort }}</item>\n <item *ngIf=\"state.filter\" (click)=\"clearFilter()\" data-automation-id=\"novo-data-table-clear-dropdown-clear-filter\">{{ labels.clearFilter }}</item>\n <item *ngIf=\"state.sort && state.filter\" (click)=\"clearAll()\" data-automation-id=\"novo-data-table-clear-dropdown-clear-all\">{{ labels.clearAllNormalCase }}</item>\n </list>\n </novo-dropdown>\n ",
7140
7172
  changeDetection: core.ChangeDetectionStrategy.OnPush
7141
7173
  },] }
7142
7174
  ];
@@ -7146,6 +7178,7 @@
7146
7178
  { type: NovoLabelService }
7147
7179
  ]; };
7148
7180
  NovoDataTableClearButton.propDecorators = {
7181
+ selectedClear: [{ type: core.Output }],
7149
7182
  sortClear: [{ type: core.Output }],
7150
7183
  filterClear: [{ type: core.Output }],
7151
7184
  allClear: [{ type: core.Output }]
@@ -7200,7 +7233,10 @@
7200
7233
  _this.current = data.results.length;
7201
7234
  _this.data = data.results;
7202
7235
  // Clear selection
7203
- _this.state.selectedRows.clear();
7236
+ if (!_this.state.retainSelected) {
7237
+ _this.state.selectedRows.clear();
7238
+ }
7239
+ _this.state.retainSelected = false;
7204
7240
  _this.state.onSelectionChange();
7205
7241
  // Mark changes
7206
7242
  setTimeout(function () {
@@ -7572,6 +7608,7 @@
7572
7608
  }
7573
7609
  }
7574
7610
  this.state.filter = filter;
7611
+ this.state.checkRetainment('filter');
7575
7612
  this.state.reset(false, true);
7576
7613
  this.state.updates.next({ filter: filter, sort: this.state.sort });
7577
7614
  this.state.onSortFilterChange();
@@ -7579,6 +7616,7 @@
7579
7616
  NovoDataTableSortFilter.prototype.sort = function (id, value, transform) {
7580
7617
  var sort = { id: id, value: value, transform: transform };
7581
7618
  this.state.sort = sort;
7619
+ this.state.checkRetainment('sort');
7582
7620
  this.state.reset(false, true);
7583
7621
  this.state.updates.next({ sort: sort, filter: this.state.filter });
7584
7622
  this.state.onSortFilterChange();
@@ -7991,6 +8029,7 @@
7991
8029
  this.trackByFn = function (index, item) { return item.id; };
7992
8030
  this.templates = {};
7993
8031
  this.fixedHeader = false;
8032
+ this.maxSelected = undefined;
7994
8033
  this._hideGlobalSearch = true;
7995
8034
  this.preferencesChanged = new core.EventEmitter();
7996
8035
  this.loading = true;
@@ -8214,6 +8253,7 @@
8214
8253
  };
8215
8254
  NovoDataTable.prototype.ngAfterContentInit = function () {
8216
8255
  var _this = this;
8256
+ var _a;
8217
8257
  if (this.displayedColumns && this.displayedColumns.length) {
8218
8258
  this.expandable = this.displayedColumns.includes('expand');
8219
8259
  }
@@ -8243,6 +8283,7 @@
8243
8283
  }
8244
8284
  this.state.page = this.paginationOptions ? this.paginationOptions.page : undefined;
8245
8285
  this.state.pageSize = this.paginationOptions ? this.paginationOptions.pageSize : undefined;
8286
+ this.state.selectionOptions = (_a = this.selectionOptions) !== null && _a !== void 0 ? _a : undefined;
8246
8287
  // Scrolling inside table
8247
8288
  this.novoDataTableContainer.nativeElement.addEventListener('scroll', this.scrollListenerHandler);
8248
8289
  this.initialized = true;
@@ -8417,11 +8458,11 @@
8417
8458
  this.ref.markForCheck();
8418
8459
  };
8419
8460
  NovoDataTable.prototype.performInteractions = function (event) {
8420
- var e_1, _a;
8461
+ var e_1, _b;
8421
8462
  if (this.listInteractions) {
8422
8463
  try {
8423
- for (var _b = __values(this.columns), _c = _b.next(); !_c.done; _c = _b.next()) {
8424
- var column = _c.value;
8464
+ for (var _c = __values(this.columns), _d = _c.next(); !_d.done; _d = _c.next()) {
8465
+ var column = _d.value;
8425
8466
  var allListColumnInteractions = this.listInteractions[column.id];
8426
8467
  var listColumnInteraction = allListColumnInteractions && allListColumnInteractions.find(function (int) { return int.event.includes(event); });
8427
8468
  if (listColumnInteraction) {
@@ -8432,7 +8473,7 @@
8432
8473
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
8433
8474
  finally {
8434
8475
  try {
8435
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
8476
+ if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
8436
8477
  }
8437
8478
  finally { if (e_1) throw e_1.error; }
8438
8479
  }
@@ -8450,7 +8491,7 @@
8450
8491
  animations.transition('void <=> *', animations.animate('70ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
8451
8492
  ]),
8452
8493
  ],
8453
- template: "\n <header\n *ngIf=\"(!(dataSource?.totallyEmpty && !state.userFiltered) && !loading) || forceShowHeader\"\n [class.empty]=\"hideGlobalSearch && !paginationOptions && !templates['customActions']\"\n >\n <ng-container *ngTemplateOutlet=\"templates['customHeader']\"></ng-container>\n <novo-search\n alwaysOpen=\"true\"\n (searchChanged)=\"onSearchChange($event)\"\n [(ngModel)]=\"state.globalSearch\"\n *ngIf=\"!hideGlobalSearch\"\n [placeholder]=\"searchOptions?.placeholder\"\n [hint]=\"searchOptions?.tooltip\"\n >\n </novo-search>\n <novo-data-table-pagination\n *ngIf=\"paginationOptions\"\n [theme]=\"paginationOptions.theme\"\n [length]=\"dataSource?.currentTotal\"\n [page]=\"paginationOptions.page\"\n [pageSize]=\"paginationOptions.pageSize\"\n [pageSizeOptions]=\"paginationOptions.pageSizeOptions\"\n [dataFeatureId]=\"paginatorDataFeatureId\"\n >\n </novo-data-table-pagination>\n <div class=\"novo-data-table-actions\" *ngIf=\"templates['customActions']\">\n <ng-container *ngTemplateOutlet=\"templates['customActions']\"></ng-container>\n </div>\n </header>\n <div class=\"novo-data-table-loading-mask\" *ngIf=\"dataSource?.loading || loading\" data-automation-id=\"novo-data-table-loading\">\n <novo-loading></novo-loading>\n </div>\n <div class=\"novo-data-table-outside-container\" [ngClass]=\"{ 'novo-data-table-outside-container-fixed': fixedHeader }\">\n <div class=\"novo-data-table-custom-filter\" *ngIf=\"customFilter\">\n <ng-container *ngTemplateOutlet=\"templates['customFilter']\"></ng-container>\n </div>\n <div\n #novoDataTableContainer\n class=\"novo-data-table-container\"\n [ngClass]=\"{ 'novo-data-table-container-fixed': fixedHeader }\"\n [class.empty-user-filtered]=\"dataSource?.currentlyEmpty && state.userFiltered\"\n [class.empty]=\"dataSource?.totallyEmpty && !dataSource?.loading && !loading && !state.userFiltered && !dataSource.pristine\"\n >\n <cdk-table\n *ngIf=\"columns?.length > 0 && columnsLoaded && dataSource\"\n [dataSource]=\"dataSource\"\n [trackBy]=\"trackByFn\"\n novoDataTableSortFilter\n [class.expandable]=\"expandable\"\n [class.empty]=\"dataSource?.currentlyEmpty && state.userFiltered\"\n [hidden]=\"dataSource?.totallyEmpty && !state.userFiltered\"\n >\n <ng-container cdkColumnDef=\"selection\">\n <novo-data-table-checkbox-header-cell *cdkHeaderCellDef></novo-data-table-checkbox-header-cell>\n <novo-data-table-checkbox-cell *cdkCellDef=\"let row; let i = index\" [row]=\"row\"></novo-data-table-checkbox-cell>\n </ng-container>\n <ng-container cdkColumnDef=\"expand\">\n <novo-data-table-expand-header-cell *cdkHeaderCellDef></novo-data-table-expand-header-cell>\n <novo-data-table-expand-cell *cdkCellDef=\"let row; let i = index\" [row]=\"row\"></novo-data-table-expand-cell>\n </ng-container>\n <ng-container *ngFor=\"let column of columns; trackBy: trackColumnsBy\" [cdkColumnDef]=\"column.id\">\n <novo-data-table-header-cell\n *cdkHeaderCellDef\n [column]=\"column\"\n [filterTemplate]=\"templates['column-filter-' + column.id]\"\n [novo-data-table-cell-config]=\"column\"\n [resized]=\"resized\"\n [defaultSort]=\"defaultSort\"\n [allowMultipleFilters]=\"allowMultipleFilters\"\n [class.empty]=\"column?.type === 'action' && !column?.label\"\n [class.button-header-cell]=\"column?.type === 'expand' || (column?.type === 'action' && !column?.action?.options)\"\n [class.dropdown-header-cell]=\"column?.type === 'action' && column?.action?.options\"\n [class.fixed-header]=\"fixedHeader\"\n ></novo-data-table-header-cell>\n <novo-data-table-cell\n *cdkCellDef=\"let row\"\n [resized]=\"resized\"\n [column]=\"column\"\n [row]=\"row\"\n [template]=\"columnToTemplate[column.id]\"\n [class.empty]=\"column?.type === 'action' && !column?.label\"\n [class.button-cell]=\"column?.type === 'expand' || (column?.type === 'action' && !column?.action?.options)\"\n [class.dropdown-cell]=\"column?.type === 'action' && column?.action?.options\"\n ></novo-data-table-cell>\n </ng-container>\n <novo-data-table-header-row\n *cdkHeaderRowDef=\"displayedColumns\"\n [fixedHeader]=\"fixedHeader\"\n data-automation-id=\"novo-data-table-header-row\"\n ></novo-data-table-header-row>\n <novo-data-table-row\n *cdkRowDef=\"let row; columns: displayedColumns\"\n [ngClass]=\"{ active: row[rowIdentifier] == activeRowIdentifier }\"\n [novoDataTableExpand]=\"detailRowTemplate\"\n [row]=\"row\"\n [id]=\"name + '-' + row[rowIdentifier]\"\n [dataAutomationId]=\"row[rowIdentifier]\"\n ></novo-data-table-row>\n </cdk-table>\n <div class=\"novo-data-table-footer\" *ngIf=\"templates['footer']\">\n <ng-container *ngTemplateOutlet=\"templates['footer']; context: { $implicit: columns, data: dataSource.data }\"></ng-container>\n </div>\n <div\n class=\"novo-data-table-no-results-container\"\n [style.left.px]=\"scrollLeft\"\n *ngIf=\"dataSource?.currentlyEmpty && state.userFiltered && !dataSource?.loading && !loading && !dataSource.pristine\"\n >\n <div class=\"novo-data-table-empty-message\">\n <ng-container *ngTemplateOutlet=\"templates['noResultsMessage'] || templates['defaultNoResultsMessage']\"></ng-container>\n </div>\n </div>\n </div>\n <div\n class=\"novo-data-table-empty-container\"\n *ngIf=\"dataSource?.totallyEmpty && !dataSource?.loading && !loading && !state.userFiltered && !dataSource.pristine\"\n >\n <div class=\"novo-data-table-empty-message\">\n <ng-container *ngTemplateOutlet=\"templates['emptyMessage'] || templates['defaultNoResultsMessage']\"></ng-container>\n </div>\n </div>\n </div>\n <!-- DEFAULT CELL TEMPLATE -->\n <ng-template novoTemplate=\"textCellTemplate\" let-row let-col=\"col\">\n <span [style.width.px]=\"col?.width\" [style.min-width.px]=\"col?.width\" [style.max-width.px]=\"col?.width\">{{\n row[col.id] | dataTableInterpolate: col\n }}</span>\n </ng-template>\n <ng-template novoTemplate=\"dateCellTemplate\" let-row let-col=\"col\">\n <span>{{ row[col.id] | dataTableInterpolate: col | dataTableDateRenderer: col }}</span>\n </ng-template>\n <ng-template novoTemplate=\"datetimeCellTemplate\" let-row let-col=\"col\">\n <span>{{ row[col.id] | dataTableInterpolate: col | dataTableDateTimeRenderer: col }}</span>\n </ng-template>\n <ng-template novoTemplate=\"timeCellTemplate\" let-row let-col=\"col\">\n <span>{{ row[col.id] | dataTableInterpolate: col | dataTableTimeRenderer: col }}</span>\n </ng-template>\n <ng-template novoTemplate=\"currencyCellTemplate\" let-row let-col=\"col\">\n <span>{{ row[col.id] | dataTableInterpolate: col | dataTableCurrencyRenderer: col }}</span>\n </ng-template>\n <ng-template novoTemplate=\"bigdecimalCellTemplate\" let-row let-col=\"col\">\n <span>{{ row[col.id] | dataTableInterpolate: col | dataTableBigDecimalRenderer: col }}</span>\n </ng-template>\n <ng-template novoTemplate=\"numberCellTemplate\" let-row let-col=\"col\">\n <span>{{ row[col.id] | dataTableInterpolate: col | dataTableNumberRenderer: col }}</span>\n </ng-template>\n <ng-template novoTemplate=\"percentCellTemplate\" let-row let-col=\"col\">\n <span>{{ row[col.id] | dataTableInterpolate: col | dataTableNumberRenderer: col:true }}</span>\n </ng-template>\n <ng-template novoTemplate=\"linkCellTemplate\" let-row let-col=\"col\">\n <a\n [attr.data-feature-id]=\"col?.attributes?.dataFeatureId\"\n (click)=\"col.handlers?.click({ originalEvent: $event, row: row })\"\n [style.width.px]=\"col?.width\"\n [style.min-width.px]=\"col?.width\"\n [style.max-width.px]=\"col?.width\"\n >{{ row[col.id] | dataTableInterpolate: col }}</a\n >\n </ng-template>\n <ng-template novoTemplate=\"telCellTemplate\" let-row let-col=\"col\">\n <a href=\"tel:{{ row[col.id] | dataTableInterpolate: col }}\" [target]=\"col?.attributes?.target\">{{\n row[col.id] | dataTableInterpolate: col\n }}</a>\n </ng-template>\n <ng-template novoTemplate=\"mailtoCellTemplate\" let-row let-col=\"col\">\n <a href=\"mailto:{{ row[col.id] | dataTableInterpolate: col }}\" [target]=\"col?.attributes?.target\">{{\n row[col.id] | dataTableInterpolate: col\n }}</a>\n </ng-template>\n <ng-template novoTemplate=\"buttonCellTemplate\" let-row let-col=\"col\">\n <p [tooltip]=\"col?.action?.tooltip\" tooltipPosition=\"right\" [attr.data-feature-id]=\"col?.attributes?.dataFeatureId\">\n <i\n class=\"bhi-{{ col?.action?.icon }} data-table-icon\"\n (click)=\"col.handlers?.click({ originalEvent: $event, row: row })\"\n [class.disabled]=\"isDisabled(col, row)\"\n ></i>\n </p>\n </ng-template>\n <ng-template novoTemplate=\"dropdownCellTemplate\" let-row let-col=\"col\">\n <novo-dropdown parentScrollSelector=\".novo-data-table-container\" containerClass=\"novo-data-table-dropdown\">\n <button type=\"button\" theme=\"dialogue\" [icon]=\"col.action.icon\" inverse>{{ col.label }}</button>\n <list>\n <item\n *ngFor=\"let option of col?.action?.options\"\n (action)=\"option.handlers.click({ originalEvent: $event?.originalEvent, row: row })\"\n [disabled]=\"isDisabled(option, row)\"\n >\n <span [attr.data-automation-id]=\"option.label\">{{ option.label }}</span>\n </item>\n </list>\n </novo-dropdown>\n </ng-template>\n <ng-template novoTemplate=\"defaultNoResultsMessage\">\n <h4><i class=\"bhi-search-question\"></i> {{ labels.noMatchingRecordsMessage }}</h4>\n </ng-template>\n <ng-template novoTemplate=\"defaultEmptyMessage\">\n <h4><i class=\"bhi-search-question\"></i> {{ labels.emptyTableMessage }}</h4>\n </ng-template>\n <ng-template novoTemplate=\"expandedRow\"> You did not provide an \"expandedRow\" template! </ng-template>\n <ng-template #detailRowTemplate let-row>\n <div class=\"novo-data-table-detail-row\" [@expand] style=\"overflow: hidden\">\n <ng-container *ngTemplateOutlet=\"templates['expandedRow']; context: { $implicit: row }\"></ng-container>\n </div>\n </ng-template>\n <!-- CUSTOM CELLS PASSED IN -->\n <ng-content></ng-content>\n ",
8494
+ template: "\n <header\n *ngIf=\"(!(dataSource?.totallyEmpty && !state.userFiltered) && !loading) || forceShowHeader\"\n [class.empty]=\"hideGlobalSearch && !paginationOptions && !templates['customActions']\"\n >\n <ng-container *ngTemplateOutlet=\"templates['customHeader']\"></ng-container>\n <novo-search\n alwaysOpen=\"true\"\n (searchChanged)=\"onSearchChange($event)\"\n [(ngModel)]=\"state.globalSearch\"\n *ngIf=\"!hideGlobalSearch\"\n [placeholder]=\"searchOptions?.placeholder\"\n [hint]=\"searchOptions?.tooltip\"\n >\n </novo-search>\n <novo-data-table-pagination\n *ngIf=\"paginationOptions\"\n [theme]=\"paginationOptions.theme\"\n [length]=\"dataSource?.currentTotal\"\n [page]=\"paginationOptions.page\"\n [pageSize]=\"paginationOptions.pageSize\"\n [pageSizeOptions]=\"paginationOptions.pageSizeOptions\"\n [dataFeatureId]=\"paginatorDataFeatureId\"\n >\n </novo-data-table-pagination>\n <div class=\"novo-data-table-actions\" *ngIf=\"templates['customActions']\">\n <ng-container *ngTemplateOutlet=\"templates['customActions']\"></ng-container>\n </div>\n </header>\n <div class=\"novo-data-table-loading-mask\" *ngIf=\"dataSource?.loading || loading\" data-automation-id=\"novo-data-table-loading\">\n <novo-loading></novo-loading>\n </div>\n <div class=\"novo-data-table-outside-container\" [ngClass]=\"{ 'novo-data-table-outside-container-fixed': fixedHeader }\">\n <div class=\"novo-data-table-custom-filter\" *ngIf=\"customFilter\">\n <ng-container *ngTemplateOutlet=\"templates['customFilter']\"></ng-container>\n </div>\n <div\n #novoDataTableContainer\n class=\"novo-data-table-container\"\n [ngClass]=\"{ 'novo-data-table-container-fixed': fixedHeader }\"\n [class.empty-user-filtered]=\"dataSource?.currentlyEmpty && state.userFiltered\"\n [class.empty]=\"dataSource?.totallyEmpty && !dataSource?.loading && !loading && !state.userFiltered && !dataSource.pristine\"\n >\n <cdk-table\n *ngIf=\"columns?.length > 0 && columnsLoaded && dataSource\"\n [dataSource]=\"dataSource\"\n [trackBy]=\"trackByFn\"\n novoDataTableSortFilter\n [class.expandable]=\"expandable\"\n [class.empty]=\"dataSource?.currentlyEmpty && state.userFiltered\"\n [hidden]=\"dataSource?.totallyEmpty && !state.userFiltered\"\n >\n <ng-container cdkColumnDef=\"selection\">\n <novo-data-table-checkbox-header-cell *cdkHeaderCellDef [maxSelected]=\"maxSelected\"></novo-data-table-checkbox-header-cell>\n <novo-data-table-checkbox-cell *cdkCellDef=\"let row; let i = index\" [row]=\"row\" [maxSelected]=\"maxSelected\"></novo-data-table-checkbox-cell>\n </ng-container>\n <ng-container cdkColumnDef=\"expand\">\n <novo-data-table-expand-header-cell *cdkHeaderCellDef></novo-data-table-expand-header-cell>\n <novo-data-table-expand-cell *cdkCellDef=\"let row; let i = index\" [row]=\"row\"></novo-data-table-expand-cell>\n </ng-container>\n <ng-container *ngFor=\"let column of columns; trackBy: trackColumnsBy\" [cdkColumnDef]=\"column.id\">\n <novo-data-table-header-cell\n *cdkHeaderCellDef\n [column]=\"column\"\n [filterTemplate]=\"templates['column-filter-' + column.id]\"\n [novo-data-table-cell-config]=\"column\"\n [resized]=\"resized\"\n [defaultSort]=\"defaultSort\"\n [allowMultipleFilters]=\"allowMultipleFilters\"\n [class.empty]=\"column?.type === 'action' && !column?.label\"\n [class.button-header-cell]=\"column?.type === 'expand' || (column?.type === 'action' && !column?.action?.options)\"\n [class.dropdown-header-cell]=\"column?.type === 'action' && column?.action?.options\"\n [class.fixed-header]=\"fixedHeader\"\n ></novo-data-table-header-cell>\n <novo-data-table-cell\n *cdkCellDef=\"let row\"\n [resized]=\"resized\"\n [column]=\"column\"\n [row]=\"row\"\n [template]=\"columnToTemplate[column.id]\"\n [class.empty]=\"column?.type === 'action' && !column?.label\"\n [class.button-cell]=\"column?.type === 'expand' || (column?.type === 'action' && !column?.action?.options)\"\n [class.dropdown-cell]=\"column?.type === 'action' && column?.action?.options\"\n ></novo-data-table-cell>\n </ng-container>\n <novo-data-table-header-row\n *cdkHeaderRowDef=\"displayedColumns\"\n [fixedHeader]=\"fixedHeader\"\n data-automation-id=\"novo-data-table-header-row\"\n ></novo-data-table-header-row>\n <novo-data-table-row\n *cdkRowDef=\"let row; columns: displayedColumns\"\n [ngClass]=\"{ active: row[rowIdentifier] == activeRowIdentifier }\"\n [novoDataTableExpand]=\"detailRowTemplate\"\n [row]=\"row\"\n [id]=\"name + '-' + row[rowIdentifier]\"\n [dataAutomationId]=\"row[rowIdentifier]\"\n ></novo-data-table-row>\n </cdk-table>\n <div class=\"novo-data-table-footer\" *ngIf=\"templates['footer']\">\n <ng-container *ngTemplateOutlet=\"templates['footer']; context: { $implicit: columns, data: dataSource.data }\"></ng-container>\n </div>\n <div\n class=\"novo-data-table-no-results-container\"\n [style.left.px]=\"scrollLeft\"\n *ngIf=\"dataSource?.currentlyEmpty && state.userFiltered && !dataSource?.loading && !loading && !dataSource.pristine\"\n >\n <div class=\"novo-data-table-empty-message\">\n <ng-container *ngTemplateOutlet=\"templates['noResultsMessage'] || templates['defaultNoResultsMessage']\"></ng-container>\n </div>\n </div>\n </div>\n <div\n class=\"novo-data-table-empty-container\"\n *ngIf=\"dataSource?.totallyEmpty && !dataSource?.loading && !loading && !state.userFiltered && !dataSource.pristine\"\n >\n <div class=\"novo-data-table-empty-message\">\n <ng-container *ngTemplateOutlet=\"templates['emptyMessage'] || templates['defaultNoResultsMessage']\"></ng-container>\n </div>\n </div>\n </div>\n <!-- DEFAULT CELL TEMPLATE -->\n <ng-template novoTemplate=\"textCellTemplate\" let-row let-col=\"col\">\n <span [style.width.px]=\"col?.width\" [style.min-width.px]=\"col?.width\" [style.max-width.px]=\"col?.width\">{{\n row[col.id] | dataTableInterpolate: col\n }}</span>\n </ng-template>\n <ng-template novoTemplate=\"dateCellTemplate\" let-row let-col=\"col\">\n <span>{{ row[col.id] | dataTableInterpolate: col | dataTableDateRenderer: col }}</span>\n </ng-template>\n <ng-template novoTemplate=\"datetimeCellTemplate\" let-row let-col=\"col\">\n <span>{{ row[col.id] | dataTableInterpolate: col | dataTableDateTimeRenderer: col }}</span>\n </ng-template>\n <ng-template novoTemplate=\"timeCellTemplate\" let-row let-col=\"col\">\n <span>{{ row[col.id] | dataTableInterpolate: col | dataTableTimeRenderer: col }}</span>\n </ng-template>\n <ng-template novoTemplate=\"currencyCellTemplate\" let-row let-col=\"col\">\n <span>{{ row[col.id] | dataTableInterpolate: col | dataTableCurrencyRenderer: col }}</span>\n </ng-template>\n <ng-template novoTemplate=\"bigdecimalCellTemplate\" let-row let-col=\"col\">\n <span>{{ row[col.id] | dataTableInterpolate: col | dataTableBigDecimalRenderer: col }}</span>\n </ng-template>\n <ng-template novoTemplate=\"numberCellTemplate\" let-row let-col=\"col\">\n <span>{{ row[col.id] | dataTableInterpolate: col | dataTableNumberRenderer: col }}</span>\n </ng-template>\n <ng-template novoTemplate=\"percentCellTemplate\" let-row let-col=\"col\">\n <span>{{ row[col.id] | dataTableInterpolate: col | dataTableNumberRenderer: col:true }}</span>\n </ng-template>\n <ng-template novoTemplate=\"linkCellTemplate\" let-row let-col=\"col\">\n <a\n [attr.data-feature-id]=\"col?.attributes?.dataFeatureId\"\n (click)=\"col.handlers?.click({ originalEvent: $event, row: row })\"\n [style.width.px]=\"col?.width\"\n [style.min-width.px]=\"col?.width\"\n [style.max-width.px]=\"col?.width\"\n >{{ row[col.id] | dataTableInterpolate: col }}</a\n >\n </ng-template>\n <ng-template novoTemplate=\"telCellTemplate\" let-row let-col=\"col\">\n <a href=\"tel:{{ row[col.id] | dataTableInterpolate: col }}\" [target]=\"col?.attributes?.target\">{{\n row[col.id] | dataTableInterpolate: col\n }}</a>\n </ng-template>\n <ng-template novoTemplate=\"mailtoCellTemplate\" let-row let-col=\"col\">\n <a href=\"mailto:{{ row[col.id] | dataTableInterpolate: col }}\" [target]=\"col?.attributes?.target\">{{\n row[col.id] | dataTableInterpolate: col\n }}</a>\n </ng-template>\n <ng-template novoTemplate=\"buttonCellTemplate\" let-row let-col=\"col\">\n <p [tooltip]=\"col?.action?.tooltip\" tooltipPosition=\"right\" [attr.data-feature-id]=\"col?.attributes?.dataFeatureId\">\n <i\n class=\"bhi-{{ col?.action?.icon }} data-table-icon\"\n (click)=\"col.handlers?.click({ originalEvent: $event, row: row })\"\n [class.disabled]=\"isDisabled(col, row)\"\n ></i>\n </p>\n </ng-template>\n <ng-template novoTemplate=\"dropdownCellTemplate\" let-row let-col=\"col\">\n <novo-dropdown parentScrollSelector=\".novo-data-table-container\" containerClass=\"novo-data-table-dropdown\">\n <button type=\"button\" theme=\"dialogue\" [icon]=\"col.action.icon\" inverse>{{ col.label }}</button>\n <list>\n <item\n *ngFor=\"let option of col?.action?.options\"\n (action)=\"option.handlers.click({ originalEvent: $event?.originalEvent, row: row })\"\n [disabled]=\"isDisabled(option, row)\"\n >\n <span [attr.data-automation-id]=\"option.label\">{{ option.label }}</span>\n </item>\n </list>\n </novo-dropdown>\n </ng-template>\n <ng-template novoTemplate=\"defaultNoResultsMessage\">\n <h4><i class=\"bhi-search-question\"></i> {{ labels.noMatchingRecordsMessage }}</h4>\n </ng-template>\n <ng-template novoTemplate=\"defaultEmptyMessage\">\n <h4><i class=\"bhi-search-question\"></i> {{ labels.emptyTableMessage }}</h4>\n </ng-template>\n <ng-template novoTemplate=\"expandedRow\"> You did not provide an \"expandedRow\" template! </ng-template>\n <ng-template #detailRowTemplate let-row>\n <div class=\"novo-data-table-detail-row\" [@expand] style=\"overflow: hidden\">\n <ng-container *ngTemplateOutlet=\"templates['expandedRow']; context: { $implicit: row }\"></ng-container>\n </div>\n </ng-template>\n <!-- CUSTOM CELLS PASSED IN -->\n <ng-content></ng-content>\n ",
8454
8495
  changeDetection: core.ChangeDetectionStrategy.OnPush,
8455
8496
  providers: [DataTableState]
8456
8497
  },] }
@@ -8470,6 +8511,7 @@
8470
8511
  displayedColumns: [{ type: core.Input }],
8471
8512
  paginationOptions: [{ type: core.Input }],
8472
8513
  searchOptions: [{ type: core.Input }],
8514
+ selectionOptions: [{ type: core.Input }],
8473
8515
  defaultSort: [{ type: core.Input }],
8474
8516
  name: [{ type: core.Input }],
8475
8517
  allowMultipleFilters: [{ type: core.Input }],
@@ -8479,6 +8521,7 @@
8479
8521
  templates: [{ type: core.Input }],
8480
8522
  fixedHeader: [{ type: core.Input }],
8481
8523
  paginatorDataFeatureId: [{ type: core.Input }],
8524
+ maxSelected: [{ type: core.Input }],
8482
8525
  dataTableService: [{ type: core.Input }],
8483
8526
  rows: [{ type: core.Input }],
8484
8527
  outsideFilter: [{ type: core.Input }],
@@ -26941,7 +26984,7 @@
26941
26984
  { type: core.Component, args: [{
26942
26985
  selector: 'novo-address',
26943
26986
  providers: [ADDRESS_VALUE_ACCESSOR],
26944
- template: "\n <span\n *ngIf=\"!config?.address1?.hidden\"\n class=\"street-address\"\n [class.invalid]=\"invalid.address1\"\n [class.focus]=\"focused.address1\"\n [class.disabled]=\"disabled.address1\"\n >\n <i\n *ngIf=\"config.address1.required\"\n class=\"required-indicator address1\"\n [ngClass]=\"{ 'bhi-circle': !valid.address1, 'bhi-check': valid.address1 }\"\n >\n </i>\n <input\n [class.maxlength-error]=\"invalidMaxlength.address1\"\n type=\"text\"\n id=\"address1\"\n name=\"address1\"\n [placeholder]=\"config.address1.label\"\n [maxlength]=\"config?.address1?.maxlength\"\n autocomplete=\"shipping street-address address-line-1\"\n [(ngModel)]=\"model.address1\"\n (ngModelChange)=\"updateControl()\"\n (focus)=\"isFocused($event, 'address1')\"\n (blur)=\"isBlurred($event, 'address1')\"\n (input)=\"onInput($event, 'address1')\"\n />\n </span>\n <span\n *ngIf=\"!config?.address2?.hidden\"\n class=\"apt suite\"\n [class.invalid]=\"invalid.address2\"\n [class.focus]=\"focused.address2\"\n [class.disabled]=\"disabled.address2\"\n >\n <i\n *ngIf=\"config.address2.required\"\n class=\"required-indicator address2\"\n [ngClass]=\"{ 'bhi-circle': !valid.address2, 'bhi-check': valid.address2 }\"\n >\n </i>\n <input\n [class.maxlength-error]=\"invalidMaxlength.address2\"\n type=\"text\"\n id=\"address2\"\n name=\"address2\"\n [placeholder]=\"config.address2.label\"\n [maxlength]=\"config?.address2?.maxlength\"\n autocomplete=\"shipping address-line-2\"\n [(ngModel)]=\"model.address2\"\n (ngModelChange)=\"updateControl()\"\n (focus)=\"isFocused($event, 'address2')\"\n (blur)=\"isBlurred($event, 'address2')\"\n (input)=\"onInput($event, 'address2')\"\n />\n </span>\n <span\n *ngIf=\"!config?.city?.hidden\"\n class=\"city locality\"\n [class.invalid]=\"invalid.city\"\n [class.focus]=\"focused.city\"\n [class.disabled]=\"disabled.city\"\n >\n <i *ngIf=\"config.city.required\" class=\"required-indicator\" [ngClass]=\"{ 'bhi-circle': !valid.city, 'bhi-check': valid.city }\"> </i>\n <input\n [class.maxlength-error]=\"invalidMaxlength.city\"\n type=\"text\"\n id=\"city\"\n name=\"city\"\n [placeholder]=\"config.city.label\"\n autocomplete=\"shipping city locality\"\n [maxlength]=\"config?.city?.maxlength\"\n [(ngModel)]=\"model.city\"\n (ngModelChange)=\"updateControl()\"\n (focus)=\"isFocused($event, 'city')\"\n (blur)=\"isBlurred($event, 'city')\"\n (input)=\"onInput($event, 'city')\"\n />\n </span>\n <span\n *ngIf=\"!config?.state?.hidden\"\n class=\"state region\"\n [class.invalid]=\"invalid.state\"\n [class.focus]=\"focused.state\"\n [class.disabled]=\"disabled.state\"\n [tooltip]=\"tooltip.state\"\n >\n <i *ngIf=\"config.state.required\" class=\"required-indicator\" [ngClass]=\"{ 'bhi-circle': !valid.state, 'bhi-check': valid.state }\"> </i>\n <novo-picker\n [config]=\"config?.state?.pickerConfig\"\n [placeholder]=\"config?.state?.label\"\n (changed)=\"onStateChange($event)\"\n autocomplete=\"shipping region\"\n [(ngModel)]=\"model.state\"\n [disablePickerInput]=\"disabled.state\"\n ></novo-picker>\n </span>\n <span\n *ngIf=\"!config?.zip?.hidden\"\n class=\"zip postal-code\"\n [class.invalid]=\"invalid.zip\"\n [class.focus]=\"focused.zip\"\n [class.disabled]=\"disabled.zip\"\n >\n <i *ngIf=\"config.zip.required\" class=\"required-indicator\" [ngClass]=\"{ 'bhi-circle': !valid.zip, 'bhi-check': valid.zip }\"> </i>\n <input\n [class.maxlength-error]=\"invalidMaxlength.zip\"\n type=\"text\"\n id=\"zip\"\n name=\"zip\"\n [placeholder]=\"config.zip.label\"\n autocomplete=\"shipping postal-code\"\n [maxlength]=\"config?.zip?.maxlength\"\n [(ngModel)]=\"model.zip\"\n (ngModelChange)=\"updateControl()\"\n (focus)=\"isFocused($event, 'zip')\"\n (blur)=\"isBlurred($event, 'zip')\"\n (input)=\"onInput($event, 'zip')\"\n />\n </span>\n <span\n *ngIf=\"!config?.countryID?.hidden\"\n class=\"country-name\"\n [class.invalid]=\"invalid.countryID\"\n [class.focus]=\"focused.countryID\"\n [class.disabled]=\"disabled.countryID\"\n >\n <i\n *ngIf=\"config.countryID.required\"\n class=\"required-indicator\"\n [ngClass]=\"{ 'bhi-circle': !valid.countryID, 'bhi-check': valid.countryID }\"\n >\n </i>\n <novo-picker\n [config]=\"config?.countryID?.pickerConfig\"\n [placeholder]=\"config.countryID.label\"\n (changed)=\"onCountryChange($event)\"\n autocomplete=\"shipping country\"\n [(ngModel)]=\"model.countryID\"\n [disablePickerInput]=\"disabled.countryID\"\n ></novo-picker>\n </span>\n "
26987
+ template: "\n <span\n *ngIf=\"!config?.address1?.hidden\"\n class=\"street-address\"\n [class.invalid]=\"invalid.address1\"\n [class.focus]=\"focused.address1\"\n [class.disabled]=\"disabled.address1\"\n >\n <i\n *ngIf=\"config.address1.required\"\n class=\"required-indicator address1\"\n [ngClass]=\"{ 'bhi-circle': !valid.address1, 'bhi-check': valid.address1 }\"\n >\n </i>\n <input\n [class.maxlength-error]=\"invalidMaxlength.address1\"\n type=\"text\"\n id=\"address1\"\n name=\"address1\"\n [placeholder]=\"config.address1.label\"\n [maxlength]=\"config?.address1?.maxlength\"\n autocomplete=\"shipping street-address address-line-1\"\n [(ngModel)]=\"model.address1\"\n (ngModelChange)=\"updateControl()\"\n (focus)=\"isFocused($event, 'address1')\"\n (blur)=\"isBlurred($event, 'address1')\"\n (input)=\"onInput($event, 'address1')\"\n [disabled]=\"disabled.address1\"\n />\n </span>\n <span\n *ngIf=\"!config?.address2?.hidden\"\n class=\"apt suite\"\n [class.invalid]=\"invalid.address2\"\n [class.focus]=\"focused.address2\"\n [class.disabled]=\"disabled.address2\"\n >\n <i\n *ngIf=\"config.address2.required\"\n class=\"required-indicator address2\"\n [ngClass]=\"{ 'bhi-circle': !valid.address2, 'bhi-check': valid.address2 }\"\n >\n </i>\n <input\n [class.maxlength-error]=\"invalidMaxlength.address2\"\n type=\"text\"\n id=\"address2\"\n name=\"address2\"\n [placeholder]=\"config.address2.label\"\n [maxlength]=\"config?.address2?.maxlength\"\n autocomplete=\"shipping address-line-2\"\n [(ngModel)]=\"model.address2\"\n (ngModelChange)=\"updateControl()\"\n (focus)=\"isFocused($event, 'address2')\"\n (blur)=\"isBlurred($event, 'address2')\"\n (input)=\"onInput($event, 'address2')\"\n [disabled]=\"disabled.address2\"\n />\n </span>\n <span\n *ngIf=\"!config?.city?.hidden\"\n class=\"city locality\"\n [class.invalid]=\"invalid.city\"\n [class.focus]=\"focused.city\"\n [class.disabled]=\"disabled.city\"\n >\n <i *ngIf=\"config.city.required\" class=\"required-indicator\" [ngClass]=\"{ 'bhi-circle': !valid.city, 'bhi-check': valid.city }\"> </i>\n <input\n [class.maxlength-error]=\"invalidMaxlength.city\"\n type=\"text\"\n id=\"city\"\n name=\"city\"\n [placeholder]=\"config.city.label\"\n autocomplete=\"shipping city locality\"\n [maxlength]=\"config?.city?.maxlength\"\n [(ngModel)]=\"model.city\"\n (ngModelChange)=\"updateControl()\"\n (focus)=\"isFocused($event, 'city')\"\n (blur)=\"isBlurred($event, 'city')\"\n (input)=\"onInput($event, 'city')\"\n [disabled]=\"disabled.city\"\n />\n </span>\n <span\n *ngIf=\"!config?.state?.hidden\"\n class=\"state region\"\n [class.invalid]=\"invalid.state\"\n [class.focus]=\"focused.state\"\n [class.disabled]=\"disabled.state\"\n [tooltip]=\"tooltip.state\"\n >\n <i *ngIf=\"config.state.required\" class=\"required-indicator\" [ngClass]=\"{ 'bhi-circle': !valid.state, 'bhi-check': valid.state }\"> </i>\n <novo-picker\n [config]=\"config?.state?.pickerConfig\"\n [placeholder]=\"config?.state?.label\"\n (changed)=\"onStateChange($event)\"\n autocomplete=\"shipping region\"\n [(ngModel)]=\"model.state\"\n [disablePickerInput]=\"disabled.state\"\n ></novo-picker>\n </span>\n <span\n *ngIf=\"!config?.zip?.hidden\"\n class=\"zip postal-code\"\n [class.invalid]=\"invalid.zip\"\n [class.focus]=\"focused.zip\"\n [class.disabled]=\"disabled.zip\"\n >\n <i *ngIf=\"config.zip.required\" class=\"required-indicator\" [ngClass]=\"{ 'bhi-circle': !valid.zip, 'bhi-check': valid.zip }\"> </i>\n <input\n [class.maxlength-error]=\"invalidMaxlength.zip\"\n type=\"text\"\n id=\"zip\"\n name=\"zip\"\n [placeholder]=\"config.zip.label\"\n autocomplete=\"shipping postal-code\"\n [maxlength]=\"config?.zip?.maxlength\"\n [(ngModel)]=\"model.zip\"\n (ngModelChange)=\"updateControl()\"\n (focus)=\"isFocused($event, 'zip')\"\n (blur)=\"isBlurred($event, 'zip')\"\n (input)=\"onInput($event, 'zip')\"\n [disabled]=\"disabled.zip\"\n />\n </span>\n <span\n *ngIf=\"!config?.countryID?.hidden\"\n class=\"country-name\"\n [class.invalid]=\"invalid.countryID\"\n [class.focus]=\"focused.countryID\"\n [class.disabled]=\"disabled.countryID\"\n >\n <i\n *ngIf=\"config.countryID.required\"\n class=\"required-indicator\"\n [ngClass]=\"{ 'bhi-circle': !valid.countryID, 'bhi-check': valid.countryID }\"\n >\n </i>\n <novo-picker\n [config]=\"config?.countryID?.pickerConfig\"\n [placeholder]=\"config.countryID.label\"\n (changed)=\"onCountryChange($event)\"\n autocomplete=\"shipping country\"\n [(ngModel)]=\"model.countryID\"\n [disablePickerInput]=\"disabled.countryID\"\n ></novo-picker>\n </span>\n "
26945
26988
  },] }
26946
26989
  ];
26947
26990
  NovoAddressElement.ctorParameters = function () { return [
@@ -28126,7 +28169,7 @@
28126
28169
  animations.transition('startDate <=> endDate', animations.animate('200ms ease-in')),
28127
28170
  ]),
28128
28171
  ],
28129
- template: "\n <div class=\"calendar\">\n <div class=\"calendar-top\" *ngIf=\"!inline && !range\">\n <h4 class=\"day\" [attr.data-automation-id]=\"heading?.day\">{{heading?.day}}</h4>\n <h2 class=\"month\" [attr.data-automation-id]=\"heading?.month\">{{heading?.month}}</h2>\n <h1 class=\"date\" [attr.data-automation-id]=\"heading?.date\">{{heading?.date}}</h1>\n <h3 class=\"year\" [attr.data-automation-id]=\"heading?.year\">{{heading?.year}}</h3>\n </div>\n <div class=\"date-range-tabs\" *ngIf=\"range\" [class.week-select-mode]=\"weekRangeSelect\">\n <span class=\"range-tab\" (click)=\"toggleRangeSelect('startDate')\" [@startDateTextState]=\"rangeSelectMode\" data-automation-id=\"calendar-start-date\">{{selectedLabel}}</span>\n <span class=\"range-tab\" (click)=\"toggleRangeSelect('endDate')\" [@endDateTextState]=\"rangeSelectMode\" data-automation-id=\"calendar-end-date\">{{selected2Label}}</span>\n <i class=\"indicator\" [@indicatorState]=\"rangeSelectMode\"></i>\n </div>\n <div class=\"calendar-header\">\n <span class=\"previous\" (click)=\"prevMonth($event)\" data-automation-id=\"calendar-previous\"></span>\n <span class=\"heading\">\n <span class=\"month\" (click)=\"open($event, 'months')\" data-automation-id=\"header-month\">{{monthLabel}}</span>\n <span class=\"year\" (click)=\"open($event, 'years')\" data-automation-id=\"header-year\">{{month?.getFullYear()}}</span>\n </span>\n <span class=\"next\" (click)=\"nextMonth($event)\" data-automation-id=\"calendar-next\"></span>\n </div>\n <table class=\"calendar-content days\" cellspacing=\"0\" cellpadding=\"0\" [hidden]=\"!(view=='days')\">\n <thead>\n <tr>\n <th *ngFor=\"let day of weekdays\" title=\"{{day}}\" class=\"weekday\" [attr.data-automation-id]=\"day.substr(0, 2)\">{{day.substr(0, 2)}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let week of weeks\">\n <td *ngFor=\"let day of week.days\" [ngClass]=\"{\n today: day.isToday,\n 'notinmonth': day.date.getMonth() !== this.month.getMonth(),\n selected: isSelected(range, day.date, selected, selected2),\n filler: isFiller(range, day.date, selected, selected2),\n startfill: isStartFill(range, day.date, selected, selected2),\n endfill: isEndFill(range, day.date, selected, selected2),\n 'selecting-range': isSelectingRange(range, day.date, selected, selected2, hoverDay, rangeSelectMode, weekRangeSelect)\n }\" (mouseover)=\"rangeHover($event, day)\" [attr.data-automation-id]=\"day.number\">\n <button class=\"day\" [attr.data-automation-id]=\"day.number\" [disabled]=\"isDisabled(day.date, start, end)\" (click)=\"select($event, day, true)\">{{day.number}}</button>\n </td>\n </tr>\n </tbody>\n </table>\n <section class=\"calendar-content months\" [hidden]=\"view !== 'months'\">\n <div *ngFor=\"let month of months;let i = index\" (click)=\"setMonth(i)\">\n <div class=\"month\" [ngClass]=\"{selected: i === selected?.getMonth()}\" [attr.data-automation-id]=\"month\">{{month}}</div>\n </div>\n </section>\n <section class=\"calendar-content years\" [hidden]=\"view !== 'years'\">\n <div *ngFor=\"let year of years\" (click)=\"setYear(year)\">\n <div class=\"year\" [ngClass]=\"{selected: year == selected?.getFullYear()}\" [attr.data-automation-id]=\"year\">{{year}}</div>\n </div>\n </section>\n <div class=\"calendar-footer\">\n <span (click)=\"setToday()\" class=\"today\" data-automation-id=\"calendar-today\">{{ labels.today }}</span>\n </div>\n </div>\n "
28172
+ template: "\n <div class=\"calendar\">\n <div class=\"calendar-top\" *ngIf=\"!inline && !range\">\n <h4 class=\"day\" [attr.data-automation-id]=\"heading?.day\">{{heading?.day}}</h4>\n <h2 class=\"month\" [attr.data-automation-id]=\"heading?.month\">{{heading?.month}}</h2>\n <h1 class=\"date\" [attr.data-automation-id]=\"heading?.date\">{{heading?.date}}</h1>\n <h3 class=\"year\" [attr.data-automation-id]=\"heading?.year\">{{heading?.year}}</h3>\n </div>\n <div class=\"date-range-tabs\" *ngIf=\"range\" [class.week-select-mode]=\"weekRangeSelect\">\n <span class=\"range-tab\" (click)=\"toggleRangeSelect('startDate')\" [@startDateTextState]=\"rangeSelectMode\" data-automation-id=\"calendar-start-date\">{{selectedLabel}}</span>\n <span class=\"range-tab\" (click)=\"toggleRangeSelect('endDate')\" [@endDateTextState]=\"rangeSelectMode\" data-automation-id=\"calendar-end-date\">{{selected2Label}}</span>\n <i class=\"indicator\" [@indicatorState]=\"rangeSelectMode\"></i>\n </div>\n <div class=\"calendar-header\">\n <span class=\"previous\" (click)=\"prevMonth($event)\" data-automation-id=\"calendar-previous\"></span>\n <span class=\"heading\">\n <span class=\"month\" (click)=\"open($event, 'months')\" data-automation-id=\"header-month\">{{monthLabel}}</span>\n <span class=\"year\" (click)=\"open($event, 'years')\" data-automation-id=\"header-year\">{{month?.getFullYear()}}</span>\n </span>\n <span class=\"next\" (click)=\"nextMonth($event)\" data-automation-id=\"calendar-next\"></span>\n </div>\n <table class=\"calendar-content days\" cellspacing=\"0\" cellpadding=\"0\" [hidden]=\"!(view=='days')\">\n <thead>\n <tr>\n <th *ngFor=\"let day of weekdays\" title=\"{{day}}\" class=\"weekday\" [attr.data-automation-id]=\"day.substr(0, 2)\">{{day.substr(0, 2)}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let week of weeks\">\n <td *ngFor=\"let day of week.days\" [ngClass]=\"{\n today: day.isToday,\n 'notinmonth': day.date.getMonth() !== this.month.getMonth(),\n selected: isSelected(range, day.date, selected, selected2),\n filler: isFiller(range, day.date, selected, selected2),\n startfill: isStartFill(range, day.date, selected, selected2),\n endfill: isEndFill(range, day.date, selected, selected2),\n 'selecting-range': isSelectingRange(range, day.date, selected, selected2, hoverDay, rangeSelectMode, weekRangeSelect)\n }\" (mouseover)=\"rangeHover($event, day)\" [attr.data-automation-id]=\"day.number\">\n <button [title]=\"isDisabled(day.date, start, end) ? disabledDateMessage : ''\" class=\"day\" [attr.data-automation-id]=\"day.number\" [disabled]=\"isDisabled(day.date, start, end)\" (click)=\"select($event, day, true)\">{{day.number}}</button>\n </td>\n </tr>\n </tbody>\n </table>\n <section class=\"calendar-content months\" [hidden]=\"view !== 'months'\">\n <div *ngFor=\"let month of months;let i = index\" (click)=\"setMonth(i)\">\n <div class=\"month\" [ngClass]=\"{selected: i === selected?.getMonth()}\" [attr.data-automation-id]=\"month\">{{month}}</div>\n </div>\n </section>\n <section class=\"calendar-content years\" [hidden]=\"view !== 'years'\">\n <div *ngFor=\"let year of years\" (click)=\"setYear(year)\">\n <div class=\"year\" [ngClass]=\"{selected: year == selected?.getFullYear()}\" [attr.data-automation-id]=\"year\">{{year}}</div>\n </div>\n </section>\n <div class=\"calendar-footer\">\n <span (click)=\"setToday()\" class=\"today\" data-automation-id=\"calendar-today\">{{ labels.today }}</span>\n </div>\n </div>\n "
28130
28173
  },] }
28131
28174
  ];
28132
28175
  NovoDatePickerElement.ctorParameters = function () { return [
@@ -28142,6 +28185,7 @@
28142
28185
  range: [{ type: core.Input }],
28143
28186
  weekRangeSelect: [{ type: core.Input }],
28144
28187
  weekStart: [{ type: core.Input }],
28188
+ disabledDateMessage: [{ type: core.Input }],
28145
28189
  onSelect: [{ type: core.Output }]
28146
28190
  };
28147
28191
 
@@ -28558,7 +28602,7 @@
28558
28602
  { type: core.Component, args: [{
28559
28603
  selector: 'novo-date-picker-input',
28560
28604
  providers: [DATE_VALUE_ACCESSOR],
28561
- template: "\n <input\n type=\"text\"\n [name]=\"name\"\n [(ngModel)]=\"formattedValue\"\n [textMask]=\"maskOptions\"\n [placeholder]=\"placeholder\"\n (focus)=\"_handleFocus($event)\"\n (keydown)=\"_handleKeydown($event)\"\n (input)=\"_handleInput($event)\"\n (blur)=\"_handleBlur($event)\"\n #input\n data-automation-id=\"date-input\"\n [disabled]=\"disabled\"\n />\n <i *ngIf=\"!hasValue\" (click)=\"openPanel()\" class=\"bhi-calendar\"></i>\n <i *ngIf=\"hasValue\" (click)=\"clearValue()\" class=\"bhi-times\"></i>\n <novo-overlay-template [parent]=\"element\" position=\"above-below\">\n <novo-date-picker\n [start]=\"start\"\n [end]=\"end\"\n inline=\"true\"\n (onSelect)=\"setValueAndClose($event)\"\n [ngModel]=\"value\"\n [weekStart]=\"weekStart\"\n ></novo-date-picker>\n </novo-overlay-template>\n "
28605
+ template: "\n <input\n type=\"text\"\n [name]=\"name\"\n [(ngModel)]=\"formattedValue\"\n [textMask]=\"maskOptions\"\n [placeholder]=\"placeholder\"\n (focus)=\"_handleFocus($event)\"\n (keydown)=\"_handleKeydown($event)\"\n (input)=\"_handleInput($event)\"\n (blur)=\"_handleBlur($event)\"\n #input\n data-automation-id=\"date-input\"\n [disabled]=\"disabled\"\n />\n <i *ngIf=\"!hasValue\" (click)=\"openPanel()\" class=\"bhi-calendar\"></i>\n <i *ngIf=\"hasValue\" (click)=\"clearValue()\" class=\"bhi-times\"></i>\n <novo-overlay-template [parent]=\"element\" position=\"above-below\">\n <novo-date-picker\n [start]=\"start\"\n [end]=\"end\"\n inline=\"true\"\n (onSelect)=\"setValueAndClose($event)\"\n [disabledDateMessage]=\"disabledDateMessage\"\n [ngModel]=\"value\"\n [weekStart]=\"weekStart\"\n ></novo-date-picker>\n </novo-overlay-template>\n "
28562
28606
  },] }
28563
28607
  ];
28564
28608
  NovoDatePickerInputElement.ctorParameters = function () { return [
@@ -28576,6 +28620,7 @@
28576
28620
  format: [{ type: core.Input }],
28577
28621
  textMaskEnabled: [{ type: core.Input }],
28578
28622
  allowInvalidDate: [{ type: core.Input }],
28623
+ disabledDateMessage: [{ type: core.Input }],
28579
28624
  disabled: [{ type: core.HostBinding, args: ['class.disabled',] }, { type: core.Input }],
28580
28625
  weekStart: [{ type: core.Input }],
28581
28626
  blurEvent: [{ type: core.Output }],
@@ -28668,6 +28713,7 @@
28668
28713
  _this.dataTable = dataTable;
28669
28714
  _this.ref = ref;
28670
28715
  _this.role = 'gridcell';
28716
+ _this.maxSelected = undefined;
28671
28717
  _this.checked = false;
28672
28718
  renderer.setAttribute(elementRef.nativeElement, 'data-automation-id', "novo-checkbox-column-" + columnDef.cssClassFriendlyName);
28673
28719
  renderer.addClass(elementRef.nativeElement, "novo-checkbox-column-" + columnDef.cssClassFriendlyName);
@@ -28682,11 +28728,23 @@
28682
28728
  });
28683
28729
  return _this;
28684
28730
  }
28731
+ Object.defineProperty(NovoDataTableCheckboxCell.prototype, "isAtLimit", {
28732
+ get: function () {
28733
+ return this.maxSelected && this.dataTable.state.selectedRows.size >= this.maxSelected && !this.checked;
28734
+ },
28735
+ enumerable: false,
28736
+ configurable: true
28737
+ });
28685
28738
  NovoDataTableCheckboxCell.prototype.ngOnInit = function () {
28686
28739
  this.checked = this.dataTable.isSelected(this.row);
28687
28740
  };
28688
28741
  NovoDataTableCheckboxCell.prototype.onClick = function () {
28689
- this.dataTable.selectRow(this.row);
28742
+ if (!this.isAtLimit) {
28743
+ this.dataTable.selectRow(this.row);
28744
+ }
28745
+ };
28746
+ NovoDataTableCheckboxCell.prototype.getTooltip = function () {
28747
+ return (this.isAtLimit) ? 'More than ' + this.maxSelected + ' items are not able to be selected at one time' : '';
28690
28748
  };
28691
28749
  NovoDataTableCheckboxCell.prototype.ngOnDestroy = function () {
28692
28750
  if (this.selectionSubscription) {
@@ -28701,7 +28759,7 @@
28701
28759
  NovoDataTableCheckboxCell.decorators = [
28702
28760
  { type: core.Component, args: [{
28703
28761
  selector: 'novo-data-table-checkbox-cell',
28704
- template: "\n <div class=\"data-table-checkbox\" (click)=\"onClick()\">\n <input type=\"checkbox\" [checked]=\"checked\">\n <label>\n <i [class.bhi-checkbox-empty]=\"!checked\"\n [class.bhi-checkbox-filled]=\"checked\"></i>\n </label>\n </div>\n ",
28762
+ template: "\n <div class=\"data-table-checkbox\" (click)=\"onClick()\" [tooltip]=\"getTooltip()\" tooltipPosition=\"right\">\n <input type=\"checkbox\" [checked]=\"checked\">\n <label>\n <i [class.bhi-checkbox-disabled]=\"isAtLimit\"\n [class.bhi-checkbox-empty]=\"!checked\"\n [class.bhi-checkbox-filled]=\"checked\"></i>\n </label>\n </div>\n ",
28705
28763
  changeDetection: core.ChangeDetectionStrategy.OnPush
28706
28764
  },] }
28707
28765
  ];
@@ -28714,7 +28772,8 @@
28714
28772
  ]; };
28715
28773
  NovoDataTableCheckboxCell.propDecorators = {
28716
28774
  role: [{ type: core.HostBinding, args: ['attr.role',] }],
28717
- row: [{ type: core.Input }]
28775
+ row: [{ type: core.Input }],
28776
+ maxSelected: [{ type: core.Input }]
28718
28777
  };
28719
28778
 
28720
28779
  var NovoDataTableExpandCell = /** @class */ (function (_super) {
@@ -28860,13 +28919,210 @@
28860
28919
  role: [{ type: core.HostBinding, args: ['attr.role',] }]
28861
28920
  };
28862
28921
 
28922
+ // NG2
28923
+ var NovoToastElement = /** @class */ (function () {
28924
+ function NovoToastElement(sanitizer) {
28925
+ this.sanitizer = sanitizer;
28926
+ this.theme = 'danger';
28927
+ this.icon = 'caution';
28928
+ this.hasDialogue = false;
28929
+ this.isCloseable = false;
28930
+ this.closed = new core.EventEmitter();
28931
+ this.show = false;
28932
+ this.animate = false;
28933
+ this.parent = null;
28934
+ this.launched = false;
28935
+ }
28936
+ Object.defineProperty(NovoToastElement.prototype, "message", {
28937
+ set: function (m) {
28938
+ this._message = this.sanitizer.bypassSecurityTrustHtml(m);
28939
+ },
28940
+ enumerable: false,
28941
+ configurable: true
28942
+ });
28943
+ NovoToastElement.prototype.ngOnInit = function () {
28944
+ if (!this.launched) {
28945
+ // clear position and time
28946
+ this.position = null;
28947
+ this.time = null;
28948
+ // set icon and styling
28949
+ this.iconClass = "bhi-" + this.icon;
28950
+ this.alertTheme = this.theme + " toast-container embedded";
28951
+ if (this.hasDialogue) {
28952
+ this.alertTheme += ' dialogue';
28953
+ }
28954
+ }
28955
+ };
28956
+ NovoToastElement.prototype.ngOnChanges = function (changes) {
28957
+ // set icon and styling
28958
+ this.iconClass = "bhi-" + this.icon;
28959
+ this.alertTheme = this.theme + " toast-container embedded";
28960
+ if (this.hasDialogue) {
28961
+ this.alertTheme += ' dialogue';
28962
+ }
28963
+ };
28964
+ NovoToastElement.prototype.clickHandler = function (event) {
28965
+ if (!this.isCloseable) {
28966
+ if (event) {
28967
+ event.stopPropagation();
28968
+ event.preventDefault();
28969
+ }
28970
+ if (this.parent) {
28971
+ this.parent.hide(this);
28972
+ }
28973
+ else {
28974
+ this.closed.emit({ closed: true });
28975
+ }
28976
+ }
28977
+ };
28978
+ NovoToastElement.prototype.close = function (event) {
28979
+ if (event) {
28980
+ event.stopPropagation();
28981
+ event.preventDefault();
28982
+ }
28983
+ if (this.parent) {
28984
+ this.parent.hide(this);
28985
+ }
28986
+ else {
28987
+ this.closed.emit({ closed: true });
28988
+ }
28989
+ };
28990
+ return NovoToastElement;
28991
+ }());
28992
+ NovoToastElement.decorators = [
28993
+ { type: core.Component, args: [{
28994
+ selector: 'novo-toast',
28995
+ host: {
28996
+ '[class]': 'alertTheme',
28997
+ '[class.show]': 'show',
28998
+ '[class.animate]': 'animate',
28999
+ '[class.embedded]': 'embedded',
29000
+ '(click)': '!isCloseable && clickHandler($event)',
29001
+ },
29002
+ template: "\n <div class=\"toast-icon\">\n <i [ngClass]=\"iconClass\"></i>\n </div>\n <div class=\"toast-content\">\n <h5 *ngIf=\"title\">{{title}}</h5>\n <p *ngIf=\"_message\" [class.message-only]=\"!title\" [innerHtml]=\"_message\"></p>\n <div *ngIf=\"link\" class=\"link-generated\">\n <input type=\"text\" [value]=\"link\" onfocus=\"this.select();\"/>\n </div>\n <div class=\"dialogue\">\n <ng-content></ng-content>\n </div>\n </div>\n <div class=\"close-icon\" *ngIf=\"isCloseable\" (click)=\"close($event)\">\n <i class=\"bhi-times\"></i>\n </div>\n "
29003
+ },] }
29004
+ ];
29005
+ NovoToastElement.ctorParameters = function () { return [
29006
+ { type: platformBrowser.DomSanitizer }
29007
+ ]; };
29008
+ NovoToastElement.propDecorators = {
29009
+ theme: [{ type: core.Input }],
29010
+ icon: [{ type: core.Input }],
29011
+ title: [{ type: core.Input }],
29012
+ hasDialogue: [{ type: core.Input }],
29013
+ link: [{ type: core.Input }],
29014
+ isCloseable: [{ type: core.Input }],
29015
+ message: [{ type: core.Input }],
29016
+ closed: [{ type: core.Output }]
29017
+ };
29018
+
29019
+ // NG2
29020
+ var NovoToastService = /** @class */ (function () {
29021
+ function NovoToastService(componentUtils) {
29022
+ this.componentUtils = componentUtils;
29023
+ this.references = [];
29024
+ this.icons = { default: 'bell', success: 'check', info: 'info', warning: 'warning', danger: 'remove' };
29025
+ this.defaults = { hideDelay: 3500, position: 'growlTopRight', theme: 'default' };
29026
+ }
29027
+ Object.defineProperty(NovoToastService.prototype, "parentViewContainer", {
29028
+ set: function (view) {
29029
+ this._parentViewContainer = view;
29030
+ },
29031
+ enumerable: false,
29032
+ configurable: true
29033
+ });
29034
+ NovoToastService.prototype.alert = function (options, toastElement) {
29035
+ var _this = this;
29036
+ if (toastElement === void 0) { toastElement = NovoToastElement; }
29037
+ return new Promise(function (resolve) {
29038
+ if (!_this._parentViewContainer) {
29039
+ console.error('No parent view container specified for the ToastService. Set it inside your main application. \nthis.toastService.parentViewContainer = view (ViewContainerRef)');
29040
+ return;
29041
+ }
29042
+ var toast = _this.componentUtils.append(toastElement, _this._parentViewContainer);
29043
+ _this.references.push(toast);
29044
+ _this.handleAlert(toast.instance, options);
29045
+ resolve(toast);
29046
+ });
29047
+ };
29048
+ NovoToastService.prototype.isVisible = function (toast) {
29049
+ return toast.show;
29050
+ };
29051
+ NovoToastService.prototype.hide = function (toast) {
29052
+ var _this = this;
29053
+ toast.animate = false;
29054
+ setTimeout(function () {
29055
+ toast.show = false;
29056
+ var REF = _this.references.filter(function (x) { return x.instance === toast; })[0];
29057
+ if (REF) {
29058
+ _this.references.splice(_this.references.indexOf(REF), 1);
29059
+ REF.destroy();
29060
+ }
29061
+ }, 300);
29062
+ };
29063
+ NovoToastService.prototype.handleAlert = function (toast, options) {
29064
+ var _this = this;
29065
+ this.setToastOnSession(toast, options);
29066
+ setTimeout(function () {
29067
+ _this.show(toast);
29068
+ }, 20);
29069
+ if (!toast.isCloseable) {
29070
+ this.toastTimer(toast);
29071
+ }
29072
+ };
29073
+ NovoToastService.prototype.setToastOnSession = function (toast, opts) {
29074
+ var OPTIONS = typeof opts === 'object' ? opts : {};
29075
+ toast.parent = this;
29076
+ toast.title = OPTIONS.title || '';
29077
+ toast.message = OPTIONS.message || '';
29078
+ toast.hideDelay = OPTIONS.hideDelay || this.defaults.hideDelay;
29079
+ toast.link = OPTIONS.link || '';
29080
+ toast.isCloseable = OPTIONS.isCloseable || false;
29081
+ var CUSTOM_CLASS = OPTIONS.customClass || '';
29082
+ var ALERT_STYLE = OPTIONS.theme || this.defaults.theme;
29083
+ var ALERT_POSITION = OPTIONS.position || this.defaults.position;
29084
+ var ALERT_ICON = OPTIONS.icon || this.icons.default;
29085
+ toast.iconClass = "bhi-" + ALERT_ICON;
29086
+ toast.launched = true;
29087
+ toast.alertTheme = ALERT_STYLE + " " + ALERT_POSITION + " " + CUSTOM_CLASS + " toast-container launched";
29088
+ };
29089
+ NovoToastService.prototype.show = function (toast) {
29090
+ toast.show = true;
29091
+ setTimeout(addClass, 25);
29092
+ /**
29093
+ * Adds animate class to be called after a timeout
29094
+ **/
29095
+ function addClass() {
29096
+ toast.animate = true;
29097
+ }
29098
+ };
29099
+ NovoToastService.prototype.toastTimer = function (toast) {
29100
+ var _this = this;
29101
+ if (toast.hideDelay < 0) {
29102
+ return;
29103
+ }
29104
+ setTimeout(function () {
29105
+ _this.hide(toast);
29106
+ }, toast.hideDelay);
29107
+ };
29108
+ return NovoToastService;
29109
+ }());
29110
+ NovoToastService.decorators = [
29111
+ { type: core.Injectable }
29112
+ ];
29113
+ NovoToastService.ctorParameters = function () { return [
29114
+ { type: ComponentUtils }
29115
+ ]; };
29116
+
28863
29117
  var NovoDataTableCheckboxHeaderCell = /** @class */ (function (_super) {
28864
29118
  __extends(NovoDataTableCheckboxHeaderCell, _super);
28865
- function NovoDataTableCheckboxHeaderCell(columnDef, elementRef, renderer, dataTable, ref) {
29119
+ function NovoDataTableCheckboxHeaderCell(columnDef, elementRef, renderer, dataTable, ref, toaster) {
28866
29120
  var _this = _super.call(this, columnDef, elementRef) || this;
28867
29121
  _this.dataTable = dataTable;
28868
29122
  _this.ref = ref;
29123
+ _this.toaster = toaster;
28869
29124
  _this.role = 'columnheader';
29125
+ _this.maxSelected = undefined;
28870
29126
  _this.checked = false;
28871
29127
  renderer.setAttribute(elementRef.nativeElement, 'data-automation-id', "novo-checkbox-column-header-" + columnDef.cssClassFriendlyName);
28872
29128
  renderer.addClass(elementRef.nativeElement, "novo-checkbox-column-" + columnDef.cssClassFriendlyName);
@@ -28879,6 +29135,8 @@
28879
29135
  if (event.isPageSizeChange) {
28880
29136
  _this.checked = false;
28881
29137
  _this.dataTable.selectRows(false);
29138
+ _this.dataTable.state.checkRetainment('pageSize');
29139
+ _this.dataTable.state.reset(false, true);
28882
29140
  }
28883
29141
  else {
28884
29142
  _this.checked = _this.dataTable.allCurrentRowsSelected();
@@ -28891,6 +29149,13 @@
28891
29149
  });
28892
29150
  return _this;
28893
29151
  }
29152
+ Object.defineProperty(NovoDataTableCheckboxHeaderCell.prototype, "isAtLimit", {
29153
+ get: function () {
29154
+ return this.maxSelected && this.dataTable.state.selectedRows.size + this.dataTable.dataSource.data.length > this.maxSelected && !this.checked;
29155
+ },
29156
+ enumerable: false,
29157
+ configurable: true
29158
+ });
28894
29159
  NovoDataTableCheckboxHeaderCell.prototype.ngOnDestroy = function () {
28895
29160
  if (this.selectionSubscription) {
28896
29161
  this.selectionSubscription.unsubscribe();
@@ -28903,7 +29168,17 @@
28903
29168
  }
28904
29169
  };
28905
29170
  NovoDataTableCheckboxHeaderCell.prototype.onClick = function () {
28906
- this.dataTable.selectRows(!this.checked);
29171
+ if (this.isAtLimit) {
29172
+ this.toaster.alert({
29173
+ theme: 'danger',
29174
+ position: 'fixedTop',
29175
+ message: 'Error, more than 500 items are not able to be selected at one time',
29176
+ icon: 'caution',
29177
+ });
29178
+ }
29179
+ else {
29180
+ this.dataTable.selectRows(!this.checked);
29181
+ }
28907
29182
  };
28908
29183
  return NovoDataTableCheckboxHeaderCell;
28909
29184
  }(table.CdkHeaderCell));
@@ -28919,10 +29194,12 @@
28919
29194
  { type: core.ElementRef },
28920
29195
  { type: core.Renderer2 },
28921
29196
  { type: NovoDataTable },
28922
- { type: core.ChangeDetectorRef }
29197
+ { type: core.ChangeDetectorRef },
29198
+ { type: NovoToastService }
28923
29199
  ]; };
28924
29200
  NovoDataTableCheckboxHeaderCell.propDecorators = {
28925
- role: [{ type: core.HostBinding, args: ['attr.role',] }]
29201
+ role: [{ type: core.HostBinding, args: ['attr.role',] }],
29202
+ maxSelected: [{ type: core.Input }]
28926
29203
  };
28927
29204
 
28928
29205
  var NovoDataTableHeaderCell = /** @class */ (function (_super) {
@@ -29038,10 +29315,12 @@
29038
29315
  this.resetSubscription.unsubscribe();
29039
29316
  };
29040
29317
  NovoDataTablePagination.prototype.selectPage = function (page) {
29318
+ this.state.checkRetainment('page');
29041
29319
  this.page = page;
29042
29320
  this.emitPageEvent();
29043
29321
  };
29044
29322
  NovoDataTablePagination.prototype.nextPage = function () {
29323
+ this.state.checkRetainment('page');
29045
29324
  if (!this.hasNextPage()) {
29046
29325
  return;
29047
29326
  }
@@ -29050,6 +29329,7 @@
29050
29329
  this.emitPageEvent();
29051
29330
  };
29052
29331
  NovoDataTablePagination.prototype.previousPage = function () {
29332
+ this.state.checkRetainment('page');
29053
29333
  if (!this.hasPreviousPage()) {
29054
29334
  return;
29055
29335
  }
@@ -29581,7 +29861,7 @@
29581
29861
  animations.transition('date <=> time', animations.animate('200ms ease-in')),
29582
29862
  ]),
29583
29863
  ],
29584
- template: "\n <div class=\"date-time-container\">\n <div class=\"date-time-tabs\">\n <span\n class=\"date-tab\"\n (click)=\"toggleView('date')\"\n [@dateTextState]=\"componentTabState\"\n data-automation-id=\"novo-date-time-date-tab\"\n >{{ selectedLabel }}</span\n >\n <span\n class=\"time-tab\"\n (click)=\"toggleView('time')\"\n [@timeTextState]=\"componentTabState\"\n data-automation-id=\"novo-date-time-time-tab\"\n >\n <span class=\"hours\" data-automation-id=\"novo-time-picker-hours\">{{ hours }}</span\n >:<span class=\"minutes\" data-automation-id=\"novo-time-picker-minutes\">{{ minutes }}</span>\n <span *ngIf=\"!military\" class=\"meridian\"> {{ meridian }}</span>\n </span>\n <i class=\"date-time-indicator\" [@indicatorState]=\"componentTabState\"></i>\n </div>\n <div class=\"view-container\" [@containerState]=\"componentTabState\">\n <div class=\"calendar\">\n <novo-date-picker\n (onSelect)=\"onDateSelected($event)\"\n [(ngModel)]=\"model\"\n inline=\"true\"\n [minYear]=\"minYear\"\n [maxYear]=\"maxYear\"\n [start]=\"start\"\n [end]=\"end\"\n [weekStart]=\"weekStart\"\n ></novo-date-picker>\n </div>\n <div class=\"time-picker\">\n <novo-time-picker (onSelect)=\"onTimeSelected($event)\" [(ngModel)]=\"model\" [military]=\"military\" inline=\"true\"></novo-time-picker>\n </div>\n </div>\n </div>\n "
29864
+ template: "\n <div class=\"date-time-container\">\n <div class=\"date-time-tabs\">\n <span\n class=\"date-tab\"\n (click)=\"toggleView('date')\"\n [@dateTextState]=\"componentTabState\"\n data-automation-id=\"novo-date-time-date-tab\"\n >{{ selectedLabel }}</span\n >\n <span\n class=\"time-tab\"\n (click)=\"toggleView('time')\"\n [@timeTextState]=\"componentTabState\"\n data-automation-id=\"novo-date-time-time-tab\"\n >\n <span class=\"hours\" data-automation-id=\"novo-time-picker-hours\">{{ hours }}</span\n >:<span class=\"minutes\" data-automation-id=\"novo-time-picker-minutes\">{{ minutes }}</span>\n <span *ngIf=\"!military\" class=\"meridian\"> {{ meridian }}</span>\n </span>\n <i class=\"date-time-indicator\" [@indicatorState]=\"componentTabState\"></i>\n </div>\n <div class=\"view-container\" [@containerState]=\"componentTabState\">\n <div class=\"calendar\">\n <novo-date-picker\n (onSelect)=\"onDateSelected($event)\"\n [(ngModel)]=\"model\"\n inline=\"true\"\n [minYear]=\"minYear\"\n [maxYear]=\"maxYear\"\n [start]=\"start\"\n [end]=\"end\"\n [disabledDateMessage]=\"disabledDateMessage\"\n [weekStart]=\"weekStart\"\n ></novo-date-picker>\n </div>\n <div class=\"time-picker\">\n <novo-time-picker (onSelect)=\"onTimeSelected($event)\" [(ngModel)]=\"model\" [military]=\"military\" inline=\"true\"></novo-time-picker>\n </div>\n </div>\n </div>\n "
29585
29865
  },] }
29586
29866
  ];
29587
29867
  NovoDateTimePickerElement.ctorParameters = function () { return [
@@ -29595,6 +29875,7 @@
29595
29875
  end: [{ type: core.Input }],
29596
29876
  military: [{ type: core.Input }],
29597
29877
  weekStart: [{ type: core.Input }],
29878
+ disabledDateMessage: [{ type: core.Input }],
29598
29879
  onSelect: [{ type: core.Output }]
29599
29880
  };
29600
29881
 
@@ -29706,7 +29987,7 @@
29706
29987
  { type: core.Component, args: [{
29707
29988
  selector: 'novo-date-time-picker-input',
29708
29989
  providers: [DATE_VALUE_ACCESSOR$1],
29709
- template: "\n <novo-date-picker-input\n [ngModel]=\"datePart\"\n (ngModelChange)=\"updateDate($event)\"\n [start]=\"start\"\n [end]=\"end\"\n [maskOptions]=\"maskOptions\"\n (blurEvent)=\"handleBlur($event)\"\n (focusEvent)=\"handleFocus($event)\"\n [disabled]=\"disabled\"\n [weekStart]=\"weekStart\"\n ></novo-date-picker-input>\n <novo-time-picker-input\n [ngModel]=\"timePart\"\n (ngModelChange)=\"updateTime($event)\"\n [military]=\"military\"\n (blurEvent)=\"handleBlur($event)\"\n (focusEvent)=\"handleFocus($event)\"\n [disabled]=\"disabled\"\n ></novo-time-picker-input>\n "
29990
+ template: "\n <novo-date-picker-input\n [ngModel]=\"datePart\"\n (ngModelChange)=\"updateDate($event)\"\n [start]=\"start\"\n [end]=\"end\"\n [disabledDateMessage]=\"disabledDateMessage\"\n [maskOptions]=\"maskOptions\"\n (blurEvent)=\"handleBlur($event)\"\n (focusEvent)=\"handleFocus($event)\"\n [disabled]=\"disabled\"\n [weekStart]=\"weekStart\"\n ></novo-date-picker-input>\n <novo-time-picker-input\n [ngModel]=\"timePart\"\n (ngModelChange)=\"updateTime($event)\"\n [military]=\"military\"\n (blurEvent)=\"handleBlur($event)\"\n (focusEvent)=\"handleFocus($event)\"\n [disabled]=\"disabled\"\n ></novo-time-picker-input>\n "
29710
29991
  },] }
29711
29992
  ];
29712
29993
  NovoDateTimePickerInputElement.ctorParameters = function () { return [
@@ -29724,6 +30005,7 @@
29724
30005
  disabled: [{ type: core.Input }],
29725
30006
  format: [{ type: core.Input }],
29726
30007
  weekStart: [{ type: core.Input }],
30008
+ disabledDateMessage: [{ type: core.Input }],
29727
30009
  blurEvent: [{ type: core.Output }],
29728
30010
  focusEvent: [{ type: core.Output }],
29729
30011
  changeEvent: [{ type: core.Output }]
@@ -30604,6 +30886,7 @@
30604
30886
  _this.isEmpty = config.isEmpty;
30605
30887
  }
30606
30888
  _this.weekStart = config.weekStart || 0;
30889
+ _this.disabledDateMessage = config.disabledDateMessage;
30607
30890
  return _this;
30608
30891
  }
30609
30892
  return BaseControl;
@@ -31101,6 +31384,7 @@
31101
31384
  _this.tipWell = control.tipWell;
31102
31385
  _this.customControlConfig = control.customControlConfig;
31103
31386
  _this.warning = control.warning;
31387
+ _this.disabledDateMessage = control.disabledDateMessage;
31104
31388
  // Reactive Form, need to enable/disable, can't bind to [disabled]
31105
31389
  if (_this.readOnly) {
31106
31390
  _this.disable();
@@ -31453,7 +31737,7 @@
31453
31737
  return key.indexOf('customEncrypted') > -1;
31454
31738
  };
31455
31739
  FormUtils.prototype.getControlForField = function (field, http, config, overrides, forTable, fieldData) {
31456
- var e_1, _a;
31740
+ var e_1, _b;
31457
31741
  if (forTable === void 0) { forTable = false; }
31458
31742
  // TODO: if field.type overrides `determineInputType` we should use it in that method or use this method
31459
31743
  // TODO: (cont.) as the setter of the field argument
@@ -31492,7 +31776,7 @@
31492
31776
  closeOnSelect: field.closeOnSelect,
31493
31777
  layoutOptions: field.layoutOptions,
31494
31778
  };
31495
- this.inferStartDate(controlConfig, field);
31779
+ this.inferDateRange(controlConfig, field);
31496
31780
  // TODO: getControlOptions should always return the correct format
31497
31781
  var optionsConfig = this.getControlOptions(field, http, config, fieldData);
31498
31782
  if (Array.isArray(optionsConfig) && !(type === 'chips' || type === 'picker')) {
@@ -31632,8 +31916,8 @@
31632
31916
  controlConfig.config.readOnly = controlConfig.readOnly;
31633
31917
  if (field.fields && field.fields.length) {
31634
31918
  try {
31635
- for (var _b = __values(field.fields), _c = _b.next(); !_c.done; _c = _b.next()) {
31636
- var subfield = _c.value;
31919
+ for (var _c = __values(field.fields), _d = _c.next(); !_d.done; _d = _c.next()) {
31920
+ var subfield = _d.value;
31637
31921
  controlConfig.config[subfield.name] = {
31638
31922
  required: !!subfield.required,
31639
31923
  hidden: !!subfield.readOnly,
@@ -31671,7 +31955,7 @@
31671
31955
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
31672
31956
  finally {
31673
31957
  try {
31674
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
31958
+ if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
31675
31959
  }
31676
31960
  finally { if (e_1) throw e_1.error; }
31677
31961
  }
@@ -31799,7 +32083,7 @@
31799
32083
  return (data && data[field.name]) || null;
31800
32084
  };
31801
32085
  FormUtils.prototype.getEmbeddedFieldData = function (field, data) {
31802
- var _a = __read(field.name.split('.'), 2), parentFieldName = _a[0], fieldName = _a[1];
32086
+ var _b = __read(field.name.split('.'), 2), parentFieldName = _b[0], fieldName = _b[1];
31803
32087
  return (data && data[parentFieldName] && data[parentFieldName][fieldName]) || null;
31804
32088
  };
31805
32089
  FormUtils.prototype.getFormFields = function (meta) {
@@ -31810,6 +32094,7 @@
31810
32094
  })
31811
32095
  : [];
31812
32096
  var fields = meta.fields.map(function (field) {
32097
+ field.parentEntity = meta.entity;
31813
32098
  if (!field.hasOwnProperty('sortOrder')) {
31814
32099
  field.sortOrder = Number.MAX_SAFE_INTEGER - 1;
31815
32100
  }
@@ -32017,23 +32302,23 @@
32017
32302
  return dateFns.addDays(dateFns.startOfToday(), dateRange.minOffset);
32018
32303
  }
32019
32304
  };
32020
- /**
32021
- * Get the min start date of a Date base on field data.
32022
- */
32023
- FormUtils.prototype.getStartDate = function (field) {
32024
- if (field.allowedDateRange) {
32025
- return this.getStartDateFromRange(field.allowedDateRange);
32305
+ FormUtils.prototype.getEndDateFromRange = function (dateRange) {
32306
+ if (dateRange.maxDate) {
32307
+ return dateFns.parse(dateRange.maxDate);
32308
+ }
32309
+ else if (dateRange.minOffset) {
32310
+ return dateFns.addDays(dateFns.startOfToday(), dateRange.minOffset);
32026
32311
  }
32027
- // there is no restriction on the start date
32028
- return null;
32029
32312
  };
32030
- FormUtils.prototype.inferStartDate = function (controlConfig, field) {
32031
- if (field.dataType === 'Date') {
32032
- var startDate = this.getStartDate(field);
32033
- if (startDate) {
32034
- controlConfig.startDate = startDate;
32035
- }
32036
- return startDate;
32313
+ /**
32314
+ * Get the min start date and max end date of a Date base on field data.
32315
+ */
32316
+ FormUtils.prototype.inferDateRange = function (controlConfig, field) {
32317
+ var _a;
32318
+ if (field.dataType === 'Date' && field.allowedDateRange) {
32319
+ controlConfig.startDate = this.getStartDateFromRange(field.allowedDateRange);
32320
+ controlConfig.endDate = this.getEndDateFromRange(field.allowedDateRange);
32321
+ controlConfig.disabledDateMessage = (_a = field.allowedDateRange) === null || _a === void 0 ? void 0 : _a.disabledDateMessage;
32037
32322
  }
32038
32323
  };
32039
32324
  FormUtils.prototype.inflateEmbeddedProperties = function (data) {
@@ -32041,7 +32326,7 @@
32041
32326
  Object.keys(data)
32042
32327
  .filter(function (fieldName) { return fieldName.includes('.'); })
32043
32328
  .forEach(function (field) {
32044
- var _a = __read(field.split('.'), 2), parentFieldName = _a[0], fieldName = _a[1];
32329
+ var _b = __read(field.split('.'), 2), parentFieldName = _b[0], fieldName = _b[1];
32045
32330
  if (!data[parentFieldName]) {
32046
32331
  data[parentFieldName] = {};
32047
32332
  }
@@ -32240,201 +32525,6 @@
32240
32525
  { type: ComponentUtils }
32241
32526
  ]; };
32242
32527
 
32243
- // NG2
32244
- var NovoToastElement = /** @class */ (function () {
32245
- function NovoToastElement(sanitizer) {
32246
- this.sanitizer = sanitizer;
32247
- this.theme = 'danger';
32248
- this.icon = 'caution';
32249
- this.hasDialogue = false;
32250
- this.isCloseable = false;
32251
- this.closed = new core.EventEmitter();
32252
- this.show = false;
32253
- this.animate = false;
32254
- this.parent = null;
32255
- this.launched = false;
32256
- }
32257
- Object.defineProperty(NovoToastElement.prototype, "message", {
32258
- set: function (m) {
32259
- this._message = this.sanitizer.bypassSecurityTrustHtml(m);
32260
- },
32261
- enumerable: false,
32262
- configurable: true
32263
- });
32264
- NovoToastElement.prototype.ngOnInit = function () {
32265
- if (!this.launched) {
32266
- // clear position and time
32267
- this.position = null;
32268
- this.time = null;
32269
- // set icon and styling
32270
- this.iconClass = "bhi-" + this.icon;
32271
- this.alertTheme = this.theme + " toast-container embedded";
32272
- if (this.hasDialogue) {
32273
- this.alertTheme += ' dialogue';
32274
- }
32275
- }
32276
- };
32277
- NovoToastElement.prototype.ngOnChanges = function (changes) {
32278
- // set icon and styling
32279
- this.iconClass = "bhi-" + this.icon;
32280
- this.alertTheme = this.theme + " toast-container embedded";
32281
- if (this.hasDialogue) {
32282
- this.alertTheme += ' dialogue';
32283
- }
32284
- };
32285
- NovoToastElement.prototype.clickHandler = function (event) {
32286
- if (!this.isCloseable) {
32287
- if (event) {
32288
- event.stopPropagation();
32289
- event.preventDefault();
32290
- }
32291
- if (this.parent) {
32292
- this.parent.hide(this);
32293
- }
32294
- else {
32295
- this.closed.emit({ closed: true });
32296
- }
32297
- }
32298
- };
32299
- NovoToastElement.prototype.close = function (event) {
32300
- if (event) {
32301
- event.stopPropagation();
32302
- event.preventDefault();
32303
- }
32304
- if (this.parent) {
32305
- this.parent.hide(this);
32306
- }
32307
- else {
32308
- this.closed.emit({ closed: true });
32309
- }
32310
- };
32311
- return NovoToastElement;
32312
- }());
32313
- NovoToastElement.decorators = [
32314
- { type: core.Component, args: [{
32315
- selector: 'novo-toast',
32316
- host: {
32317
- '[class]': 'alertTheme',
32318
- '[class.show]': 'show',
32319
- '[class.animate]': 'animate',
32320
- '[class.embedded]': 'embedded',
32321
- '(click)': '!isCloseable && clickHandler($event)',
32322
- },
32323
- template: "\n <div class=\"toast-icon\">\n <i [ngClass]=\"iconClass\"></i>\n </div>\n <div class=\"toast-content\">\n <h5 *ngIf=\"title\">{{title}}</h5>\n <p *ngIf=\"_message\" [class.message-only]=\"!title\" [innerHtml]=\"_message\"></p>\n <div *ngIf=\"link\" class=\"link-generated\">\n <input type=\"text\" [value]=\"link\" onfocus=\"this.select();\"/>\n </div>\n <div class=\"dialogue\">\n <ng-content></ng-content>\n </div>\n </div>\n <div class=\"close-icon\" *ngIf=\"isCloseable\" (click)=\"close($event)\">\n <i class=\"bhi-times\"></i>\n </div>\n "
32324
- },] }
32325
- ];
32326
- NovoToastElement.ctorParameters = function () { return [
32327
- { type: platformBrowser.DomSanitizer }
32328
- ]; };
32329
- NovoToastElement.propDecorators = {
32330
- theme: [{ type: core.Input }],
32331
- icon: [{ type: core.Input }],
32332
- title: [{ type: core.Input }],
32333
- hasDialogue: [{ type: core.Input }],
32334
- link: [{ type: core.Input }],
32335
- isCloseable: [{ type: core.Input }],
32336
- message: [{ type: core.Input }],
32337
- closed: [{ type: core.Output }]
32338
- };
32339
-
32340
- // NG2
32341
- var NovoToastService = /** @class */ (function () {
32342
- function NovoToastService(componentUtils) {
32343
- this.componentUtils = componentUtils;
32344
- this.references = [];
32345
- this.icons = { default: 'bell', success: 'check', info: 'info', warning: 'warning', danger: 'remove' };
32346
- this.defaults = { hideDelay: 3500, position: 'growlTopRight', theme: 'default' };
32347
- }
32348
- Object.defineProperty(NovoToastService.prototype, "parentViewContainer", {
32349
- set: function (view) {
32350
- this._parentViewContainer = view;
32351
- },
32352
- enumerable: false,
32353
- configurable: true
32354
- });
32355
- NovoToastService.prototype.alert = function (options, toastElement) {
32356
- var _this = this;
32357
- if (toastElement === void 0) { toastElement = NovoToastElement; }
32358
- return new Promise(function (resolve) {
32359
- if (!_this._parentViewContainer) {
32360
- console.error('No parent view container specified for the ToastService. Set it inside your main application. \nthis.toastService.parentViewContainer = view (ViewContainerRef)');
32361
- return;
32362
- }
32363
- var toast = _this.componentUtils.append(toastElement, _this._parentViewContainer);
32364
- _this.references.push(toast);
32365
- _this.handleAlert(toast.instance, options);
32366
- resolve(toast);
32367
- });
32368
- };
32369
- NovoToastService.prototype.isVisible = function (toast) {
32370
- return toast.show;
32371
- };
32372
- NovoToastService.prototype.hide = function (toast) {
32373
- var _this = this;
32374
- toast.animate = false;
32375
- setTimeout(function () {
32376
- toast.show = false;
32377
- var REF = _this.references.filter(function (x) { return x.instance === toast; })[0];
32378
- if (REF) {
32379
- _this.references.splice(_this.references.indexOf(REF), 1);
32380
- REF.destroy();
32381
- }
32382
- }, 300);
32383
- };
32384
- NovoToastService.prototype.handleAlert = function (toast, options) {
32385
- var _this = this;
32386
- this.setToastOnSession(toast, options);
32387
- setTimeout(function () {
32388
- _this.show(toast);
32389
- }, 20);
32390
- if (!toast.isCloseable) {
32391
- this.toastTimer(toast);
32392
- }
32393
- };
32394
- NovoToastService.prototype.setToastOnSession = function (toast, opts) {
32395
- var OPTIONS = typeof opts === 'object' ? opts : {};
32396
- toast.parent = this;
32397
- toast.title = OPTIONS.title || '';
32398
- toast.message = OPTIONS.message || '';
32399
- toast.hideDelay = OPTIONS.hideDelay || this.defaults.hideDelay;
32400
- toast.link = OPTIONS.link || '';
32401
- toast.isCloseable = OPTIONS.isCloseable || false;
32402
- var CUSTOM_CLASS = OPTIONS.customClass || '';
32403
- var ALERT_STYLE = OPTIONS.theme || this.defaults.theme;
32404
- var ALERT_POSITION = OPTIONS.position || this.defaults.position;
32405
- var ALERT_ICON = OPTIONS.icon || this.icons.default;
32406
- toast.iconClass = "bhi-" + ALERT_ICON;
32407
- toast.launched = true;
32408
- toast.alertTheme = ALERT_STYLE + " " + ALERT_POSITION + " " + CUSTOM_CLASS + " toast-container launched";
32409
- };
32410
- NovoToastService.prototype.show = function (toast) {
32411
- toast.show = true;
32412
- setTimeout(addClass, 25);
32413
- /**
32414
- * Adds animate class to be called after a timeout
32415
- **/
32416
- function addClass() {
32417
- toast.animate = true;
32418
- }
32419
- };
32420
- NovoToastService.prototype.toastTimer = function (toast) {
32421
- var _this = this;
32422
- if (toast.hideDelay < 0) {
32423
- return;
32424
- }
32425
- setTimeout(function () {
32426
- _this.hide(toast);
32427
- }, toast.hideDelay);
32428
- };
32429
- return NovoToastService;
32430
- }());
32431
- NovoToastService.decorators = [
32432
- { type: core.Injectable }
32433
- ];
32434
- NovoToastService.ctorParameters = function () { return [
32435
- { type: ComponentUtils }
32436
- ]; };
32437
-
32438
32528
  // NG2
32439
32529
  var ControlConfirmModal = /** @class */ (function () {
32440
32530
  function ControlConfirmModal(modalRef, params, labels) {
@@ -34183,7 +34273,7 @@
34183
34273
  NovoControlTemplates.decorators = [
34184
34274
  { type: core.Component, args: [{
34185
34275
  selector: 'novo-control-templates',
34186
- template: "\n <!---Readonly--->\n <ng-template novoTemplate=\"read-only\" let-form=\"form\" let-control>\n <div>{{ form.value[control.key] }}</div>\n </ng-template>\n <!--Textbox--->\n <ng-template novoTemplate=\"textbox\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\" class=\"novo-control-input-container novo-control-input-with-label\" [tooltip]=\"control?.tooltip\" [tooltipPosition]=\"control?.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\">\n <input *ngIf=\"control?.type !== 'number' && control?.textMaskEnabled\" [textMask]=\"control.maskOptions\" [formControlName]=\"control.key\" [id]=\"control.key\" [type]=\"control?.type\" [placeholder]=\"control?.placeholder\" (input)=\"methods.emitChange($event)\" (focus)=\"methods.handleFocus($event)\" (blur)=\"methods.handleBlur($event)\" autocomplete>\n <input *ngIf=\"control?.type !== 'number' && !control?.textMaskEnabled\" [class.maxlength-error]=\"errors?.maxlength\" [formControlName]=\"control.key\" [id]=\"control.key\" [type]=\"control?.type\" [placeholder]=\"control?.placeholder\" (input)=\"methods.emitChange($event)\" [maxlength]=\"control?.maxlength\" (focus)=\"methods.handleFocus($event)\" (blur)=\"methods.handleBlur($event)\" autocomplete>\n <input *ngIf=\"control?.type === 'number' && control?.subType !== 'percentage'\" [class.maxlength-error]=\"errors?.maxlength\" [formControlName]=\"control.key\" [id]=\"control.key\" [type]=\"control?.type\" [placeholder]=\"control?.placeholder\" (keydown)=\"methods.restrictKeys($event)\" (input)=\"methods.emitChange($event)\" [maxlength]=\"control?.maxlength\" (focus)=\"methods.handleFocus($event)\" (blur)=\"methods.handleBlur($event)\" step=\"any\" (mousewheel)=\"numberInput.blur()\" #numberInput>\n <!-- the percentage input does not use formControlName like a normal reactive input because instead of setting the floating point value directly, it is multiplied by 100 into a percentage value -->\n <input *ngIf=\"control?.type === 'number' && control?.subType === 'percentage'\" [id]=\"control.key\" [type]=\"control?.type\" [placeholder]=\"control?.placeholder\" (keydown)=\"methods.restrictKeys($event)\" [value]=\"control?.percentValue\" [disabled]=\"control?.readOnly\" (input)=\"methods.handlePercentChange($event)\" (focus)=\"methods.handleFocus($event)\" (blur)=\"methods.handleBlur($event)\" step=\"any\" (mousewheel)=\"percentInput.blur()\" #percentInput>\n <label class=\"input-label\" *ngIf=\"control?.subType === 'currency'\">{{ control.currencyFormat }}</label>\n <label class=\"input-label\" *ngIf=\"control?.subType === 'percentage'\">%</label>\n </div>\n </ng-template>\n\n <!--Textarea--->\n <ng-template novoTemplate=\"text-area\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div class=\"textarea-container\" [formGroup]=\"form\" [tooltip]=\"control?.tooltip\" [tooltipPosition]=\"control?.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\">\n <textarea [class.maxlength-error]=\"errors?.maxlength\" [name]=\"control.key\" [attr.id]=\"control.key\" [placeholder]=\"control.placeholder\" [formControlName]=\"control.key\" autosize (input)=\"methods.handleTextAreaInput($event)\" (focus)=\"methods.handleFocus($event)\" (blur)=\"methods.handleBlur($event)\" [maxlength]=\"control?.maxlength\"></textarea>\n </div>\n </ng-template>\n\n <!--Editor-->\n <ng-template novoTemplate=\"editor\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\">\n <novo-editor [name]=\"control.key\" [formControlName]=\"control.key\" [startupFocus]=\"control.startupFocus\" [minimal]=\"control.minimal\" [fileBrowserImageUploadUrl]=\"control.fileBrowserImageUploadUrl\" (focus)=\"methods.handleFocus($event)\" (blur)=\"methods.handleBlur($event)\" [config]=\"control.config\"></novo-editor>\n </div>\n </ng-template>\n\n <!--AceEditor-->\n <ng-template novoTemplate=\"ace-editor\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\">\n <novo-ace-editor [name]=\"control.key\" [formControlName]=\"control.key\" (focus)=\"methods.handleFocus($event)\" (blur)=\"methods.handleBlur($event)\"></novo-ace-editor>\n </div>\n </ng-template>\n\n <!--HTML5 Select-->\n <ng-template novoTemplate=\"native-select\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\">\n <select [id]=\"control.key\" [formControlName]=\"control.key\" [tooltip]=\"control.tooltip\" [tooltipPosition]=\"control.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\">\n <option *ngIf=\"control.placeholder\" value=\"\" disabled selected hidden>{{ control.placeholder }}</option>\n <option *ngFor=\"let opt of control.options\" [value]=\"opt.key\">{{opt.value}}</option>\n </select>\n </div>\n </ng-template>\n\n <!--File-->\n <ng-template novoTemplate=\"file\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\">\n <novo-file-input [formControlName]=\"control.key\" [id]=\"control.key\" [name]=\"control.key\" [placeholder]=\"control.placeholder\" [value]=\"control.value\" [multiple]=\"control.multiple\" [layoutOptions]=\"control.layoutOptions\" [tooltip]=\"control.tooltip\" [tooltipPosition]=\"control.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\" (edit)=\"methods.handleEdit($event)\" (save)=\"methods.handleSave($event)\" (delete)=\"methods.handleDelete($event)\" (upload)=\"methods.handleUpload($event)\"></novo-file-input>\n </div>\n </ng-template>\n\n <!--Tiles-->\n <ng-template novoTemplate=\"tiles\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\">\n <novo-tiles [options]=\"control.options\" [formControlName]=\"control.key\" (onChange)=\"methods.modelChange($event)\" [tooltip]=\"control.tooltip\" [tooltipPosition]=\"control.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\" [controlDisabled]=\"control.disabled\"></novo-tiles>\n </div>\n </ng-template>\n\n <!--Picker-->\n <ng-template novoTemplate=\"picker\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\" class=\"novo-control-input-container\">\n <novo-picker [config]=\"control.config\" [formControlName]=\"control.key\" [placeholder]=\"control.placeholder\" [parentScrollSelector]=\"control.parentScrollSelector\" *ngIf=\"!control.multiple\" (select)=\"methods.modelChange($event);\" (changed)=\"methods.modelChangeWithRaw($event)\" (typing)=\"methods.handleTyping($event)\" (focus)=\"methods.handleFocus($event)\" (blur)=\"methods.handleBlur($event)\" [tooltip]=\"control.tooltip\" [tooltipPosition]=\"control.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\"></novo-picker>\n <novo-chips [source]=\"control.config\" [type]=\"control.config.type\" [formControlName]=\"control.key\" [placeholder]=\"control.placeholder\" [maxlength]=\"control?.maxlength\" *ngIf=\"control.multiple && !control.config.columns\" [closeOnSelect]=\"control.closeOnSelect\" (changed)=\"methods.modelChangeWithRaw($event)\" (typing)=\"methods.handleTyping($event)\" (focus)=\"methods.handleFocus($event)\" (blur)=\"methods.handleBlur($event)\" [tooltip]=\"control.tooltip\" [tooltipPosition]=\"control.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\"></novo-chips>\n <novo-row-chips [source]=\"control.config\" [type]=\"control.config.type\" [formControlName]=\"control.key\" [placeholder]=\"control.placeholder\" *ngIf=\"control.multiple && control.config.columns\" [closeOnSelect]=\"control.closeOnSelect\" (changed)=\"methods.modelChangeWithRaw($event)\" (typing)=\"methods.handleTyping($event)\" (focus)=\"methods.handleFocus($event)\" (blur)=\"methods.handleBlur($event)\" [tooltip]=\"control.tooltip\" [tooltipPosition]=\"control.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\"></novo-row-chips>\n </div>\n </ng-template>\n\n <!--Novo Select-->\n <ng-template novoTemplate=\"select\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\">\n <novo-select [options]=\"control.options\" [headerConfig]=\"control.headerConfig\" [placeholder]=\"control.placeholder\" [formControlName]=\"control.key\" [tooltip]=\"control.tooltip\" [tooltipPosition]=\"control.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\" (onSelect)=\"methods.modelChange($event)\"></novo-select>\n </div>\n </ng-template>\n\n <!--Radio-->\n <ng-template novoTemplate=\"radio\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\" class=\"novo-control-input-container\">\n <novo-radio [name]=\"control.key\" [formControlName]=\"control.key\" *ngFor=\"let option of control.options\" [value]=\"option.value\" [label]=\"option.label\" [checked]=\"option.value === form.value[control.key] || (form.value[control.key] && option.value === form.value[control.key].id)\" [tooltip]=\"control.tooltip\" [tooltipPosition]=\"control.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\" [button]=\"!!option.icon\" [icon]=\"option.icon\" [attr.data-automation-id]=\"control.key + '-' + (option?.label || option?.value)\"></novo-radio>\n </div>\n </ng-template>\n\n <!--Time-->\n <ng-template novoTemplate=\"time\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\" class=\"novo-control-input-container\" [tooltip]=\"control?.tooltip\" [tooltipPosition]=\"control?.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\">\n <novo-time-picker-input [attr.id]=\"control.key\" [name]=\"control.key\" [formControlName]=\"control.key\" [placeholder]=\"control.placeholder\" [military]=\"control.military\"></novo-time-picker-input>\n </div>\n </ng-template>\n\n <!--Date-->\n <ng-template novoTemplate=\"date\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\" class=\"novo-control-input-container\" [tooltip]=\"control.tooltip\" [tooltipPosition]=\"control.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\">\n <novo-date-picker-input [attr.id]=\"control.key\" [name]=\"control.key\" [formControlName]=\"control.key\" [start]=\"control.startDate\" [end]=\"control.endDate\" [format]=\"control.dateFormat\" [allowInvalidDate]=\"control.allowInvalidDate\" [textMaskEnabled]=\"control.textMaskEnabled\" [placeholder]=\"control.placeholder\" [weekStart]=\"control.weekStart\" (focusEvent)=\"methods.handleFocus($event)\" (blurEvent)=\"methods.handleBlur($event)\" (changeEvent)=\"methods.emitChange($event)\"></novo-date-picker-input>\n </div>\n </ng-template>\n\n <!--Date and Time-->\n <ng-template novoTemplate=\"date-time\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\" class=\"novo-control-input-container\" [tooltip]=\"control.tooltip\" [tooltipPosition]=\"control.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\">\n <novo-date-time-picker-input [attr.id]=\"control.key\" [name]=\"control.key\" [formControlName]=\"control.key\" [start]=\"control.startDate\" [end]=\"control.endDate\" [placeholder]=\"control.placeholder\" [military]=\"control.military\" [weekStart]=\"control.weekStart\" (focusEvent)=\"methods.handleFocus($event)\" (blurEvent)=\"methods.handleBlur($event)\" (changeEvent)=\"methods.emitChange($event)\" ></novo-date-time-picker-input>\n </div>\n </ng-template>\n\n <!--Address-->\n <ng-template novoTemplate=\"address\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\">\n <novo-address [formControlName]=\"control.key\" [config]=\"control?.config\" [readOnly]=\"control?.readOnly\" (change)=\"methods.handleAddressChange($event)\" (focus)=\"methods.handleFocus($event.event, $event.field)\" (blur)=\"methods.handleBlur($event.event, $event.field)\" (validityChange)=\"methods.updateValidity()\"></novo-address>\n </div>\n </ng-template>\n\n <!--Checkbox-->\n <ng-template novoTemplate=\"checkbox\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\">\n <novo-checkbox [formControlName]=\"control?.key\" [name]=\"control?.key\" [label]=\"control?.checkboxLabel\" [tooltip]=\"control?.tooltip\" [tooltipPosition]=\"control?.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\" [layoutOptions]=\"control?.layoutOptions\"></novo-checkbox>\n </div>\n </ng-template>\n\n <!--Checklist-->\n <ng-template novoTemplate=\"checklist\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\">\n <novo-check-list [formControlName]=\"control.key\" [name]=\"control.key\" [options]=\"control?.options\" [tooltip]=\"control?.tooltip\" [tooltipPosition]=\"control?.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\" (onSelect)=\"methods.modelChange($event)\"></novo-check-list>\n </div>\n </ng-template>\n\n <!--QuickNote-->\n <ng-template novoTemplate=\"quick-note\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\">\n <novo-quick-note [formControlName]=\"control.key\" [startupFocus]=\"control?.startupFocus\" [placeholder]=\"control?.placeholder\" [config]=\"control?.config\" (change)=\"methods.modelChange($event)\" [tooltip]=\"control?.tooltip\" [tooltipPosition]=\"control?.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\" [tooltipPreline]=\"control?.tooltipPreline\"></novo-quick-note>\n </div>\n </ng-template>\n "
34276
+ template: "\n <!---Readonly--->\n <ng-template novoTemplate=\"read-only\" let-form=\"form\" let-control>\n <div>{{ form.value[control.key] }}</div>\n </ng-template>\n <!--Textbox--->\n <ng-template novoTemplate=\"textbox\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\" class=\"novo-control-input-container novo-control-input-with-label\" [tooltip]=\"control?.tooltip\" [tooltipPosition]=\"control?.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\">\n <input *ngIf=\"control?.type !== 'number' && control?.textMaskEnabled\" [textMask]=\"control.maskOptions\" [formControlName]=\"control.key\" [id]=\"control.key\" [type]=\"control?.type\" [placeholder]=\"control?.placeholder\" (input)=\"methods.emitChange($event)\" (focus)=\"methods.handleFocus($event)\" (blur)=\"methods.handleBlur($event)\" autocomplete>\n <input *ngIf=\"control?.type !== 'number' && !control?.textMaskEnabled\" [class.maxlength-error]=\"errors?.maxlength\" [formControlName]=\"control.key\" [id]=\"control.key\" [type]=\"control?.type\" [placeholder]=\"control?.placeholder\" (input)=\"methods.emitChange($event)\" [maxlength]=\"control?.maxlength\" (focus)=\"methods.handleFocus($event)\" (blur)=\"methods.handleBlur($event)\" autocomplete>\n <input *ngIf=\"control?.type === 'number' && control?.subType !== 'percentage'\" [class.maxlength-error]=\"errors?.maxlength\" [formControlName]=\"control.key\" [id]=\"control.key\" [type]=\"control?.type\" [placeholder]=\"control?.placeholder\" (keydown)=\"methods.restrictKeys($event)\" (input)=\"methods.emitChange($event)\" [maxlength]=\"control?.maxlength\" (focus)=\"methods.handleFocus($event)\" (blur)=\"methods.handleBlur($event)\" step=\"any\" (mousewheel)=\"numberInput.blur()\" #numberInput>\n <!-- the percentage input does not use formControlName like a normal reactive input because instead of setting the floating point value directly, it is multiplied by 100 into a percentage value -->\n <input *ngIf=\"control?.type === 'number' && control?.subType === 'percentage'\" [id]=\"control.key\" [type]=\"control?.type\" [placeholder]=\"control?.placeholder\" (keydown)=\"methods.restrictKeys($event)\" [value]=\"control?.percentValue\" [disabled]=\"control?.readOnly\" (input)=\"methods.handlePercentChange($event)\" (focus)=\"methods.handleFocus($event)\" (blur)=\"methods.handleBlur($event)\" step=\"any\" (mousewheel)=\"percentInput.blur()\" #percentInput>\n <label class=\"input-label\" *ngIf=\"control?.subType === 'currency'\">{{ control.currencyFormat }}</label>\n <label class=\"input-label\" *ngIf=\"control?.subType === 'percentage'\">%</label>\n </div>\n </ng-template>\n\n <!--Textarea--->\n <ng-template novoTemplate=\"text-area\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div class=\"textarea-container\" [formGroup]=\"form\" [tooltip]=\"control?.tooltip\" [tooltipPosition]=\"control?.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\">\n <textarea [class.maxlength-error]=\"errors?.maxlength\" [name]=\"control.key\" [attr.id]=\"control.key\" [placeholder]=\"control.placeholder\" [formControlName]=\"control.key\" autosize (input)=\"methods.handleTextAreaInput($event)\" (focus)=\"methods.handleFocus($event)\" (blur)=\"methods.handleBlur($event)\" [maxlength]=\"control?.maxlength\"></textarea>\n </div>\n </ng-template>\n\n <!--Editor-->\n <ng-template novoTemplate=\"editor\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\">\n <novo-editor [name]=\"control.key\" [formControlName]=\"control.key\" [startupFocus]=\"control.startupFocus\" [minimal]=\"control.minimal\" [fileBrowserImageUploadUrl]=\"control.fileBrowserImageUploadUrl\" (focus)=\"methods.handleFocus($event)\" (blur)=\"methods.handleBlur($event)\" [config]=\"control.config\"></novo-editor>\n </div>\n </ng-template>\n\n <!--AceEditor-->\n <ng-template novoTemplate=\"ace-editor\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\">\n <novo-ace-editor [name]=\"control.key\" [formControlName]=\"control.key\" (focus)=\"methods.handleFocus($event)\" (blur)=\"methods.handleBlur($event)\"></novo-ace-editor>\n </div>\n </ng-template>\n\n <!--HTML5 Select-->\n <ng-template novoTemplate=\"native-select\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\">\n <select [id]=\"control.key\" [formControlName]=\"control.key\" [tooltip]=\"control.tooltip\" [tooltipPosition]=\"control.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\">\n <option *ngIf=\"control.placeholder\" value=\"\" disabled selected hidden>{{ control.placeholder }}</option>\n <option *ngFor=\"let opt of control.options\" [value]=\"opt.key\">{{opt.value}}</option>\n </select>\n </div>\n </ng-template>\n\n <!--File-->\n <ng-template novoTemplate=\"file\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\">\n <novo-file-input [formControlName]=\"control.key\" [id]=\"control.key\" [name]=\"control.key\" [placeholder]=\"control.placeholder\" [value]=\"control.value\" [multiple]=\"control.multiple\" [layoutOptions]=\"control.layoutOptions\" [tooltip]=\"control.tooltip\" [tooltipPosition]=\"control.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\" (edit)=\"methods.handleEdit($event)\" (save)=\"methods.handleSave($event)\" (delete)=\"methods.handleDelete($event)\" (upload)=\"methods.handleUpload($event)\"></novo-file-input>\n </div>\n </ng-template>\n\n <!--Tiles-->\n <ng-template novoTemplate=\"tiles\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\">\n <novo-tiles [options]=\"control.options\" [formControlName]=\"control.key\" (onChange)=\"methods.modelChange($event)\" [tooltip]=\"control.tooltip\" [tooltipPosition]=\"control.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\" [controlDisabled]=\"control.disabled\"></novo-tiles>\n </div>\n </ng-template>\n\n <!--Picker-->\n <ng-template novoTemplate=\"picker\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\" class=\"novo-control-input-container\">\n <novo-picker [config]=\"control.config\" [formControlName]=\"control.key\" [placeholder]=\"control.placeholder\" [parentScrollSelector]=\"control.parentScrollSelector\" *ngIf=\"!control.multiple\" (select)=\"methods.modelChange($event);\" (changed)=\"methods.modelChangeWithRaw($event)\" (typing)=\"methods.handleTyping($event)\" (focus)=\"methods.handleFocus($event)\" (blur)=\"methods.handleBlur($event)\" [tooltip]=\"control.tooltip\" [tooltipPosition]=\"control.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\"></novo-picker>\n <novo-chips [source]=\"control.config\" [type]=\"control.config.type\" [formControlName]=\"control.key\" [placeholder]=\"control.placeholder\" [maxlength]=\"control?.maxlength\" *ngIf=\"control.multiple && !control.config.columns\" [closeOnSelect]=\"control.closeOnSelect\" (changed)=\"methods.modelChangeWithRaw($event)\" (typing)=\"methods.handleTyping($event)\" (focus)=\"methods.handleFocus($event)\" (blur)=\"methods.handleBlur($event)\" [tooltip]=\"control.tooltip\" [tooltipPosition]=\"control.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\"></novo-chips>\n <novo-row-chips [source]=\"control.config\" [type]=\"control.config.type\" [formControlName]=\"control.key\" [placeholder]=\"control.placeholder\" *ngIf=\"control.multiple && control.config.columns\" [closeOnSelect]=\"control.closeOnSelect\" (changed)=\"methods.modelChangeWithRaw($event)\" (typing)=\"methods.handleTyping($event)\" (focus)=\"methods.handleFocus($event)\" (blur)=\"methods.handleBlur($event)\" [tooltip]=\"control.tooltip\" [tooltipPosition]=\"control.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\"></novo-row-chips>\n </div>\n </ng-template>\n\n <!--Novo Select-->\n <ng-template novoTemplate=\"select\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\">\n <novo-select [options]=\"control.options\" [headerConfig]=\"control.headerConfig\" [placeholder]=\"control.placeholder\" [formControlName]=\"control.key\" [tooltip]=\"control.tooltip\" [tooltipPosition]=\"control.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\" (onSelect)=\"methods.modelChange($event)\"></novo-select>\n </div>\n </ng-template>\n\n <!--Radio-->\n <ng-template novoTemplate=\"radio\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\" class=\"novo-control-input-container\">\n <novo-radio [name]=\"control.key\" [formControlName]=\"control.key\" *ngFor=\"let option of control.options\" [value]=\"option.value\" [label]=\"option.label\" [checked]=\"option.value === form.value[control.key] || (form.value[control.key] && option.value === form.value[control.key].id)\" [tooltip]=\"control.tooltip\" [tooltipPosition]=\"control.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\" [button]=\"!!option.icon\" [icon]=\"option.icon\" [attr.data-automation-id]=\"control.key + '-' + (option?.label || option?.value)\"></novo-radio>\n </div>\n </ng-template>\n\n <!--Time-->\n <ng-template novoTemplate=\"time\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\" class=\"novo-control-input-container\" [tooltip]=\"control?.tooltip\" [tooltipPosition]=\"control?.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\">\n <novo-time-picker-input [attr.id]=\"control.key\" [name]=\"control.key\" [formControlName]=\"control.key\" [placeholder]=\"control.placeholder\" [military]=\"control.military\"></novo-time-picker-input>\n </div>\n </ng-template>\n\n <!--Date-->\n <ng-template novoTemplate=\"date\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\" class=\"novo-control-input-container\" [tooltip]=\"control.tooltip\" [tooltipPosition]=\"control.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\">\n <novo-date-picker-input [attr.id]=\"control.key\" [name]=\"control.key\" [formControlName]=\"control.key\" [start]=\"control.startDate\" [end]=\"control.endDate\" [disabledDateMessage]=\"control.disabledDateMessage\" [format]=\"control.dateFormat\" [allowInvalidDate]=\"control.allowInvalidDate\" [textMaskEnabled]=\"control.textMaskEnabled\" [placeholder]=\"control.placeholder\" [weekStart]=\"control.weekStart\" (focusEvent)=\"methods.handleFocus($event)\" (blurEvent)=\"methods.handleBlur($event)\" (changeEvent)=\"methods.emitChange($event)\"></novo-date-picker-input>\n </div>\n </ng-template>\n\n <!--Date and Time-->\n <ng-template novoTemplate=\"date-time\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\" class=\"novo-control-input-container\" [tooltip]=\"control.tooltip\" [tooltipPosition]=\"control.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\">\n <novo-date-time-picker-input [attr.id]=\"control.key\" [name]=\"control.key\" [formControlName]=\"control.key\" [start]=\"control.startDate\" [end]=\"control.endDate\" [placeholder]=\"control.placeholder\" [military]=\"control.military\" [weekStart]=\"control.weekStart\" (focusEvent)=\"methods.handleFocus($event)\" (blurEvent)=\"methods.handleBlur($event)\" (changeEvent)=\"methods.emitChange($event)\" ></novo-date-time-picker-input>\n </div>\n </ng-template>\n\n <!--Address-->\n <ng-template novoTemplate=\"address\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\">\n <novo-address [formControlName]=\"control.key\" [config]=\"control?.config\" [readOnly]=\"control?.readOnly\" (change)=\"methods.handleAddressChange($event)\" (focus)=\"methods.handleFocus($event.event, $event.field)\" (blur)=\"methods.handleBlur($event.event, $event.field)\" (validityChange)=\"methods.updateValidity()\"></novo-address>\n </div>\n </ng-template>\n\n <!--Checkbox-->\n <ng-template novoTemplate=\"checkbox\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\">\n <novo-checkbox [formControlName]=\"control?.key\" [name]=\"control?.key\" [label]=\"control?.checkboxLabel\" [tooltip]=\"control?.tooltip\" [tooltipPosition]=\"control?.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\" [layoutOptions]=\"control?.layoutOptions\"></novo-checkbox>\n </div>\n </ng-template>\n\n <!--Checklist-->\n <ng-template novoTemplate=\"checklist\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\">\n <novo-check-list [formControlName]=\"control.key\" [name]=\"control.key\" [options]=\"control?.options\" [tooltip]=\"control?.tooltip\" [tooltipPosition]=\"control?.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [tooltipPreline]=\"control?.tooltipPreline\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\" (onSelect)=\"methods.modelChange($event)\"></novo-check-list>\n </div>\n </ng-template>\n\n <!--QuickNote-->\n <ng-template novoTemplate=\"quick-note\" let-control let-form=\"form\" let-errors=\"errors\" let-methods=\"methods\">\n <div [formGroup]=\"form\">\n <novo-quick-note [formControlName]=\"control.key\" [startupFocus]=\"control?.startupFocus\" [placeholder]=\"control?.placeholder\" [config]=\"control?.config\" (change)=\"methods.modelChange($event)\" [tooltip]=\"control?.tooltip\" [tooltipPosition]=\"control?.tooltipPosition\" [tooltipSize]=\"control?.tooltipSize\" [removeTooltipArrow]=\"control?.removeTooltipArrow\" [tooltipAutoPosition]=\"control?.tooltipAutoPosition\" [tooltipPreline]=\"control?.tooltipPreline\"></novo-quick-note>\n </div>\n </ng-template>\n "
34187
34277
  },] }
34188
34278
  ];
34189
34279
  NovoControlTemplates.ctorParameters = function () { return [