novo-elements 5.6.1 → 5.10.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 (39) hide show
  1. package/bundles/novo-elements.umd.js +312 -218
  2. package/bundles/novo-elements.umd.js.map +1 -1
  3. package/bundles/novo-elements.umd.min.js +2 -2
  4. package/bundles/novo-elements.umd.min.js.map +1 -1
  5. package/elements/chips/Chips.scss +6 -0
  6. package/elements/data-table/cell-headers/data-table-checkbox-header-cell.component.d.ts +5 -1
  7. package/elements/data-table/cells/data-table-checkbox-cell.component.d.ts +3 -0
  8. package/elements/data-table/data-table-clear-button.component.d.ts +2 -0
  9. package/elements/data-table/data-table.component.d.ts +3 -1
  10. package/elements/data-table/data-table.component.scss +5 -1
  11. package/elements/data-table/interfaces.d.ts +3 -0
  12. package/elements/data-table/state/data-table-state.service.d.ts +6 -2
  13. package/elements/form/FormInterfaces.d.ts +1 -0
  14. package/elements/picker/extras/entity-picker-results/EntityPickerResults.d.ts +1 -0
  15. package/esm2015/elements/data-table/cell-headers/data-table-checkbox-header-cell.component.js +26 -6
  16. package/esm2015/elements/data-table/cells/data-table-checkbox-cell.component.js +16 -5
  17. package/esm2015/elements/data-table/data-table-clear-button.component.js +9 -1
  18. package/esm2015/elements/data-table/data-table.component.js +8 -3
  19. package/esm2015/elements/data-table/data-table.source.js +5 -2
  20. package/esm2015/elements/data-table/interfaces.js +1 -1
  21. package/esm2015/elements/data-table/pagination/data-table-pagination.component.js +4 -1
  22. package/esm2015/elements/data-table/sort-filter/sort-filter.directive.js +3 -1
  23. package/esm2015/elements/data-table/state/data-table-state.service.js +31 -7
  24. package/esm2015/elements/expansion/expansion-panel.js +1 -1
  25. package/esm2015/elements/form/FormInterfaces.js +1 -1
  26. package/esm2015/elements/form/extras/address/Address.js +5 -1
  27. package/esm2015/elements/picker/extras/entity-picker-results/EntityPickerResults.js +31 -1
  28. package/esm2015/index.js +1 -1
  29. package/esm2015/services/novo-label-service.js +2 -1
  30. package/esm2015/utils/app-bridge/AppBridge.js +1 -1
  31. package/esm2015/utils/form-utils/FormUtils.js +2 -1
  32. package/fesm2015/novo-elements.js +326 -215
  33. package/fesm2015/novo-elements.js.map +1 -1
  34. package/index.d.ts +1 -1
  35. package/novo-elements.metadata.json +1 -1
  36. package/package.json +1 -1
  37. package/services/novo-label-service.d.ts +1 -0
  38. package/styles/global/variables.scss +4 -1
  39. package/utils/app-bridge/AppBridge.d.ts +1 -1
@@ -2971,6 +2971,7 @@ class NovoLabelService {
2971
2971
  this.clearAllNormalCase = 'Clear All';
2972
2972
  this.clearSort = 'Clear Sort';
2973
2973
  this.clearFilter = 'Clear Filter';
2974
+ this.clearSelected = 'Clear Selected';
2974
2975
  this.today = 'Today';
2975
2976
  this.now = 'Now';
2976
2977
  this.isRequired = 'is required';
@@ -5747,6 +5748,8 @@ class EntityPickerResult {
5747
5748
  return 'user';
5748
5749
  case 'CorporationDepartment':
5749
5750
  return 'department';
5751
+ case 'JobShift':
5752
+ return 'timetable contract';
5750
5753
  default:
5751
5754
  return '';
5752
5755
  }
@@ -5760,6 +5763,14 @@ class EntityPickerResult {
5760
5763
  }
5761
5764
  return timestamp;
5762
5765
  }
5766
+ renderTimeNoOffset(dateStr) {
5767
+ let timestamp = '';
5768
+ if (dateStr) {
5769
+ dateStr = dateStr.slice(0, 19);
5770
+ timestamp = this.labels.formatTime(dateStr);
5771
+ }
5772
+ return timestamp;
5773
+ }
5763
5774
  getNameForResult(result) {
5764
5775
  if (result) {
5765
5776
  switch (result.searchEntity) {
@@ -5828,6 +5839,26 @@ EntityPickerResult.decorators = [
5828
5839
  <i class="bhi-calendar"></i>
5829
5840
  <span [innerHtml]="renderTimestamp(match.data.dateBegin) + ' - ' + renderTimestamp(match.data.dateEnd)"></span>
5830
5841
  </p>
5842
+ <!-- START Date -->
5843
+ <p class="start-date" *ngIf="match.data.startTime && match.data.searchEntity === 'JobShift'">
5844
+ <i class="bhi-calendar"></i>
5845
+ <span [innerHtml]="renderTimestamp(match.data.startTime)"></span>
5846
+ </p>
5847
+ <!-- START & END TIME -->
5848
+ <p class="start-time" *ngIf="match.data.startTime && match.data.searchEntity === 'JobShift'">
5849
+ <i class="bhi-clock"></i>
5850
+ <span [innerHtml]="renderTimeNoOffset(match.data.startTime) + ' - ' + renderTimeNoOffset(match.data.endTime)"></span>
5851
+ </p>
5852
+ <!-- JOBORDER -->
5853
+ <p class="job" *ngIf="match.data.jobOrder && match.data.searchEntity === 'JobShift'">
5854
+ <i class="bhi-job"></i>
5855
+ <span [innerHtml]="highlight(match.data.jobOrder.title, term)"></span>
5856
+ </p>
5857
+ <!-- OPENINGS -->
5858
+ <p class="openings" *ngIf="match.data.openings && match.data.searchEntity === 'JobShift'">
5859
+ <i class="bhi-candidate"></i>
5860
+ <span>{{ match.data.numAssigned }} / {{ match.data.openings }}</span>
5861
+ </p>
5831
5862
  <!-- EMAIL -->
5832
5863
  <p class="email" *ngIf="match.data.email">
5833
5864
  <i class="bhi-email"></i> <span [innerHtml]="highlight(match.data.email, term)"></span>
@@ -7169,6 +7200,7 @@ class DataTableState {
7169
7200
  this.expandedRows = new Set();
7170
7201
  this.isForceRefresh = false;
7171
7202
  this.updates = new EventEmitter();
7203
+ this.retainSelected = false;
7172
7204
  }
7173
7205
  get userFiltered() {
7174
7206
  return !!(this.filter || this.sort || this.globalSearch || this.outsideFilter);
@@ -7186,9 +7218,12 @@ class DataTableState {
7186
7218
  this.filter = undefined;
7187
7219
  }
7188
7220
  this.page = 0;
7189
- this.selectedRows.clear();
7190
- this.resetSource.next();
7221
+ if (!this.retainSelected) {
7222
+ this.selectedRows.clear();
7223
+ this.resetSource.next();
7224
+ }
7191
7225
  this.onSortFilterChange();
7226
+ this.retainSelected = false;
7192
7227
  if (fireUpdate) {
7193
7228
  this.updates.emit({
7194
7229
  sort: this.sort,
@@ -7200,8 +7235,8 @@ class DataTableState {
7200
7235
  clearSort(fireUpdate = true) {
7201
7236
  this.sort = undefined;
7202
7237
  this.page = 0;
7203
- this.selectedRows.clear();
7204
- this.resetSource.next();
7238
+ this.checkRetainment('sort');
7239
+ this.reset(fireUpdate, true);
7205
7240
  this.onSortFilterChange();
7206
7241
  if (fireUpdate) {
7207
7242
  this.updates.emit({
@@ -7215,8 +7250,8 @@ class DataTableState {
7215
7250
  this.filter = undefined;
7216
7251
  this.globalSearch = undefined;
7217
7252
  this.page = 0;
7218
- this.selectedRows.clear();
7219
- this.resetSource.next();
7253
+ this.checkRetainment('filter');
7254
+ this.reset(fireUpdate, true);
7220
7255
  this.onSortFilterChange();
7221
7256
  if (fireUpdate) {
7222
7257
  this.updates.emit({
@@ -7226,6 +7261,19 @@ class DataTableState {
7226
7261
  });
7227
7262
  }
7228
7263
  }
7264
+ clearSelected(fireUpdate = true) {
7265
+ this.globalSearch = undefined;
7266
+ this.page = 0;
7267
+ this.reset(fireUpdate, true);
7268
+ this.onSelectionChange();
7269
+ if (fireUpdate) {
7270
+ this.updates.emit({
7271
+ sort: this.sort,
7272
+ filter: this.filter,
7273
+ globalSearch: this.globalSearch,
7274
+ });
7275
+ }
7276
+ }
7229
7277
  onSelectionChange() {
7230
7278
  this.selectionSource.next();
7231
7279
  }
@@ -7233,9 +7281,12 @@ class DataTableState {
7233
7281
  this.expandSource.next(targetId);
7234
7282
  }
7235
7283
  onPaginationChange(isPageSizeChange, pageSize) {
7284
+ this.checkRetainment('page');
7236
7285
  this.paginationSource.next({ isPageSizeChange, pageSize });
7237
7286
  }
7238
7287
  onSortFilterChange() {
7288
+ this.checkRetainment('sort');
7289
+ this.checkRetainment('filter');
7239
7290
  this.sortFilterSource.next({
7240
7291
  sort: this.sort,
7241
7292
  filter: this.filter,
@@ -7259,6 +7310,10 @@ class DataTableState {
7259
7310
  }
7260
7311
  }
7261
7312
  }
7313
+ checkRetainment(caller) {
7314
+ var _a;
7315
+ this.retainSelected = ((_a = this.selectionOptions) === null || _a === void 0 ? void 0 : _a.some(option => option.label === caller)) || this.retainSelected;
7316
+ }
7262
7317
  }
7263
7318
  DataTableState.decorators = [
7264
7319
  { type: Injectable }
@@ -7269,6 +7324,7 @@ class NovoDataTableClearButton {
7269
7324
  this.state = state;
7270
7325
  this.ref = ref;
7271
7326
  this.labels = labels;
7327
+ this.selectedClear = new EventEmitter();
7272
7328
  this.sortClear = new EventEmitter();
7273
7329
  this.filterClear = new EventEmitter();
7274
7330
  this.allClear = new EventEmitter();
@@ -7281,9 +7337,14 @@ class NovoDataTableClearButton {
7281
7337
  this.state.clearFilter();
7282
7338
  this.filterClear.emit(true);
7283
7339
  }
7340
+ clearSelected() {
7341
+ this.state.clearSelected();
7342
+ this.selectedClear.emit(true);
7343
+ }
7284
7344
  clearAll() {
7285
7345
  this.state.reset();
7286
7346
  this.allClear.emit(true);
7347
+ this.selectedClear.emit(true);
7287
7348
  this.sortClear.emit(true);
7288
7349
  this.filterClear.emit(true);
7289
7350
  }
@@ -7295,6 +7356,7 @@ NovoDataTableClearButton.decorators = [
7295
7356
  <novo-dropdown side="bottom-right" class="novo-data-table-clear-button" data-automation-id="novo-data-table-clear-dropdown">
7296
7357
  <button type="button" theme="primary" color="negative" icon="collapse" data-automation-id="novo-data-table-clear-dropdown-btn">{{ labels.clear }}</button>
7297
7358
  <list>
7359
+ <item *ngIf="state.selected.length > 0" (click)="clearSelected()" data-automation-id="novo-data-table-clear-dropdown-clear-selected">{{ labels.clearSelected }}</item>
7298
7360
  <item *ngIf="state.sort" (click)="clearSort()" data-automation-id="novo-data-table-clear-dropdown-clear-sort">{{ labels.clearSort }}</item>
7299
7361
  <item *ngIf="state.filter" (click)="clearFilter()" data-automation-id="novo-data-table-clear-dropdown-clear-filter">{{ labels.clearFilter }}</item>
7300
7362
  <item *ngIf="state.sort && state.filter" (click)="clearAll()" data-automation-id="novo-data-table-clear-dropdown-clear-all">{{ labels.clearAllNormalCase }}</item>
@@ -7310,6 +7372,7 @@ NovoDataTableClearButton.ctorParameters = () => [
7310
7372
  { type: NovoLabelService }
7311
7373
  ];
7312
7374
  NovoDataTableClearButton.propDecorators = {
7375
+ selectedClear: [{ type: Output }],
7313
7376
  sortClear: [{ type: Output }],
7314
7377
  filterClear: [{ type: Output }],
7315
7378
  allClear: [{ type: Output }]
@@ -7353,7 +7416,10 @@ class DataTableSource extends DataSource {
7353
7416
  this.current = data.results.length;
7354
7417
  this.data = data.results;
7355
7418
  // Clear selection
7356
- this.state.selectedRows.clear();
7419
+ if (!this.state.retainSelected) {
7420
+ this.state.selectedRows.clear();
7421
+ }
7422
+ this.state.retainSelected = false;
7357
7423
  this.state.onSelectionChange();
7358
7424
  // Mark changes
7359
7425
  setTimeout(() => {
@@ -7716,6 +7782,7 @@ class NovoDataTableSortFilter {
7716
7782
  }
7717
7783
  }
7718
7784
  this.state.filter = filter;
7785
+ this.state.checkRetainment('filter');
7719
7786
  this.state.reset(false, true);
7720
7787
  this.state.updates.next({ filter, sort: this.state.sort });
7721
7788
  this.state.onSortFilterChange();
@@ -7723,6 +7790,7 @@ class NovoDataTableSortFilter {
7723
7790
  sort(id, value, transform) {
7724
7791
  const sort = { id, value, transform };
7725
7792
  this.state.sort = sort;
7793
+ this.state.checkRetainment('sort');
7726
7794
  this.state.reset(false, true);
7727
7795
  this.state.updates.next({ sort, filter: this.state.filter });
7728
7796
  this.state.onSortFilterChange();
@@ -8258,6 +8326,7 @@ class NovoDataTable {
8258
8326
  this.trackByFn = (index, item) => item.id;
8259
8327
  this.templates = {};
8260
8328
  this.fixedHeader = false;
8329
+ this.maxSelected = undefined;
8261
8330
  this._hideGlobalSearch = true;
8262
8331
  this.preferencesChanged = new EventEmitter();
8263
8332
  this.loading = true;
@@ -8429,6 +8498,7 @@ class NovoDataTable {
8429
8498
  }
8430
8499
  }
8431
8500
  ngAfterContentInit() {
8501
+ var _a;
8432
8502
  if (this.displayedColumns && this.displayedColumns.length) {
8433
8503
  this.expandable = this.displayedColumns.includes('expand');
8434
8504
  }
@@ -8458,6 +8528,7 @@ class NovoDataTable {
8458
8528
  }
8459
8529
  this.state.page = this.paginationOptions ? this.paginationOptions.page : undefined;
8460
8530
  this.state.pageSize = this.paginationOptions ? this.paginationOptions.pageSize : undefined;
8531
+ this.state.selectionOptions = (_a = this.selectionOptions) !== null && _a !== void 0 ? _a : undefined;
8461
8532
  // Scrolling inside table
8462
8533
  this.novoDataTableContainer.nativeElement.addEventListener('scroll', this.scrollListenerHandler);
8463
8534
  this.initialized = true;
@@ -8702,8 +8773,8 @@ NovoDataTable.decorators = [
8702
8773
  [hidden]="dataSource?.totallyEmpty && !state.userFiltered"
8703
8774
  >
8704
8775
  <ng-container cdkColumnDef="selection">
8705
- <novo-data-table-checkbox-header-cell *cdkHeaderCellDef></novo-data-table-checkbox-header-cell>
8706
- <novo-data-table-checkbox-cell *cdkCellDef="let row; let i = index" [row]="row"></novo-data-table-checkbox-cell>
8776
+ <novo-data-table-checkbox-header-cell *cdkHeaderCellDef [maxSelected]="maxSelected"></novo-data-table-checkbox-header-cell>
8777
+ <novo-data-table-checkbox-cell *cdkCellDef="let row; let i = index" [row]="row" [maxSelected]="maxSelected"></novo-data-table-checkbox-cell>
8707
8778
  </ng-container>
8708
8779
  <ng-container cdkColumnDef="expand">
8709
8780
  <novo-data-table-expand-header-cell *cdkHeaderCellDef></novo-data-table-expand-header-cell>
@@ -8874,6 +8945,7 @@ NovoDataTable.propDecorators = {
8874
8945
  displayedColumns: [{ type: Input }],
8875
8946
  paginationOptions: [{ type: Input }],
8876
8947
  searchOptions: [{ type: Input }],
8948
+ selectionOptions: [{ type: Input }],
8877
8949
  defaultSort: [{ type: Input }],
8878
8950
  name: [{ type: Input }],
8879
8951
  allowMultipleFilters: [{ type: Input }],
@@ -8883,6 +8955,7 @@ NovoDataTable.propDecorators = {
8883
8955
  templates: [{ type: Input }],
8884
8956
  fixedHeader: [{ type: Input }],
8885
8957
  paginatorDataFeatureId: [{ type: Input }],
8958
+ maxSelected: [{ type: Input }],
8886
8959
  dataTableService: [{ type: Input }],
8887
8960
  rows: [{ type: Input }],
8888
8961
  outsideFilter: [{ type: Input }],
@@ -27373,6 +27446,7 @@ NovoAddressElement.decorators = [
27373
27446
  (focus)="isFocused($event, 'address1')"
27374
27447
  (blur)="isBlurred($event, 'address1')"
27375
27448
  (input)="onInput($event, 'address1')"
27449
+ [disabled]="disabled.address1"
27376
27450
  />
27377
27451
  </span>
27378
27452
  <span
@@ -27401,6 +27475,7 @@ NovoAddressElement.decorators = [
27401
27475
  (focus)="isFocused($event, 'address2')"
27402
27476
  (blur)="isBlurred($event, 'address2')"
27403
27477
  (input)="onInput($event, 'address2')"
27478
+ [disabled]="disabled.address2"
27404
27479
  />
27405
27480
  </span>
27406
27481
  <span
@@ -27424,6 +27499,7 @@ NovoAddressElement.decorators = [
27424
27499
  (focus)="isFocused($event, 'city')"
27425
27500
  (blur)="isBlurred($event, 'city')"
27426
27501
  (input)="onInput($event, 'city')"
27502
+ [disabled]="disabled.city"
27427
27503
  />
27428
27504
  </span>
27429
27505
  <span
@@ -27465,6 +27541,7 @@ NovoAddressElement.decorators = [
27465
27541
  (focus)="isFocused($event, 'zip')"
27466
27542
  (blur)="isBlurred($event, 'zip')"
27467
27543
  (input)="onInput($event, 'zip')"
27544
+ [disabled]="disabled.zip"
27468
27545
  />
27469
27546
  </span>
27470
27547
  <span
@@ -29412,6 +29489,7 @@ class NovoDataTableCheckboxCell extends CdkCell {
29412
29489
  this.dataTable = dataTable;
29413
29490
  this.ref = ref;
29414
29491
  this.role = 'gridcell';
29492
+ this.maxSelected = undefined;
29415
29493
  this.checked = false;
29416
29494
  renderer.setAttribute(elementRef.nativeElement, 'data-automation-id', `novo-checkbox-column-${columnDef.cssClassFriendlyName}`);
29417
29495
  renderer.addClass(elementRef.nativeElement, `novo-checkbox-column-${columnDef.cssClassFriendlyName}`);
@@ -29425,11 +29503,19 @@ class NovoDataTableCheckboxCell extends CdkCell {
29425
29503
  this.ref.markForCheck();
29426
29504
  });
29427
29505
  }
29506
+ get isAtLimit() {
29507
+ return this.maxSelected && this.dataTable.state.selectedRows.size >= this.maxSelected && !this.checked;
29508
+ }
29428
29509
  ngOnInit() {
29429
29510
  this.checked = this.dataTable.isSelected(this.row);
29430
29511
  }
29431
29512
  onClick() {
29432
- this.dataTable.selectRow(this.row);
29513
+ if (!this.isAtLimit) {
29514
+ this.dataTable.selectRow(this.row);
29515
+ }
29516
+ }
29517
+ getTooltip() {
29518
+ return (this.isAtLimit) ? 'More than ' + this.maxSelected + ' items are not able to be selected at one time' : '';
29433
29519
  }
29434
29520
  ngOnDestroy() {
29435
29521
  if (this.selectionSubscription) {
@@ -29444,10 +29530,11 @@ NovoDataTableCheckboxCell.decorators = [
29444
29530
  { type: Component, args: [{
29445
29531
  selector: 'novo-data-table-checkbox-cell',
29446
29532
  template: `
29447
- <div class="data-table-checkbox" (click)="onClick()">
29533
+ <div class="data-table-checkbox" (click)="onClick()" [tooltip]="getTooltip()" tooltipPosition="right">
29448
29534
  <input type="checkbox" [checked]="checked">
29449
29535
  <label>
29450
- <i [class.bhi-checkbox-empty]="!checked"
29536
+ <i [class.bhi-checkbox-disabled]="isAtLimit"
29537
+ [class.bhi-checkbox-empty]="!checked"
29451
29538
  [class.bhi-checkbox-filled]="checked"></i>
29452
29539
  </label>
29453
29540
  </div>
@@ -29464,7 +29551,8 @@ NovoDataTableCheckboxCell.ctorParameters = () => [
29464
29551
  ];
29465
29552
  NovoDataTableCheckboxCell.propDecorators = {
29466
29553
  role: [{ type: HostBinding, args: ['attr.role',] }],
29467
- row: [{ type: Input }]
29554
+ row: [{ type: Input }],
29555
+ maxSelected: [{ type: Input }]
29468
29556
  };
29469
29557
 
29470
29558
  class NovoDataTableExpandCell extends CdkCell {
@@ -29602,12 +29690,211 @@ NovoDataTableExpandHeaderCell.propDecorators = {
29602
29690
  role: [{ type: HostBinding, args: ['attr.role',] }]
29603
29691
  };
29604
29692
 
29693
+ // NG2
29694
+ class NovoToastElement {
29695
+ constructor(sanitizer) {
29696
+ this.sanitizer = sanitizer;
29697
+ this.theme = 'danger';
29698
+ this.icon = 'caution';
29699
+ this.hasDialogue = false;
29700
+ this.isCloseable = false;
29701
+ this.closed = new EventEmitter();
29702
+ this.show = false;
29703
+ this.animate = false;
29704
+ this.parent = null;
29705
+ this.launched = false;
29706
+ }
29707
+ set message(m) {
29708
+ this._message = this.sanitizer.bypassSecurityTrustHtml(m);
29709
+ }
29710
+ ngOnInit() {
29711
+ if (!this.launched) {
29712
+ // clear position and time
29713
+ this.position = null;
29714
+ this.time = null;
29715
+ // set icon and styling
29716
+ this.iconClass = `bhi-${this.icon}`;
29717
+ this.alertTheme = `${this.theme} toast-container embedded`;
29718
+ if (this.hasDialogue) {
29719
+ this.alertTheme += ' dialogue';
29720
+ }
29721
+ }
29722
+ }
29723
+ ngOnChanges(changes) {
29724
+ // set icon and styling
29725
+ this.iconClass = `bhi-${this.icon}`;
29726
+ this.alertTheme = `${this.theme} toast-container embedded`;
29727
+ if (this.hasDialogue) {
29728
+ this.alertTheme += ' dialogue';
29729
+ }
29730
+ }
29731
+ clickHandler(event) {
29732
+ if (!this.isCloseable) {
29733
+ if (event) {
29734
+ event.stopPropagation();
29735
+ event.preventDefault();
29736
+ }
29737
+ if (this.parent) {
29738
+ this.parent.hide(this);
29739
+ }
29740
+ else {
29741
+ this.closed.emit({ closed: true });
29742
+ }
29743
+ }
29744
+ }
29745
+ close(event) {
29746
+ if (event) {
29747
+ event.stopPropagation();
29748
+ event.preventDefault();
29749
+ }
29750
+ if (this.parent) {
29751
+ this.parent.hide(this);
29752
+ }
29753
+ else {
29754
+ this.closed.emit({ closed: true });
29755
+ }
29756
+ }
29757
+ }
29758
+ NovoToastElement.decorators = [
29759
+ { type: Component, args: [{
29760
+ selector: 'novo-toast',
29761
+ host: {
29762
+ '[class]': 'alertTheme',
29763
+ '[class.show]': 'show',
29764
+ '[class.animate]': 'animate',
29765
+ '[class.embedded]': 'embedded',
29766
+ '(click)': '!isCloseable && clickHandler($event)',
29767
+ },
29768
+ template: `
29769
+ <div class="toast-icon">
29770
+ <i [ngClass]="iconClass"></i>
29771
+ </div>
29772
+ <div class="toast-content">
29773
+ <h5 *ngIf="title">{{title}}</h5>
29774
+ <p *ngIf="_message" [class.message-only]="!title" [innerHtml]="_message"></p>
29775
+ <div *ngIf="link" class="link-generated">
29776
+ <input type="text" [value]="link" onfocus="this.select();"/>
29777
+ </div>
29778
+ <div class="dialogue">
29779
+ <ng-content></ng-content>
29780
+ </div>
29781
+ </div>
29782
+ <div class="close-icon" *ngIf="isCloseable" (click)="close($event)">
29783
+ <i class="bhi-times"></i>
29784
+ </div>
29785
+ `
29786
+ },] }
29787
+ ];
29788
+ NovoToastElement.ctorParameters = () => [
29789
+ { type: DomSanitizer }
29790
+ ];
29791
+ NovoToastElement.propDecorators = {
29792
+ theme: [{ type: Input }],
29793
+ icon: [{ type: Input }],
29794
+ title: [{ type: Input }],
29795
+ hasDialogue: [{ type: Input }],
29796
+ link: [{ type: Input }],
29797
+ isCloseable: [{ type: Input }],
29798
+ message: [{ type: Input }],
29799
+ closed: [{ type: Output }]
29800
+ };
29801
+
29802
+ // NG2
29803
+ class NovoToastService {
29804
+ constructor(componentUtils) {
29805
+ this.componentUtils = componentUtils;
29806
+ this.references = [];
29807
+ this.icons = { default: 'bell', success: 'check', info: 'info', warning: 'warning', danger: 'remove' };
29808
+ this.defaults = { hideDelay: 3500, position: 'growlTopRight', theme: 'default' };
29809
+ }
29810
+ set parentViewContainer(view) {
29811
+ this._parentViewContainer = view;
29812
+ }
29813
+ alert(options, toastElement = NovoToastElement) {
29814
+ return new Promise((resolve) => {
29815
+ if (!this._parentViewContainer) {
29816
+ console.error('No parent view container specified for the ToastService. Set it inside your main application. \nthis.toastService.parentViewContainer = view (ViewContainerRef)');
29817
+ return;
29818
+ }
29819
+ const toast = this.componentUtils.append(toastElement, this._parentViewContainer);
29820
+ this.references.push(toast);
29821
+ this.handleAlert(toast.instance, options);
29822
+ resolve(toast);
29823
+ });
29824
+ }
29825
+ isVisible(toast) {
29826
+ return toast.show;
29827
+ }
29828
+ hide(toast) {
29829
+ toast.animate = false;
29830
+ setTimeout(() => {
29831
+ toast.show = false;
29832
+ const REF = this.references.filter((x) => x.instance === toast)[0];
29833
+ if (REF) {
29834
+ this.references.splice(this.references.indexOf(REF), 1);
29835
+ REF.destroy();
29836
+ }
29837
+ }, 300);
29838
+ }
29839
+ handleAlert(toast, options) {
29840
+ this.setToastOnSession(toast, options);
29841
+ setTimeout(() => {
29842
+ this.show(toast);
29843
+ }, 20);
29844
+ if (!toast.isCloseable) {
29845
+ this.toastTimer(toast);
29846
+ }
29847
+ }
29848
+ setToastOnSession(toast, opts) {
29849
+ const OPTIONS = typeof opts === 'object' ? opts : {};
29850
+ toast.parent = this;
29851
+ toast.title = OPTIONS.title || '';
29852
+ toast.message = OPTIONS.message || '';
29853
+ toast.hideDelay = OPTIONS.hideDelay || this.defaults.hideDelay;
29854
+ toast.link = OPTIONS.link || '';
29855
+ toast.isCloseable = OPTIONS.isCloseable || false;
29856
+ const CUSTOM_CLASS = OPTIONS.customClass || '';
29857
+ const ALERT_STYLE = OPTIONS.theme || this.defaults.theme;
29858
+ const ALERT_POSITION = OPTIONS.position || this.defaults.position;
29859
+ const ALERT_ICON = OPTIONS.icon || this.icons.default;
29860
+ toast.iconClass = `bhi-${ALERT_ICON}`;
29861
+ toast.launched = true;
29862
+ toast.alertTheme = `${ALERT_STYLE} ${ALERT_POSITION} ${CUSTOM_CLASS} toast-container launched`;
29863
+ }
29864
+ show(toast) {
29865
+ toast.show = true;
29866
+ setTimeout(addClass, 25);
29867
+ /**
29868
+ * Adds animate class to be called after a timeout
29869
+ **/
29870
+ function addClass() {
29871
+ toast.animate = true;
29872
+ }
29873
+ }
29874
+ toastTimer(toast) {
29875
+ if (toast.hideDelay < 0) {
29876
+ return;
29877
+ }
29878
+ setTimeout(() => {
29879
+ this.hide(toast);
29880
+ }, toast.hideDelay);
29881
+ }
29882
+ }
29883
+ NovoToastService.decorators = [
29884
+ { type: Injectable }
29885
+ ];
29886
+ NovoToastService.ctorParameters = () => [
29887
+ { type: ComponentUtils }
29888
+ ];
29889
+
29605
29890
  class NovoDataTableCheckboxHeaderCell extends CdkHeaderCell {
29606
- constructor(columnDef, elementRef, renderer, dataTable, ref) {
29891
+ constructor(columnDef, elementRef, renderer, dataTable, ref, toaster) {
29607
29892
  super(columnDef, elementRef);
29608
29893
  this.dataTable = dataTable;
29609
29894
  this.ref = ref;
29895
+ this.toaster = toaster;
29610
29896
  this.role = 'columnheader';
29897
+ this.maxSelected = undefined;
29611
29898
  this.checked = false;
29612
29899
  renderer.setAttribute(elementRef.nativeElement, 'data-automation-id', `novo-checkbox-column-header-${columnDef.cssClassFriendlyName}`);
29613
29900
  renderer.addClass(elementRef.nativeElement, `novo-checkbox-column-${columnDef.cssClassFriendlyName}`);
@@ -29620,6 +29907,8 @@ class NovoDataTableCheckboxHeaderCell extends CdkHeaderCell {
29620
29907
  if (event.isPageSizeChange) {
29621
29908
  this.checked = false;
29622
29909
  this.dataTable.selectRows(false);
29910
+ this.dataTable.state.checkRetainment('pageSize');
29911
+ this.dataTable.state.reset(false, true);
29623
29912
  }
29624
29913
  else {
29625
29914
  this.checked = this.dataTable.allCurrentRowsSelected();
@@ -29631,6 +29920,9 @@ class NovoDataTableCheckboxHeaderCell extends CdkHeaderCell {
29631
29920
  this.ref.markForCheck();
29632
29921
  });
29633
29922
  }
29923
+ get isAtLimit() {
29924
+ return this.maxSelected && this.dataTable.state.selectedRows.size + this.dataTable.dataSource.data.length > this.maxSelected && !this.checked;
29925
+ }
29634
29926
  ngOnDestroy() {
29635
29927
  if (this.selectionSubscription) {
29636
29928
  this.selectionSubscription.unsubscribe();
@@ -29643,7 +29935,17 @@ class NovoDataTableCheckboxHeaderCell extends CdkHeaderCell {
29643
29935
  }
29644
29936
  }
29645
29937
  onClick() {
29646
- this.dataTable.selectRows(!this.checked);
29938
+ if (this.isAtLimit) {
29939
+ this.toaster.alert({
29940
+ theme: 'danger',
29941
+ position: 'fixedTop',
29942
+ message: 'Error, more than 500 items are not able to be selected at one time',
29943
+ icon: 'caution',
29944
+ });
29945
+ }
29946
+ else {
29947
+ this.dataTable.selectRows(!this.checked);
29948
+ }
29647
29949
  }
29648
29950
  }
29649
29951
  NovoDataTableCheckboxHeaderCell.decorators = [
@@ -29666,10 +29968,12 @@ NovoDataTableCheckboxHeaderCell.ctorParameters = () => [
29666
29968
  { type: ElementRef },
29667
29969
  { type: Renderer2 },
29668
29970
  { type: NovoDataTable },
29669
- { type: ChangeDetectorRef }
29971
+ { type: ChangeDetectorRef },
29972
+ { type: NovoToastService }
29670
29973
  ];
29671
29974
  NovoDataTableCheckboxHeaderCell.propDecorators = {
29672
- role: [{ type: HostBinding, args: ['attr.role',] }]
29975
+ role: [{ type: HostBinding, args: ['attr.role',] }],
29976
+ maxSelected: [{ type: Input }]
29673
29977
  };
29674
29978
 
29675
29979
  class NovoDataTableHeaderCell extends CdkHeaderCell {
@@ -29765,10 +30069,12 @@ class NovoDataTablePagination {
29765
30069
  this.resetSubscription.unsubscribe();
29766
30070
  }
29767
30071
  selectPage(page) {
30072
+ this.state.checkRetainment('page');
29768
30073
  this.page = page;
29769
30074
  this.emitPageEvent();
29770
30075
  }
29771
30076
  nextPage() {
30077
+ this.state.checkRetainment('page');
29772
30078
  if (!this.hasNextPage()) {
29773
30079
  return;
29774
30080
  }
@@ -29777,6 +30083,7 @@ class NovoDataTablePagination {
29777
30083
  this.emitPageEvent();
29778
30084
  }
29779
30085
  previousPage() {
30086
+ this.state.checkRetainment('page');
29780
30087
  if (!this.hasPreviousPage()) {
29781
30088
  return;
29782
30089
  }
@@ -31154,7 +31461,7 @@ NovoExpansionPanel.decorators = [
31154
31461
  '[class.novo-expansion-panel-spacing]': '_hasSpacing()',
31155
31462
  '[class.novo-expansion-panel-padding]': 'padding',
31156
31463
  },
31157
- styles: ["@-webkit-keyframes rotate{0%{transform:rotate(0deg)}75%{transform:rotate(200deg)}to{transform:rotate(180deg)}}@-webkit-keyframes half-rotate{0%{transform:rotate(45deg)}75%{transform:rotate(100deg)}to{transform:rotate(90deg)}}@-webkit-keyframes rotateBack{0%{transform:rotate(90deg)}to{transform:rotate(0deg)}}@-webkit-keyframes show{0%{opacity:0;transform:translateX(-100%)}75%{transform:translateX(0)}to{opacity:1;transform:translateX(0)}}@keyframes rotate{0%{transform:rotate(0deg)}75%{transform:rotate(200deg)}to{transform:rotate(180deg)}}@keyframes half-rotate{0%{transform:rotate(45deg)}75%{transform:rotate(100deg)}to{transform:rotate(90deg)}}@keyframes rotateBack{0%{transform:rotate(90deg)}to{transform:rotate(0deg)}}@keyframes show{0%{opacity:0;transform:translateX(-100%)}75%{transform:translateX(0)}to{opacity:1;transform:translateX(0)}}.novo-expansion-panel{background:#fff;color:#3d464d}.novo-action-row{border-top-color:#3d464d}.novo-expansion-panel:not(.novo-expanded) .novo-expansion-panel-header:not([aria-disabled=true]).cdk-keyboard-focused,.novo-expansion-panel:not(.novo-expanded) .novo-expansion-panel-header:not([aria-disabled=true]).cdk-program-focused,.novo-expansion-panel:not(.novo-expanded) .novo-expansion-panel-header:not([aria-disabled=true]):hover{background:rgba(0,0,0,.04)}.novo-expansion-panel-header-title{color:#3d464d}.novo-expansion-indicator:after,.novo-expansion-panel-header-description{color:#999}.novo-expansion-panel-header[aria-disabled=true]{color:#999;pointer-events:none}.novo-expansion-panel-header[aria-disabled=true] .novo-expansion-panel-header-description,.novo-expansion-panel-header[aria-disabled=true] .novo-expansion-panel-header-title{color:inherit}.novo-expansion-panel.novo-expanded[theme=company]{border-top:3px solid #39d}.novo-expansion-panel.novo-expanded[theme=candidate]{border-top:3px solid #4b7}.novo-expansion-panel.novo-expanded[theme=navigation]{border-top:3px solid #2f384f}.novo-expansion-panel.novo-expanded[theme=lead]{border-top:3px solid #a69}.novo-expansion-panel.novo-expanded[theme=contact]{border-top:3px solid #fa4}.novo-expansion-panel.novo-expanded[theme=opportunity]{border-top:3px solid #625}.novo-expansion-panel.novo-expanded[theme=job]{border-top:3px solid #b56}.novo-expansion-panel.novo-expanded[theme=earnCode],.novo-expansion-panel.novo-expanded[theme=jobCode]{border-top:3px solid #696d79}.novo-expansion-panel.novo-expanded[theme=sendout]{border-top:3px solid #747884}.novo-expansion-panel.novo-expanded[theme=placement]{border-top:3px solid #0b344f}.novo-expansion-panel.novo-expanded[theme=corporateuser],.novo-expansion-panel.novo-expanded[theme=credential],.novo-expansion-panel.novo-expanded[theme=distributionList],.novo-expansion-panel.novo-expanded[theme=task],.novo-expansion-panel.novo-expanded[theme=user]{border-top:3px solid #4f5361}.novo-expansion-panel.novo-expanded[theme=aqua]{border-top:3px solid #3bafda}.novo-expansion-panel.novo-expanded[theme=ocean]{border-top:3px solid #4a89dc}.novo-expansion-panel.novo-expanded[theme=mint]{border-top:3px solid #37bc9b}.novo-expansion-panel.novo-expanded[theme=grass]{border-top:3px solid #8cc152}.novo-expansion-panel.novo-expanded[theme=sunflower]{border-top:3px solid #f6b042}.novo-expansion-panel.novo-expanded[theme=bittersweet]{border-top:3px solid #eb6845}.novo-expansion-panel.novo-expanded[theme=grapefruit]{border-top:3px solid #da4453}.novo-expansion-panel.novo-expanded[theme=carnation]{border-top:3px solid #d770ad}.novo-expansion-panel.novo-expanded[theme=lavender]{border-top:3px solid #967adc}.novo-expansion-panel.novo-expanded[theme=positive]{border-top:3px solid #4a89dc}.novo-expansion-panel.novo-expanded[theme=success]{border-top:3px solid #8cc152}.novo-expansion-panel.novo-expanded[theme=negative]{border-top:3px solid #da4453}.novo-expansion-panel.novo-expanded[theme=warning]{border-top:3px solid #f6b042}.novo-expansion-panel.novo-expanded[theme=black]{border-top:3px solid #000}.novo-expansion-panel.novo-expanded[theme=dark]{border-top:3px solid #3d464d}.novo-expansion-panel.novo-expanded[theme=pulse]{border-top:3px solid #3bafda}.novo-expansion-panel.novo-expanded[theme=neutral]{border-top:3px solid #4f5361}.novo-expansion-panel.novo-expanded[theme=navy]{border-top:3px solid #0d2d42}.novo-expansion-panel.novo-expanded[theme=contract]{border-top:3px solid #454ea0}.novo-expansion-panel.novo-expanded[theme=mountain]{border-top:3px solid #9678b6}.novo-expansion-panel.novo-expanded[theme=billableCharge],.novo-expansion-panel.novo-expanded[theme=invoiceStatement],.novo-expansion-panel.novo-expanded[theme=payableCharge]{border-top:3px solid #696d79}.novo-expansion-panel.novo-expanded[theme=submission]{border-top:3px solid #a9adbb}.novo-expansion-panel.novo-expanded[theme=note]{border-top:3px solid #747884}.novo-expansion-panel.novo-expanded[theme=ash]{border-top:3px solid #a0a0a0}.novo-expansion-panel.novo-expanded[theme=slate]{border-top:3px solid #707070}.novo-expansion-panel.novo-expanded[theme=charcoal]{border-top:3px solid #282828}.novo-expansion-panel.novo-expanded[theme=background]{border-top:3px solid #f4f4f4}.novo-expansion-panel.novo-expanded[theme=background-dark]{border-top:3px solid #e2e2e2}.novo-expansion-panel.novo-expanded[theme=white]{border-top:3px solid #fff}.novo-expansion-panel.novo-expanded[theme=grey]{border-top:3px solid #999}.novo-expansion-panel.novo-expanded[theme=off-white]{border-top:3px solid #f4f4f4}.novo-expansion-panel.novo-expanded[theme=light]{border-top:3px solid #d9dadc}.novo-expansion-panel.novo-expanded[theme=empty]{border-top:3px solid #cccdcc}.novo-expansion-panel.novo-expanded[theme=sand]{border-top:3px solid #f4f4f4}.novo-expansion-panel.novo-expanded[theme=silver]{border-top:3px solid #e2e2e2}.novo-expansion-panel.novo-expanded[theme=stone]{border-top:3px solid #bebebe}.novo-expansion-panel{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-sizing:content-box;display:block;margin:0 16px;transition:margin 225ms ease-in-out}.novo-expansion-panel.novo-expanded{margin:16px 4px}.novo-expansion-panel.novo-expanded:first-child{margin-top:0}.novo-expansion-panel.novo-expanded:last-child{margin-bottom:0}.novo-expansion-panel-content{overflow:hidden}.novo-expansion-panel-content.novo-expanded{overflow:visible}.novo-expansion-panel-padding .novo-expansion-panel-body{padding:0 24px 16px}.novo-accordion .novo-expansion-panel-spacing:first-child{margin-top:0}.novo-accordion .novo-expansion-panel-spacing:last-child{margin-bottom:0}.novo-action-row{border-top-style:solid;border-top-width:1px;display:flex;flex-direction:row;justify-content:flex-end;padding:16px 8px 16px 24px}.novo-action-row button.novo-button{margin-left:8px}[dir=rtl] .novo-action-row button.novo-button{margin-left:0;margin-right:8px}"]
31464
+ styles: ["@-webkit-keyframes rotate{0%{transform:rotate(0deg)}75%{transform:rotate(200deg)}to{transform:rotate(180deg)}}@-webkit-keyframes half-rotate{0%{transform:rotate(45deg)}75%{transform:rotate(100deg)}to{transform:rotate(90deg)}}@-webkit-keyframes rotateBack{0%{transform:rotate(90deg)}to{transform:rotate(0deg)}}@-webkit-keyframes show{0%{opacity:0;transform:translateX(-100%)}75%{transform:translateX(0)}to{opacity:1;transform:translateX(0)}}@keyframes rotate{0%{transform:rotate(0deg)}75%{transform:rotate(200deg)}to{transform:rotate(180deg)}}@keyframes half-rotate{0%{transform:rotate(45deg)}75%{transform:rotate(100deg)}to{transform:rotate(90deg)}}@keyframes rotateBack{0%{transform:rotate(90deg)}to{transform:rotate(0deg)}}@keyframes show{0%{opacity:0;transform:translateX(-100%)}75%{transform:translateX(0)}to{opacity:1;transform:translateX(0)}}.novo-expansion-panel{background:#fff;color:#3d464d}.novo-action-row{border-top-color:#3d464d}.novo-expansion-panel:not(.novo-expanded) .novo-expansion-panel-header:not([aria-disabled=true]).cdk-keyboard-focused,.novo-expansion-panel:not(.novo-expanded) .novo-expansion-panel-header:not([aria-disabled=true]).cdk-program-focused,.novo-expansion-panel:not(.novo-expanded) .novo-expansion-panel-header:not([aria-disabled=true]):hover{background:rgba(0,0,0,.04)}.novo-expansion-panel-header-title{color:#3d464d}.novo-expansion-indicator:after,.novo-expansion-panel-header-description{color:#999}.novo-expansion-panel-header[aria-disabled=true]{color:#999;pointer-events:none}.novo-expansion-panel-header[aria-disabled=true] .novo-expansion-panel-header-description,.novo-expansion-panel-header[aria-disabled=true] .novo-expansion-panel-header-title{color:inherit}.novo-expansion-panel.novo-expanded[theme=company]{border-top:3px solid #39d}.novo-expansion-panel.novo-expanded[theme=candidate]{border-top:3px solid #4b7}.novo-expansion-panel.novo-expanded[theme=navigation]{border-top:3px solid #2f384f}.novo-expansion-panel.novo-expanded[theme=lead]{border-top:3px solid #a69}.novo-expansion-panel.novo-expanded[theme=contact]{border-top:3px solid #fa4}.novo-expansion-panel.novo-expanded[theme=opportunity]{border-top:3px solid #625}.novo-expansion-panel.novo-expanded[theme=job]{border-top:3px solid #b56}.novo-expansion-panel.novo-expanded[theme=earnCode],.novo-expansion-panel.novo-expanded[theme=jobCode]{border-top:3px solid #696d79}.novo-expansion-panel.novo-expanded[theme=sendout]{border-top:3px solid #747884}.novo-expansion-panel.novo-expanded[theme=placement]{border-top:3px solid #0b344f}.novo-expansion-panel.novo-expanded[theme=corporateuser],.novo-expansion-panel.novo-expanded[theme=credential],.novo-expansion-panel.novo-expanded[theme=distributionList],.novo-expansion-panel.novo-expanded[theme=task],.novo-expansion-panel.novo-expanded[theme=user]{border-top:3px solid #4f5361}.novo-expansion-panel.novo-expanded[theme=aqua]{border-top:3px solid #3bafda}.novo-expansion-panel.novo-expanded[theme=ocean]{border-top:3px solid #4a89dc}.novo-expansion-panel.novo-expanded[theme=mint]{border-top:3px solid #37bc9b}.novo-expansion-panel.novo-expanded[theme=grass]{border-top:3px solid #8cc152}.novo-expansion-panel.novo-expanded[theme=sunflower]{border-top:3px solid #f6b042}.novo-expansion-panel.novo-expanded[theme=bittersweet]{border-top:3px solid #eb6845}.novo-expansion-panel.novo-expanded[theme=grapefruit]{border-top:3px solid #da4453}.novo-expansion-panel.novo-expanded[theme=carnation]{border-top:3px solid #d770ad}.novo-expansion-panel.novo-expanded[theme=lavender]{border-top:3px solid #967adc}.novo-expansion-panel.novo-expanded[theme=positive]{border-top:3px solid #4a89dc}.novo-expansion-panel.novo-expanded[theme=success]{border-top:3px solid #8cc152}.novo-expansion-panel.novo-expanded[theme=negative]{border-top:3px solid #da4453}.novo-expansion-panel.novo-expanded[theme=warning]{border-top:3px solid #f6b042}.novo-expansion-panel.novo-expanded[theme=black]{border-top:3px solid #000}.novo-expansion-panel.novo-expanded[theme=dark]{border-top:3px solid #3d464d}.novo-expansion-panel.novo-expanded[theme=pulse]{border-top:3px solid #3bafda}.novo-expansion-panel.novo-expanded[theme=neutral]{border-top:3px solid #4f5361}.novo-expansion-panel.novo-expanded[theme=navy]{border-top:3px solid #0d2d42}.novo-expansion-panel.novo-expanded[theme=contract]{border-top:3px solid #454ea0}.novo-expansion-panel.novo-expanded[theme=mountain]{border-top:3px solid #9678b6}.novo-expansion-panel.novo-expanded[theme=billableCharge],.novo-expansion-panel.novo-expanded[theme=invoiceStatement],.novo-expansion-panel.novo-expanded[theme=payableCharge]{border-top:3px solid #696d79}.novo-expansion-panel.novo-expanded[theme=submission]{border-top:3px solid #a9adbb}.novo-expansion-panel.novo-expanded[theme=note]{border-top:3px solid #747884}.novo-expansion-panel.novo-expanded[theme=ash]{border-top:3px solid #a0a0a0}.novo-expansion-panel.novo-expanded[theme=slate]{border-top:3px solid #707070}.novo-expansion-panel.novo-expanded[theme=charcoal]{border-top:3px solid #282828}.novo-expansion-panel.novo-expanded[theme=jobShift]{border-top:3px solid #454ea0}.novo-expansion-panel.novo-expanded[theme=background]{border-top:3px solid #f4f4f4}.novo-expansion-panel.novo-expanded[theme=background-dark]{border-top:3px solid #e2e2e2}.novo-expansion-panel.novo-expanded[theme=white]{border-top:3px solid #fff}.novo-expansion-panel.novo-expanded[theme=grey]{border-top:3px solid #999}.novo-expansion-panel.novo-expanded[theme=off-white]{border-top:3px solid #f4f4f4}.novo-expansion-panel.novo-expanded[theme=light]{border-top:3px solid #d9dadc}.novo-expansion-panel.novo-expanded[theme=empty]{border-top:3px solid #cccdcc}.novo-expansion-panel.novo-expanded[theme=sand]{border-top:3px solid #f4f4f4}.novo-expansion-panel.novo-expanded[theme=silver]{border-top:3px solid #e2e2e2}.novo-expansion-panel.novo-expanded[theme=stone]{border-top:3px solid #bebebe}.novo-expansion-panel{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12);box-sizing:content-box;display:block;margin:0 16px;transition:margin 225ms ease-in-out}.novo-expansion-panel.novo-expanded{margin:16px 4px}.novo-expansion-panel.novo-expanded:first-child{margin-top:0}.novo-expansion-panel.novo-expanded:last-child{margin-bottom:0}.novo-expansion-panel-content{overflow:hidden}.novo-expansion-panel-content.novo-expanded{overflow:visible}.novo-expansion-panel-padding .novo-expansion-panel-body{padding:0 24px 16px}.novo-accordion .novo-expansion-panel-spacing:first-child{margin-top:0}.novo-accordion .novo-expansion-panel-spacing:last-child{margin-bottom:0}.novo-action-row{border-top-style:solid;border-top-width:1px;display:flex;flex-direction:row;justify-content:flex-end;padding:16px 8px 16px 24px}.novo-action-row button.novo-button{margin-left:8px}[dir=rtl] .novo-action-row button.novo-button{margin-left:0;margin-right:8px}"]
31158
31465
  },] }
31159
31466
  ];
31160
31467
  NovoExpansionPanel.ctorParameters = () => [
@@ -32556,6 +32863,7 @@ class FormUtils {
32556
32863
  })
32557
32864
  : [];
32558
32865
  let fields = meta.fields.map((field) => {
32866
+ field.parentEntity = meta.entity;
32559
32867
  if (!field.hasOwnProperty('sortOrder')) {
32560
32868
  field.sortOrder = Number.MAX_SAFE_INTEGER - 1;
32561
32869
  }
@@ -32979,203 +33287,6 @@ NovoModalService.ctorParameters = () => [
32979
33287
  { type: ComponentUtils }
32980
33288
  ];
32981
33289
 
32982
- // NG2
32983
- class NovoToastElement {
32984
- constructor(sanitizer) {
32985
- this.sanitizer = sanitizer;
32986
- this.theme = 'danger';
32987
- this.icon = 'caution';
32988
- this.hasDialogue = false;
32989
- this.isCloseable = false;
32990
- this.closed = new EventEmitter();
32991
- this.show = false;
32992
- this.animate = false;
32993
- this.parent = null;
32994
- this.launched = false;
32995
- }
32996
- set message(m) {
32997
- this._message = this.sanitizer.bypassSecurityTrustHtml(m);
32998
- }
32999
- ngOnInit() {
33000
- if (!this.launched) {
33001
- // clear position and time
33002
- this.position = null;
33003
- this.time = null;
33004
- // set icon and styling
33005
- this.iconClass = `bhi-${this.icon}`;
33006
- this.alertTheme = `${this.theme} toast-container embedded`;
33007
- if (this.hasDialogue) {
33008
- this.alertTheme += ' dialogue';
33009
- }
33010
- }
33011
- }
33012
- ngOnChanges(changes) {
33013
- // set icon and styling
33014
- this.iconClass = `bhi-${this.icon}`;
33015
- this.alertTheme = `${this.theme} toast-container embedded`;
33016
- if (this.hasDialogue) {
33017
- this.alertTheme += ' dialogue';
33018
- }
33019
- }
33020
- clickHandler(event) {
33021
- if (!this.isCloseable) {
33022
- if (event) {
33023
- event.stopPropagation();
33024
- event.preventDefault();
33025
- }
33026
- if (this.parent) {
33027
- this.parent.hide(this);
33028
- }
33029
- else {
33030
- this.closed.emit({ closed: true });
33031
- }
33032
- }
33033
- }
33034
- close(event) {
33035
- if (event) {
33036
- event.stopPropagation();
33037
- event.preventDefault();
33038
- }
33039
- if (this.parent) {
33040
- this.parent.hide(this);
33041
- }
33042
- else {
33043
- this.closed.emit({ closed: true });
33044
- }
33045
- }
33046
- }
33047
- NovoToastElement.decorators = [
33048
- { type: Component, args: [{
33049
- selector: 'novo-toast',
33050
- host: {
33051
- '[class]': 'alertTheme',
33052
- '[class.show]': 'show',
33053
- '[class.animate]': 'animate',
33054
- '[class.embedded]': 'embedded',
33055
- '(click)': '!isCloseable && clickHandler($event)',
33056
- },
33057
- template: `
33058
- <div class="toast-icon">
33059
- <i [ngClass]="iconClass"></i>
33060
- </div>
33061
- <div class="toast-content">
33062
- <h5 *ngIf="title">{{title}}</h5>
33063
- <p *ngIf="_message" [class.message-only]="!title" [innerHtml]="_message"></p>
33064
- <div *ngIf="link" class="link-generated">
33065
- <input type="text" [value]="link" onfocus="this.select();"/>
33066
- </div>
33067
- <div class="dialogue">
33068
- <ng-content></ng-content>
33069
- </div>
33070
- </div>
33071
- <div class="close-icon" *ngIf="isCloseable" (click)="close($event)">
33072
- <i class="bhi-times"></i>
33073
- </div>
33074
- `
33075
- },] }
33076
- ];
33077
- NovoToastElement.ctorParameters = () => [
33078
- { type: DomSanitizer }
33079
- ];
33080
- NovoToastElement.propDecorators = {
33081
- theme: [{ type: Input }],
33082
- icon: [{ type: Input }],
33083
- title: [{ type: Input }],
33084
- hasDialogue: [{ type: Input }],
33085
- link: [{ type: Input }],
33086
- isCloseable: [{ type: Input }],
33087
- message: [{ type: Input }],
33088
- closed: [{ type: Output }]
33089
- };
33090
-
33091
- // NG2
33092
- class NovoToastService {
33093
- constructor(componentUtils) {
33094
- this.componentUtils = componentUtils;
33095
- this.references = [];
33096
- this.icons = { default: 'bell', success: 'check', info: 'info', warning: 'warning', danger: 'remove' };
33097
- this.defaults = { hideDelay: 3500, position: 'growlTopRight', theme: 'default' };
33098
- }
33099
- set parentViewContainer(view) {
33100
- this._parentViewContainer = view;
33101
- }
33102
- alert(options, toastElement = NovoToastElement) {
33103
- return new Promise((resolve) => {
33104
- if (!this._parentViewContainer) {
33105
- console.error('No parent view container specified for the ToastService. Set it inside your main application. \nthis.toastService.parentViewContainer = view (ViewContainerRef)');
33106
- return;
33107
- }
33108
- const toast = this.componentUtils.append(toastElement, this._parentViewContainer);
33109
- this.references.push(toast);
33110
- this.handleAlert(toast.instance, options);
33111
- resolve(toast);
33112
- });
33113
- }
33114
- isVisible(toast) {
33115
- return toast.show;
33116
- }
33117
- hide(toast) {
33118
- toast.animate = false;
33119
- setTimeout(() => {
33120
- toast.show = false;
33121
- const REF = this.references.filter((x) => x.instance === toast)[0];
33122
- if (REF) {
33123
- this.references.splice(this.references.indexOf(REF), 1);
33124
- REF.destroy();
33125
- }
33126
- }, 300);
33127
- }
33128
- handleAlert(toast, options) {
33129
- this.setToastOnSession(toast, options);
33130
- setTimeout(() => {
33131
- this.show(toast);
33132
- }, 20);
33133
- if (!toast.isCloseable) {
33134
- this.toastTimer(toast);
33135
- }
33136
- }
33137
- setToastOnSession(toast, opts) {
33138
- const OPTIONS = typeof opts === 'object' ? opts : {};
33139
- toast.parent = this;
33140
- toast.title = OPTIONS.title || '';
33141
- toast.message = OPTIONS.message || '';
33142
- toast.hideDelay = OPTIONS.hideDelay || this.defaults.hideDelay;
33143
- toast.link = OPTIONS.link || '';
33144
- toast.isCloseable = OPTIONS.isCloseable || false;
33145
- const CUSTOM_CLASS = OPTIONS.customClass || '';
33146
- const ALERT_STYLE = OPTIONS.theme || this.defaults.theme;
33147
- const ALERT_POSITION = OPTIONS.position || this.defaults.position;
33148
- const ALERT_ICON = OPTIONS.icon || this.icons.default;
33149
- toast.iconClass = `bhi-${ALERT_ICON}`;
33150
- toast.launched = true;
33151
- toast.alertTheme = `${ALERT_STYLE} ${ALERT_POSITION} ${CUSTOM_CLASS} toast-container launched`;
33152
- }
33153
- show(toast) {
33154
- toast.show = true;
33155
- setTimeout(addClass, 25);
33156
- /**
33157
- * Adds animate class to be called after a timeout
33158
- **/
33159
- function addClass() {
33160
- toast.animate = true;
33161
- }
33162
- }
33163
- toastTimer(toast) {
33164
- if (toast.hideDelay < 0) {
33165
- return;
33166
- }
33167
- setTimeout(() => {
33168
- this.hide(toast);
33169
- }, toast.hideDelay);
33170
- }
33171
- }
33172
- NovoToastService.decorators = [
33173
- { type: Injectable }
33174
- ];
33175
- NovoToastService.ctorParameters = () => [
33176
- { type: ComponentUtils }
33177
- ];
33178
-
33179
33290
  // NG2
33180
33291
  class ControlConfirmModal {
33181
33292
  constructor(modalRef, params, labels) {