novo-elements 5.11.0 → 5.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3168,6 +3168,7 @@
3168
3168
  this.noItems = 'There are no items';
3169
3169
  this.dateFormat = 'MM/dd/yyyy';
3170
3170
  this.dateFormatPlaceholder = 'MM/DD/YYYY';
3171
+ this.localDatePlaceholder = 'mm/dd/yyyy';
3171
3172
  this.timeFormatPlaceholderAM = 'hh:mm AM';
3172
3173
  this.timeFormatPlaceholder24Hour = 'HH:mm';
3173
3174
  this.timeFormatAM = 'AM';
@@ -3216,6 +3217,9 @@
3216
3217
  NovoLabelService.prototype.dateFormatString = function () {
3217
3218
  return this.dateFormat;
3218
3219
  };
3220
+ NovoLabelService.prototype.localizedDatePlaceholder = function () {
3221
+ return this.localDatePlaceholder;
3222
+ };
3219
3223
  NovoLabelService.prototype.tabbedGroupClearSuggestion = function (tabLabelPlural) {
3220
3224
  return "Clear your search to see all " + tabLabelPlural + ".";
3221
3225
  };
@@ -8030,8 +8034,10 @@
8030
8034
  this.templates = {};
8031
8035
  this.fixedHeader = false;
8032
8036
  this.maxSelected = undefined;
8037
+ this.canSelectAll = false;
8033
8038
  this._hideGlobalSearch = true;
8034
8039
  this.preferencesChanged = new core.EventEmitter();
8040
+ this.allSelected = new core.EventEmitter();
8035
8041
  this.loading = true;
8036
8042
  this.columnToTemplate = {};
8037
8043
  this.columnsLoaded = false;
@@ -8371,6 +8377,10 @@
8371
8377
  this.state.onSelectionChange();
8372
8378
  };
8373
8379
  NovoDataTable.prototype.allCurrentRowsSelected = function () {
8380
+ var _a, _b;
8381
+ if (!((_b = (_a = this.dataSource) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.length)) {
8382
+ return false;
8383
+ }
8374
8384
  for (var i = 0; i < (this.dataSource.data || []).length; i++) {
8375
8385
  if (!this.isSelected((this.dataSource.data || [])[i])) {
8376
8386
  return false;
@@ -8458,11 +8468,11 @@
8458
8468
  this.ref.markForCheck();
8459
8469
  };
8460
8470
  NovoDataTable.prototype.performInteractions = function (event) {
8461
- var e_1, _b;
8471
+ var e_1, _c;
8462
8472
  if (this.listInteractions) {
8463
8473
  try {
8464
- for (var _c = __values(this.columns), _d = _c.next(); !_d.done; _d = _c.next()) {
8465
- var column = _d.value;
8474
+ for (var _d = __values(this.columns), _e = _d.next(); !_e.done; _e = _d.next()) {
8475
+ var column = _e.value;
8466
8476
  var allListColumnInteractions = this.listInteractions[column.id];
8467
8477
  var listColumnInteraction = allListColumnInteractions && allListColumnInteractions.find(function (int) { return int.event.includes(event); });
8468
8478
  if (listColumnInteraction) {
@@ -8473,7 +8483,7 @@
8473
8483
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
8474
8484
  finally {
8475
8485
  try {
8476
- if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
8486
+ if (_e && !_e.done && (_c = _d.return)) _c.call(_d);
8477
8487
  }
8478
8488
  finally { if (e_1) throw e_1.error; }
8479
8489
  }
@@ -8491,7 +8501,7 @@
8491
8501
  animations.transition('void <=> *', animations.animate('70ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
8492
8502
  ]),
8493
8503
  ],
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 ",
8504
+ 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\" [canSelectAll]=\"canSelectAll\"></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 ",
8495
8505
  changeDetection: core.ChangeDetectionStrategy.OnPush,
8496
8506
  providers: [DataTableState]
8497
8507
  },] }
@@ -8522,6 +8532,7 @@
8522
8532
  fixedHeader: [{ type: core.Input }],
8523
8533
  paginatorDataFeatureId: [{ type: core.Input }],
8524
8534
  maxSelected: [{ type: core.Input }],
8535
+ canSelectAll: [{ type: core.Input }],
8525
8536
  dataTableService: [{ type: core.Input }],
8526
8537
  rows: [{ type: core.Input }],
8527
8538
  outsideFilter: [{ type: core.Input }],
@@ -8532,6 +8543,7 @@
8532
8543
  forceShowHeader: [{ type: core.Input }],
8533
8544
  hideGlobalSearch: [{ type: core.Input }],
8534
8545
  preferencesChanged: [{ type: core.Output }],
8546
+ allSelected: [{ type: core.Output }],
8535
8547
  empty: [{ type: core.HostBinding, args: ['class.empty',] }],
8536
8548
  loadingClass: [{ type: core.HostBinding, args: ['class.loading',] }],
8537
8549
  listInteractions: [{ type: core.Input }]
@@ -28252,6 +28264,7 @@
28252
28264
  var month;
28253
28265
  var day;
28254
28266
  var date = new Date();
28267
+ var isInvalidDate = true;
28255
28268
  if (Helpers.isEmpty(dateFormat)) {
28256
28269
  // Default to MM/dd/yyyy
28257
28270
  dateFormat = 'mm/dd/yyyy';
@@ -28275,6 +28288,7 @@
28275
28288
  }
28276
28289
  if (month >= 0 && month <= 11 && year > 1900 && day > 0 && day <= 31) {
28277
28290
  date = new Date(year, month, day);
28291
+ isInvalidDate = false;
28278
28292
  }
28279
28293
  }
28280
28294
  else if (dateFormatTokens && dateFormatTokens.length === 4 && dateString.length >= 1) {
@@ -28289,7 +28303,7 @@
28289
28303
  dateString = "" + dateString + delimiter[1];
28290
28304
  }
28291
28305
  }
28292
- return [date, dateString];
28306
+ return [date, dateString, isInvalidDate];
28293
28307
  };
28294
28308
  DateFormatService.prototype.parseTimeString = function (timeString, militaryTime) {
28295
28309
  var e_2, _a;
@@ -28410,6 +28424,7 @@
28410
28424
  this._changeDetectorRef = _changeDetectorRef;
28411
28425
  this.dateFormatService = dateFormatService;
28412
28426
  this.formattedValue = '';
28427
+ this.invalidDateErrorMessage = '';
28413
28428
  /** View -> model callback called when value changes */
28414
28429
  this._onChange = function () { };
28415
28430
  /** View -> model callback called when autocomplete has been touched */
@@ -28421,7 +28436,7 @@
28421
28436
  this.blurEvent = new core.EventEmitter();
28422
28437
  this.focusEvent = new core.EventEmitter();
28423
28438
  this.changeEvent = new core.EventEmitter();
28424
- this.placeholder = this.labels.dateFormatString().toUpperCase() || this.labels.dateFormatPlaceholder;
28439
+ this.placeholder = this.labels.localizedDatePlaceholder();
28425
28440
  }
28426
28441
  NovoDatePickerInputElement.prototype.ngOnInit = function () {
28427
28442
  this.userDefinedFormat = this.format ? !this.format.match(/^(DD\/MM\/YYYY|MM\/DD\/YYYY)$/g) : false;
@@ -28436,6 +28451,7 @@
28436
28451
  else {
28437
28452
  this.maskOptions = { mask: false };
28438
28453
  }
28454
+ this.setupInvalidDateErrorMessage();
28439
28455
  };
28440
28456
  /** BEGIN: Convenient Panel Methods. */
28441
28457
  NovoDatePickerInputElement.prototype.openPanel = function () {
@@ -28467,9 +28483,11 @@
28467
28483
  }
28468
28484
  };
28469
28485
  NovoDatePickerInputElement.prototype._handleBlur = function (event) {
28486
+ this.handleInvalidDate();
28470
28487
  this.blurEvent.emit(event);
28471
28488
  };
28472
28489
  NovoDatePickerInputElement.prototype._handleFocus = function (event) {
28490
+ this.showInvalidDateError = false;
28473
28491
  this.openPanel();
28474
28492
  this.focusEvent.emit(event);
28475
28493
  };
@@ -28486,7 +28504,8 @@
28486
28504
  };
28487
28505
  NovoDatePickerInputElement.prototype.formatDate = function (value, blur) {
28488
28506
  try {
28489
- var _a = __read(this.dateFormatService.parseString(value, false, 'date'), 2), dateTimeValue = _a[0], formatted = _a[1];
28507
+ var _a = __read(this.dateFormatService.parseString(value, false, 'date'), 3), dateTimeValue = _a[0], formatted = _a[1], isInvalidDate = _a[2];
28508
+ this.isInvalidDate = isInvalidDate;
28490
28509
  if (!isNaN(dateTimeValue.getUTCDate())) {
28491
28510
  var dt = new Date(dateTimeValue);
28492
28511
  this.dispatchOnChange(dt, blur);
@@ -28510,6 +28529,24 @@
28510
28529
  NovoDatePickerInputElement.prototype.setDisabledState = function (disabled) {
28511
28530
  this.disabled = disabled;
28512
28531
  };
28532
+ NovoDatePickerInputElement.prototype.handleInvalidDate = function () {
28533
+ if (this.isInvalidDate && this.value) {
28534
+ this.showInvalidDateError = true;
28535
+ this.clearValue();
28536
+ this.closePanel();
28537
+ }
28538
+ };
28539
+ NovoDatePickerInputElement.prototype.setupInvalidDateErrorMessage = function () {
28540
+ var dateFormat = this.labels.dateFormatString();
28541
+ if (Helpers.isEmpty(dateFormat)) {
28542
+ // Default to mm/dd/yyyy
28543
+ dateFormat = 'mm/dd/yyyy';
28544
+ }
28545
+ else {
28546
+ dateFormat = dateFormat.toLowerCase();
28547
+ }
28548
+ this.invalidDateErrorMessage = "Invalid date field entered. Date format of " + dateFormat + " is required.";
28549
+ };
28513
28550
  NovoDatePickerInputElement.prototype.dispatchOnChange = function (newValue, blur, skip) {
28514
28551
  if (blur === void 0) { blur = false; }
28515
28552
  if (skip === void 0) { skip = false; }
@@ -28602,7 +28639,7 @@
28602
28639
  { type: core.Component, args: [{
28603
28640
  selector: 'novo-date-picker-input',
28604
28641
  providers: [DATE_VALUE_ACCESSOR],
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 "
28642
+ 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 <span class=\"error-text\" *ngIf=\"showInvalidDateError\">{{invalidDateErrorMessage}}</span>\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 "
28606
28643
  },] }
28607
28644
  ];
28608
28645
  NovoDatePickerInputElement.ctorParameters = function () { return [
@@ -29123,28 +29160,41 @@
29123
29160
  _this.toaster = toaster;
29124
29161
  _this.role = 'columnheader';
29125
29162
  _this.maxSelected = undefined;
29163
+ _this.canSelectAll = false;
29126
29164
  _this.checked = false;
29127
29165
  renderer.setAttribute(elementRef.nativeElement, 'data-automation-id', "novo-checkbox-column-header-" + columnDef.cssClassFriendlyName);
29128
29166
  renderer.addClass(elementRef.nativeElement, "novo-checkbox-column-" + columnDef.cssClassFriendlyName);
29129
29167
  renderer.addClass(elementRef.nativeElement, 'novo-data-table-checkbox-header-cell');
29130
29168
  _this.selectionSubscription = _this.dataTable.state.selectionSource.subscribe(function () {
29131
29169
  _this.checked = _this.dataTable.allCurrentRowsSelected();
29170
+ if (_this.canSelectAll) {
29171
+ _this.selectAllChanged();
29172
+ }
29132
29173
  _this.ref.markForCheck();
29133
29174
  });
29134
29175
  _this.paginationSubscription = _this.dataTable.state.paginationSource.subscribe(function (event) {
29135
29176
  if (event.isPageSizeChange) {
29136
29177
  _this.checked = false;
29178
+ if (_this.canSelectAll) {
29179
+ _this.selectAllChanged();
29180
+ }
29137
29181
  _this.dataTable.selectRows(false);
29138
29182
  _this.dataTable.state.checkRetainment('pageSize');
29139
29183
  _this.dataTable.state.reset(false, true);
29140
29184
  }
29141
29185
  else {
29142
29186
  _this.checked = _this.dataTable.allCurrentRowsSelected();
29187
+ if (_this.canSelectAll) {
29188
+ _this.selectAllChanged();
29189
+ }
29143
29190
  }
29144
29191
  _this.ref.markForCheck();
29145
29192
  });
29146
29193
  _this.resetSubscription = _this.dataTable.state.resetSource.subscribe(function () {
29147
29194
  _this.checked = false;
29195
+ if (_this.canSelectAll) {
29196
+ _this.selectAllChanged();
29197
+ }
29148
29198
  _this.ref.markForCheck();
29149
29199
  });
29150
29200
  return _this;
@@ -29179,6 +29229,17 @@
29179
29229
  else {
29180
29230
  this.dataTable.selectRows(!this.checked);
29181
29231
  }
29232
+ if (this.canSelectAll) {
29233
+ this.selectAllChanged();
29234
+ }
29235
+ };
29236
+ NovoDataTableCheckboxHeaderCell.prototype.selectAllChanged = function () {
29237
+ var _a, _b, _c;
29238
+ var allSelectedEvent = {
29239
+ allSelected: this.checked,
29240
+ selectedCount: (_c = (_b = (_a = this.dataTable) === null || _a === void 0 ? void 0 : _a.state) === null || _b === void 0 ? void 0 : _b.selected) === null || _c === void 0 ? void 0 : _c.length,
29241
+ };
29242
+ this.dataTable.allSelected.emit(allSelectedEvent);
29182
29243
  };
29183
29244
  return NovoDataTableCheckboxHeaderCell;
29184
29245
  }(table.CdkHeaderCell));
@@ -29199,7 +29260,8 @@
29199
29260
  ]; };
29200
29261
  NovoDataTableCheckboxHeaderCell.propDecorators = {
29201
29262
  role: [{ type: core.HostBinding, args: ['attr.role',] }],
29202
- maxSelected: [{ type: core.Input }]
29263
+ maxSelected: [{ type: core.Input }],
29264
+ canSelectAll: [{ type: core.Input }]
29203
29265
  };
29204
29266
 
29205
29267
  var NovoDataTableHeaderCell = /** @class */ (function (_super) {