@clr/angular
Version:
Angular components for Clarity
146 lines • 19.9 kB
JavaScript
/*
* Copyright (c) 2016-2025 Broadcom. All Rights Reserved.
* The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
* This software is released under MIT license.
* The full license information can be found in LICENSE in the root directory of this project.
*/
import { AccordionStatus } from '../../enums/accordion-status.enum';
import { AccordionModel } from '../../models/accordion.model';
export class StepperModel extends AccordionModel {
constructor() {
super(...arguments);
this.stepperModelInitialize = false;
}
get allPanelsCompleted() {
return this.panels.length && this.getNumberOfIncompletePanels() === 0 && this.getNumberOfOpenPanels() === 0;
}
get shouldOpenFirstPanel() {
return !this.initialPanel || (this._panels && Object.keys(this._panels).length && !this._panels[this.initialPanel]);
}
addPanel(id, open = false) {
super.addPanel(id, open);
this._panels[id].disabled = true;
}
updatePanelOrder(ids) {
super.updatePanelOrder(ids);
if (this.stepperModelInitialize === false) {
this.openFirstPanel();
}
}
togglePanel(panelId) {
if (this._panels[panelId].status === AccordionStatus.Complete) {
this._panels[panelId].open = !this._panels[panelId].open;
}
}
navigateToPreviousPanel(currentPanelId) {
this.openPreviousPanel(this._panels[currentPanelId].id);
}
navigateToNextPanel(currentPanelId, currentPanelValid = true) {
if (currentPanelValid) {
this.completePanel(currentPanelId);
this.openNextPanel(this._panels[currentPanelId].id);
}
else {
this.setPanelError(currentPanelId);
}
}
overrideInitialPanel(panelId) {
this.initialPanel = panelId;
this.panels
.filter(() => this._panels[panelId] !== undefined)
.forEach(panel => {
if (panel.index < this._panels[panelId].index) {
this.completePanel(panel.id);
}
else if (panel.id === panelId) {
this._panels[panel.id].open = true;
}
else {
this._panels[panel.id].open = false;
}
});
}
setPanelValid(panelId) {
this._panels[panelId].status = AccordionStatus.Complete;
}
setPanelInvalid(panelId) {
this._panels[panelId].status = AccordionStatus.Error;
}
setPanelsWithErrors(ids) {
ids.forEach(id => this.setPanelError(id));
}
resetPanels() {
/* return stepper to initialize state */
this.stepperModelInitialize = false;
this.panels.forEach(p => this.resetPanel(p.id));
this.openFirstPanel();
}
getNextPanel(currentPanelId) {
return this.panels.find(s => s.index === this._panels[currentPanelId].index + 1);
}
getPreviousPanel(currentPanelId) {
return this.panels.find(s => s.index === this._panels[currentPanelId].index - 1);
}
resetAllFuturePanels(panelId) {
this.panels.filter(panel => panel.index >= this._panels[panelId].index).forEach(panel => this.resetPanel(panel.id));
}
resetPanel(panelId) {
this._panels[panelId].status = AccordionStatus.Inactive;
this._panels[panelId].open = false;
this._panels[panelId].disabled = true;
}
openFirstPanel() {
if (!this.shouldOpenFirstPanel) {
return;
}
const firstPanel = this.getFirstPanel();
/**
* You need to call updatePanelOrder first to get the correct order,
* else the list of panels will not have `index` set and we won't know
* how to find the first panel.
*/
if (!firstPanel) {
return;
}
this._panels[firstPanel.id].open = true;
this._panels[firstPanel.id].disabled = true;
this.stepperModelInitialize = true;
}
completePanel(panelId) {
this._panels[panelId].status = AccordionStatus.Complete;
this._panels[panelId].disabled = false;
this._panels[panelId].open = false;
}
openNextPanel(currentPanelId) {
const nextPanel = this.getNextPanel(currentPanelId);
if (nextPanel) {
this.resetAllFuturePanels(nextPanel.id);
this._panels[nextPanel.id].open = true;
this._panels[nextPanel.id].disabled = true;
}
}
openPreviousPanel(currentPanelId) {
const prevPanel = this.getPreviousPanel(currentPanelId);
if (prevPanel) {
this._panels[currentPanelId].open = false;
this._panels[currentPanelId].disabled = false;
this._panels[prevPanel.id].open = true;
this._panels[prevPanel.id].disabled = true;
}
}
setPanelError(panelId) {
this.resetAllFuturePanels(panelId);
this._panels[panelId].open = true;
this._panels[panelId].status = AccordionStatus.Error;
}
getFirstPanel() {
return this.panels.find(panel => panel.index === 0);
}
getNumberOfIncompletePanels() {
return this.panels.reduce((prev, next) => (next.status !== AccordionStatus.Complete ? prev + 1 : prev), 0);
}
getNumberOfOpenPanels() {
return this.panels.reduce((prev, next) => (next.open !== false ? prev + 1 : prev), 0);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHBlci5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXIvc3JjL2FjY29yZGlvbi9zdGVwcGVyL21vZGVscy9zdGVwcGVyLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUU5RCxNQUFNLE9BQU8sWUFBYSxTQUFRLGNBQWM7SUFBaEQ7O1FBQ1UsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO0lBOEp6QyxDQUFDO0lBM0pDLElBQUksa0JBQWtCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLDJCQUEyQixFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM5RyxDQUFDO0lBRUQsSUFBSSxvQkFBb0I7UUFDdEIsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDdEgsQ0FBQztJQUVRLFFBQVEsQ0FBQyxFQUFVLEVBQUUsSUFBSSxHQUFHLEtBQUs7UUFDeEMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0lBQ25DLENBQUM7SUFFUSxnQkFBZ0IsQ0FBQyxHQUFhO1FBQ3JDLEtBQUssQ0FBQyxnQkFBZ0Is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Q0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDI1IEJyb2FkY29tLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhlIHRlcm0gXCJCcm9hZGNvbVwiIHJlZmVycyB0byBCcm9hZGNvbSBJbmMuIGFuZC9vciBpdHMgc3Vic2lkaWFyaWVzLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBBY2NvcmRpb25TdGF0dXMgfSBmcm9tICcuLi8uLi9lbnVtcy9hY2NvcmRpb24tc3RhdHVzLmVudW0nO1xuaW1wb3J0IHsgQWNjb3JkaW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvYWNjb3JkaW9uLm1vZGVsJztcblxuZXhwb3J0IGNsYXNzIFN0ZXBwZXJNb2RlbCBleHRlbmRzIEFjY29yZGlvbk1vZGVsIHtcbiAgcHJpdmF0ZSBzdGVwcGVyTW9kZWxJbml0aWFsaXplID0gZmFsc2U7XG4gIHByaXZhdGUgaW5pdGlhbFBhbmVsOiBzdHJpbmc7XG5cbiAgZ2V0IGFsbFBhbmVsc0NvbXBsZXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wYW5lbHMubGVuZ3RoICYmIHRoaXMuZ2V0TnVtYmVyT2ZJbmNvbXBsZXRlUGFuZWxzKCkgPT09IDAgJiYgdGhpcy5nZXROdW1iZXJPZk9wZW5QYW5lbHMoKSA9PT0gMDtcbiAgfVxuXG4gIGdldCBzaG91bGRPcGVuRmlyc3RQYW5lbCgpIHtcbiAgICByZXR1cm4gIXRoaXMuaW5pdGlhbFBhbmVsIHx8ICh0aGlzLl9wYW5lbHMgJiYgT2JqZWN0LmtleXModGhpcy5fcGFuZWxzKS5sZW5ndGggJiYgIXRoaXMuX3BhbmVsc1t0aGlzLmluaXRpYWxQYW5lbF0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgYWRkUGFuZWwoaWQ6IHN0cmluZywgb3BlbiA9IGZhbHNlKSB7XG4gICAgc3VwZXIuYWRkUGFuZWwoaWQsIG9wZW4pO1xuICAgIHRoaXMuX3BhbmVsc1tpZF0uZGlzYWJsZWQgPSB0cnVlO1xuICB9XG5cbiAgb3ZlcnJpZGUgdXBkYXRlUGFuZWxPcmRlcihpZHM6IHN0cmluZ1tdKSB7XG4gICAgc3VwZXIudXBkYXRlUGFuZWxPcmRlcihpZHMpO1xuICAgIGlmICh0aGlzLnN0ZXBwZXJNb2RlbEluaXRpYWxpemUgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm9wZW5GaXJzdFBhbmVsKCk7XG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgdG9nZ2xlUGFuZWwocGFuZWxJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuX3BhbmVsc1twYW5lbElkXS5zdGF0dXMgPT09IEFjY29yZGlvblN0YXR1cy5Db21wbGV0ZSkge1xuICAgICAgdGhpcy5fcGFuZWxzW3BhbmVsSWRdLm9wZW4gPSAhdGhpcy5fcGFuZWxzW3BhbmVsSWRdLm9wZW47XG4gICAgfVxuICB9XG5cbiAgbmF2aWdhdGVUb1ByZXZpb3VzUGFuZWwoY3VycmVudFBhbmVsSWQ6IHN0cmluZykge1xuICAgIHRoaXMub3BlblByZXZpb3VzUGFuZWwodGhpcy5fcGFuZWxzW2N1cnJlbnRQYW5lbElkXS5pZCk7XG4gIH1cblxuICBuYXZpZ2F0ZVRvTmV4dFBhbmVsKGN1cnJlbnRQYW5lbElkOiBzdHJpbmcsIGN1cnJlbnRQYW5lbFZhbGlkID0gdHJ1ZSkge1xuICAgIGlmIChjdXJyZW50UGFuZWxWYWxpZCkge1xuICAgICAgdGhpcy5jb21wbGV0ZVBhbmVsKGN1cnJlbnRQYW5lbElkKTtcbiAgICAgIHRoaXMub3Blbk5leHRQYW5lbCh0aGlzLl9wYW5lbHNbY3VycmVudFBhbmVsSWRdLmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRQYW5lbEVycm9yKGN1cnJlbnRQYW5lbElkKTtcbiAgICB9XG4gIH1cblxuICBvdmVycmlkZUluaXRpYWxQYW5lbChwYW5lbElkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmluaXRpYWxQYW5lbCA9IHBhbmVsSWQ7XG4gICAgdGhpcy5wYW5lbHNcbiAgICAgIC5maWx0ZXIoKCkgPT4gdGhpcy5fcGFuZWxzW3BhbmVsSWRdICE9PSB1bmRlZmluZWQpXG4gICAgICAuZm9yRWFjaChwYW5lbCA9PiB7XG4gICAgICAgIGlmIChwYW5lbC5pbmRleCA8IHRoaXMuX3BhbmVsc1twYW5lbElkXS5pbmRleCkge1xuICAgICAgICAgIHRoaXMuY29tcGxldGVQYW5lbChwYW5lbC5pZCk7XG4gICAgICAgIH0gZWxzZSBpZiAocGFuZWwuaWQgPT09IHBhbmVsSWQpIHtcbiAgICAgICAgICB0aGlzLl9wYW5lbHNbcGFuZWwuaWRdLm9wZW4gPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3BhbmVsc1twYW5lbC5pZF0ub3BlbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHNldFBhbmVsVmFsaWQocGFuZWxJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5fcGFuZWxzW3BhbmVsSWRdLnN0YXR1cyA9IEFjY29yZGlvblN0YXR1cy5Db21wbGV0ZTtcbiAgfVxuXG4gIHNldFBhbmVsSW52YWxpZChwYW5lbElkOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9wYW5lbHNbcGFuZWxJZF0uc3RhdHVzID0gQWNjb3JkaW9uU3RhdHVzLkVycm9yO1xuICB9XG5cbiAgc2V0UGFuZWxzV2l0aEVycm9ycyhpZHM6IHN0cmluZ1tdKSB7XG4gICAgaWRzLmZvckVhY2goaWQgPT4gdGhpcy5zZXRQYW5lbEVycm9yKGlkKSk7XG4gIH1cblxuICByZXNldFBhbmVscygpIHtcbiAgICAvKiByZXR1cm4gc3RlcHBlciB0byBpbml0aWFsaXplIHN0YXRlICovXG4gICAgdGhpcy5zdGVwcGVyTW9kZWxJbml0aWFsaXplID0gZmFsc2U7XG4gICAgdGhpcy5wYW5lbHMuZm9yRWFjaChwID0+IHRoaXMucmVzZXRQYW5lbChwLmlkKSk7XG4gICAgdGhpcy5vcGVuRmlyc3RQYW5lbCgpO1xuICB9XG5cbiAgZ2V0TmV4dFBhbmVsKGN1cnJlbnRQYW5lbElkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5wYW5lbHMuZmluZChzID0+IHMuaW5kZXggPT09IHRoaXMuX3BhbmVsc1tjdXJyZW50UGFuZWxJZF0uaW5kZXggKyAxKTtcbiAgfVxuXG4gIGdldFByZXZpb3VzUGFuZWwoY3VycmVudFBhbmVsSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnBhbmVscy5maW5kKHMgPT4gcy5pbmRleCA9PT0gdGhpcy5fcGFuZWxzW2N1cnJlbnRQYW5lbElkXS5pbmRleCAtIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldEFsbEZ1dHVyZVBhbmVscyhwYW5lbElkOiBzdHJpbmcpIHtcbiAgICB0aGlzLnBhbmVscy5maWx0ZXIocGFuZWwgPT4gcGFuZWwuaW5kZXggPj0gdGhpcy5fcGFuZWxzW3BhbmVsSWRdLmluZGV4KS5mb3JFYWNoKHBhbmVsID0+IHRoaXMucmVzZXRQYW5lbChwYW5lbC5pZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFBhbmVsKHBhbmVsSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX3BhbmVsc1twYW5lbElkXS5zdGF0dXMgPSBBY2NvcmRpb25TdGF0dXMuSW5hY3RpdmU7XG4gICAgdGhpcy5fcGFuZWxzW3BhbmVsSWRdLm9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLl9wYW5lbHNbcGFuZWxJZF0uZGlzYWJsZWQgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuRmlyc3RQYW5lbCgpIHtcbiAgICBpZiAoIXRoaXMuc2hvdWxkT3BlbkZpcnN0UGFuZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZmlyc3RQYW5lbCA9IHRoaXMuZ2V0Rmlyc3RQYW5lbCgpO1xuICAgIC8qKlxuICAgICAqIFlvdSBuZWVkIHRvIGNhbGwgdXBkYXRlUGFuZWxPcmRlciBmaXJzdCB0byBnZXQgdGhlIGNvcnJlY3Qgb3JkZXIsXG4gICAgICogZWxzZSB0aGUgbGlzdCBvZiBwYW5lbHMgd2lsbCBub3QgaGF2ZSBgaW5kZXhgIHNldCBhbmQgd2Ugd29uJ3Qga25vd1xuICAgICAqIGhvdyB0byBmaW5kIHRoZSBmaXJzdCBwYW5lbC5cbiAgICAgKi9cbiAgICBpZiAoIWZpcnN0UGFuZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9wYW5lbHNbZmlyc3RQYW5lbC5pZF0ub3BlbiA9IHRydWU7XG4gICAgdGhpcy5fcGFuZWxzW2ZpcnN0UGFuZWwuaWRdLmRpc2FibGVkID0gdHJ1ZTtcbiAgICB0aGlzLnN0ZXBwZXJNb2RlbEluaXRpYWxpemUgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wbGV0ZVBhbmVsKHBhbmVsSWQ6IHN0cmluZykge1xuICAgIHRoaXMuX3BhbmVsc1twYW5lbElkXS5zdGF0dXMgPSBBY2NvcmRpb25TdGF0dXMuQ29tcGxldGU7XG4gICAgdGhpcy5fcGFuZWxzW3BhbmVsSWRdLmRpc2FibGVkID0gZmFsc2U7XG4gICAgdGhpcy5fcGFuZWxzW3BhbmVsSWRdLm9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgb3Blbk5leHRQYW5lbChjdXJyZW50UGFuZWxJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbmV4dFBhbmVsID0gdGhpcy5nZXROZXh0UGFuZWwoY3VycmVudFBhbmVsSWQpO1xuXG4gICAgaWYgKG5leHRQYW5lbCkge1xuICAgICAgdGhpcy5yZXNldEFsbEZ1dHVyZVBhbmVscyhuZXh0UGFuZWwuaWQpO1xuICAgICAgdGhpcy5fcGFuZWxzW25leHRQYW5lbC5pZF0ub3BlbiA9IHRydWU7XG4gICAgICB0aGlzLl9wYW5lbHNbbmV4dFBhbmVsLmlkXS5kaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuUHJldmlvdXNQYW5lbChjdXJyZW50UGFuZWxJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcHJldlBhbmVsID0gdGhpcy5nZXRQcmV2aW91c1BhbmVsKGN1cnJlbnRQYW5lbElkKTtcblxuICAgIGlmIChwcmV2UGFuZWwpIHtcbiAgICAgIHRoaXMuX3BhbmVsc1tjdXJyZW50UGFuZWxJZF0ub3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5fcGFuZWxzW2N1cnJlbnRQYW5lbElkXS5kaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgICB0aGlzLl9wYW5lbHNbcHJldlBhbmVsLmlkXS5vcGVuID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3BhbmVsc1twcmV2UGFuZWwuaWRdLmRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFBhbmVsRXJyb3IocGFuZWxJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5yZXNldEFsbEZ1dHVyZVBhbmVscyhwYW5lbElkKTtcbiAgICB0aGlzLl9wYW5lbHNbcGFuZWxJZF0ub3BlbiA9IHRydWU7XG4gICAgdGhpcy5fcGFuZWxzW3BhbmVsSWRdLnN0YXR1cyA9IEFjY29yZGlvblN0YXR1cy5FcnJvcjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Rmlyc3RQYW5lbCgpIHtcbiAgICByZXR1cm4gdGhpcy5wYW5lbHMuZmluZChwYW5lbCA9PiBwYW5lbC5pbmRleCA9PT0gMCk7XG4gIH1cblxuICBwcml2YXRlIGdldE51bWJlck9mSW5jb21wbGV0ZVBhbmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5wYW5lbHMucmVkdWNlKChwcmV2LCBuZXh0KSA9PiAobmV4dC5zdGF0dXMgIT09IEFjY29yZGlvblN0YXR1cy5Db21wbGV0ZSA/IHByZXYgKyAxIDogcHJldiksIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROdW1iZXJPZk9wZW5QYW5lbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFuZWxzLnJlZHVjZSgocHJldiwgbmV4dCkgPT4gKG5leHQub3BlbiAhPT0gZmFsc2UgPyBwcmV2ICsgMSA6IHByZXYpLCAwKTtcbiAgfVxufVxuIl19