@clr/angular 17.3.1 → 17.4.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.
@@ -223,19 +223,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
223
223
  }]
224
224
  }] });
225
225
 
226
- /*
227
- * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
228
- * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
229
- * This software is released under MIT license.
230
- * The full license information can be found in LICENSE in the root directory of this project.
231
- */
232
- var AccordionStatus;
233
- (function (AccordionStatus) {
234
- AccordionStatus["Inactive"] = "inactive";
235
- AccordionStatus["Error"] = "error";
236
- AccordionStatus["Complete"] = "complete";
237
- })(AccordionStatus || (AccordionStatus = {}));
238
-
239
226
  /*
240
227
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
241
228
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -328,6 +315,8 @@ const commonStringsDefault = {
328
315
  datagridFilterDialogAriaLabel: 'Filter dialog',
329
316
  columnSeparatorAriaLabel: 'Column resize handle',
330
317
  columnSeparatorDescription: 'Use left or right key to resize the column',
318
+ fromLabel: 'From',
319
+ toLabel: 'To',
331
320
  // Alert
332
321
  alertCloseButtonAriaLabel: 'Close alert',
333
322
  alertNextAlertAriaLabel: 'Next alert message, {CURRENT} of {COUNT}',
@@ -373,6 +362,7 @@ const commonStringsDefault = {
373
362
  datagridExpandableRowContent: 'Expandable row content',
374
363
  datagridExpandableRowsHelperText: `Screen reader table commands may not work for viewing expanded content, please use your screen reader's browse mode to read the content exposed by this button`,
375
364
  // Wizard
365
+ wizardStep: 'Step',
376
366
  wizardStepSuccess: 'Completed',
377
367
  wizardStepError: 'Error',
378
368
  wizardStepnavAriaLabel: 'Step navigation',
@@ -444,6 +434,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
444
434
  }]
445
435
  }] });
446
436
 
437
+ /*
438
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
439
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
440
+ * This software is released under MIT license.
441
+ * The full license information can be found in LICENSE in the root directory of this project.
442
+ */
443
+ var AccordionStatus;
444
+ (function (AccordionStatus) {
445
+ AccordionStatus["Inactive"] = "inactive";
446
+ AccordionStatus["Error"] = "error";
447
+ AccordionStatus["Complete"] = "complete";
448
+ })(AccordionStatus || (AccordionStatus = {}));
449
+
447
450
  /*
448
451
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
449
452
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -573,8 +576,6 @@ class ClrAccordionPanel {
573
576
  this.disabled = false;
574
577
  this.panelOpen = false;
575
578
  this.panelOpenChange = new EventEmitter();
576
- this.AccordionStatus = AccordionStatus;
577
- this.isAccordion = true;
578
579
  this._id = uniqueIdFactory();
579
580
  }
580
581
  get id() {
@@ -650,10 +651,10 @@ class ClrAccordionPanel {
650
651
  }
651
652
  }
652
653
  ClrAccordionPanel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrAccordionPanel, deps: [{ token: ClrCommonStringsService }, { token: AccordionService }, { token: IfExpandService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
653
- ClrAccordionPanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrAccordionPanel, selector: "clr-accordion-panel", inputs: { disabled: ["clrAccordionPanelDisabled", "disabled"], panelOpen: ["clrAccordionPanelOpen", "panelOpen"] }, outputs: { panelOpenChange: "clrAccordionPanelOpenChange" }, host: { properties: { "class.clr-accordion-panel": "true", "class.clr-accordion-panel-disabled": "this.disabled" } }, providers: [IfExpandService], queries: [{ propertyName: "accordionDescription", predicate: ClrAccordionDescription }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [disabled]=\"isAccordion && panel.disabled\"\n [attr.aria-disabled]=\"!isAccordion && panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-accordion-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle\"></cds-icon>\n <span class=\"clr-accordion-number\">{{panelNumber}}.</span>\n <cds-icon status=\"danger\" shape=\"exclamation-circle\" class=\"clr-accordion-error-icon\"></cds-icon>\n <cds-icon status=\"success\" shape=\"check-circle\" class=\"clr-accordion-complete-icon\"></cds-icon>\n </span>\n <ng-content select=\"clr-accordion-title, clr-step-title\"></ng-content>\n <ng-content select=\"clr-accordion-description, clr-step-description\"></ng-content>\n </button>\n <div class=\"clr-sr-only\" role=\"status\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\"> {{ stepErrorText(panelNumber)}} </ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">\n {{ stepCompleteText(panelNumber)}}\n </ng-container>\n </div>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n class=\"clr-accordion-content-region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], animations: panelAnimation, changeDetection: i0.ChangeDetectionStrategy.OnPush });
654
+ ClrAccordionPanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrAccordionPanel, selector: "clr-accordion-panel", inputs: { disabled: ["clrAccordionPanelDisabled", "disabled"], panelOpen: ["clrAccordionPanelOpen", "panelOpen"] }, outputs: { panelOpenChange: "clrAccordionPanelOpenChange" }, host: { properties: { "class.clr-accordion-panel": "true", "class.clr-accordion-panel-disabled": "this.disabled" } }, providers: [IfExpandService], queries: [{ propertyName: "accordionDescription", predicate: ClrAccordionDescription }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [disabled]=\"panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-accordion-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle\"></cds-icon>\n </span>\n <ng-content select=\"clr-accordion-title, clr-step-title\"></ng-content>\n <ng-content select=\"clr-accordion-description, clr-step-description\"></ng-content>\n </button>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n class=\"clr-accordion-content-region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], animations: panelAnimation, changeDetection: i0.ChangeDetectionStrategy.OnPush });
654
655
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrAccordionPanel, decorators: [{
655
656
  type: Component,
656
- args: [{ selector: 'clr-accordion-panel', host: { '[class.clr-accordion-panel]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, animations: panelAnimation, providers: [IfExpandService], template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [disabled]=\"isAccordion && panel.disabled\"\n [attr.aria-disabled]=\"!isAccordion && panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-accordion-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle\"></cds-icon>\n <span class=\"clr-accordion-number\">{{panelNumber}}.</span>\n <cds-icon status=\"danger\" shape=\"exclamation-circle\" class=\"clr-accordion-error-icon\"></cds-icon>\n <cds-icon status=\"success\" shape=\"check-circle\" class=\"clr-accordion-complete-icon\"></cds-icon>\n </span>\n <ng-content select=\"clr-accordion-title, clr-step-title\"></ng-content>\n <ng-content select=\"clr-accordion-description, clr-step-description\"></ng-content>\n </button>\n <div class=\"clr-sr-only\" role=\"status\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\"> {{ stepErrorText(panelNumber)}} </ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">\n {{ stepCompleteText(panelNumber)}}\n </ng-container>\n </div>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n class=\"clr-accordion-content-region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n" }]
657
+ args: [{ selector: 'clr-accordion-panel', host: { '[class.clr-accordion-panel]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, animations: panelAnimation, providers: [IfExpandService], template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [disabled]=\"panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-accordion-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle\"></cds-icon>\n </span>\n <ng-content select=\"clr-accordion-title, clr-step-title\"></ng-content>\n <ng-content select=\"clr-accordion-description, clr-step-description\"></ng-content>\n </button>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n class=\"clr-accordion-content-region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n" }]
657
658
  }], ctorParameters: function () { return [{ type: ClrCommonStringsService }, { type: AccordionService }, { type: IfExpandService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { disabled: [{
658
659
  type: Input,
659
660
  args: ['clrAccordionPanelDisabled']
@@ -971,6 +972,9 @@ class StepperModel extends AccordionModel {
971
972
  this._panels[panelId].open = !this._panels[panelId].open;
972
973
  }
973
974
  }
975
+ navigateToPreviousPanel(currentPanelId) {
976
+ this.openPreviousPanel(this._panels[currentPanelId].id);
977
+ }
974
978
  navigateToNextPanel(currentPanelId, currentPanelValid = true) {
975
979
  if (currentPanelValid) {
976
980
  this.completePanel(currentPanelId);
@@ -1014,6 +1018,9 @@ class StepperModel extends AccordionModel {
1014
1018
  getNextPanel(currentPanelId) {
1015
1019
  return this.panels.find(s => s.index === this._panels[currentPanelId].index + 1);
1016
1020
  }
1021
+ getPreviousPanel(currentPanelId) {
1022
+ return this.panels.find(s => s.index === this._panels[currentPanelId].index - 1);
1023
+ }
1017
1024
  resetAllFuturePanels(panelId) {
1018
1025
  this.panels.filter(panel => panel.index >= this._panels[panelId].index).forEach(panel => this.resetPanel(panel.id));
1019
1026
  }
@@ -1052,6 +1059,15 @@ class StepperModel extends AccordionModel {
1052
1059
  this._panels[nextPanel.id].disabled = true;
1053
1060
  }
1054
1061
  }
1062
+ openPreviousPanel(currentPanelId) {
1063
+ const prevPanel = this.getPreviousPanel(currentPanelId);
1064
+ if (prevPanel) {
1065
+ this._panels[currentPanelId].open = false;
1066
+ this._panels[currentPanelId].disabled = false;
1067
+ this._panels[prevPanel.id].open = true;
1068
+ this._panels[prevPanel.id].disabled = true;
1069
+ }
1070
+ }
1055
1071
  setPanelError(panelId) {
1056
1072
  this.resetAllFuturePanels(panelId);
1057
1073
  this._panels[panelId].open = true;
@@ -1098,6 +1114,11 @@ class StepperService extends AccordionService {
1098
1114
  this.accordion.setPanelsWithErrors(ids);
1099
1115
  this.emitUpdatedPanels();
1100
1116
  }
1117
+ navigateToPreviousPanel(currentPanelId) {
1118
+ this.accordion.navigateToPreviousPanel(currentPanelId);
1119
+ this.updatePreviousStep(currentPanelId);
1120
+ this.emitUpdatedPanels();
1121
+ }
1101
1122
  navigateToNextPanel(currentPanelId, currentPanelValid = true) {
1102
1123
  this.accordion.navigateToNextPanel(currentPanelId, currentPanelValid);
1103
1124
  this.updateNextStep(currentPanelId, currentPanelValid);
@@ -1116,6 +1137,12 @@ class StepperService extends AccordionService {
1116
1137
  this._activeStepChanges.next(currentPanelId);
1117
1138
  }
1118
1139
  }
1140
+ updatePreviousStep(currentPanelId) {
1141
+ const prevPanel = this.accordion.getPreviousPanel(currentPanelId);
1142
+ if (prevPanel) {
1143
+ this._activeStepChanges.next(prevPanel.id);
1144
+ }
1145
+ }
1119
1146
  getAllCompletedPanelChanges() {
1120
1147
  return this._panelsChanges.pipe(map(() => this.accordion.allPanelsCompleted), distinctUntilChanged());
1121
1148
  }
@@ -1140,7 +1167,7 @@ class ClrStepperPanel extends ClrAccordionPanel {
1140
1167
  this.formGroupName = formGroupName;
1141
1168
  this.ngModelGroup = ngModelGroup;
1142
1169
  this.stepperService = stepperService;
1143
- this.isAccordion = false;
1170
+ this.AccordionStatus = AccordionStatus;
1144
1171
  this.subscriptions = [];
1145
1172
  }
1146
1173
  get id() {
@@ -1191,10 +1218,10 @@ class ClrStepperPanel extends ClrAccordionPanel {
1191
1218
  }
1192
1219
  }
1193
1220
  ClrStepperPanel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrStepperPanel, deps: [{ token: PLATFORM_ID }, { token: ClrCommonStringsService }, { token: i1.FormGroupName, optional: true }, { token: i1.NgModelGroup, optional: true }, { token: StepperService }, { token: IfExpandService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1194
- ClrStepperPanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrStepperPanel, selector: "clr-stepper-panel", host: { properties: { "class.clr-accordion-panel": "true" } }, providers: [IfExpandService], viewQueries: [{ propertyName: "headerButton", first: true, predicate: ["headerButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [disabled]=\"isAccordion && panel.disabled\"\n [attr.aria-disabled]=\"!isAccordion && panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-accordion-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle\"></cds-icon>\n <span class=\"clr-accordion-number\">{{panelNumber}}.</span>\n <cds-icon status=\"danger\" shape=\"exclamation-circle\" class=\"clr-accordion-error-icon\"></cds-icon>\n <cds-icon status=\"success\" shape=\"check-circle\" class=\"clr-accordion-complete-icon\"></cds-icon>\n </span>\n <ng-content select=\"clr-accordion-title, clr-step-title\"></ng-content>\n <ng-content select=\"clr-accordion-description, clr-step-description\"></ng-content>\n </button>\n <div class=\"clr-sr-only\" role=\"status\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\"> {{ stepErrorText(panelNumber)}} </ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">\n {{ stepCompleteText(panelNumber)}}\n </ng-container>\n </div>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n class=\"clr-accordion-content-region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], animations: stepAnimation, changeDetection: i0.ChangeDetectionStrategy.OnPush });
1221
+ ClrStepperPanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrStepperPanel, selector: "clr-stepper-panel", host: { properties: { "class.clr-stepper-panel": "true" } }, providers: [IfExpandService], viewQueries: [{ propertyName: "headerButton", first: true, predicate: ["headerButton"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header clr-stepper-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [attr.aria-disabled]=\"panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-step-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle clr-step-angle\"></cds-icon>\n <cds-icon\n status=\"danger\"\n *ngIf=\"panel.status === AccordionStatus.Error\"\n shape=\"exclamation-circle\"\n class=\"clr-step-error-icon\"\n ></cds-icon>\n <cds-icon\n status=\"success\"\n *ngIf=\"panel.status === AccordionStatus.Complete\"\n shape=\"check-circle\"\n class=\"clr-step-complete-icon\"\n ></cds-icon>\n </span>\n <span class=\"clr-step-title-wrapper\">\n <span class=\"clr-step-number\">{{panelNumber}}.</span>\n <ng-content select=\"clr-step-title\"></ng-content>\n </span>\n <ng-content select=\"clr-step-description\"></ng-content>\n </button>\n <div class=\"clr-sr-only\" role=\"status\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\"> {{ stepErrorText(panelNumber)}} </ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">\n {{ stepCompleteText(panelNumber)}}\n </ng-container>\n </div>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n class=\"clr-accordion-content-region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }], animations: stepAnimation, changeDetection: i0.ChangeDetectionStrategy.OnPush });
1195
1222
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrStepperPanel, decorators: [{
1196
1223
  type: Component,
1197
- args: [{ selector: 'clr-stepper-panel', host: { '[class.clr-accordion-panel]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, animations: stepAnimation, providers: [IfExpandService], template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [disabled]=\"isAccordion && panel.disabled\"\n [attr.aria-disabled]=\"!isAccordion && panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-accordion-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle\"></cds-icon>\n <span class=\"clr-accordion-number\">{{panelNumber}}.</span>\n <cds-icon status=\"danger\" shape=\"exclamation-circle\" class=\"clr-accordion-error-icon\"></cds-icon>\n <cds-icon status=\"success\" shape=\"check-circle\" class=\"clr-accordion-complete-icon\"></cds-icon>\n </span>\n <ng-content select=\"clr-accordion-title, clr-step-title\"></ng-content>\n <ng-content select=\"clr-accordion-description, clr-step-description\"></ng-content>\n </button>\n <div class=\"clr-sr-only\" role=\"status\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\"> {{ stepErrorText(panelNumber)}} </ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">\n {{ stepCompleteText(panelNumber)}}\n </ng-container>\n </div>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n class=\"clr-accordion-content-region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n" }]
1224
+ args: [{ selector: 'clr-stepper-panel', host: { '[class.clr-stepper-panel]': 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, animations: stepAnimation, providers: [IfExpandService], template: "<ng-container *ngIf=\"panel | async; let panel\">\n <div [ngClass]=\"getPanelStateClasses(panel)\">\n <div class=\"clr-accordion-header clr-stepper-header\">\n <button\n type=\"button\"\n class=\"clr-accordion-header-button\"\n (click)=\"togglePanel()\"\n [id]=\"getAccordionHeaderId(panel.templateId)\"\n [attr.aria-disabled]=\"panel.disabled\"\n [attr.aria-controls]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-expanded]=\"panel.open\"\n [class.clr-accordion-header-has-description]=\"(accordionDescription.changes | async)?.length || accordionDescription.length\"\n #headerButton\n >\n <span class=\"clr-step-status\">\n <cds-icon shape=\"angle\" direction=\"right\" class=\"clr-accordion-angle clr-step-angle\"></cds-icon>\n <cds-icon\n status=\"danger\"\n *ngIf=\"panel.status === AccordionStatus.Error\"\n shape=\"exclamation-circle\"\n class=\"clr-step-error-icon\"\n ></cds-icon>\n <cds-icon\n status=\"success\"\n *ngIf=\"panel.status === AccordionStatus.Complete\"\n shape=\"check-circle\"\n class=\"clr-step-complete-icon\"\n ></cds-icon>\n </span>\n <span class=\"clr-step-title-wrapper\">\n <span class=\"clr-step-number\">{{panelNumber}}.</span>\n <ng-content select=\"clr-step-title\"></ng-content>\n </span>\n <ng-content select=\"clr-step-description\"></ng-content>\n </button>\n <div class=\"clr-sr-only\" role=\"status\">\n <ng-container *ngIf=\"panel.status === AccordionStatus.Error\"> {{ stepErrorText(panelNumber)}} </ng-container>\n <ng-container *ngIf=\"panel.status === AccordionStatus.Complete\">\n {{ stepCompleteText(panelNumber)}}\n </ng-container>\n </div>\n </div>\n <div\n @skipInitialRender\n role=\"region\"\n class=\"clr-accordion-content-region\"\n [id]=\"getAccordionContentId(panel.templateId)\"\n [attr.aria-hidden]=\"!panel.open\"\n [attr.aria-labelledby]=\"getAccordionHeaderId(panel.templateId)\"\n >\n <div\n *ngIf=\"panel.open\"\n @toggle\n (@toggle.done)=\"collapsePanelOnAnimationDone(panel)\"\n class=\"clr-accordion-content\"\n >\n <div class=\"clr-accordion-inner-content\">\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n </div>\n</ng-container>\n" }]
1198
1225
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
1199
1226
  type: Inject,
1200
1227
  args: [PLATFORM_ID]
@@ -1216,6 +1243,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
1216
1243
  var ClrStepButtonType;
1217
1244
  (function (ClrStepButtonType) {
1218
1245
  ClrStepButtonType["Next"] = "next";
1246
+ ClrStepButtonType["Previous"] = "previous";
1219
1247
  ClrStepButtonType["Submit"] = "submit";
1220
1248
  })(ClrStepButtonType || (ClrStepButtonType = {}));
1221
1249
  class ClrStepButton {
@@ -1224,16 +1252,22 @@ class ClrStepButton {
1224
1252
  this.stepperService = stepperService;
1225
1253
  this.type = ClrStepButtonType.Next;
1226
1254
  this.submitButton = false;
1255
+ this.previousButton = false;
1227
1256
  }
1228
1257
  ngOnInit() {
1229
1258
  this.submitButton = this.type === ClrStepButtonType.Submit;
1259
+ this.previousButton = this.type === ClrStepButtonType.Previous;
1230
1260
  }
1231
1261
  navigateToNextPanel() {
1262
+ if (this.previousButton) {
1263
+ this.stepperService.navigateToPreviousPanel(this.clrStep.id);
1264
+ return;
1265
+ }
1232
1266
  this.stepperService.navigateToNextPanel(this.clrStep.id, this.clrStep.formGroup.valid);
1233
1267
  }
1234
1268
  }
1235
1269
  ClrStepButton.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrStepButton, deps: [{ token: ClrStepperPanel }, { token: StepperService }], target: i0.ɵɵFactoryTarget.Directive });
1236
- ClrStepButton.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrStepButton, selector: "[clrStepButton]", inputs: { type: ["clrStepButton", "type"] }, host: { listeners: { "click": "navigateToNextPanel()" }, properties: { "class.clr-step-button": "true", "class.btn": "true", "type": "'button'", "class.btn-primary": "this.submitButton" } }, ngImport: i0 });
1270
+ ClrStepButton.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrStepButton, selector: "[clrStepButton]", inputs: { type: ["clrStepButton", "type"] }, host: { listeners: { "click": "navigateToNextPanel()" }, properties: { "class.clr-step-button": "true", "class.btn": "true", "type": "'button'", "class.btn-success": "this.submitButton", "class.btn-link": "this.previousButton" } }, ngImport: i0 });
1237
1271
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrStepButton, decorators: [{
1238
1272
  type: Directive,
1239
1273
  args: [{
@@ -1249,7 +1283,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
1249
1283
  args: ['clrStepButton']
1250
1284
  }], submitButton: [{
1251
1285
  type: HostBinding,
1252
- args: ['class.btn-primary']
1286
+ args: ['class.btn-success']
1287
+ }], previousButton: [{
1288
+ type: HostBinding,
1289
+ args: ['class.btn-link']
1253
1290
  }], navigateToNextPanel: [{
1254
1291
  type: HostListener,
1255
1292
  args: ['click']
@@ -12707,6 +12744,12 @@ class DatagridNumericFilter extends DatagridFilterRegistrar {
12707
12744
  get minPlaceholderValue() {
12708
12745
  return this.minPlaceholder || this.commonStrings.keys.minValue;
12709
12746
  }
12747
+ get fromLabelValue() {
12748
+ return this.fromLabel || this.commonStrings.keys.fromLabel;
12749
+ }
12750
+ get toLabelValue() {
12751
+ return this.toLabel || this.commonStrings.keys.toLabel;
12752
+ }
12710
12753
  get low() {
12711
12754
  if (typeof this.filter.low === 'number' && isFinite(this.filter.low)) {
12712
12755
  return this.filter.low;
@@ -12769,31 +12812,40 @@ class DatagridNumericFilter extends DatagridFilterRegistrar {
12769
12812
  }
12770
12813
  }
12771
12814
  DatagridNumericFilter.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridNumericFilter, deps: [{ token: FiltersProvider }, { token: DomAdapter }, { token: ClrCommonStringsService }, { token: ClrPopoverToggleService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
12772
- DatagridNumericFilter.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: DatagridNumericFilter, selector: "clr-dg-numeric-filter", inputs: { minPlaceholder: ["clrFilterMinPlaceholder", "minPlaceholder"], maxPlaceholder: ["clrFilterMaxPlaceholder", "maxPlaceholder"], value: ["clrFilterValue", "value"], customNumericFilter: ["clrDgNumericFilter", "customNumericFilter"] }, outputs: { filterValueChange: "clrFilterValueChange" }, providers: [{ provide: CustomFilter, useExisting: DatagridNumericFilter }], viewQueries: [{ propertyName: "input", first: true, predicate: ["input_low"], descendants: true }, { propertyName: "filterContainer", first: true, predicate: ClrDatagridFilter, descendants: true }], usesInheritance: true, ngImport: i0, template: `
12815
+ DatagridNumericFilter.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: DatagridNumericFilter, selector: "clr-dg-numeric-filter", inputs: { minPlaceholder: ["clrFilterMinPlaceholder", "minPlaceholder"], maxPlaceholder: ["clrFilterMaxPlaceholder", "maxPlaceholder"], fromLabel: ["clrFilterFromLabel", "fromLabel"], toLabel: ["clrFilterToLabel", "toLabel"], value: ["clrFilterValue", "value"], customNumericFilter: ["clrDgNumericFilter", "customNumericFilter"] }, outputs: { filterValueChange: "clrFilterValueChange" }, providers: [{ provide: CustomFilter, useExisting: DatagridNumericFilter }], viewQueries: [{ propertyName: "input", first: true, predicate: ["input_low"], descendants: true }, { propertyName: "filterContainer", first: true, predicate: ClrDatagridFilter, descendants: true }], usesInheritance: true, ngImport: i0, template: `
12773
12816
  <clr-dg-filter [clrDgFilter]="registered" [(clrDgFilterOpen)]="open">
12774
- <input
12775
- class="datagrid-numeric-filter-input"
12776
- #input_low
12777
- type="number"
12778
- autocomplete="off"
12779
- name="low"
12780
- [(ngModel)]="low"
12781
- [placeholder]="minPlaceholderValue"
12782
- [attr.aria-label]="minPlaceholderValue"
12783
- />
12784
- <span class="datagrid-filter-input-spacer"></span>
12785
- <input
12786
- class="datagrid-numeric-filter-input"
12787
- #input_high
12788
- type="number"
12789
- autocomplete="off"
12790
- name="high"
12791
- [(ngModel)]="high"
12792
- [placeholder]="maxPlaceholderValue"
12793
- [attr.aria-label]="maxPlaceholderValue"
12794
- />
12817
+ <div class="datagrid-numeric-filter-form">
12818
+ <div class="clr-form-control">
12819
+ <label class="clr-control-label">{{ fromLabelValue }}</label>
12820
+ <input
12821
+ clrInput
12822
+ class="datagrid-numeric-filter-input"
12823
+ #input_low
12824
+ type="number"
12825
+ autocomplete="off"
12826
+ name="low"
12827
+ [(ngModel)]="low"
12828
+ [placeholder]="minPlaceholderValue"
12829
+ [attr.aria-label]="minPlaceholderValue"
12830
+ />
12831
+ </div>
12832
+ <div class="clr-form-control">
12833
+ <label class="clr-control-label">{{ toLabelValue }}</label>
12834
+ <input
12835
+ clrInput
12836
+ class="datagrid-numeric-filter-input"
12837
+ #input_high
12838
+ type="number"
12839
+ autocomplete="off"
12840
+ name="high"
12841
+ [(ngModel)]="high"
12842
+ [placeholder]="maxPlaceholderValue"
12843
+ [attr.aria-label]="maxPlaceholderValue"
12844
+ />
12845
+ </div>
12846
+ </div>
12795
12847
  </clr-dg-filter>
12796
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ClrDatagridFilter, selector: "clr-dg-filter", inputs: ["clrDgFilterOpen", "clrDgFilter"], outputs: ["clrDgFilterOpenChange"] }] });
12848
+ `, isInline: true, dependencies: [{ kind: "directive", type: ClrLabel, selector: "label", inputs: ["for"] }, { kind: "directive", type: ClrInput, selector: "[clrInput]" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ClrDatagridFilter, selector: "clr-dg-filter", inputs: ["clrDgFilterOpen", "clrDgFilter"], outputs: ["clrDgFilterOpenChange"] }] });
12797
12849
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridNumericFilter, decorators: [{
12798
12850
  type: Component,
12799
12851
  args: [{
@@ -12801,27 +12853,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12801
12853
  providers: [{ provide: CustomFilter, useExisting: DatagridNumericFilter }],
12802
12854
  template: `
12803
12855
  <clr-dg-filter [clrDgFilter]="registered" [(clrDgFilterOpen)]="open">
12804
- <input
12805
- class="datagrid-numeric-filter-input"
12806
- #input_low
12807
- type="number"
12808
- autocomplete="off"
12809
- name="low"
12810
- [(ngModel)]="low"
12811
- [placeholder]="minPlaceholderValue"
12812
- [attr.aria-label]="minPlaceholderValue"
12813
- />
12814
- <span class="datagrid-filter-input-spacer"></span>
12815
- <input
12816
- class="datagrid-numeric-filter-input"
12817
- #input_high
12818
- type="number"
12819
- autocomplete="off"
12820
- name="high"
12821
- [(ngModel)]="high"
12822
- [placeholder]="maxPlaceholderValue"
12823
- [attr.aria-label]="maxPlaceholderValue"
12824
- />
12856
+ <div class="datagrid-numeric-filter-form">
12857
+ <div class="clr-form-control">
12858
+ <label class="clr-control-label">{{ fromLabelValue }}</label>
12859
+ <input
12860
+ clrInput
12861
+ class="datagrid-numeric-filter-input"
12862
+ #input_low
12863
+ type="number"
12864
+ autocomplete="off"
12865
+ name="low"
12866
+ [(ngModel)]="low"
12867
+ [placeholder]="minPlaceholderValue"
12868
+ [attr.aria-label]="minPlaceholderValue"
12869
+ />
12870
+ </div>
12871
+ <div class="clr-form-control">
12872
+ <label class="clr-control-label">{{ toLabelValue }}</label>
12873
+ <input
12874
+ clrInput
12875
+ class="datagrid-numeric-filter-input"
12876
+ #input_high
12877
+ type="number"
12878
+ autocomplete="off"
12879
+ name="high"
12880
+ [(ngModel)]="high"
12881
+ [placeholder]="maxPlaceholderValue"
12882
+ [attr.aria-label]="maxPlaceholderValue"
12883
+ />
12884
+ </div>
12885
+ </div>
12825
12886
  </clr-dg-filter>
12826
12887
  `,
12827
12888
  }]
@@ -12831,6 +12892,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
12831
12892
  }], maxPlaceholder: [{
12832
12893
  type: Input,
12833
12894
  args: ['clrFilterMaxPlaceholder']
12895
+ }], fromLabel: [{
12896
+ type: Input,
12897
+ args: ['clrFilterFromLabel']
12898
+ }], toLabel: [{
12899
+ type: Input,
12900
+ args: ['clrFilterToLabel']
12834
12901
  }], filterValueChange: [{
12835
12902
  type: Output,
12836
12903
  args: ['clrFilterValueChange']
@@ -13411,6 +13478,19 @@ var ClrDatagridSortOrder;
13411
13478
  ClrDatagridSortOrder[ClrDatagridSortOrder["DESC"] = -1] = "DESC";
13412
13479
  })(ClrDatagridSortOrder || (ClrDatagridSortOrder = {}));
13413
13480
 
13481
+ /*
13482
+ * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
13483
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
13484
+ * This software is released under MIT license.
13485
+ * The full license information can be found in LICENSE in the root directory of this project.
13486
+ */
13487
+ // @TODO The top two are not used now, which is probably a performance drag that was broken along the way.
13488
+ // There was a previous pattern to hide everything to do computation then display, for Firefox, needs revisiting.
13489
+ const NO_LAYOUT_CLASS = 'datagrid-no-layout';
13490
+ const COMPUTE_WIDTH_CLASS = 'datagrid-computing-columns-width';
13491
+ const STRICT_WIDTH_CLASS = 'datagrid-fixed-width';
13492
+ const HIDDEN_COLUMN_CLASS = 'datagrid-hidden-column';
13493
+
13414
13494
  /*
13415
13495
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
13416
13496
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -13845,15 +13925,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
13845
13925
  * The full license information can be found in LICENSE in the root directory of this project.
13846
13926
  */
13847
13927
  class ClrDatagridColumn extends DatagridFilterRegistrar {
13848
- constructor(_sort, filters, vcr, detailService, changeDetectorRef) {
13928
+ constructor(el, _sort, filters, vcr, detailService, changeDetectorRef) {
13849
13929
  super(filters);
13930
+ this.el = el;
13850
13931
  this._sort = _sort;
13851
13932
  this.vcr = vcr;
13852
13933
  this.detailService = detailService;
13853
13934
  this.changeDetectorRef = changeDetectorRef;
13854
13935
  this.sortOrderChange = new EventEmitter();
13855
13936
  this.filterValueChange = new EventEmitter();
13856
- this.showSeparator = true;
13857
13937
  /**
13858
13938
  * A custom filter for this column that can be provided in the projected content
13859
13939
  */
@@ -13872,9 +13952,20 @@ class ClrDatagridColumn extends DatagridFilterRegistrar {
13872
13952
  * Subscription to the sort service changes
13873
13953
  */
13874
13954
  this.subscriptions = [];
13955
+ this._showSeparator = true;
13875
13956
  this.subscriptions.push(this.listenForSortingChanges());
13876
13957
  this.subscriptions.push(this.listenForDetailPaneChanges());
13877
13958
  }
13959
+ get isHidden() {
13960
+ return this.el.nativeElement.classList.contains(HIDDEN_COLUMN_CLASS);
13961
+ }
13962
+ get showSeparator() {
13963
+ return this._showSeparator;
13964
+ }
13965
+ set showSeparator(value) {
13966
+ this._showSeparator = value;
13967
+ this.changeDetectorRef.markForCheck();
13968
+ }
13878
13969
  // TODO: We might want to make this an enum in the future
13879
13970
  get colType() {
13880
13971
  return this._colType;
@@ -14050,8 +14141,6 @@ class ClrDatagridColumn extends DatagridFilterRegistrar {
14050
14141
  return this.detailService.stateChange.subscribe(state => {
14051
14142
  if (this.showSeparator !== !state) {
14052
14143
  this.showSeparator = !state;
14053
- // Have to manually change because of OnPush
14054
- this.changeDetectorRef.markForCheck();
14055
14144
  }
14056
14145
  });
14057
14146
  }
@@ -14084,7 +14173,7 @@ class ClrDatagridColumn extends DatagridFilterRegistrar {
14084
14173
  }
14085
14174
  }
14086
14175
  }
14087
- ClrDatagridColumn.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridColumn, deps: [{ token: Sort }, { token: FiltersProvider }, { token: i0.ViewContainerRef }, { token: DetailService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
14176
+ ClrDatagridColumn.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridColumn, deps: [{ token: i0.ElementRef }, { token: Sort }, { token: FiltersProvider }, { token: i0.ViewContainerRef }, { token: DetailService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
14088
14177
  ClrDatagridColumn.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrDatagridColumn, selector: "clr-dg-column", inputs: { filterStringPlaceholder: ["clrFilterStringPlaceholder", "filterStringPlaceholder"], filterNumberMaxPlaceholder: ["clrFilterNumberMaxPlaceholder", "filterNumberMaxPlaceholder"], filterNumberMinPlaceholder: ["clrFilterNumberMinPlaceholder", "filterNumberMinPlaceholder"], colType: ["clrDgColType", "colType"], field: ["clrDgField", "field"], sortBy: ["clrDgSortBy", "sortBy"], sortOrder: ["clrDgSortOrder", "sortOrder"], updateFilterValue: ["clrFilterValue", "updateFilterValue"] }, outputs: { sortOrderChange: "clrDgSortOrderChange", filterValueChange: "clrFilterValueChange" }, host: { attributes: { "role": "columnheader" }, properties: { "class.datagrid-column": "true", "attr.aria-sort": "ariaSort" } }, queries: [{ propertyName: "projectedFilter", first: true, predicate: CustomFilter, descendants: true }], usesInheritance: true, usesOnChanges: true, hostDirectives: [{ directive: ClrPopoverHostDirective }], ngImport: i0, template: `
14089
14178
  <div class="datagrid-column-flex">
14090
14179
  <button class="datagrid-column-title" *ngIf="sortable" (click)="sort()" type="button">
@@ -14125,7 +14214,7 @@ ClrDatagridColumn.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", vers
14125
14214
 
14126
14215
  <clr-dg-column-separator *ngIf="showSeparator"></clr-dg-column-separator>
14127
14216
  </div>
14128
- `, isInline: true, dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "component", type: ClrDatagridColumnSeparator, selector: "clr-dg-column-separator" }, { kind: "component", type: DatagridNumericFilter, selector: "clr-dg-numeric-filter", inputs: ["clrFilterMinPlaceholder", "clrFilterMaxPlaceholder", "clrFilterValue", "clrDgNumericFilter"], outputs: ["clrFilterValueChange"] }, { kind: "component", type: DatagridStringFilter, selector: "clr-dg-string-filter", inputs: ["clrFilterPlaceholder", "clrDgStringFilter", "clrFilterValue"], outputs: ["clrFilterValueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
14217
+ `, isInline: true, dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }, { kind: "component", type: ClrDatagridColumnSeparator, selector: "clr-dg-column-separator" }, { kind: "component", type: DatagridNumericFilter, selector: "clr-dg-numeric-filter", inputs: ["clrFilterMinPlaceholder", "clrFilterMaxPlaceholder", "clrFilterFromLabel", "clrFilterToLabel", "clrFilterValue", "clrDgNumericFilter"], outputs: ["clrFilterValueChange"] }, { kind: "component", type: DatagridStringFilter, selector: "clr-dg-string-filter", inputs: ["clrFilterPlaceholder", "clrDgStringFilter", "clrFilterValue"], outputs: ["clrFilterValueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
14129
14218
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrDatagridColumn, decorators: [{
14130
14219
  type: Component,
14131
14220
  args: [{
@@ -14179,7 +14268,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
14179
14268
  },
14180
14269
  changeDetection: ChangeDetectionStrategy.OnPush,
14181
14270
  }]
14182
- }], ctorParameters: function () { return [{ type: Sort }, { type: FiltersProvider }, { type: i0.ViewContainerRef }, { type: DetailService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { filterStringPlaceholder: [{
14271
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: Sort }, { type: FiltersProvider }, { type: i0.ViewContainerRef }, { type: DetailService }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { filterStringPlaceholder: [{
14183
14272
  type: Input,
14184
14273
  args: ['clrFilterStringPlaceholder']
14185
14274
  }], filterNumberMaxPlaceholder: [{
@@ -15759,19 +15848,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
15759
15848
  type: Injectable
15760
15849
  }], ctorParameters: function () { return [{ type: FiltersProvider }, { type: Sort }, { type: Page }, { type: StateDebouncer }]; } });
15761
15850
 
15762
- /*
15763
- * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
15764
- * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
15765
- * This software is released under MIT license.
15766
- * The full license information can be found in LICENSE in the root directory of this project.
15767
- */
15768
- // @TODO The top two are not used now, which is probably a performance drag that was broken along the way.
15769
- // There was a previous pattern to hide everything to do computation then display, for Firefox, needs revisiting.
15770
- const NO_LAYOUT_CLASS = 'datagrid-no-layout';
15771
- const COMPUTE_WIDTH_CLASS = 'datagrid-computing-columns-width';
15772
- const STRICT_WIDTH_CLASS = 'datagrid-fixed-width';
15773
- const HIDDEN_COLUMN_CLASS = 'datagrid-hidden-column';
15774
-
15775
15851
  /*
15776
15852
  * Copyright (c) 2016-2024 Broadcom. All Rights Reserved.
15777
15853
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -18243,6 +18319,7 @@ class DatagridMainRenderer {
18243
18319
  row.expandableRow?.cells.get(columnIndex)?.setHidden(state);
18244
18320
  }
18245
18321
  });
18322
+ this.updateColumnSeparatorsVisibility();
18246
18323
  this.keyNavigation.resetKeyGrid();
18247
18324
  break;
18248
18325
  case DatagridColumnChanges.INITIALIZE:
@@ -18285,6 +18362,17 @@ class DatagridMainRenderer {
18285
18362
  return false;
18286
18363
  }
18287
18364
  }
18365
+ updateColumnSeparatorsVisibility() {
18366
+ const visibleColumns = this.datagrid.columns.filter(column => !column.isHidden);
18367
+ visibleColumns.forEach((column, index) => {
18368
+ if (index === visibleColumns.length - 1) {
18369
+ column.showSeparator = false;
18370
+ }
18371
+ else if (!column.showSeparator) {
18372
+ column.showSeparator = true;
18373
+ }
18374
+ });
18375
+ }
18288
18376
  }
18289
18377
  DatagridMainRenderer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: DatagridMainRenderer, deps: [{ token: ClrDatagrid }, { token: DatagridRenderOrganizer }, { token: Items }, { token: Page }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: DetailService }, { token: TableSizeService }, { token: ColumnsService }, { token: i0.NgZone }, { token: KeyNavigationGridController }], target: i0.ɵɵFactoryTarget.Directive });
18290
18378
  DatagridMainRenderer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: DatagridMainRenderer, selector: "clr-datagrid", providers: [{ provide: DomAdapter, useFactory: domAdapterFactory, deps: [PLATFORM_ID] }], queries: [{ propertyName: "headers", predicate: DatagridHeaderRenderer }, { propertyName: "rows", predicate: DatagridRowRenderer }], ngImport: i0 });
@@ -21985,15 +22073,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
21985
22073
  * The full license information can be found in LICENSE in the root directory of this project.
21986
22074
  */
21987
22075
  const createCloseButton = (document, ariaLabel) => {
22076
+ ClarityIcons.addIcons(timesIcon);
21988
22077
  const closeButton = document.createElement('button');
21989
22078
  closeButton.setAttribute('aria-label', ariaLabel);
21990
22079
  closeButton.setAttribute('aria-hidden', 'true');
21991
22080
  closeButton.innerHTML = `
21992
22081
  <cds-icon
21993
22082
  inner-offset="1"
21994
- shape="close"
22083
+ shape="times"
21995
22084
  size="32"
21996
- </cds-icon>
22085
+ ></cds-icon>
21997
22086
  `;
21998
22087
  /**
21999
22088
  * The button is hidden by default based on our Desktop-first approach.
@@ -26769,16 +26858,23 @@ ClrWizardStepnavItem.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", v
26769
26858
  [attr.disabled]="isDisabled ? '' : null"
26770
26859
  >
26771
26860
  <div class="clr-wizard-stepnav-link-icon">
26772
- <cds-icon *ngIf="hasError" shape="error-standard" aria-label="error"></cds-icon>
26773
- <cds-icon *ngIf="!hasError && isComplete" shape="success-standard" aria-label="complete"></cds-icon>
26861
+ <cds-icon
26862
+ *ngIf="hasError"
26863
+ shape="error-standard"
26864
+ [attr.aria-label]="commonStrings.keys.wizardStepError"
26865
+ ></cds-icon>
26866
+ <cds-icon
26867
+ *ngIf="!hasError && isComplete"
26868
+ shape="success-standard"
26869
+ [attr.aria-label]="commonStrings.keys.wizardStepSuccess"
26870
+ ></cds-icon>
26774
26871
  </div>
26775
26872
 
26873
+ <span class="clr-sr-only">{{ commonStrings.keys.wizardStep }}</span>
26776
26874
  <div class="clr-wizard-stepnav-link-page-number"><ng-content></ng-content></div>
26777
26875
  <span class="clr-wizard-stepnav-link-title">
26778
26876
  <ng-template [ngTemplateOutlet]="page.navTitle"></ng-template>
26779
26877
  </span>
26780
- <span *ngIf="hasError" class="clr-sr-only">{{ commonStrings.keys.wizardStepError }}</span>
26781
- <span *ngIf="!hasError && isComplete" class="clr-sr-only">{{ commonStrings.keys.wizardStepSuccess }}</span>
26782
26878
  </button>
26783
26879
  `, isInline: true, dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdsIconCustomTag, selector: "cds-icon" }] });
26784
26880
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrWizardStepnavItem, decorators: [{
@@ -26793,16 +26889,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImpor
26793
26889
  [attr.disabled]="isDisabled ? '' : null"
26794
26890
  >
26795
26891
  <div class="clr-wizard-stepnav-link-icon">
26796
- <cds-icon *ngIf="hasError" shape="error-standard" aria-label="error"></cds-icon>
26797
- <cds-icon *ngIf="!hasError && isComplete" shape="success-standard" aria-label="complete"></cds-icon>
26892
+ <cds-icon
26893
+ *ngIf="hasError"
26894
+ shape="error-standard"
26895
+ [attr.aria-label]="commonStrings.keys.wizardStepError"
26896
+ ></cds-icon>
26897
+ <cds-icon
26898
+ *ngIf="!hasError && isComplete"
26899
+ shape="success-standard"
26900
+ [attr.aria-label]="commonStrings.keys.wizardStepSuccess"
26901
+ ></cds-icon>
26798
26902
  </div>
26799
26903
 
26904
+ <span class="clr-sr-only">{{ commonStrings.keys.wizardStep }}</span>
26800
26905
  <div class="clr-wizard-stepnav-link-page-number"><ng-content></ng-content></div>
26801
26906
  <span class="clr-wizard-stepnav-link-title">
26802
26907
  <ng-template [ngTemplateOutlet]="page.navTitle"></ng-template>
26803
26908
  </span>
26804
- <span *ngIf="hasError" class="clr-sr-only">{{ commonStrings.keys.wizardStepError }}</span>
26805
- <span *ngIf="!hasError && isComplete" class="clr-sr-only">{{ commonStrings.keys.wizardStepSuccess }}</span>
26806
26909
  </button>
26807
26910
  `,
26808
26911
  host: {