windows-plus-utilities 0.0.87 → 0.0.89
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.
- package/esm2022/modal-wizard/components/step/step.component.mjs +3 -3
- package/esm2022/modal-wizard/public-api.mjs +2 -1
- package/esm2022/modal-wizard/util/factory/wizard-step-factory.mjs +17 -0
- package/esm2022/modal-wizard/util/interface/step-definition.interface.mjs +1 -1
- package/esm2022/modal-wizard/util/interface/wizard-state.interface.mjs +1 -1
- package/esm2022/modal-wizard/util/service/wizard-step.service.mjs +72 -98
- package/fesm2022/windows-plus-utilities-modal-wizard.mjs +91 -100
- package/fesm2022/windows-plus-utilities-modal-wizard.mjs.map +1 -1
- package/modal-wizard/public-api.d.ts +1 -0
- package/modal-wizard/util/factory/wizard-step-factory.d.ts +14 -0
- package/modal-wizard/util/interface/step-definition.interface.d.ts +21 -1
- package/modal-wizard/util/interface/wizard-state.interface.d.ts +10 -0
- package/modal-wizard/util/service/wizard-step.service.d.ts +43 -76
- package/package.json +12 -12
|
@@ -29,10 +29,10 @@ export class StepComponent {
|
|
|
29
29
|
// this.stepService.setCurrentStep(step);
|
|
30
30
|
}
|
|
31
31
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: StepComponent, deps: [{ token: i1.WizardStepService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
32
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.8", type: StepComponent, isStandalone: true, selector: "step", ngImport: i0, template: "<div class=\"form-steps-container\">\r\n\t<ng-container *ngFor=\"let step of steps | async; let i = index;\">\r\n\t\t<div class=\"d-flex flex-column align-items-center\">\r\n\t\t\t<div \r\n\t\t\t\t(click)=\"onStepClick(step)\"\r\n\t\t\t\t[ngClass]=\"{ 'step-complete': step.isComplete, 'step-incomplete': !step.isComplete, 'step-current': (currentIndex | async) === i }\"\r\n\t\t\t\tclass=\"step-bubble cursor-pointer\"\r\n\t\t\t>{{ i }}</div>\r\n\t\t\t<div>\r\n\t\t\t\t<span class=\"text-grey\">{{step.title}}</span>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"i < (steps | async)?.length - 1\" class=\"step-divider\"></div>\r\n\t</ng-container>\r\n</div>", styles: [".form-steps-container{display:flex;justify-content:space-between;align-items:center;padding:0 32px;margin-bottom:32px}.step-bubble{padding:20px;border:3px solid var(--wp-primaryBlue);width:12px;height:12px;display:flex;justify-content:center;align-items:center;border-radius:50%;color:var(--wp-primaryBlue);font-size:1em;cursor:pointer;-webkit-user-select:none;user-select:none}.step-divider{height:2px;background:var(--wp-primaryBlue);flex:1;margin:0 10px}.step-current,.step-complete{background:var(--wp-primaryBlue);color:#fff}.step-incomplete{cursor:not-allowed;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); }
|
|
32
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.8", type: StepComponent, isStandalone: true, selector: "step", ngImport: i0, template: "<div class=\"form-steps-container\">\r\n\t<ng-container *ngFor=\"let step of steps | async; let i = index;\">\r\n\t\t<div class=\"d-flex flex-column align-items-center\">\r\n\t\t\t<div \r\n\t\t\t\t(click)=\"onStepClick(step)\"\r\n\t\t\t\t[ngClass]=\"{ 'step-complete': step.isComplete, 'step-incomplete': !step.isComplete, 'step-current': (currentIndex | async) === i }\"\r\n\t\t\t\tclass=\"step-bubble cursor-pointer\"\r\n\t\t\t>{{ i + 1}}</div>\r\n\t\t\t<div>\r\n\t\t\t\t<span class=\"text-grey\">{{step.title}}</span>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"i < (steps | async)?.length - 1\" class=\"step-divider\"></div>\r\n\t</ng-container>\r\n</div>", styles: [".form-steps-container{display:flex;justify-content:space-between;align-items:center;padding:0 32px;margin-bottom:32px}.step-bubble{padding:20px;border:3px solid var(--wp-primaryBlue);width:12px;height:12px;display:flex;justify-content:center;align-items:center;border-radius:50%;color:var(--wp-primaryBlue);font-size:1em;cursor:pointer;-webkit-user-select:none;user-select:none}.step-divider{height:2px;background:var(--wp-primaryBlue);flex:1;margin:0 10px}.step-current,.step-complete{background:var(--wp-primaryBlue);color:#fff}.step-incomplete{cursor:not-allowed;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); }
|
|
33
33
|
}
|
|
34
34
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: StepComponent, decorators: [{
|
|
35
35
|
type: Component,
|
|
36
|
-
args: [{ selector: 'step', standalone: true, imports: [CommonModule], template: "<div class=\"form-steps-container\">\r\n\t<ng-container *ngFor=\"let step of steps | async; let i = index;\">\r\n\t\t<div class=\"d-flex flex-column align-items-center\">\r\n\t\t\t<div \r\n\t\t\t\t(click)=\"onStepClick(step)\"\r\n\t\t\t\t[ngClass]=\"{ 'step-complete': step.isComplete, 'step-incomplete': !step.isComplete, 'step-current': (currentIndex | async) === i }\"\r\n\t\t\t\tclass=\"step-bubble cursor-pointer\"\r\n\t\t\t>{{ i }}</div>\r\n\t\t\t<div>\r\n\t\t\t\t<span class=\"text-grey\">{{step.title}}</span>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"i < (steps | async)?.length - 1\" class=\"step-divider\"></div>\r\n\t</ng-container>\r\n</div>", styles: [".form-steps-container{display:flex;justify-content:space-between;align-items:center;padding:0 32px;margin-bottom:32px}.step-bubble{padding:20px;border:3px solid var(--wp-primaryBlue);width:12px;height:12px;display:flex;justify-content:center;align-items:center;border-radius:50%;color:var(--wp-primaryBlue);font-size:1em;cursor:pointer;-webkit-user-select:none;user-select:none}.step-divider{height:2px;background:var(--wp-primaryBlue);flex:1;margin:0 10px}.step-current,.step-complete{background:var(--wp-primaryBlue);color:#fff}.step-incomplete{cursor:not-allowed;pointer-events:none}\n"] }]
|
|
36
|
+
args: [{ selector: 'step', standalone: true, imports: [CommonModule], template: "<div class=\"form-steps-container\">\r\n\t<ng-container *ngFor=\"let step of steps | async; let i = index;\">\r\n\t\t<div class=\"d-flex flex-column align-items-center\">\r\n\t\t\t<div \r\n\t\t\t\t(click)=\"onStepClick(step)\"\r\n\t\t\t\t[ngClass]=\"{ 'step-complete': step.isComplete, 'step-incomplete': !step.isComplete, 'step-current': (currentIndex | async) === i }\"\r\n\t\t\t\tclass=\"step-bubble cursor-pointer\"\r\n\t\t\t>{{ i + 1}}</div>\r\n\t\t\t<div>\r\n\t\t\t\t<span class=\"text-grey\">{{step.title}}</span>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"i < (steps | async)?.length - 1\" class=\"step-divider\"></div>\r\n\t</ng-container>\r\n</div>", styles: [".form-steps-container{display:flex;justify-content:space-between;align-items:center;padding:0 32px;margin-bottom:32px}.step-bubble{padding:20px;border:3px solid var(--wp-primaryBlue);width:12px;height:12px;display:flex;justify-content:center;align-items:center;border-radius:50%;color:var(--wp-primaryBlue);font-size:1em;cursor:pointer;-webkit-user-select:none;user-select:none}.step-divider{height:2px;background:var(--wp-primaryBlue);flex:1;margin:0 10px}.step-current,.step-complete{background:var(--wp-primaryBlue);color:#fff}.step-incomplete{cursor:not-allowed;pointer-events:none}\n"] }]
|
|
37
37
|
}], ctorParameters: () => [{ type: i1.WizardStepService }] });
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93aW5kb3dzLXBsdXMtdXRpbGl0aWVzL21vZGFsLXdpemFyZC9jb21wb25lbnRzL3N0ZXAvc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93aW5kb3dzLXBsdXMtdXRpbGl0aWVzL21vZGFsLXdpemFyZC9jb21wb25lbnRzL3N0ZXAvc3RlcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7OztBQVkvQyxNQUFNLE9BQU8sYUFBYTtJQVN6Qjs7OztPQUlHO0lBQ0YsWUFBb0IsV0FBbUM7UUFBbkMsZ0JBQVcsR0FBWCxXQUFXLENBQXdCO0lBQUksQ0FBQztJQUM3RDs7O09BR0c7SUFDRixRQUFRO1FBQ04sSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFELENBQUM7SUFDRjs7OztPQUlHO0lBQ0YsV0FBVyxDQUFDLElBQXlCO1FBQ25DLHlDQUF5QztJQUMzQyxDQUFDOzhHQTlCVSxhQUFhO2tHQUFiLGFBQWEsZ0VDYjFCLDJwQkFjTSxxb0JETE0sWUFBWTs7MkZBSVgsYUFBYTtrQkFQekIsU0FBUzsrQkFDRSxNQUFNLGNBQ0osSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJ1xyXG5pbXBvcnQgeyBTdGVwRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL3V0aWwvaW50ZXJmYWNlL3N0ZXAtZGVmaW5pdGlvbi5pbnRlcmZhY2UnXHJcbmltcG9ydCB7IFdpemFyZFN0ZXBTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXRpbC9zZXJ2aWNlL3dpemFyZC1zdGVwLnNlcnZpY2UnXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3N0ZXAnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3N0ZXAuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3N0ZXAuY29tcG9uZW50LnNhc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgU3RlcENvbXBvbmVudCB7XHJcblx0LyoqXHJcblx0ICogQGRlc2NyaXB0aW9uIGFuIG9ic2VydmFibGUgdG8gdGhlIG1vZGFsIHN0ZXBzXHJcblx0ICovXHJcbiAgc3RlcHM6IE9ic2VydmFibGU8U3RlcERlZmluaXRpb248YW55PltdPlxyXG5cdC8qKlxyXG5cdCAqIEBkZXNjcmlwdGlvbiBhbiBvYnNlcnZhYmxlIHRvIHRoZSBjdXJyZW50IHN0ZXBcclxuXHQgKi9cclxuICBjdXJyZW50SW5kZXg6IE9ic2VydmFibGU8bnVtYmVyPjtcclxuXHQvKipcclxuXHQgKiBAYXV0aG9yIEFsZXggSG9kc29uXHJcblx0ICogQGRlc2NyaXB0aW9uIGNsYXNzIGNvbnN0cnVjdG9yIHNwZWNpZnlpbmcgdGhlIHJlcXVpcmVkIHNlcnZpY2VzIGFuZCBwcm9wZXJ0aWVzXHJcblx0ICogQHBhcmFtIHN0ZXBTZXJ2aWNlIHRoZSBzZXJ2aWNlIGNsYXNzIHdoaWNoIGNvbnRhaW5zIGFjY2VzcyB0byB0aGUgbW9kYWwgc3RlcHMgZnVuY3Rpb25hbGl0eVxyXG5cdCAqL1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc3RlcFNlcnZpY2U6IFdpemFyZFN0ZXBTZXJ2aWNlPGFueT4pIHsgfVxyXG5cdC8qKlxyXG5cdCAqIEBhdXRob3IgQWxleCBIb2Rzb25cclxuXHQgKiBAZGVzY3JpcHRpb24gdGhlIG1ldGhvZCB0byBiZSBydW4gd2hlbiB0aGUgY29tcG9uZW50IGlzIHJlbmRlcmVkXHJcblx0ICovXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0ZXBzID0gdGhpcy5zdGVwU2VydmljZS5nZXRTdGVwcyQoKTtcclxuICAgIHRoaXMuY3VycmVudEluZGV4ID0gdGhpcy5zdGVwU2VydmljZS5nZXRDdXJyZW50SW5kZXgkKCk7XHJcbiAgfVxyXG5cdC8qKlxyXG5cdCAqIEBhdXRob3IgQWxleCBIb2Rzb25cclxuXHQgKiBAZGVzY3JpcHRpb24gaGFuZGxlcyB0aGUgdXNlciBjbGlja2luZyBhIHN0ZXBcclxuXHQgKiBAcGFyYW0gc3RlcCB0aGUgc3RlcCBjbGlja2VkXHJcblx0ICovXHJcbiAgb25TdGVwQ2xpY2soc3RlcDogU3RlcERlZmluaXRpb248YW55Pikge1xyXG4gICAgLy8gdGhpcy5zdGVwU2VydmljZS5zZXRDdXJyZW50U3RlcChzdGVwKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImZvcm0tc3RlcHMtY29udGFpbmVyXCI+XHJcblx0PG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3RlcCBvZiBzdGVwcyB8IGFzeW5jOyBsZXQgaSA9IGluZGV4O1wiPlxyXG5cdFx0PGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuXHRcdFx0PGRpdiBcclxuXHRcdFx0XHQoY2xpY2spPVwib25TdGVwQ2xpY2soc3RlcClcIlxyXG5cdFx0XHRcdFtuZ0NsYXNzXT1cInsgJ3N0ZXAtY29tcGxldGUnOiBzdGVwLmlzQ29tcGxldGUsICdzdGVwLWluY29tcGxldGUnOiAhc3RlcC5pc0NvbXBsZXRlLCAnc3RlcC1jdXJyZW50JzogKGN1cnJlbnRJbmRleCB8IGFzeW5jKSA9PT0gaSB9XCJcclxuXHRcdFx0XHRjbGFzcz1cInN0ZXAtYnViYmxlIGN1cnNvci1wb2ludGVyXCJcclxuXHRcdFx0Pnt7IGkgKyAxfX08L2Rpdj5cclxuXHRcdFx0PGRpdj5cclxuXHRcdFx0XHQ8c3BhbiBjbGFzcz1cInRleHQtZ3JleVwiPnt7c3RlcC50aXRsZX19PC9zcGFuPlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdDwvZGl2PlxyXG5cdFx0PGRpdiAqbmdJZj1cImkgPCAoc3RlcHMgfCBhc3luYyk/Lmxlbmd0aCAtIDFcIiBjbGFzcz1cInN0ZXAtZGl2aWRlclwiPjwvZGl2PlxyXG5cdDwvbmctY29udGFpbmVyPlxyXG48L2Rpdj4iXX0=
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Public API Surface of windows-plus-utilities
|
|
3
3
|
*/
|
|
4
4
|
export * from './components/step/step.component';
|
|
5
|
+
export * from './util/factory/wizard-step-factory';
|
|
5
6
|
export * from './util/helper/wizard-builder.service';
|
|
6
7
|
export * from './util/interface/modal-step.interface';
|
|
7
8
|
export * from './util/interface/step-definition.interface';
|
|
@@ -10,4 +11,4 @@ export * from './util/interface/wizard-modal.interface';
|
|
|
10
11
|
export * from './util/interface/wizard-state.interface';
|
|
11
12
|
export * from './util/service/wizard-step.service';
|
|
12
13
|
export * from './util/service/step.service';
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3dpbmRvd3MtcGx1cy11dGlsaXRpZXMvbW9kYWwtd2l6YXJkL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxjQUFjLGtDQUFrQyxDQUFDO0FBRWpELGNBQWMsb0NBQW9DLENBQUE7QUFFbEQsY0FBYyxzQ0FBc0MsQ0FBQTtBQUVwRCxjQUFjLHVDQUF1QyxDQUFBO0FBQ3JELGNBQWMsNENBQTRDLENBQUE7QUFDMUQsY0FBYywwQ0FBMEMsQ0FBQTtBQUN4RCxjQUFjLHlDQUF5QyxDQUFBO0FBQ3ZELGNBQWMseUNBQXlDLENBQUE7QUFFdkQsY0FBYyxvQ0FBb0MsQ0FBQTtBQUNsRCxjQUFjLDZCQUE2QixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIHdpbmRvd3MtcGx1cy11dGlsaXRpZXNcclxuICovXHJcbmV4cG9ydCAqIGZyb20gJy4vY29tcG9uZW50cy9zdGVwL3N0ZXAuY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vdXRpbC9mYWN0b3J5L3dpemFyZC1zdGVwLWZhY3RvcnknXHJcblxyXG5leHBvcnQgKiBmcm9tICcuL3V0aWwvaGVscGVyL3dpemFyZC1idWlsZGVyLnNlcnZpY2UnXHJcblxyXG5leHBvcnQgKiBmcm9tICcuL3V0aWwvaW50ZXJmYWNlL21vZGFsLXN0ZXAuaW50ZXJmYWNlJ1xyXG5leHBvcnQgKiBmcm9tICcuL3V0aWwvaW50ZXJmYWNlL3N0ZXAtZGVmaW5pdGlvbi5pbnRlcmZhY2UnXHJcbmV4cG9ydCAqIGZyb20gJy4vdXRpbC9pbnRlcmZhY2Uvc3RlcHBlZC1tb2RhbC5pbnRlcmZhY2UnXHJcbmV4cG9ydCAqIGZyb20gJy4vdXRpbC9pbnRlcmZhY2Uvd2l6YXJkLW1vZGFsLmludGVyZmFjZSdcclxuZXhwb3J0ICogZnJvbSAnLi91dGlsL2ludGVyZmFjZS93aXphcmQtc3RhdGUuaW50ZXJmYWNlJ1xyXG5cclxuZXhwb3J0ICogZnJvbSAnLi91dGlsL3NlcnZpY2Uvd2l6YXJkLXN0ZXAuc2VydmljZSdcclxuZXhwb3J0ICogZnJvbSAnLi91dGlsL3NlcnZpY2Uvc3RlcC5zZXJ2aWNlJyJdfQ==
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Factory helper for building dynamic wizard step flows.
|
|
3
|
+
*/
|
|
4
|
+
export class WizardStepFactory {
|
|
5
|
+
constructor(masterSteps) {
|
|
6
|
+
this.masterSteps = masterSteps;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Resolves the active step list based on context conditions.
|
|
10
|
+
*
|
|
11
|
+
* @param context The current wizard context.
|
|
12
|
+
*/
|
|
13
|
+
build(context) {
|
|
14
|
+
return this.masterSteps.filter(step => !step.condition || step.condition(context));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6YXJkLXN0ZXAtZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dpbmRvd3MtcGx1cy11dGlsaXRpZXMvbW9kYWwtd2l6YXJkL3V0aWwvZmFjdG9yeS93aXphcmQtc3RlcC1mYWN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGlCQUFpQjtJQUM1QixZQUNtQixXQUFnQztRQUFoQyxnQkFBVyxHQUFYLFdBQVcsQ0FBcUI7SUFDL0MsQ0FBQztJQUVMOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsT0FBVTtRQUNkLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDcEMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQzNDLENBQUE7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdGVwRGVmaW5pdGlvbiB9IGZyb20gJy4uL2ludGVyZmFjZS9zdGVwLWRlZmluaXRpb24uaW50ZXJmYWNlJ1xyXG5cclxuLyoqXHJcbiAqIEZhY3RvcnkgaGVscGVyIGZvciBidWlsZGluZyBkeW5hbWljIHdpemFyZCBzdGVwIGZsb3dzLlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFdpemFyZFN0ZXBGYWN0b3J5PFQ+IHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWFzdGVyU3RlcHM6IFN0ZXBEZWZpbml0aW9uPFQ+W11cclxuICApIHsgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXNvbHZlcyB0aGUgYWN0aXZlIHN0ZXAgbGlzdCBiYXNlZCBvbiBjb250ZXh0IGNvbmRpdGlvbnMuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY3VycmVudCB3aXphcmQgY29udGV4dC5cclxuICAgKi9cclxuICBidWlsZChjb250ZXh0OiBUKTogU3RlcERlZmluaXRpb248VD5bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXN0ZXJTdGVwcy5maWx0ZXIoc3RlcCA9PlxyXG4gICAgICAhc3RlcC5jb25kaXRpb24gfHwgc3RlcC5jb25kaXRpb24oY29udGV4dClcclxuICAgIClcclxuICB9XHJcbn0iXX0=
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1kZWZpbml0aW9uLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dpbmRvd3MtcGx1cy11dGlsaXRpZXMvbW9kYWwtd2l6YXJkL3V0aWwvaW50ZXJmYWNlL3N0ZXAtZGVmaW5pdGlvbi5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAYXV0aG9yIEFsZXggSG9kc29uXHJcbiAqIEBkZXNjcmlwdGlvbiBhbiBpbnRlcmZhY2UgZGVmaW5pbmcgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGEgc2luZ2xlIHdpemFyZCBzdGVwXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBEZWZpbml0aW9uPFQ+
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1kZWZpbml0aW9uLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dpbmRvd3MtcGx1cy11dGlsaXRpZXMvbW9kYWwtd2l6YXJkL3V0aWwvaW50ZXJmYWNlL3N0ZXAtZGVmaW5pdGlvbi5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAYXV0aG9yIEFsZXggSG9kc29uXHJcbiAqIEBkZXNjcmlwdGlvbiBhbiBpbnRlcmZhY2UgZGVmaW5pbmcgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGEgc2luZ2xlIHdpemFyZCBzdGVwXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBEZWZpbml0aW9uPFQ+IHtcclxuXHQvKipcclxuXHQgKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHN0ZXAuXHJcblx0ICovXHJcbiAgaWQ6IHN0cmluZ1xyXG4gIC8qKlxyXG4gICAqIEh1bWFuLXJlYWRhYmxlIHN0ZXAgdGl0bGUuXHJcbiAgICovXHJcbiAgdGl0bGU6IHN0cmluZ1xyXG4gIC8qKlxyXG4gICAqIFVuaXF1ZSBpZGVudGlmaWVyIHVzZWQgZm9yIHJvdXRpbmcgYW5kIGxvb2t1cC5cclxuICAgKi9cclxuICBzbHVnOiBzdHJpbmdcclxuXHQvKipcclxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RlcCBpcyBjb21wbGV0ZWQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gZW5hYmxlL2Rpc2FibGUgbmF2aWdhdGlvbiBvciBzaG93IHByb2dyZXNzLlxyXG5cdCAqL1xyXG5cdGlzQ29tcGxldGU6IGJvb2xlYW5cclxuICAvKipcclxuICAgKiBPcHRpb25hbCBndWFyZCBleGVjdXRlZCBiZWZvcmUgbGVhdmluZyB0aGUgc3RlcC5cclxuICAgKiBSZXR1cm4gZmFsc2UgdG8gYmxvY2sgbmF2aWdhdGlvbi5cclxuICAgKi9cclxuICBvbkV4aXQ/OiAoY29udGV4dD86IGFueSkgPT4gUHJvbWlzZTxib29sZWFuPiB8IGJvb2xlYW5cclxuICAvKipcclxuICAgKiBPcHRpb25hbCBjb25kaXRpb25hbCB2aXNpYmlsaXR5IHJ1bGUuXHJcbiAgICogSWYgcHJvdmlkZWQsIHRoZSBzdGVwIHdpbGwgb25seSBiZSBpbmNsdWRlZCB3aGVuIHRydWUuXHJcbiAgICovXHJcbiAgY29uZGl0aW9uPzogKGNvbnRleHQ6IFQpID0+IGJvb2xlYW5cclxufSJdfQ==
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6YXJkLXN0YXRlLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dpbmRvd3MtcGx1cy11dGlsaXRpZXMvbW9kYWwtd2l6YXJkL3V0aWwvaW50ZXJmYWNlL3dpemFyZC1zdGF0ZS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0ZXBEZWZpbml0aW9uIH0gZnJvbSAnLi9zdGVwLWRlZmluaXRpb24uaW50ZXJmYWNlJ1xyXG4vKipcclxuICogQGF1dGhvciBBbGV4IEhvZHNvblxyXG4gKiBAZGVzY3JpcHRpb24gYW4gaW50ZXJmYWNlIGRlZmluaW5nIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgd2l6YXJkIG1vZGFsJ3Mgc3RhdGVcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgV2l6YXJkU3RhdGU8VD4ge1xyXG4gIC8qKlxyXG4gICAqIE9yZGVyZWQgYWN0aXZlIHN0ZXBzIGluIHRoZSB3aXphcmQuXHJcbiAgICovXHJcbiAgc3RlcHM6IFN0ZXBEZWZpbml0aW9uPFQ+W11cclxuICAvKipcclxuICAgKiBDdXJyZW50IGFjdGl2ZSBzdGVwIGluZGV4LlxyXG4gICAqL1xyXG4gIGN1cnJlbnRJbmRleDogbnVtYmVyXHJcbiAgLyoqXHJcbiAgICogU2hhcmVkIHdpemFyZCBjb250ZXh0IG9iamVjdC5cclxuICAgKi9cclxuICBjb250ZXh0OiBUXHJcbn0iXX0=
|
|
@@ -1,140 +1,135 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject
|
|
2
|
+
import { BehaviorSubject } from 'rxjs';
|
|
3
|
+
import { map } from 'rxjs/operators';
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
5
|
import * as i1 from "@angular/router";
|
|
5
6
|
/**
|
|
6
|
-
*
|
|
7
|
+
* Generic reusable wizard step controller.
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* Handles:
|
|
10
|
+
* - Navigation
|
|
11
|
+
* - Conditional step resolution
|
|
12
|
+
* - Dynamic step insertion/removal
|
|
13
|
+
* - Context persistence
|
|
14
|
+
* - Router synchronization
|
|
12
15
|
*
|
|
13
|
-
*
|
|
14
|
-
* component level. Each wizard instance should create and initialize its own
|
|
15
|
-
* service instance.
|
|
16
|
-
*
|
|
17
|
-
* @typeParam T - The type used for step parameter definitions.
|
|
16
|
+
* @template T The shared wizard context type.
|
|
18
17
|
*/
|
|
19
18
|
export class WizardStepService {
|
|
20
|
-
/**
|
|
21
|
-
* Creates a new WizardStepService instance.
|
|
22
|
-
*
|
|
23
|
-
* @param router - Angular Router used to update the URL when step changes occur.
|
|
24
|
-
* @param activatedRoute - The current route used as the relative base for navigation.
|
|
25
|
-
*/
|
|
26
19
|
constructor(router, activatedRoute) {
|
|
27
20
|
this.router = router;
|
|
28
21
|
this.activatedRoute = activatedRoute;
|
|
29
22
|
/**
|
|
30
|
-
* Internal state container
|
|
31
|
-
*
|
|
32
|
-
* Holds the ordered step definitions and the currently active index.
|
|
33
|
-
* A `null` value indicates the wizard has not yet been initialized.
|
|
23
|
+
* Internal wizard state container.
|
|
34
24
|
*/
|
|
35
25
|
this.state$ = new BehaviorSubject(null);
|
|
36
26
|
/**
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
* This can be controlled externally (e.g., form validity).
|
|
27
|
+
* Controls whether forward navigation is allowed.
|
|
40
28
|
*/
|
|
41
29
|
this.stepForwardAvailability$ = new BehaviorSubject(false);
|
|
42
30
|
}
|
|
43
31
|
/**
|
|
44
|
-
* Initializes the wizard
|
|
45
|
-
*
|
|
46
|
-
* This method must be called before navigation methods are used.
|
|
47
|
-
* It resets the wizard state and navigates to the first step.
|
|
32
|
+
* Initializes the wizard.
|
|
48
33
|
*
|
|
49
|
-
* @param
|
|
34
|
+
* @param factory The step factory defining the wizard flow.
|
|
35
|
+
* @param initialContext Initial shared context object.
|
|
50
36
|
*/
|
|
51
|
-
initialize(
|
|
37
|
+
initialize(factory, initialContext) {
|
|
38
|
+
this.factory = factory;
|
|
39
|
+
const steps = factory.build(initialContext);
|
|
52
40
|
this.state$.next({
|
|
53
|
-
steps
|
|
54
|
-
currentIndex: 0
|
|
41
|
+
steps,
|
|
42
|
+
currentIndex: 0,
|
|
43
|
+
context: initialContext
|
|
55
44
|
});
|
|
56
45
|
this.navigate();
|
|
57
46
|
}
|
|
58
47
|
/**
|
|
59
|
-
* Returns the
|
|
60
|
-
*
|
|
61
|
-
* @returns The active {@link StepDefinition}, or `null` if not initialized.
|
|
48
|
+
* Returns the current step synchronously.
|
|
62
49
|
*/
|
|
63
50
|
getCurrentStep() {
|
|
64
|
-
|
|
51
|
+
const state = this.state$.value;
|
|
52
|
+
if (!state)
|
|
53
|
+
return null;
|
|
54
|
+
return state.steps[state.currentIndex] ?? null;
|
|
65
55
|
}
|
|
66
56
|
/**
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* @returns Observable stream of the active step or `null` if uninitialized.
|
|
57
|
+
* Observable stream of current step.
|
|
70
58
|
*/
|
|
71
59
|
getCurrentStep$() {
|
|
72
60
|
return this.state$.pipe(map(state => state ? state.steps[state.currentIndex] : null));
|
|
73
61
|
}
|
|
74
62
|
/**
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
* @returns Observable stream of step definitions.
|
|
63
|
+
* Observable stream of all active steps.
|
|
78
64
|
*/
|
|
79
65
|
getSteps$() {
|
|
80
66
|
return this.state$.pipe(map(state => state?.steps ?? []));
|
|
81
67
|
}
|
|
82
68
|
/**
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
* @returns Observable stream of the current index (0-based).
|
|
69
|
+
* Observable stream of the current index.
|
|
86
70
|
*/
|
|
87
71
|
getCurrentIndex$() {
|
|
88
72
|
return this.state$.pipe(map(state => state?.currentIndex ?? 0));
|
|
89
73
|
}
|
|
90
74
|
/**
|
|
91
|
-
*
|
|
75
|
+
* Returns the shared wizard context.
|
|
76
|
+
*/
|
|
77
|
+
getContext() {
|
|
78
|
+
return this.state$.value?.context ?? null;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Advances to the next step.
|
|
92
82
|
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
95
|
-
*
|
|
83
|
+
* Executes:
|
|
84
|
+
* - onExit guard
|
|
85
|
+
* - context merge
|
|
86
|
+
* - step recomposition
|
|
87
|
+
* - navigation
|
|
96
88
|
*
|
|
97
|
-
* @param
|
|
89
|
+
* @param partialContext Optional context updates.
|
|
98
90
|
*/
|
|
99
|
-
async next(
|
|
91
|
+
async next(partialContext) {
|
|
100
92
|
const state = this.state$.value;
|
|
101
|
-
if (!state)
|
|
93
|
+
if (!state || !this.factory)
|
|
102
94
|
return;
|
|
103
95
|
const current = state.steps[state.currentIndex];
|
|
96
|
+
const updatedContext = {
|
|
97
|
+
...state.context,
|
|
98
|
+
...partialContext
|
|
99
|
+
};
|
|
104
100
|
if (current.onExit) {
|
|
105
|
-
const allowed = await current.onExit(
|
|
101
|
+
const allowed = await current.onExit(updatedContext);
|
|
106
102
|
if (!allowed)
|
|
107
103
|
return;
|
|
108
104
|
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
105
|
+
const newSteps = this.factory.build(updatedContext);
|
|
106
|
+
const currentSlug = current.slug;
|
|
107
|
+
const newIndex = newSteps.findIndex(s => s.slug === currentSlug);
|
|
108
|
+
const nextIndex = Math.min(newIndex + 1, newSteps.length - 1);
|
|
109
|
+
this.state$.next({
|
|
110
|
+
steps: newSteps,
|
|
111
|
+
currentIndex: nextIndex,
|
|
112
|
+
context: updatedContext
|
|
113
|
+
});
|
|
114
|
+
this.navigate();
|
|
116
115
|
}
|
|
117
116
|
/**
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
* No guards are executed during backward navigation.
|
|
117
|
+
* Navigates to the previous step.
|
|
121
118
|
*/
|
|
122
119
|
previous() {
|
|
123
120
|
const state = this.state$.value;
|
|
124
121
|
if (!state)
|
|
125
122
|
return;
|
|
126
|
-
if (state.currentIndex
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
123
|
+
if (state.currentIndex === 0)
|
|
124
|
+
return;
|
|
125
|
+
this.state$.next({
|
|
126
|
+
...state,
|
|
127
|
+
currentIndex: state.currentIndex - 1
|
|
128
|
+
});
|
|
129
|
+
this.navigate();
|
|
133
130
|
}
|
|
134
131
|
/**
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
* @returns `true` if on the last step; otherwise `false`.
|
|
132
|
+
* Returns whether the wizard is currently on the last step.
|
|
138
133
|
*/
|
|
139
134
|
isLast() {
|
|
140
135
|
const state = this.state$.value;
|
|
@@ -143,30 +138,19 @@ export class WizardStepService {
|
|
|
143
138
|
return state.currentIndex === state.steps.length - 1;
|
|
144
139
|
}
|
|
145
140
|
/**
|
|
146
|
-
* Sets
|
|
147
|
-
*
|
|
148
|
-
* This is typically controlled by external validation logic (e.g., form state).
|
|
149
|
-
*
|
|
150
|
-
* @param available - `true` if forward navigation should be allowed.
|
|
141
|
+
* Sets forward navigation availability.
|
|
151
142
|
*/
|
|
152
143
|
setStepForwardAvailability(available) {
|
|
153
144
|
this.stepForwardAvailability$.next(available);
|
|
154
145
|
}
|
|
155
146
|
/**
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
* @returns Observable stream of the forward navigation flag.
|
|
147
|
+
* Returns observable forward navigation state.
|
|
159
148
|
*/
|
|
160
149
|
getStepForwardAvailability() {
|
|
161
150
|
return this.stepForwardAvailability$.asObservable();
|
|
162
151
|
}
|
|
163
152
|
/**
|
|
164
|
-
* Navigates the router to the
|
|
165
|
-
*
|
|
166
|
-
* This method updates the URL relative to the injected route
|
|
167
|
-
* using the pattern: `step-{slug}`.
|
|
168
|
-
*
|
|
169
|
-
* @internal
|
|
153
|
+
* Navigates the Angular router to the current step.
|
|
170
154
|
*/
|
|
171
155
|
navigate() {
|
|
172
156
|
const step = this.getCurrentStep();
|
|
@@ -174,20 +158,10 @@ export class WizardStepService {
|
|
|
174
158
|
return;
|
|
175
159
|
this.router.navigate([`step-${step.slug}`], { relativeTo: this.activatedRoute });
|
|
176
160
|
}
|
|
177
|
-
/**
|
|
178
|
-
* Navigates the router away from any "step" route.
|
|
179
|
-
*
|
|
180
|
-
* This methods updates the URL relative to the injected route, removing every after `/step-
|
|
181
|
-
*/
|
|
182
|
-
clearStepRoute() {
|
|
183
|
-
const url = this.router.url;
|
|
184
|
-
const [initial] = url.split('/step-');
|
|
185
|
-
this.router.navigate([initial]);
|
|
186
|
-
}
|
|
187
161
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: WizardStepService, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
188
162
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: WizardStepService }); }
|
|
189
163
|
}
|
|
190
164
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: WizardStepService, decorators: [{
|
|
191
165
|
type: Injectable
|
|
192
166
|
}], ctorParameters: () => [{ type: i1.Router }, { type: i1.ActivatedRoute }] });
|
|
193
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6YXJkLXN0ZXAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dpbmRvd3MtcGx1cy11dGlsaXRpZXMvbW9kYWwtd2l6YXJkL3V0aWwvc2VydmljZS93aXphcmQtc3RlcC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFMUMsT0FBTyxFQUFFLGVBQWUsRUFBYyxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUE7OztBQUd2RDs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUgsTUFBTSxPQUFPLGlCQUFpQjtJQWlCN0I7Ozs7O09BS0c7SUFDSCxZQUNTLE1BQWMsRUFDZCxjQUE4QjtRQUQ5QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBdkJ2Qzs7Ozs7V0FLRztRQUNLLFdBQU0sR0FBRyxJQUFJLGVBQWUsQ0FBd0IsSUFBSSxDQUFDLENBQUE7UUFFakU7Ozs7V0FJRztRQUNLLDZCQUF3QixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFBO0lBV2xFLENBQUM7SUFFTDs7Ozs7OztPQU9HO0lBQ0gsVUFBVSxDQUFDLEtBQTBCO1FBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ2hCLEtBQUssRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsaUJBQWlCO1lBQ3BDLFlBQVksRUFBRSxDQUFDO1NBQ2YsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBO0lBQ2hCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYztRQUNiLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQTtJQUN4RSxDQUFD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QUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTTtRQUVqQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FDbkIsQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUNyQixFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQ25DLENBQUE7SUFDRixDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNILGNBQWM7UUFDYixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQTtRQUMzQixNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7SUFDaEMsQ0FBQzs4R0FuTVcsaUJBQWlCO2tIQUFqQixpQkFBaUI7OzJGQUFqQixpQkFBaUI7a0JBRDdCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHsgUm91dGVyLCBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcidcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBtYXAgfSBmcm9tICdyeGpzJ1xyXG5pbXBvcnQgeyBTdGVwRGVmaW5pdGlvbiB9IGZyb20gJy4uL2ludGVyZmFjZS9zdGVwLWRlZmluaXRpb24uaW50ZXJmYWNlJ1xyXG5pbXBvcnQgeyBXaXphcmRTdGF0ZSB9IGZyb20gJy4uL2ludGVyZmFjZS93aXphcmQtc3RhdGUuaW50ZXJmYWNlJ1xyXG4vKipcclxuICogQSBmaW5pdGUgc3RhdGUgbWFjaGluZSBzZXJ2aWNlIHVzZWQgdG8gbWFuYWdlIHdpemFyZC1zdHlsZSBzdGVwIG5hdmlnYXRpb24uXHJcbiAqXHJcbiAqIFRoaXMgc2VydmljZSBtYWludGFpbnMgYW4gaW1tdXRhYmxlIGxpc3Qgb2Yge0BsaW5rIFN0ZXBEZWZpbml0aW9ufSBvYmplY3RzIGFuZFxyXG4gKiB0cmFja3MgdGhlIGN1cnJlbnQgYWN0aXZlIHN0ZXAgaW5kZXggaW50ZXJuYWxseS4gSXQgZXhwb3NlcyByZWFjdGl2ZSBzdHJlYW1zXHJcbiAqIGZvciBzdGVwIGRhdGEgYW5kIG5hdmlnYXRpb24gc3RhdGUsIGFuZCBjb29yZGluYXRlcyByb3V0ZXIgbmF2aWdhdGlvbiB3aGVuXHJcbiAqIHRyYW5zaXRpb25zIG9jY3VyLlxyXG4gKlxyXG4gKiBUaGUgc2VydmljZSBpcyBpbnRlbnRpb25hbGx5IGNvbXBvbmVudC1zY29wZWQgYW5kIG11c3QgYmUgcHJvdmlkZWQgYXQgdGhlXHJcbiAqIGNvbXBvbmVudCBsZXZlbC4gRWFjaCB3aXphcmQgaW5zdGFuY2Ugc2hvdWxkIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBpdHMgb3duXHJcbiAqIHNlcnZpY2UgaW5zdGFuY2UuXHJcbiAqXHJcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIHVzZWQgZm9yIHN0ZXAgcGFyYW1ldGVyIGRlZmluaXRpb25zLlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgV2l6YXJkU3RlcFNlcnZpY2U8VD4ge1xyXG5cclxuXHQvKipcclxuXHQgKiBJbnRlcm5hbCBzdGF0ZSBjb250YWluZXIgZm9yIHRoZSB3aXphcmQuXHJcblx0ICpcclxuXHQgKiBIb2xkcyB0aGUgb3JkZXJlZCBzdGVwIGRlZmluaXRpb25zIGFuZCB0aGUgY3VycmVudGx5IGFjdGl2ZSBpbmRleC5cclxuXHQgKiBBIGBudWxsYCB2YWx1ZSBpbmRpY2F0ZXMgdGhlIHdpemFyZCBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxXaXphcmRTdGF0ZTxUPiB8IG51bGw+KG51bGwpXHJcblxyXG5cdC8qKlxyXG5cdCAqIEVtaXRzIHdoZXRoZXIgZm9yd2FyZCBuYXZpZ2F0aW9uIGlzIGN1cnJlbnRseSBhbGxvd2VkLlxyXG5cdCAqXHJcblx0ICogVGhpcyBjYW4gYmUgY29udHJvbGxlZCBleHRlcm5hbGx5IChlLmcuLCBmb3JtIHZhbGlkaXR5KS5cclxuXHQgKi9cclxuXHRwcml2YXRlIHN0ZXBGb3J3YXJkQXZhaWxhYmlsaXR5JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpXHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYSBuZXcgV2l6YXJkU3RlcFNlcnZpY2UgaW5zdGFuY2UuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gcm91dGVyIC0gQW5ndWxhciBSb3V0ZXIgdXNlZCB0byB1cGRhdGUgdGhlIFVSTCB3aGVuIHN0ZXAgY2hhbmdlcyBvY2N1ci5cclxuXHQgKiBAcGFyYW0gYWN0aXZhdGVkUm91dGUgLSBUaGUgY3VycmVudCByb3V0ZSB1c2VkIGFzIHRoZSByZWxhdGl2ZSBiYXNlIGZvciBuYXZpZ2F0aW9uLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuXHRcdHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlXHJcblx0KSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZCB3aXRoIGFuIG9yZGVyZWQgbGlzdCBvZiBzdGVwIGRlZmluaXRpb25zLlxyXG5cdCAqXHJcblx0ICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIG5hdmlnYXRpb24gbWV0aG9kcyBhcmUgdXNlZC5cclxuXHQgKiBJdCByZXNldHMgdGhlIHdpemFyZCBzdGF0ZSBhbmQgbmF2aWdhdGVzIHRvIHRoZSBmaXJzdCBzdGVwLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIHN0ZXBzIC0gVGhlIG9yZGVyZWQgY29sbGVjdGlvbiBvZiBzdGVwIGRlZmluaXRpb25zLlxyXG5cdCAqL1xyXG5cdGluaXRpYWxpemUoc3RlcHM6IFN0ZXBEZWZpbml0aW9uPFQ+W10pOiB2b2lkIHtcclxuXHRcdHRoaXMuc3RhdGUkLm5leHQoe1xyXG5cdFx0XHRzdGVwczogWy4uLnN0ZXBzXSwgLy8gZGVmZW5zaXZlIGNvcHlcclxuXHRcdFx0Y3VycmVudEluZGV4OiAwXHJcblx0XHR9KVxyXG5cclxuXHRcdHRoaXMubmF2aWdhdGUoKVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJucyB0aGUgY3VycmVudGx5IGFjdGl2ZSBzdGVwIHN5bmNocm9ub3VzbHkuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJucyBUaGUgYWN0aXZlIHtAbGluayBTdGVwRGVmaW5pdGlvbn0sIG9yIGBudWxsYCBpZiBub3QgaW5pdGlhbGl6ZWQuXHJcblx0ICovXHJcblx0Z2V0Q3VycmVudFN0ZXAoKTogU3RlcERlZmluaXRpb248VD4gfCBudWxsIHtcclxuXHRcdHJldHVybiB0aGlzLnN0YXRlJC52YWx1ZT8uc3RlcHNbdGhpcy5zdGF0ZSQudmFsdWUuY3VycmVudEluZGV4XSA/PyBudWxsXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFbWl0cyB0aGUgY3VycmVudGx5IGFjdGl2ZSBzdGVwIHdoZW5ldmVyIHRoZSB3aXphcmQgc3RhdGUgY2hhbmdlcy5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm5zIE9ic2VydmFibGUgc3RyZWFtIG9mIHRoZSBhY3RpdmUgc3RlcCBvciBgbnVsbGAgaWYgdW5pbml0aWFsaXplZC5cclxuXHQgKi9cclxuXHRnZXRDdXJyZW50U3RlcCQoKTogT2JzZXJ2YWJsZTxTdGVwRGVmaW5pdGlvbjxUPiB8IG51bGw+IHtcclxuXHRcdHJldHVybiB0aGlzLnN0YXRlJC5waXBlKFxyXG5cdFx0XHRtYXAoc3RhdGUgPT5cclxuXHRcdFx0XHRzdGF0ZSA/IHN0YXRlLnN0ZXBzW3N0YXRlLmN1cnJlbnRJbmRleF0gOiBudWxsXHJcblx0XHRcdClcclxuXHRcdClcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVtaXRzIHRoZSBmdWxsIG9yZGVyZWQgbGlzdCBvZiB3aXphcmQgc3RlcHMuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHN0cmVhbSBvZiBzdGVwIGRlZmluaXRpb25zLlxyXG5cdCAqL1xyXG5cdGdldFN0ZXBzJCgpOiBPYnNlcnZhYmxlPFN0ZXBEZWZpbml0aW9uPFQ+W10+IHtcclxuXHRcdHJldHVybiB0aGlzLnN0YXRlJC5waXBlKFxyXG5cdFx0XHRtYXAoc3RhdGUgPT4gc3RhdGU/LnN0ZXBzID8/IFtdKVxyXG5cdFx0KVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW1pdHMgdGhlIGN1cnJlbnQgYWN0aXZlIHN0ZXAgaW5kZXguXHJcblx0ICpcclxuXHQgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHN0cmVhbSBvZiB0aGUgY3VycmVudCBpbmRleCAoMC1iYXNlZCkuXHJcblx0ICovXHJcblx0Z2V0Q3VycmVudEluZGV4JCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuc3RhdGUkLnBpcGUoXHJcblx0XHRcdG1hcChzdGF0ZSA9PiBzdGF0ZT8uY3VycmVudEluZGV4ID8/IDApXHJcblx0XHQpXHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBdHRlbXB0cyB0byB0cmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0ZXAuXHJcblx0ICpcclxuXHQgKiBJZiB0aGUgY3VycmVudCBzdGVwIGRlZmluZXMgYW4gYG9uRXhpdGAgZ3VhcmQsIGl0IHdpbGwgYmUgZXhlY3V0ZWQgYmVmb3JlXHJcblx0ICogdHJhbnNpdGlvbmluZy4gSWYgdGhlIGd1YXJkIHJldHVybnMgYGZhbHNlYCAob3IgcmVzb2x2ZXMgdG8gYGZhbHNlYCksXHJcblx0ICogdGhlIHRyYW5zaXRpb24gaXMgY2FuY2VsbGVkLlxyXG5cdCAqXHJcblx0ICogQHBhcmFtIGNvbnRleHQgLSBPcHRpb25hbCBjb250ZXh0dWFsIGRhdGEgcGFzc2VkIHRvIHRoZSBgb25FeGl0YCBndWFyZC5cclxuXHQgKi9cclxuXHRhc3luYyBuZXh0KGNvbnRleHQ/OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZSQudmFsdWVcclxuXHRcdGlmICghc3RhdGUpIHJldHVyblxyXG5cclxuXHRcdGNvbnN0IGN1cnJlbnQgPSBzdGF0ZS5zdGVwc1tzdGF0ZS5jdXJyZW50SW5kZXhdXHJcblxyXG5cdFx0aWYgKGN1cnJlbnQub25FeGl0KSB7XHJcblx0XHRcdGNvbnN0IGFsbG93ZWQgPSBhd2FpdCBjdXJyZW50Lm9uRXhpdChjb250ZXh0KVxyXG5cdFx0XHRpZiAoIWFsbG93ZWQpIHJldHVyblxyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChzdGF0ZS5jdXJyZW50SW5kZXggPCBzdGF0ZS5zdGVwcy5sZW5ndGggLSAxKSB7XHJcblx0XHRcdHRoaXMuc3RhdGUkLm5leHQoe1xyXG5cdFx0XHRcdC4uLnN0YXRlLFxyXG5cdFx0XHRcdGN1cnJlbnRJbmRleDogc3RhdGUuY3VycmVudEluZGV4ICsgMVxyXG5cdFx0XHR9KVxyXG5cclxuXHRcdFx0dGhpcy5uYXZpZ2F0ZSgpXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNb3ZlcyB0aGUgd2l6YXJkIHRvIHRoZSBwcmV2aW91cyBzdGVwIGlmIHBvc3NpYmxlLlxyXG5cdCAqXHJcblx0ICogTm8gZ3VhcmRzIGFyZSBleGVjdXRlZCBkdXJpbmcgYmFja3dhcmQgbmF2aWdhdGlvbi5cclxuXHQgKi9cclxuXHRwcmV2aW91cygpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZSQudmFsdWVcclxuXHRcdGlmICghc3RhdGUpIHJldHVyblxyXG5cclxuXHRcdGlmIChzdGF0ZS5jdXJyZW50SW5kZXggPiAwKSB7XHJcblx0XHRcdHRoaXMuc3RhdGUkLm5leHQoe1xyXG5cdFx0XHRcdC4uLnN0YXRlLFxyXG5cdFx0XHRcdGN1cnJlbnRJbmRleDogc3RhdGUuY3VycmVudEluZGV4IC0gMVxyXG5cdFx0XHR9KVxyXG5cclxuXHRcdFx0dGhpcy5uYXZpZ2F0ZSgpXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc3RlcCBpcyB0aGUgZmluYWwgc3RlcC5cclxuXHQgKlxyXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBvbiB0aGUgbGFzdCBzdGVwOyBvdGhlcndpc2UgYGZhbHNlYC5cclxuXHQgKi9cclxuXHRpc0xhc3QoKTogYm9vbGVhbiB7XHJcblx0XHRjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGUkLnZhbHVlXHJcblx0XHRpZiAoIXN0YXRlKSByZXR1cm4gZmFsc2VcclxuXHRcdHJldHVybiBzdGF0ZS5jdXJyZW50SW5kZXggPT09IHN0YXRlLnN0ZXBzLmxlbmd0aCAtIDFcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgd2hldGhlciBmb3J3YXJkIG5hdmlnYXRpb24gaXMgY3VycmVudGx5IHBlcm1pdHRlZC5cclxuXHQgKlxyXG5cdCAqIFRoaXMgaXMgdHlwaWNhbGx5IGNvbnRyb2xsZWQgYnkgZXh0ZXJuYWwgdmFsaWRhdGlvbiBsb2dpYyAoZS5nLiwgZm9ybSBzdGF0ZSkuXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gYXZhaWxhYmxlIC0gYHRydWVgIGlmIGZvcndhcmQgbmF2aWdhdGlvbiBzaG91bGQgYmUgYWxsb3dlZC5cclxuXHQgKi9cclxuXHRzZXRTdGVwRm9yd2FyZEF2YWlsYWJpbGl0eShhdmFpbGFibGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuXHRcdHRoaXMuc3RlcEZvcndhcmRBdmFpbGFiaWxpdHkkLm5leHQoYXZhaWxhYmxlKVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRW1pdHMgdGhlIGZvcndhcmQgbmF2aWdhdGlvbiBhdmFpbGFiaWxpdHkgc3RhdGUuXHJcblx0ICpcclxuXHQgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHN0cmVhbSBvZiB0aGUgZm9yd2FyZCBuYXZpZ2F0aW9uIGZsYWcuXHJcblx0ICovXHJcblx0Z2V0U3RlcEZvcndhcmRBdmFpbGFiaWxpdHkoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcblx0XHRyZXR1cm4gdGhpcy5zdGVwRm9yd2FyZEF2YWlsYWJpbGl0eSQuYXNPYnNlcnZhYmxlKClcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIE5hdmlnYXRlcyB0aGUgcm91dGVyIHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIHN0ZXAuXHJcblx0ICpcclxuXHQgKiBUaGlzIG1ldGhvZCB1cGRhdGVzIHRoZSBVUkwgcmVsYXRpdmUgdG8gdGhlIGluamVjdGVkIHJvdXRlXHJcblx0ICogdXNpbmcgdGhlIHBhdHRlcm46IGBzdGVwLXtzbHVnfWAuXHJcblx0ICpcclxuXHQgKiBAaW50ZXJuYWxcclxuXHQgKi9cclxuXHRwcml2YXRlIG5hdmlnYXRlKCk6IHZvaWQge1xyXG5cdFx0Y29uc3Qgc3RlcCA9IHRoaXMuZ2V0Q3VycmVudFN0ZXAoKVxyXG5cdFx0aWYgKCFzdGVwKSByZXR1cm5cclxuXHJcblx0XHR0aGlzLnJvdXRlci5uYXZpZ2F0ZShcclxuXHRcdFx0W2BzdGVwLSR7c3RlcC5zbHVnfWBdLFxyXG5cdFx0XHR7IHJlbGF0aXZlVG86IHRoaXMuYWN0aXZhdGVkUm91dGUgfVxyXG5cdFx0KVxyXG5cdH1cclxuXHQvKipcclxuXHQgKiBOYXZpZ2F0ZXMgdGhlIHJvdXRlciBhd2F5IGZyb20gYW55IFwic3RlcFwiIHJvdXRlLlxyXG5cdCAqIFxyXG5cdCAqIFRoaXMgbWV0aG9kcyB1cGRhdGVzIHRoZSBVUkwgcmVsYXRpdmUgdG8gdGhlIGluamVjdGVkIHJvdXRlLCByZW1vdmluZyBldmVyeSBhZnRlciBgL3N0ZXAtXHJcblx0ICovXHJcblx0Y2xlYXJTdGVwUm91dGUoKTogdm9pZCB7XHJcblx0XHRjb25zdCB1cmwgPSB0aGlzLnJvdXRlci51cmxcclxuXHRcdGNvbnN0IFtpbml0aWFsXSA9IHVybC5zcGxpdCgnL3N0ZXAtJylcclxuXHRcdHRoaXMucm91dGVyLm5hdmlnYXRlKFtpbml0aWFsXSlcclxuXHR9XHJcbn1cclxuXHJcbiJdfQ==
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6YXJkLXN0ZXAuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3dpbmRvd3MtcGx1cy11dGlsaXRpZXMvbW9kYWwtd2l6YXJkL3V0aWwvc2VydmljZS93aXphcmQtc3RlcC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFFMUMsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQTtBQUNsRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7OztBQUtwQzs7Ozs7Ozs7Ozs7R0FXRztBQUVILE1BQU0sT0FBTyxpQkFBaUI7SUFrQjVCLFlBQ21CLE1BQWMsRUFDZCxjQUE4QjtRQUQ5QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBbEJqRDs7V0FFRztRQUNjLFdBQU0sR0FBRyxJQUFJLGVBQWUsQ0FBd0IsSUFBSSxDQUFDLENBQUE7UUFFMUU7O1dBRUc7UUFDYyw2QkFBd0IsR0FDdkMsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUE7SUFVakMsQ0FBQztJQUVMOzs7OztPQUtHO0lBQ0gsVUFBVSxDQUFDLE9BQTZCLEVBQUUsY0FBaUI7UUFDekQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUE7UUFFdEIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUUzQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNmLEtBQUs7WUFDTCxZQUFZLEVBQUUsQ0FBQztZQUNmLE9BQU8sRUFBRSxjQUFjO1NBQ3hCLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUNqQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjO1FBQ1osTUFBTSxLQUFLLEdBQUcs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QUNmLEdBQUcsS0FBSztZQUNSLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBWSxHQUFHLENBQUM7U0FDckMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFBO0lBQ2pCLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU07UUFDSixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQTtRQUMvQixJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFBO1FBQ3hCLE9BQU8sS0FBSyxDQUFDLFlBQVksS0FBSyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUE7SUFDdEQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsMEJBQTBCLENBQUMsU0FBa0I7UUFDM0MsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCwwQkFBMEI7UUFDeEIsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsWUFBWSxFQUFFLENBQUE7SUFDckQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssUUFBUTtRQUNkLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUNsQyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU07UUFFakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ2xCLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFDckIsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUNwQyxDQUFBO0lBQ0gsQ0FBQzs4R0ExTFUsaUJBQWlCO2tIQUFqQixpQkFBaUI7OzJGQUFqQixpQkFBaUI7a0JBRDdCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcidcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcydcclxuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXHJcbmltcG9ydCB7IFdpemFyZFN0YXRlIH0gZnJvbSAnLi4vaW50ZXJmYWNlL3dpemFyZC1zdGF0ZS5pbnRlcmZhY2UnXHJcbmltcG9ydCB7IFdpemFyZFN0ZXBGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yeS93aXphcmQtc3RlcC1mYWN0b3J5J1xyXG5pbXBvcnQgeyBTdGVwRGVmaW5pdGlvbiB9IGZyb20gJy4uL2ludGVyZmFjZS9zdGVwLWRlZmluaXRpb24uaW50ZXJmYWNlJ1xyXG5cclxuLyoqXHJcbiAqIEdlbmVyaWMgcmV1c2FibGUgd2l6YXJkIHN0ZXAgY29udHJvbGxlci5cclxuICpcclxuICogSGFuZGxlczpcclxuICogLSBOYXZpZ2F0aW9uXHJcbiAqIC0gQ29uZGl0aW9uYWwgc3RlcCByZXNvbHV0aW9uXHJcbiAqIC0gRHluYW1pYyBzdGVwIGluc2VydGlvbi9yZW1vdmFsXHJcbiAqIC0gQ29udGV4dCBwZXJzaXN0ZW5jZVxyXG4gKiAtIFJvdXRlciBzeW5jaHJvbml6YXRpb25cclxuICpcclxuICogQHRlbXBsYXRlIFQgVGhlIHNoYXJlZCB3aXphcmQgY29udGV4dCB0eXBlLlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgV2l6YXJkU3RlcFNlcnZpY2U8VD4ge1xyXG5cclxuICAvKipcclxuICAgKiBJbnRlcm5hbCB3aXphcmQgc3RhdGUgY29udGFpbmVyLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgc3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxXaXphcmRTdGF0ZTxUPiB8IG51bGw+KG51bGwpXHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgZm9yd2FyZCBuYXZpZ2F0aW9uIGlzIGFsbG93ZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBzdGVwRm9yd2FyZEF2YWlsYWJpbGl0eSQgPVxyXG4gICAgbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSlcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHN0ZXAgZmFjdG9yeSB1c2VkIHRvIHJlc29sdmUgYWN0aXZlIHN0ZXBzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZmFjdG9yeT86IFdpemFyZFN0ZXBGYWN0b3J5PFQ+XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlXHJcbiAgKSB7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHdpemFyZC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBzdGVwIGZhY3RvcnkgZGVmaW5pbmcgdGhlIHdpemFyZCBmbG93LlxyXG4gICAqIEBwYXJhbSBpbml0aWFsQ29udGV4dCBJbml0aWFsIHNoYXJlZCBjb250ZXh0IG9iamVjdC5cclxuICAgKi9cclxuICBpbml0aWFsaXplKGZhY3Rvcnk6IFdpemFyZFN0ZXBGYWN0b3J5PFQ+LCBpbml0aWFsQ29udGV4dDogVCk6IHZvaWQge1xyXG4gICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeVxyXG5cclxuICAgIGNvbnN0IHN0ZXBzID0gZmFjdG9yeS5idWlsZChpbml0aWFsQ29udGV4dClcclxuXHJcbiAgICB0aGlzLnN0YXRlJC5uZXh0KHtcclxuICAgICAgc3RlcHMsXHJcbiAgICAgIGN1cnJlbnRJbmRleDogMCxcclxuICAgICAgY29udGV4dDogaW5pdGlhbENvbnRleHRcclxuICAgIH0pXHJcblxyXG4gICAgdGhpcy5uYXZpZ2F0ZSgpXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHN0ZXAgc3luY2hyb25vdXNseS5cclxuICAgKi9cclxuICBnZXRDdXJyZW50U3RlcCgpOiBTdGVwRGVmaW5pdGlvbjxUPiB8IG51bGwge1xyXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlJC52YWx1ZVxyXG4gICAgaWYgKCFzdGF0ZSkgcmV0dXJuIG51bGxcclxuICAgIHJldHVybiBzdGF0ZS5zdGVwc1tzdGF0ZS5jdXJyZW50SW5kZXhdID8/IG51bGxcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9ic2VydmFibGUgc3RyZWFtIG9mIGN1cnJlbnQgc3RlcC5cclxuICAgKi9cclxuICBnZXRDdXJyZW50U3RlcCQoKTogT2JzZXJ2YWJsZTxTdGVwRGVmaW5pdGlvbjxUPiB8IG51bGw+IHtcclxuICAgIHJldHVybiB0aGlzLnN0YXRlJC5waXBlKFxyXG4gICAgICBtYXAoc3RhdGUgPT5cclxuICAgICAgICBzdGF0ZSA/IHN0YXRlLnN0ZXBzW3N0YXRlLmN1cnJlbnRJbmRleF0gOiBudWxsXHJcbiAgICAgIClcclxuICAgIClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9ic2VydmFibGUgc3RyZWFtIG9mIGFsbCBhY3RpdmUgc3RlcHMuXHJcbiAgICovXHJcbiAgZ2V0U3RlcHMkKCk6IE9ic2VydmFibGU8U3RlcERlZmluaXRpb248VD5bXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdGUkLnBpcGUoXHJcbiAgICAgIG1hcChzdGF0ZSA9PiBzdGF0ZT8uc3RlcHMgPz8gW10pXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnNlcnZhYmxlIHN0cmVhbSBvZiB0aGUgY3VycmVudCBpbmRleC5cclxuICAgKi9cclxuICBnZXRDdXJyZW50SW5kZXgkKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSQucGlwZShcclxuICAgICAgbWFwKHN0YXRlID0+IHN0YXRlPy5jdXJyZW50SW5kZXggPz8gMClcclxuICAgIClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIHNoYXJlZCB3aXphcmQgY29udGV4dC5cclxuICAgKi9cclxuICBnZXRDb250ZXh0KCk6IFQgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLnN0YXRlJC52YWx1ZT8uY29udGV4dCA/PyBudWxsXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZHZhbmNlcyB0byB0aGUgbmV4dCBzdGVwLlxyXG4gICAqXHJcbiAgICogRXhlY3V0ZXM6XHJcbiAgICogLSBvbkV4aXQgZ3VhcmRcclxuICAgKiAtIGNvbnRleHQgbWVyZ2VcclxuICAgKiAtIHN0ZXAgcmVjb21wb3NpdGlvblxyXG4gICAqIC0gbmF2aWdhdGlvblxyXG4gICAqXHJcbiAgICogQHBhcmFtIHBhcnRpYWxDb250ZXh0IE9wdGlvbmFsIGNvbnRleHQgdXBkYXRlcy5cclxuICAgKi9cclxuICBhc3luYyBuZXh0KHBhcnRpYWxDb250ZXh0PzogUGFydGlhbDxUPik6IFByb21pc2U8dm9pZD4ge1xyXG5cclxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZSQudmFsdWVcclxuICAgIGlmICghc3RhdGUgfHwgIXRoaXMuZmFjdG9yeSkgcmV0dXJuXHJcblxyXG4gICAgY29uc3QgY3VycmVudCA9IHN0YXRlLnN0ZXBzW3N0YXRlLmN1cnJlbnRJbmRleF1cclxuXHJcbiAgICBjb25zdCB1cGRhdGVkQ29udGV4dCA9IHtcclxuICAgICAgLi4uc3RhdGUuY29udGV4dCxcclxuICAgICAgLi4ucGFydGlhbENvbnRleHRcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY3VycmVudC5vbkV4aXQpIHtcclxuICAgICAgY29uc3QgYWxsb3dlZCA9IGF3YWl0IGN1cnJlbnQub25FeGl0KHVwZGF0ZWRDb250ZXh0KVxyXG4gICAgICBpZiAoIWFsbG93ZWQpIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5ld1N0ZXBzID0gdGhpcy5mYWN0b3J5LmJ1aWxkKHVwZGF0ZWRDb250ZXh0KVxyXG5cclxuICAgIGNvbnN0IGN1cnJlbnRTbHVnID0gY3VycmVudC5zbHVnXHJcbiAgICBjb25zdCBuZXdJbmRleCA9IG5ld1N0ZXBzLmZpbmRJbmRleChzID0+IHMuc2x1ZyA9PT0gY3VycmVudFNsdWcpXHJcblxyXG4gICAgY29uc3QgbmV4dEluZGV4ID0gTWF0aC5taW4oXHJcbiAgICAgIG5ld0luZGV4ICsgMSxcclxuICAgICAgbmV3U3RlcHMubGVuZ3RoIC0gMVxyXG4gICAgKVxyXG5cclxuICAgIHRoaXMuc3RhdGUkLm5leHQoe1xyXG4gICAgICBzdGVwczogbmV3U3RlcHMsXHJcbiAgICAgIGN1cnJlbnRJbmRleDogbmV4dEluZGV4LFxyXG4gICAgICBjb250ZXh0OiB1cGRhdGVkQ29udGV4dFxyXG4gICAgfSlcclxuXHJcbiAgICB0aGlzLm5hdmlnYXRlKClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5hdmlnYXRlcyB0byB0aGUgcHJldmlvdXMgc3RlcC5cclxuICAgKi9cclxuICBwcmV2aW91cygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZSQudmFsdWVcclxuICAgIGlmICghc3RhdGUpIHJldHVyblxyXG5cclxuICAgIGlmIChzdGF0ZS5jdXJyZW50SW5kZXggPT09IDApIHJldHVyblxyXG5cclxuICAgIHRoaXMuc3RhdGUkLm5leHQoe1xyXG4gICAgICAuLi5zdGF0ZSxcclxuICAgICAgY3VycmVudEluZGV4OiBzdGF0ZS5jdXJyZW50SW5kZXggLSAxXHJcbiAgICB9KVxyXG5cclxuICAgIHRoaXMubmF2aWdhdGUoKVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB3aGV0aGVyIHRoZSB3aXphcmQgaXMgY3VycmVudGx5IG9uIHRoZSBsYXN0IHN0ZXAuXHJcbiAgICovXHJcbiAgaXNMYXN0KCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlJC52YWx1ZVxyXG4gICAgaWYgKCFzdGF0ZSkgcmV0dXJuIGZhbHNlXHJcbiAgICByZXR1cm4gc3RhdGUuY3VycmVudEluZGV4ID09PSBzdGF0ZS5zdGVwcy5sZW5ndGggLSAxXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIGZvcndhcmQgbmF2aWdhdGlvbiBhdmFpbGFiaWxpdHkuXHJcbiAgICovXHJcbiAgc2V0U3RlcEZvcndhcmRBdmFpbGFiaWxpdHkoYXZhaWxhYmxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0ZXBGb3J3YXJkQXZhaWxhYmlsaXR5JC5uZXh0KGF2YWlsYWJsZSlcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgb2JzZXJ2YWJsZSBmb3J3YXJkIG5hdmlnYXRpb24gc3RhdGUuXHJcbiAgICovXHJcbiAgZ2V0U3RlcEZvcndhcmRBdmFpbGFiaWxpdHkoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGVwRm9yd2FyZEF2YWlsYWJpbGl0eSQuYXNPYnNlcnZhYmxlKClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE5hdmlnYXRlcyB0aGUgQW5ndWxhciByb3V0ZXIgdG8gdGhlIGN1cnJlbnQgc3RlcC5cclxuICAgKi9cclxuICBwcml2YXRlIG5hdmlnYXRlKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuZ2V0Q3VycmVudFN0ZXAoKVxyXG4gICAgaWYgKCFzdGVwKSByZXR1cm5cclxuXHJcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShcclxuICAgICAgW2BzdGVwLSR7c3RlcC5zbHVnfWBdLFxyXG4gICAgICB7IHJlbGF0aXZlVG86IHRoaXMuYWN0aXZhdGVkUm91dGUgfVxyXG4gICAgKVxyXG4gIH1cclxufSJdfQ==
|
|
@@ -2,142 +2,137 @@ import * as i0 from '@angular/core';
|
|
|
2
2
|
import { Injectable, Component, Inject } from '@angular/core';
|
|
3
3
|
import * as i2 from '@angular/common';
|
|
4
4
|
import { CommonModule } from '@angular/common';
|
|
5
|
-
import { BehaviorSubject
|
|
5
|
+
import { BehaviorSubject } from 'rxjs';
|
|
6
|
+
import { map } from 'rxjs/operators';
|
|
6
7
|
import * as i1 from '@angular/router';
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
|
-
*
|
|
10
|
+
* Generic reusable wizard step controller.
|
|
10
11
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
* Handles:
|
|
13
|
+
* - Navigation
|
|
14
|
+
* - Conditional step resolution
|
|
15
|
+
* - Dynamic step insertion/removal
|
|
16
|
+
* - Context persistence
|
|
17
|
+
* - Router synchronization
|
|
15
18
|
*
|
|
16
|
-
*
|
|
17
|
-
* component level. Each wizard instance should create and initialize its own
|
|
18
|
-
* service instance.
|
|
19
|
-
*
|
|
20
|
-
* @typeParam T - The type used for step parameter definitions.
|
|
19
|
+
* @template T The shared wizard context type.
|
|
21
20
|
*/
|
|
22
21
|
class WizardStepService {
|
|
23
|
-
/**
|
|
24
|
-
* Creates a new WizardStepService instance.
|
|
25
|
-
*
|
|
26
|
-
* @param router - Angular Router used to update the URL when step changes occur.
|
|
27
|
-
* @param activatedRoute - The current route used as the relative base for navigation.
|
|
28
|
-
*/
|
|
29
22
|
constructor(router, activatedRoute) {
|
|
30
23
|
this.router = router;
|
|
31
24
|
this.activatedRoute = activatedRoute;
|
|
32
25
|
/**
|
|
33
|
-
* Internal state container
|
|
34
|
-
*
|
|
35
|
-
* Holds the ordered step definitions and the currently active index.
|
|
36
|
-
* A `null` value indicates the wizard has not yet been initialized.
|
|
26
|
+
* Internal wizard state container.
|
|
37
27
|
*/
|
|
38
28
|
this.state$ = new BehaviorSubject(null);
|
|
39
29
|
/**
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
* This can be controlled externally (e.g., form validity).
|
|
30
|
+
* Controls whether forward navigation is allowed.
|
|
43
31
|
*/
|
|
44
32
|
this.stepForwardAvailability$ = new BehaviorSubject(false);
|
|
45
33
|
}
|
|
46
34
|
/**
|
|
47
|
-
* Initializes the wizard
|
|
48
|
-
*
|
|
49
|
-
* This method must be called before navigation methods are used.
|
|
50
|
-
* It resets the wizard state and navigates to the first step.
|
|
35
|
+
* Initializes the wizard.
|
|
51
36
|
*
|
|
52
|
-
* @param
|
|
37
|
+
* @param factory The step factory defining the wizard flow.
|
|
38
|
+
* @param initialContext Initial shared context object.
|
|
53
39
|
*/
|
|
54
|
-
initialize(
|
|
40
|
+
initialize(factory, initialContext) {
|
|
41
|
+
this.factory = factory;
|
|
42
|
+
const steps = factory.build(initialContext);
|
|
55
43
|
this.state$.next({
|
|
56
|
-
steps
|
|
57
|
-
currentIndex: 0
|
|
44
|
+
steps,
|
|
45
|
+
currentIndex: 0,
|
|
46
|
+
context: initialContext
|
|
58
47
|
});
|
|
59
48
|
this.navigate();
|
|
60
49
|
}
|
|
61
50
|
/**
|
|
62
|
-
* Returns the
|
|
63
|
-
*
|
|
64
|
-
* @returns The active {@link StepDefinition}, or `null` if not initialized.
|
|
51
|
+
* Returns the current step synchronously.
|
|
65
52
|
*/
|
|
66
53
|
getCurrentStep() {
|
|
67
|
-
|
|
54
|
+
const state = this.state$.value;
|
|
55
|
+
if (!state)
|
|
56
|
+
return null;
|
|
57
|
+
return state.steps[state.currentIndex] ?? null;
|
|
68
58
|
}
|
|
69
59
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* @returns Observable stream of the active step or `null` if uninitialized.
|
|
60
|
+
* Observable stream of current step.
|
|
73
61
|
*/
|
|
74
62
|
getCurrentStep$() {
|
|
75
63
|
return this.state$.pipe(map(state => state ? state.steps[state.currentIndex] : null));
|
|
76
64
|
}
|
|
77
65
|
/**
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
* @returns Observable stream of step definitions.
|
|
66
|
+
* Observable stream of all active steps.
|
|
81
67
|
*/
|
|
82
68
|
getSteps$() {
|
|
83
69
|
return this.state$.pipe(map(state => state?.steps ?? []));
|
|
84
70
|
}
|
|
85
71
|
/**
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
* @returns Observable stream of the current index (0-based).
|
|
72
|
+
* Observable stream of the current index.
|
|
89
73
|
*/
|
|
90
74
|
getCurrentIndex$() {
|
|
91
75
|
return this.state$.pipe(map(state => state?.currentIndex ?? 0));
|
|
92
76
|
}
|
|
93
77
|
/**
|
|
94
|
-
*
|
|
78
|
+
* Returns the shared wizard context.
|
|
79
|
+
*/
|
|
80
|
+
getContext() {
|
|
81
|
+
return this.state$.value?.context ?? null;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Advances to the next step.
|
|
95
85
|
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
*
|
|
86
|
+
* Executes:
|
|
87
|
+
* - onExit guard
|
|
88
|
+
* - context merge
|
|
89
|
+
* - step recomposition
|
|
90
|
+
* - navigation
|
|
99
91
|
*
|
|
100
|
-
* @param
|
|
92
|
+
* @param partialContext Optional context updates.
|
|
101
93
|
*/
|
|
102
|
-
async next(
|
|
94
|
+
async next(partialContext) {
|
|
103
95
|
const state = this.state$.value;
|
|
104
|
-
if (!state)
|
|
96
|
+
if (!state || !this.factory)
|
|
105
97
|
return;
|
|
106
98
|
const current = state.steps[state.currentIndex];
|
|
99
|
+
const updatedContext = {
|
|
100
|
+
...state.context,
|
|
101
|
+
...partialContext
|
|
102
|
+
};
|
|
107
103
|
if (current.onExit) {
|
|
108
|
-
const allowed = await current.onExit(
|
|
104
|
+
const allowed = await current.onExit(updatedContext);
|
|
109
105
|
if (!allowed)
|
|
110
106
|
return;
|
|
111
107
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
108
|
+
const newSteps = this.factory.build(updatedContext);
|
|
109
|
+
const currentSlug = current.slug;
|
|
110
|
+
const newIndex = newSteps.findIndex(s => s.slug === currentSlug);
|
|
111
|
+
const nextIndex = Math.min(newIndex + 1, newSteps.length - 1);
|
|
112
|
+
this.state$.next({
|
|
113
|
+
steps: newSteps,
|
|
114
|
+
currentIndex: nextIndex,
|
|
115
|
+
context: updatedContext
|
|
116
|
+
});
|
|
117
|
+
this.navigate();
|
|
119
118
|
}
|
|
120
119
|
/**
|
|
121
|
-
*
|
|
122
|
-
*
|
|
123
|
-
* No guards are executed during backward navigation.
|
|
120
|
+
* Navigates to the previous step.
|
|
124
121
|
*/
|
|
125
122
|
previous() {
|
|
126
123
|
const state = this.state$.value;
|
|
127
124
|
if (!state)
|
|
128
125
|
return;
|
|
129
|
-
if (state.currentIndex
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
126
|
+
if (state.currentIndex === 0)
|
|
127
|
+
return;
|
|
128
|
+
this.state$.next({
|
|
129
|
+
...state,
|
|
130
|
+
currentIndex: state.currentIndex - 1
|
|
131
|
+
});
|
|
132
|
+
this.navigate();
|
|
136
133
|
}
|
|
137
134
|
/**
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
* @returns `true` if on the last step; otherwise `false`.
|
|
135
|
+
* Returns whether the wizard is currently on the last step.
|
|
141
136
|
*/
|
|
142
137
|
isLast() {
|
|
143
138
|
const state = this.state$.value;
|
|
@@ -146,30 +141,19 @@ class WizardStepService {
|
|
|
146
141
|
return state.currentIndex === state.steps.length - 1;
|
|
147
142
|
}
|
|
148
143
|
/**
|
|
149
|
-
* Sets
|
|
150
|
-
*
|
|
151
|
-
* This is typically controlled by external validation logic (e.g., form state).
|
|
152
|
-
*
|
|
153
|
-
* @param available - `true` if forward navigation should be allowed.
|
|
144
|
+
* Sets forward navigation availability.
|
|
154
145
|
*/
|
|
155
146
|
setStepForwardAvailability(available) {
|
|
156
147
|
this.stepForwardAvailability$.next(available);
|
|
157
148
|
}
|
|
158
149
|
/**
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
* @returns Observable stream of the forward navigation flag.
|
|
150
|
+
* Returns observable forward navigation state.
|
|
162
151
|
*/
|
|
163
152
|
getStepForwardAvailability() {
|
|
164
153
|
return this.stepForwardAvailability$.asObservable();
|
|
165
154
|
}
|
|
166
155
|
/**
|
|
167
|
-
* Navigates the router to the
|
|
168
|
-
*
|
|
169
|
-
* This method updates the URL relative to the injected route
|
|
170
|
-
* using the pattern: `step-{slug}`.
|
|
171
|
-
*
|
|
172
|
-
* @internal
|
|
156
|
+
* Navigates the Angular router to the current step.
|
|
173
157
|
*/
|
|
174
158
|
navigate() {
|
|
175
159
|
const step = this.getCurrentStep();
|
|
@@ -177,16 +161,6 @@ class WizardStepService {
|
|
|
177
161
|
return;
|
|
178
162
|
this.router.navigate([`step-${step.slug}`], { relativeTo: this.activatedRoute });
|
|
179
163
|
}
|
|
180
|
-
/**
|
|
181
|
-
* Navigates the router away from any "step" route.
|
|
182
|
-
*
|
|
183
|
-
* This methods updates the URL relative to the injected route, removing every after `/step-
|
|
184
|
-
*/
|
|
185
|
-
clearStepRoute() {
|
|
186
|
-
const url = this.router.url;
|
|
187
|
-
const [initial] = url.split('/step-');
|
|
188
|
-
this.router.navigate([initial]);
|
|
189
|
-
}
|
|
190
164
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: WizardStepService, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
191
165
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: WizardStepService }); }
|
|
192
166
|
}
|
|
@@ -220,13 +194,30 @@ class StepComponent {
|
|
|
220
194
|
// this.stepService.setCurrentStep(step);
|
|
221
195
|
}
|
|
222
196
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: StepComponent, deps: [{ token: WizardStepService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
223
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.8", type: StepComponent, isStandalone: true, selector: "step", ngImport: i0, template: "<div class=\"form-steps-container\">\r\n\t<ng-container *ngFor=\"let step of steps | async; let i = index;\">\r\n\t\t<div class=\"d-flex flex-column align-items-center\">\r\n\t\t\t<div \r\n\t\t\t\t(click)=\"onStepClick(step)\"\r\n\t\t\t\t[ngClass]=\"{ 'step-complete': step.isComplete, 'step-incomplete': !step.isComplete, 'step-current': (currentIndex | async) === i }\"\r\n\t\t\t\tclass=\"step-bubble cursor-pointer\"\r\n\t\t\t>{{ i }}</div>\r\n\t\t\t<div>\r\n\t\t\t\t<span class=\"text-grey\">{{step.title}}</span>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"i < (steps | async)?.length - 1\" class=\"step-divider\"></div>\r\n\t</ng-container>\r\n</div>", styles: [".form-steps-container{display:flex;justify-content:space-between;align-items:center;padding:0 32px;margin-bottom:32px}.step-bubble{padding:20px;border:3px solid var(--wp-primaryBlue);width:12px;height:12px;display:flex;justify-content:center;align-items:center;border-radius:50%;color:var(--wp-primaryBlue);font-size:1em;cursor:pointer;-webkit-user-select:none;user-select:none}.step-divider{height:2px;background:var(--wp-primaryBlue);flex:1;margin:0 10px}.step-current,.step-complete{background:var(--wp-primaryBlue);color:#fff}.step-incomplete{cursor:not-allowed;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); }
|
|
197
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.8", type: StepComponent, isStandalone: true, selector: "step", ngImport: i0, template: "<div class=\"form-steps-container\">\r\n\t<ng-container *ngFor=\"let step of steps | async; let i = index;\">\r\n\t\t<div class=\"d-flex flex-column align-items-center\">\r\n\t\t\t<div \r\n\t\t\t\t(click)=\"onStepClick(step)\"\r\n\t\t\t\t[ngClass]=\"{ 'step-complete': step.isComplete, 'step-incomplete': !step.isComplete, 'step-current': (currentIndex | async) === i }\"\r\n\t\t\t\tclass=\"step-bubble cursor-pointer\"\r\n\t\t\t>{{ i + 1}}</div>\r\n\t\t\t<div>\r\n\t\t\t\t<span class=\"text-grey\">{{step.title}}</span>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"i < (steps | async)?.length - 1\" class=\"step-divider\"></div>\r\n\t</ng-container>\r\n</div>", styles: [".form-steps-container{display:flex;justify-content:space-between;align-items:center;padding:0 32px;margin-bottom:32px}.step-bubble{padding:20px;border:3px solid var(--wp-primaryBlue);width:12px;height:12px;display:flex;justify-content:center;align-items:center;border-radius:50%;color:var(--wp-primaryBlue);font-size:1em;cursor:pointer;-webkit-user-select:none;user-select:none}.step-divider{height:2px;background:var(--wp-primaryBlue);flex:1;margin:0 10px}.step-current,.step-complete{background:var(--wp-primaryBlue);color:#fff}.step-incomplete{cursor:not-allowed;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); }
|
|
224
198
|
}
|
|
225
199
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: StepComponent, decorators: [{
|
|
226
200
|
type: Component,
|
|
227
|
-
args: [{ selector: 'step', standalone: true, imports: [CommonModule], template: "<div class=\"form-steps-container\">\r\n\t<ng-container *ngFor=\"let step of steps | async; let i = index;\">\r\n\t\t<div class=\"d-flex flex-column align-items-center\">\r\n\t\t\t<div \r\n\t\t\t\t(click)=\"onStepClick(step)\"\r\n\t\t\t\t[ngClass]=\"{ 'step-complete': step.isComplete, 'step-incomplete': !step.isComplete, 'step-current': (currentIndex | async) === i }\"\r\n\t\t\t\tclass=\"step-bubble cursor-pointer\"\r\n\t\t\t>{{ i }}</div>\r\n\t\t\t<div>\r\n\t\t\t\t<span class=\"text-grey\">{{step.title}}</span>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"i < (steps | async)?.length - 1\" class=\"step-divider\"></div>\r\n\t</ng-container>\r\n</div>", styles: [".form-steps-container{display:flex;justify-content:space-between;align-items:center;padding:0 32px;margin-bottom:32px}.step-bubble{padding:20px;border:3px solid var(--wp-primaryBlue);width:12px;height:12px;display:flex;justify-content:center;align-items:center;border-radius:50%;color:var(--wp-primaryBlue);font-size:1em;cursor:pointer;-webkit-user-select:none;user-select:none}.step-divider{height:2px;background:var(--wp-primaryBlue);flex:1;margin:0 10px}.step-current,.step-complete{background:var(--wp-primaryBlue);color:#fff}.step-incomplete{cursor:not-allowed;pointer-events:none}\n"] }]
|
|
201
|
+
args: [{ selector: 'step', standalone: true, imports: [CommonModule], template: "<div class=\"form-steps-container\">\r\n\t<ng-container *ngFor=\"let step of steps | async; let i = index;\">\r\n\t\t<div class=\"d-flex flex-column align-items-center\">\r\n\t\t\t<div \r\n\t\t\t\t(click)=\"onStepClick(step)\"\r\n\t\t\t\t[ngClass]=\"{ 'step-complete': step.isComplete, 'step-incomplete': !step.isComplete, 'step-current': (currentIndex | async) === i }\"\r\n\t\t\t\tclass=\"step-bubble cursor-pointer\"\r\n\t\t\t>{{ i + 1}}</div>\r\n\t\t\t<div>\r\n\t\t\t\t<span class=\"text-grey\">{{step.title}}</span>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"i < (steps | async)?.length - 1\" class=\"step-divider\"></div>\r\n\t</ng-container>\r\n</div>", styles: [".form-steps-container{display:flex;justify-content:space-between;align-items:center;padding:0 32px;margin-bottom:32px}.step-bubble{padding:20px;border:3px solid var(--wp-primaryBlue);width:12px;height:12px;display:flex;justify-content:center;align-items:center;border-radius:50%;color:var(--wp-primaryBlue);font-size:1em;cursor:pointer;-webkit-user-select:none;user-select:none}.step-divider{height:2px;background:var(--wp-primaryBlue);flex:1;margin:0 10px}.step-current,.step-complete{background:var(--wp-primaryBlue);color:#fff}.step-incomplete{cursor:not-allowed;pointer-events:none}\n"] }]
|
|
228
202
|
}], ctorParameters: () => [{ type: WizardStepService }] });
|
|
229
203
|
|
|
204
|
+
/**
|
|
205
|
+
* Factory helper for building dynamic wizard step flows.
|
|
206
|
+
*/
|
|
207
|
+
class WizardStepFactory {
|
|
208
|
+
constructor(masterSteps) {
|
|
209
|
+
this.masterSteps = masterSteps;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Resolves the active step list based on context conditions.
|
|
213
|
+
*
|
|
214
|
+
* @param context The current wizard context.
|
|
215
|
+
*/
|
|
216
|
+
build(context) {
|
|
217
|
+
return this.masterSteps.filter(step => !step.condition || step.condition(context));
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
230
221
|
class WizardBuilder {
|
|
231
222
|
constructor() {
|
|
232
223
|
/**
|
|
@@ -465,5 +456,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImpor
|
|
|
465
456
|
* Generated bundle index. Do not edit.
|
|
466
457
|
*/
|
|
467
458
|
|
|
468
|
-
export { StepComponent, StepService, WizardBuilder, WizardStepService };
|
|
459
|
+
export { StepComponent, StepService, WizardBuilder, WizardStepFactory, WizardStepService };
|
|
469
460
|
//# sourceMappingURL=windows-plus-utilities-modal-wizard.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"windows-plus-utilities-modal-wizard.mjs","sources":["../../../projects/windows-plus-utilities/modal-wizard/util/service/wizard-step.service.ts","../../../projects/windows-plus-utilities/modal-wizard/components/step/step.component.ts","../../../projects/windows-plus-utilities/modal-wizard/components/step/step.component.html","../../../projects/windows-plus-utilities/modal-wizard/util/helper/wizard-builder.service.ts","../../../projects/windows-plus-utilities/modal-wizard/util/service/step.service.ts","../../../projects/windows-plus-utilities/modal-wizard/public-api.ts","../../../projects/windows-plus-utilities/modal-wizard/windows-plus-utilities-modal-wizard.ts"],"sourcesContent":["import { Injectable } from '@angular/core'\r\nimport { Router, ActivatedRoute } from '@angular/router'\r\nimport { BehaviorSubject, Observable, map } from 'rxjs'\r\nimport { StepDefinition } from '../interface/step-definition.interface'\r\nimport { WizardState } from '../interface/wizard-state.interface'\r\n/**\r\n * A finite state machine service used to manage wizard-style step navigation.\r\n *\r\n * This service maintains an immutable list of {@link StepDefinition} objects and\r\n * tracks the current active step index internally. It exposes reactive streams\r\n * for step data and navigation state, and coordinates router navigation when\r\n * transitions occur.\r\n *\r\n * The service is intentionally component-scoped and must be provided at the\r\n * component level. Each wizard instance should create and initialize its own\r\n * service instance.\r\n *\r\n * @typeParam T - The type used for step parameter definitions.\r\n */\r\n@Injectable()\r\nexport class WizardStepService<T> {\r\n\r\n\t/**\r\n\t * Internal state container for the wizard.\r\n\t *\r\n\t * Holds the ordered step definitions and the currently active index.\r\n\t * A `null` value indicates the wizard has not yet been initialized.\r\n\t */\r\n\tprivate state$ = new BehaviorSubject<WizardState<T> | null>(null)\r\n\r\n\t/**\r\n\t * Emits whether forward navigation is currently allowed.\r\n\t *\r\n\t * This can be controlled externally (e.g., form validity).\r\n\t */\r\n\tprivate stepForwardAvailability$ = new BehaviorSubject<boolean>(false)\r\n\r\n\t/**\r\n\t * Creates a new WizardStepService instance.\r\n\t *\r\n\t * @param router - Angular Router used to update the URL when step changes occur.\r\n\t * @param activatedRoute - The current route used as the relative base for navigation.\r\n\t */\r\n\tconstructor(\r\n\t\tprivate router: Router,\r\n\t\tprivate activatedRoute: ActivatedRoute\r\n\t) { }\r\n\r\n\t/**\r\n\t * Initializes the wizard with an ordered list of step definitions.\r\n\t *\r\n\t * This method must be called before navigation methods are used.\r\n\t * It resets the wizard state and navigates to the first step.\r\n\t *\r\n\t * @param steps - The ordered collection of step definitions.\r\n\t */\r\n\tinitialize(steps: StepDefinition<T>[]): void {\r\n\t\tthis.state$.next({\r\n\t\t\tsteps: [...steps], // defensive copy\r\n\t\t\tcurrentIndex: 0\r\n\t\t})\r\n\r\n\t\tthis.navigate()\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the currently active step synchronously.\r\n\t *\r\n\t * @returns The active {@link StepDefinition}, or `null` if not initialized.\r\n\t */\r\n\tgetCurrentStep(): StepDefinition<T> | null {\r\n\t\treturn this.state$.value?.steps[this.state$.value.currentIndex] ?? null\r\n\t}\r\n\r\n\t/**\r\n\t * Emits the currently active step whenever the wizard state changes.\r\n\t *\r\n\t * @returns Observable stream of the active step or `null` if uninitialized.\r\n\t */\r\n\tgetCurrentStep$(): Observable<StepDefinition<T> | null> {\r\n\t\treturn this.state$.pipe(\r\n\t\t\tmap(state =>\r\n\t\t\t\tstate ? state.steps[state.currentIndex] : null\r\n\t\t\t)\r\n\t\t)\r\n\t}\r\n\r\n\t/**\r\n\t * Emits the full ordered list of wizard steps.\r\n\t *\r\n\t * @returns Observable stream of step definitions.\r\n\t */\r\n\tgetSteps$(): Observable<StepDefinition<T>[]> {\r\n\t\treturn this.state$.pipe(\r\n\t\t\tmap(state => state?.steps ?? [])\r\n\t\t)\r\n\t}\r\n\r\n\t/**\r\n\t * Emits the current active step index.\r\n\t *\r\n\t * @returns Observable stream of the current index (0-based).\r\n\t */\r\n\tgetCurrentIndex$(): Observable<number> {\r\n\t\treturn this.state$.pipe(\r\n\t\t\tmap(state => state?.currentIndex ?? 0)\r\n\t\t)\r\n\t}\r\n\r\n\t/**\r\n\t * Attempts to transition to the next step.\r\n\t *\r\n\t * If the current step defines an `onExit` guard, it will be executed before\r\n\t * transitioning. If the guard returns `false` (or resolves to `false`),\r\n\t * the transition is cancelled.\r\n\t *\r\n\t * @param context - Optional contextual data passed to the `onExit` guard.\r\n\t */\r\n\tasync next(context?: any): Promise<void> {\r\n\t\tconst state = this.state$.value\r\n\t\tif (!state) return\r\n\r\n\t\tconst current = state.steps[state.currentIndex]\r\n\r\n\t\tif (current.onExit) {\r\n\t\t\tconst allowed = await current.onExit(context)\r\n\t\t\tif (!allowed) return\r\n\t\t}\r\n\r\n\t\tif (state.currentIndex < state.steps.length - 1) {\r\n\t\t\tthis.state$.next({\r\n\t\t\t\t...state,\r\n\t\t\t\tcurrentIndex: state.currentIndex + 1\r\n\t\t\t})\r\n\r\n\t\t\tthis.navigate()\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Moves the wizard to the previous step if possible.\r\n\t *\r\n\t * No guards are executed during backward navigation.\r\n\t */\r\n\tprevious(): void {\r\n\t\tconst state = this.state$.value\r\n\t\tif (!state) return\r\n\r\n\t\tif (state.currentIndex > 0) {\r\n\t\t\tthis.state$.next({\r\n\t\t\t\t...state,\r\n\t\t\t\tcurrentIndex: state.currentIndex - 1\r\n\t\t\t})\r\n\r\n\t\t\tthis.navigate()\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Determines whether the current step is the final step.\r\n\t *\r\n\t * @returns `true` if on the last step; otherwise `false`.\r\n\t */\r\n\tisLast(): boolean {\r\n\t\tconst state = this.state$.value\r\n\t\tif (!state) return false\r\n\t\treturn state.currentIndex === state.steps.length - 1\r\n\t}\r\n\r\n\t/**\r\n\t * Sets whether forward navigation is currently permitted.\r\n\t *\r\n\t * This is typically controlled by external validation logic (e.g., form state).\r\n\t *\r\n\t * @param available - `true` if forward navigation should be allowed.\r\n\t */\r\n\tsetStepForwardAvailability(available: boolean): void {\r\n\t\tthis.stepForwardAvailability$.next(available)\r\n\t}\r\n\r\n\t/**\r\n\t * Emits the forward navigation availability state.\r\n\t *\r\n\t * @returns Observable stream of the forward navigation flag.\r\n\t */\r\n\tgetStepForwardAvailability(): Observable<boolean> {\r\n\t\treturn this.stepForwardAvailability$.asObservable()\r\n\t}\r\n\r\n\t/**\r\n\t * Navigates the router to the currently active step.\r\n\t *\r\n\t * This method updates the URL relative to the injected route\r\n\t * using the pattern: `step-{slug}`.\r\n\t *\r\n\t * @internal\r\n\t */\r\n\tprivate navigate(): void {\r\n\t\tconst step = this.getCurrentStep()\r\n\t\tif (!step) return\r\n\r\n\t\tthis.router.navigate(\r\n\t\t\t[`step-${step.slug}`],\r\n\t\t\t{ relativeTo: this.activatedRoute }\r\n\t\t)\r\n\t}\r\n\t/**\r\n\t * Navigates the router away from any \"step\" route.\r\n\t * \r\n\t * This methods updates the URL relative to the injected route, removing every after `/step-\r\n\t */\r\n\tclearStepRoute(): void {\r\n\t\tconst url = this.router.url\r\n\t\tconst [initial] = url.split('/step-')\r\n\t\tthis.router.navigate([initial])\r\n\t}\r\n}\r\n\r\n","import { Component } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Observable } from 'rxjs'\r\nimport { StepDefinition } from '../../util/interface/step-definition.interface'\r\nimport { WizardStepService } from '../../util/service/wizard-step.service'\r\n\r\n@Component({\r\n selector: 'step',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './step.component.html',\r\n styleUrls: ['./step.component.sass']\r\n})\r\nexport class StepComponent {\r\n\t/**\r\n\t * @description an observable to the modal steps\r\n\t */\r\n steps: Observable<StepDefinition<any>[]>\r\n\t/**\r\n\t * @description an observable to the current step\r\n\t */\r\n currentIndex: Observable<number>;\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description class constructor specifying the required services and properties\r\n\t * @param stepService the service class which contains access to the modal steps functionality\r\n\t */\r\n constructor(private stepService: WizardStepService<any>) { }\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description the method to be run when the component is rendered\r\n\t */\r\n ngOnInit(): void {\r\n this.steps = this.stepService.getSteps$();\r\n this.currentIndex = this.stepService.getCurrentIndex$();\r\n }\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description handles the user clicking a step\r\n\t * @param step the step clicked\r\n\t */\r\n onStepClick(step: StepDefinition<any>) {\r\n // this.stepService.setCurrentStep(step);\r\n }\r\n}\r\n","<div class=\"form-steps-container\">\r\n\t<ng-container *ngFor=\"let step of steps | async; let i = index;\">\r\n\t\t<div class=\"d-flex flex-column align-items-center\">\r\n\t\t\t<div \r\n\t\t\t\t(click)=\"onStepClick(step)\"\r\n\t\t\t\t[ngClass]=\"{ 'step-complete': step.isComplete, 'step-incomplete': !step.isComplete, 'step-current': (currentIndex | async) === i }\"\r\n\t\t\t\tclass=\"step-bubble cursor-pointer\"\r\n\t\t\t>{{ i }}</div>\r\n\t\t\t<div>\r\n\t\t\t\t<span class=\"text-grey\">{{step.title}}</span>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"i < (steps | async)?.length - 1\" class=\"step-divider\"></div>\r\n\t</ng-container>\r\n</div>","import { StepDefinition } from '../interface/step-definition.interface'\r\n\r\nexport class WizardBuilder<T> {\r\n\t/**\r\n\t * @description an array containing the configuration for the wizard's steps\r\n\t */\r\n\tprivate steps: StepDefinition<T>[] = []\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description adds the specified step to the step array\r\n\t * @param step the step to be added\r\n\t * @returns {WizardBuilder<T>} the wizard builder instance\r\n\t */\r\n\taddStep(step: StepDefinition<T>): WizardBuilder<T> {\r\n\t\tthis.steps.push(step)\r\n\r\n\t\treturn this\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description builds the wizard steps to be used\r\n\t * @returns {StepDefinition<T>[]} an immutable copy of the steps\r\n\t */\r\n\tbuild(): StepDefinition<T>[] {\r\n\t\treturn [...this.steps] // Immutable copy\r\n\t}\r\n}","import { Inject, Injectable } from '@angular/core'\r\nimport { BehaviorSubject, Observable } from 'rxjs'\r\nimport { StepModel } from '../interface/modal-step.interface'\r\nimport { ActivatedRoute, Router } from '@angular/router'\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class StepService<T> {\r\n\t/**\r\n\t * @description the current index\r\n\t */\r\n\tprivate currentIndex = 0\r\n\t/**\r\n\t * @description the original step configuration\r\n\t */\r\n\toriginalSteps: StepModel<T>[]\r\n\t/**\r\n\t * @description the subject for the modal steps\r\n\t */\r\n\tsteps$: BehaviorSubject<StepModel<T>[]>\r\n\t/**\r\n\t * @description the subject for the current modal step\r\n\t */\r\n\tcurrentStep$: BehaviorSubject<StepModel<T> | null> = new BehaviorSubject<StepModel<T> | null>(null);\r\n\t/**\r\n\t * @description the subject for the step forward availability\r\n\t */\r\n\tstepForwardAvailability$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false)\r\n\t/**\r\n * @author Alex Hodson\r\n * @description class constructor specifying the required services and properties\r\n * @param steps the steps in the modal\r\n */\r\n\tconstructor(\r\n\t\tprivate router: Router,\r\n\t\tprivate activatedRoute: ActivatedRoute,\r\n\t\t@Inject('steps') private stepConfig: StepModel<T>[]\r\n\t) {\r\n\t\tthis.originalSteps = this.buildSteps(stepConfig)\r\n\t\tthis.steps$ = new BehaviorSubject(this.originalSteps)\r\n\t\tthis.currentStep$.next(this.originalSteps[0])\r\n\t}\r\n\tprivate buildSteps(config: Omit<StepModel<T>, 'stepIndex'>[]): StepModel<T>[] {\r\n\t\treturn config.map((step, index) => ({\r\n\t\t\t...step,\r\n\t\t\tstepIndex: index + 1\r\n\t\t}))\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description adjusts the step indexes to be sequential based on their position in the steps array\r\n\t */\r\n\tadjustStepIndexes(): void {\r\n\t\tconst rebuilt = this.steps$.value.map((step, index) => ({\r\n\t\t\t...step,\r\n\t\t\tstepIndex: index + 1\r\n\t\t}))\r\n\r\n\t\tthis.steps$.next(rebuilt)\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description inserts a new step at a specific index, specified by the step index property\r\n\t * @param step the step to be inserted\r\n\t */\r\n\tinsertStep(step: StepModel<T>): void {\r\n\t\tconst current = this.steps$.value\r\n\r\n\t\tconst updated = [\r\n\t\t\t...current.slice(0, step.stepIndex - 1),\r\n\t\t\tstep,\r\n\t\t\t...current.slice(step.stepIndex - 1)\r\n\t\t].map((s, index) => ({\r\n\t\t\t...s,\r\n\t\t\tstepIndex: index + 1\r\n\t\t}))\r\n\r\n\t\tthis.steps$.next(updated)\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description sets the current modal step\r\n\t * @param step the step to be set\r\n\t */\r\n\tsetCurrentStep(step: StepModel<T>): void {\r\n\t\tthis.currentStep$.next(step)\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description returns the current modal step observable\r\n\t * @returns the current modal step observable\r\n\t */\r\n\tgetCurrentStepObservable(): Observable<StepModel<T> | null> {\r\n\t\treturn this.currentStep$.asObservable()\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description returns the current modal step observable\r\n\t * @returns the current modal step observable\r\n\t */\r\n\tgetCurrentStep(): StepModel<T> | null {\r\n\t\treturn this.currentStep$.getValue()\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description retrieves the current steps\r\n\t * @returns the current steps\r\n\t */\r\n\tgetSteps(): StepModel<T>[] {\r\n\t\treturn this.steps$.getValue()\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description returns the modal step observable\r\n\t * @returns the modal step observable\r\n\t */\r\n\tgetStepsObservable(): Observable<StepModel<T>[]> {\r\n\t\treturn this.steps$.asObservable()\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description sets the step forward availability\r\n\t * @param available whether a step forward is available\r\n\t */\r\n\tsetStepForwardAvailability(available: boolean): void {\r\n\t\tthis.stepForwardAvailability$.next(available)\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description returns the step forward availability observable\r\n\t * @returns the step forward availability observable\r\n\t */\r\n\tgetStepForwardAvailability(): Observable<boolean> {\r\n\t\treturn this.stepForwardAvailability$.asObservable()\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description moves to the next modal step\r\n\t */\r\n\tmoveToNextStep(): void {\r\n\t\tif (this.currentIndex < this.steps$.value.length - 1) {\r\n\t\t\tthis.currentIndex++\r\n\t\t\tthis.currentStep$.next(this.steps$.value[this.currentIndex])\r\n\t\t}\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description moves to the previous modal step\r\n\t */\r\n\tmoveToPreviousStep(): void {\r\n\t\tconst previous = this.steps$.getValue()[this.currentIndex - 1]\r\n\r\n\t\tif (!previous) return\r\n\r\n\t\tthis.currentStep$.next({\r\n\t\t\t...previous,\r\n\t\t\t'triggerCallback': false\r\n\t\t})\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description determines whether the current step is the last\r\n\t * @returns whether the step is the last one\r\n\t */\r\n\tisLastStep(): boolean {\r\n\t\treturn this.currentIndex === this.steps$.value.length\r\n\t}\r\n\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description triggers any potential \"after-step\" functionality for the current step and changes the current route with any required parameters\r\n\t * @param getParameterValue the callback which retrieves the value for a step parameter\r\n\t * @param triggerStepCallback the callback which triggers the specific functionality for the specified step index\r\n\t */\r\n\tasync handleStepChange(getParameterValue?: (...args: any) => any, triggerStepCallback?: (...args: any) => Promise<boolean>, revert: boolean = false): Promise<void | null> {\r\n\t\tconst currentStep = this.currentStep$.value\r\n\r\n\t\tif (!currentStep) return\r\n\r\n\t\tconst { stepIndex, triggerCallback } = currentStep\r\n\r\n\t\tif (triggerCallback && triggerStepCallback) {\r\n\t\t\tconst results = await triggerStepCallback(stepIndex)\r\n\r\n\t\t\tif (!results && revert) return this.moveToPreviousStep()\r\n\t\t}\r\n\r\n\t\tthis.handleNavigation(getParameterValue, currentStep)\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description handles the modification of the system route which will navigate to the specified step. If no step is provided, then the stored current step is used\r\n\t * @param getParameterValue the callback which retrieves the value for a step parameter\r\n\t * @param step an optional step which will be used to navigate to\r\n\t */\r\n\thandleNavigation(getParameterValue?: (...args: any) => any, step?: StepModel<T>): void {\r\n\t\tconst currentStep = step || this.currentStep$.value\r\n\r\n\t\tif (!currentStep) return\r\n\r\n\t\tconst { slug, parameters } = currentStep\r\n\r\n\t\tlet route = `step-${slug}`\r\n\t\tif (getParameterValue) parameters.forEach((element) => route += `/${getParameterValue(element)}`)\r\n\t\tthis.router.navigate([route], { relativeTo: this.activatedRoute })\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description clears any route paths and/or parameters created during the step functionality, reverting the url back to the original state when the step paths were appended\r\n\t */\r\n\tclearStepRoute(): void {\r\n\t\tconst url = this.router.url\r\n\t\tconst [initial] = url.split('/step-')\r\n\t\tthis.router.navigate([initial])\r\n\t}\r\n}\r\n","/*\r\n * Public API Surface of windows-plus-utilities\r\n */\r\nexport * from './components/step/step.component';\r\n\r\nexport * from './util/helper/wizard-builder.service'\r\n\r\nexport * from './util/interface/modal-step.interface'\r\nexport * from './util/interface/step-definition.interface'\r\nexport * from './util/interface/stepped-modal.interface'\r\nexport * from './util/interface/wizard-modal.interface'\r\nexport * from './util/interface/wizard-state.interface'\r\n\r\nexport * from './util/service/wizard-step.service'\r\nexport * from './util/service/step.service'","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.WizardStepService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"windows-plus-utilities-modal-wizard.mjs","sources":["../../../projects/windows-plus-utilities/modal-wizard/util/service/wizard-step.service.ts","../../../projects/windows-plus-utilities/modal-wizard/components/step/step.component.ts","../../../projects/windows-plus-utilities/modal-wizard/components/step/step.component.html","../../../projects/windows-plus-utilities/modal-wizard/util/factory/wizard-step-factory.ts","../../../projects/windows-plus-utilities/modal-wizard/util/helper/wizard-builder.service.ts","../../../projects/windows-plus-utilities/modal-wizard/util/service/step.service.ts","../../../projects/windows-plus-utilities/modal-wizard/public-api.ts","../../../projects/windows-plus-utilities/modal-wizard/windows-plus-utilities-modal-wizard.ts"],"sourcesContent":["import { Injectable } from '@angular/core'\r\nimport { ActivatedRoute, Router } from '@angular/router'\r\nimport { BehaviorSubject, Observable } from 'rxjs'\r\nimport { map } from 'rxjs/operators'\r\nimport { WizardState } from '../interface/wizard-state.interface'\r\nimport { WizardStepFactory } from '../factory/wizard-step-factory'\r\nimport { StepDefinition } from '../interface/step-definition.interface'\r\n\r\n/**\r\n * Generic reusable wizard step controller.\r\n *\r\n * Handles:\r\n * - Navigation\r\n * - Conditional step resolution\r\n * - Dynamic step insertion/removal\r\n * - Context persistence\r\n * - Router synchronization\r\n *\r\n * @template T The shared wizard context type.\r\n */\r\n@Injectable()\r\nexport class WizardStepService<T> {\r\n\r\n /**\r\n * Internal wizard state container.\r\n */\r\n private readonly state$ = new BehaviorSubject<WizardState<T> | null>(null)\r\n\r\n /**\r\n * Controls whether forward navigation is allowed.\r\n */\r\n private readonly stepForwardAvailability$ =\r\n new BehaviorSubject<boolean>(false)\r\n\r\n /**\r\n * The step factory used to resolve active steps.\r\n */\r\n private factory?: WizardStepFactory<T>\r\n\r\n constructor(\r\n private readonly router: Router,\r\n private readonly activatedRoute: ActivatedRoute\r\n ) { }\r\n\r\n /**\r\n * Initializes the wizard.\r\n *\r\n * @param factory The step factory defining the wizard flow.\r\n * @param initialContext Initial shared context object.\r\n */\r\n initialize(factory: WizardStepFactory<T>, initialContext: T): void {\r\n this.factory = factory\r\n\r\n const steps = factory.build(initialContext)\r\n\r\n this.state$.next({\r\n steps,\r\n currentIndex: 0,\r\n context: initialContext\r\n })\r\n\r\n this.navigate()\r\n }\r\n\r\n /**\r\n * Returns the current step synchronously.\r\n */\r\n getCurrentStep(): StepDefinition<T> | null {\r\n const state = this.state$.value\r\n if (!state) return null\r\n return state.steps[state.currentIndex] ?? null\r\n }\r\n\r\n /**\r\n * Observable stream of current step.\r\n */\r\n getCurrentStep$(): Observable<StepDefinition<T> | null> {\r\n return this.state$.pipe(\r\n map(state =>\r\n state ? state.steps[state.currentIndex] : null\r\n )\r\n )\r\n }\r\n\r\n /**\r\n * Observable stream of all active steps.\r\n */\r\n getSteps$(): Observable<StepDefinition<T>[]> {\r\n return this.state$.pipe(\r\n map(state => state?.steps ?? [])\r\n )\r\n }\r\n\r\n /**\r\n * Observable stream of the current index.\r\n */\r\n getCurrentIndex$(): Observable<number> {\r\n return this.state$.pipe(\r\n map(state => state?.currentIndex ?? 0)\r\n )\r\n }\r\n\r\n /**\r\n * Returns the shared wizard context.\r\n */\r\n getContext(): T | null {\r\n return this.state$.value?.context ?? null\r\n }\r\n\r\n /**\r\n * Advances to the next step.\r\n *\r\n * Executes:\r\n * - onExit guard\r\n * - context merge\r\n * - step recomposition\r\n * - navigation\r\n *\r\n * @param partialContext Optional context updates.\r\n */\r\n async next(partialContext?: Partial<T>): Promise<void> {\r\n\r\n const state = this.state$.value\r\n if (!state || !this.factory) return\r\n\r\n const current = state.steps[state.currentIndex]\r\n\r\n const updatedContext = {\r\n ...state.context,\r\n ...partialContext\r\n }\r\n\r\n if (current.onExit) {\r\n const allowed = await current.onExit(updatedContext)\r\n if (!allowed) return\r\n }\r\n\r\n const newSteps = this.factory.build(updatedContext)\r\n\r\n const currentSlug = current.slug\r\n const newIndex = newSteps.findIndex(s => s.slug === currentSlug)\r\n\r\n const nextIndex = Math.min(\r\n newIndex + 1,\r\n newSteps.length - 1\r\n )\r\n\r\n this.state$.next({\r\n steps: newSteps,\r\n currentIndex: nextIndex,\r\n context: updatedContext\r\n })\r\n\r\n this.navigate()\r\n }\r\n\r\n /**\r\n * Navigates to the previous step.\r\n */\r\n previous(): void {\r\n const state = this.state$.value\r\n if (!state) return\r\n\r\n if (state.currentIndex === 0) return\r\n\r\n this.state$.next({\r\n ...state,\r\n currentIndex: state.currentIndex - 1\r\n })\r\n\r\n this.navigate()\r\n }\r\n\r\n /**\r\n * Returns whether the wizard is currently on the last step.\r\n */\r\n isLast(): boolean {\r\n const state = this.state$.value\r\n if (!state) return false\r\n return state.currentIndex === state.steps.length - 1\r\n }\r\n\r\n /**\r\n * Sets forward navigation availability.\r\n */\r\n setStepForwardAvailability(available: boolean): void {\r\n this.stepForwardAvailability$.next(available)\r\n }\r\n\r\n /**\r\n * Returns observable forward navigation state.\r\n */\r\n getStepForwardAvailability(): Observable<boolean> {\r\n return this.stepForwardAvailability$.asObservable()\r\n }\r\n\r\n /**\r\n * Navigates the Angular router to the current step.\r\n */\r\n private navigate(): void {\r\n const step = this.getCurrentStep()\r\n if (!step) return\r\n\r\n this.router.navigate(\r\n [`step-${step.slug}`],\r\n { relativeTo: this.activatedRoute }\r\n )\r\n }\r\n}","import { Component } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Observable } from 'rxjs'\r\nimport { StepDefinition } from '../../util/interface/step-definition.interface'\r\nimport { WizardStepService } from '../../util/service/wizard-step.service'\r\n\r\n@Component({\r\n selector: 'step',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './step.component.html',\r\n styleUrls: ['./step.component.sass']\r\n})\r\nexport class StepComponent {\r\n\t/**\r\n\t * @description an observable to the modal steps\r\n\t */\r\n steps: Observable<StepDefinition<any>[]>\r\n\t/**\r\n\t * @description an observable to the current step\r\n\t */\r\n currentIndex: Observable<number>;\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description class constructor specifying the required services and properties\r\n\t * @param stepService the service class which contains access to the modal steps functionality\r\n\t */\r\n constructor(private stepService: WizardStepService<any>) { }\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description the method to be run when the component is rendered\r\n\t */\r\n ngOnInit(): void {\r\n this.steps = this.stepService.getSteps$();\r\n this.currentIndex = this.stepService.getCurrentIndex$();\r\n }\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description handles the user clicking a step\r\n\t * @param step the step clicked\r\n\t */\r\n onStepClick(step: StepDefinition<any>) {\r\n // this.stepService.setCurrentStep(step);\r\n }\r\n}\r\n","<div class=\"form-steps-container\">\r\n\t<ng-container *ngFor=\"let step of steps | async; let i = index;\">\r\n\t\t<div class=\"d-flex flex-column align-items-center\">\r\n\t\t\t<div \r\n\t\t\t\t(click)=\"onStepClick(step)\"\r\n\t\t\t\t[ngClass]=\"{ 'step-complete': step.isComplete, 'step-incomplete': !step.isComplete, 'step-current': (currentIndex | async) === i }\"\r\n\t\t\t\tclass=\"step-bubble cursor-pointer\"\r\n\t\t\t>{{ i + 1}}</div>\r\n\t\t\t<div>\r\n\t\t\t\t<span class=\"text-grey\">{{step.title}}</span>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<div *ngIf=\"i < (steps | async)?.length - 1\" class=\"step-divider\"></div>\r\n\t</ng-container>\r\n</div>","import { StepDefinition } from '../interface/step-definition.interface'\r\n\r\n/**\r\n * Factory helper for building dynamic wizard step flows.\r\n */\r\nexport class WizardStepFactory<T> {\r\n constructor(\r\n private readonly masterSteps: StepDefinition<T>[]\r\n ) { }\r\n\r\n /**\r\n * Resolves the active step list based on context conditions.\r\n *\r\n * @param context The current wizard context.\r\n */\r\n build(context: T): StepDefinition<T>[] {\r\n return this.masterSteps.filter(step =>\r\n !step.condition || step.condition(context)\r\n )\r\n }\r\n}","import { StepDefinition } from '../interface/step-definition.interface'\r\n\r\nexport class WizardBuilder<T> {\r\n\t/**\r\n\t * @description an array containing the configuration for the wizard's steps\r\n\t */\r\n\tprivate steps: StepDefinition<T>[] = []\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description adds the specified step to the step array\r\n\t * @param step the step to be added\r\n\t * @returns {WizardBuilder<T>} the wizard builder instance\r\n\t */\r\n\taddStep(step: StepDefinition<T>): WizardBuilder<T> {\r\n\t\tthis.steps.push(step)\r\n\r\n\t\treturn this\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description builds the wizard steps to be used\r\n\t * @returns {StepDefinition<T>[]} an immutable copy of the steps\r\n\t */\r\n\tbuild(): StepDefinition<T>[] {\r\n\t\treturn [...this.steps] // Immutable copy\r\n\t}\r\n}","import { Inject, Injectable } from '@angular/core'\r\nimport { BehaviorSubject, Observable } from 'rxjs'\r\nimport { StepModel } from '../interface/modal-step.interface'\r\nimport { ActivatedRoute, Router } from '@angular/router'\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class StepService<T> {\r\n\t/**\r\n\t * @description the current index\r\n\t */\r\n\tprivate currentIndex = 0\r\n\t/**\r\n\t * @description the original step configuration\r\n\t */\r\n\toriginalSteps: StepModel<T>[]\r\n\t/**\r\n\t * @description the subject for the modal steps\r\n\t */\r\n\tsteps$: BehaviorSubject<StepModel<T>[]>\r\n\t/**\r\n\t * @description the subject for the current modal step\r\n\t */\r\n\tcurrentStep$: BehaviorSubject<StepModel<T> | null> = new BehaviorSubject<StepModel<T> | null>(null);\r\n\t/**\r\n\t * @description the subject for the step forward availability\r\n\t */\r\n\tstepForwardAvailability$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false)\r\n\t/**\r\n * @author Alex Hodson\r\n * @description class constructor specifying the required services and properties\r\n * @param steps the steps in the modal\r\n */\r\n\tconstructor(\r\n\t\tprivate router: Router,\r\n\t\tprivate activatedRoute: ActivatedRoute,\r\n\t\t@Inject('steps') private stepConfig: StepModel<T>[]\r\n\t) {\r\n\t\tthis.originalSteps = this.buildSteps(stepConfig)\r\n\t\tthis.steps$ = new BehaviorSubject(this.originalSteps)\r\n\t\tthis.currentStep$.next(this.originalSteps[0])\r\n\t}\r\n\tprivate buildSteps(config: Omit<StepModel<T>, 'stepIndex'>[]): StepModel<T>[] {\r\n\t\treturn config.map((step, index) => ({\r\n\t\t\t...step,\r\n\t\t\tstepIndex: index + 1\r\n\t\t}))\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description adjusts the step indexes to be sequential based on their position in the steps array\r\n\t */\r\n\tadjustStepIndexes(): void {\r\n\t\tconst rebuilt = this.steps$.value.map((step, index) => ({\r\n\t\t\t...step,\r\n\t\t\tstepIndex: index + 1\r\n\t\t}))\r\n\r\n\t\tthis.steps$.next(rebuilt)\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description inserts a new step at a specific index, specified by the step index property\r\n\t * @param step the step to be inserted\r\n\t */\r\n\tinsertStep(step: StepModel<T>): void {\r\n\t\tconst current = this.steps$.value\r\n\r\n\t\tconst updated = [\r\n\t\t\t...current.slice(0, step.stepIndex - 1),\r\n\t\t\tstep,\r\n\t\t\t...current.slice(step.stepIndex - 1)\r\n\t\t].map((s, index) => ({\r\n\t\t\t...s,\r\n\t\t\tstepIndex: index + 1\r\n\t\t}))\r\n\r\n\t\tthis.steps$.next(updated)\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description sets the current modal step\r\n\t * @param step the step to be set\r\n\t */\r\n\tsetCurrentStep(step: StepModel<T>): void {\r\n\t\tthis.currentStep$.next(step)\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description returns the current modal step observable\r\n\t * @returns the current modal step observable\r\n\t */\r\n\tgetCurrentStepObservable(): Observable<StepModel<T> | null> {\r\n\t\treturn this.currentStep$.asObservable()\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description returns the current modal step observable\r\n\t * @returns the current modal step observable\r\n\t */\r\n\tgetCurrentStep(): StepModel<T> | null {\r\n\t\treturn this.currentStep$.getValue()\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description retrieves the current steps\r\n\t * @returns the current steps\r\n\t */\r\n\tgetSteps(): StepModel<T>[] {\r\n\t\treturn this.steps$.getValue()\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description returns the modal step observable\r\n\t * @returns the modal step observable\r\n\t */\r\n\tgetStepsObservable(): Observable<StepModel<T>[]> {\r\n\t\treturn this.steps$.asObservable()\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description sets the step forward availability\r\n\t * @param available whether a step forward is available\r\n\t */\r\n\tsetStepForwardAvailability(available: boolean): void {\r\n\t\tthis.stepForwardAvailability$.next(available)\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description returns the step forward availability observable\r\n\t * @returns the step forward availability observable\r\n\t */\r\n\tgetStepForwardAvailability(): Observable<boolean> {\r\n\t\treturn this.stepForwardAvailability$.asObservable()\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description moves to the next modal step\r\n\t */\r\n\tmoveToNextStep(): void {\r\n\t\tif (this.currentIndex < this.steps$.value.length - 1) {\r\n\t\t\tthis.currentIndex++\r\n\t\t\tthis.currentStep$.next(this.steps$.value[this.currentIndex])\r\n\t\t}\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description moves to the previous modal step\r\n\t */\r\n\tmoveToPreviousStep(): void {\r\n\t\tconst previous = this.steps$.getValue()[this.currentIndex - 1]\r\n\r\n\t\tif (!previous) return\r\n\r\n\t\tthis.currentStep$.next({\r\n\t\t\t...previous,\r\n\t\t\t'triggerCallback': false\r\n\t\t})\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description determines whether the current step is the last\r\n\t * @returns whether the step is the last one\r\n\t */\r\n\tisLastStep(): boolean {\r\n\t\treturn this.currentIndex === this.steps$.value.length\r\n\t}\r\n\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description triggers any potential \"after-step\" functionality for the current step and changes the current route with any required parameters\r\n\t * @param getParameterValue the callback which retrieves the value for a step parameter\r\n\t * @param triggerStepCallback the callback which triggers the specific functionality for the specified step index\r\n\t */\r\n\tasync handleStepChange(getParameterValue?: (...args: any) => any, triggerStepCallback?: (...args: any) => Promise<boolean>, revert: boolean = false): Promise<void | null> {\r\n\t\tconst currentStep = this.currentStep$.value\r\n\r\n\t\tif (!currentStep) return\r\n\r\n\t\tconst { stepIndex, triggerCallback } = currentStep\r\n\r\n\t\tif (triggerCallback && triggerStepCallback) {\r\n\t\t\tconst results = await triggerStepCallback(stepIndex)\r\n\r\n\t\t\tif (!results && revert) return this.moveToPreviousStep()\r\n\t\t}\r\n\r\n\t\tthis.handleNavigation(getParameterValue, currentStep)\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description handles the modification of the system route which will navigate to the specified step. If no step is provided, then the stored current step is used\r\n\t * @param getParameterValue the callback which retrieves the value for a step parameter\r\n\t * @param step an optional step which will be used to navigate to\r\n\t */\r\n\thandleNavigation(getParameterValue?: (...args: any) => any, step?: StepModel<T>): void {\r\n\t\tconst currentStep = step || this.currentStep$.value\r\n\r\n\t\tif (!currentStep) return\r\n\r\n\t\tconst { slug, parameters } = currentStep\r\n\r\n\t\tlet route = `step-${slug}`\r\n\t\tif (getParameterValue) parameters.forEach((element) => route += `/${getParameterValue(element)}`)\r\n\t\tthis.router.navigate([route], { relativeTo: this.activatedRoute })\r\n\t}\r\n\t/**\r\n\t * @author Alex Hodson\r\n\t * @description clears any route paths and/or parameters created during the step functionality, reverting the url back to the original state when the step paths were appended\r\n\t */\r\n\tclearStepRoute(): void {\r\n\t\tconst url = this.router.url\r\n\t\tconst [initial] = url.split('/step-')\r\n\t\tthis.router.navigate([initial])\r\n\t}\r\n}\r\n","/*\r\n * Public API Surface of windows-plus-utilities\r\n */\r\nexport * from './components/step/step.component';\r\n\r\nexport * from './util/factory/wizard-step-factory'\r\n\r\nexport * from './util/helper/wizard-builder.service'\r\n\r\nexport * from './util/interface/modal-step.interface'\r\nexport * from './util/interface/step-definition.interface'\r\nexport * from './util/interface/stepped-modal.interface'\r\nexport * from './util/interface/wizard-modal.interface'\r\nexport * from './util/interface/wizard-state.interface'\r\n\r\nexport * from './util/service/wizard-step.service'\r\nexport * from './util/service/step.service'","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.WizardStepService"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export * from './components/step/step.component';
|
|
2
|
+
export * from './util/factory/wizard-step-factory';
|
|
2
3
|
export * from './util/helper/wizard-builder.service';
|
|
3
4
|
export * from './util/interface/modal-step.interface';
|
|
4
5
|
export * from './util/interface/step-definition.interface';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { StepDefinition } from '../interface/step-definition.interface';
|
|
2
|
+
/**
|
|
3
|
+
* Factory helper for building dynamic wizard step flows.
|
|
4
|
+
*/
|
|
5
|
+
export declare class WizardStepFactory<T> {
|
|
6
|
+
private readonly masterSteps;
|
|
7
|
+
constructor(masterSteps: StepDefinition<T>[]);
|
|
8
|
+
/**
|
|
9
|
+
* Resolves the active step list based on context conditions.
|
|
10
|
+
*
|
|
11
|
+
* @param context The current wizard context.
|
|
12
|
+
*/
|
|
13
|
+
build(context: T): StepDefinition<T>[];
|
|
14
|
+
}
|
|
@@ -3,10 +3,30 @@
|
|
|
3
3
|
* @description an interface defining the configuration for a single wizard step
|
|
4
4
|
*/
|
|
5
5
|
export interface StepDefinition<T> {
|
|
6
|
+
/**
|
|
7
|
+
* Unique identifier for the step.
|
|
8
|
+
*/
|
|
6
9
|
id: string;
|
|
10
|
+
/**
|
|
11
|
+
* Human-readable step title.
|
|
12
|
+
*/
|
|
7
13
|
title: string;
|
|
14
|
+
/**
|
|
15
|
+
* Unique identifier used for routing and lookup.
|
|
16
|
+
*/
|
|
8
17
|
slug: string;
|
|
18
|
+
/**
|
|
19
|
+
* Indicates whether the step is completed. This can be used to enable/disable navigation or show progress.
|
|
20
|
+
*/
|
|
9
21
|
isComplete: boolean;
|
|
10
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Optional guard executed before leaving the step.
|
|
24
|
+
* Return false to block navigation.
|
|
25
|
+
*/
|
|
11
26
|
onExit?: (context?: any) => Promise<boolean> | boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Optional conditional visibility rule.
|
|
29
|
+
* If provided, the step will only be included when true.
|
|
30
|
+
*/
|
|
31
|
+
condition?: (context: T) => boolean;
|
|
12
32
|
}
|
|
@@ -4,6 +4,16 @@ import { StepDefinition } from './step-definition.interface';
|
|
|
4
4
|
* @description an interface defining the properties for the wizard modal's state
|
|
5
5
|
*/
|
|
6
6
|
export interface WizardState<T> {
|
|
7
|
+
/**
|
|
8
|
+
* Ordered active steps in the wizard.
|
|
9
|
+
*/
|
|
7
10
|
steps: StepDefinition<T>[];
|
|
11
|
+
/**
|
|
12
|
+
* Current active step index.
|
|
13
|
+
*/
|
|
8
14
|
currentIndex: number;
|
|
15
|
+
/**
|
|
16
|
+
* Shared wizard context object.
|
|
17
|
+
*/
|
|
18
|
+
context: T;
|
|
9
19
|
}
|
|
@@ -1,128 +1,95 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ActivatedRoute, Router } from '@angular/router';
|
|
2
2
|
import { Observable } from 'rxjs';
|
|
3
|
+
import { WizardStepFactory } from '../factory/wizard-step-factory';
|
|
3
4
|
import { StepDefinition } from '../interface/step-definition.interface';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
/**
|
|
6
|
-
*
|
|
7
|
+
* Generic reusable wizard step controller.
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* Handles:
|
|
10
|
+
* - Navigation
|
|
11
|
+
* - Conditional step resolution
|
|
12
|
+
* - Dynamic step insertion/removal
|
|
13
|
+
* - Context persistence
|
|
14
|
+
* - Router synchronization
|
|
12
15
|
*
|
|
13
|
-
*
|
|
14
|
-
* component level. Each wizard instance should create and initialize its own
|
|
15
|
-
* service instance.
|
|
16
|
-
*
|
|
17
|
-
* @typeParam T - The type used for step parameter definitions.
|
|
16
|
+
* @template T The shared wizard context type.
|
|
18
17
|
*/
|
|
19
18
|
export declare class WizardStepService<T> {
|
|
20
|
-
private router;
|
|
21
|
-
private activatedRoute;
|
|
19
|
+
private readonly router;
|
|
20
|
+
private readonly activatedRoute;
|
|
22
21
|
/**
|
|
23
|
-
* Internal state container
|
|
24
|
-
*
|
|
25
|
-
* Holds the ordered step definitions and the currently active index.
|
|
26
|
-
* A `null` value indicates the wizard has not yet been initialized.
|
|
22
|
+
* Internal wizard state container.
|
|
27
23
|
*/
|
|
28
|
-
private state$;
|
|
24
|
+
private readonly state$;
|
|
29
25
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* This can be controlled externally (e.g., form validity).
|
|
26
|
+
* Controls whether forward navigation is allowed.
|
|
33
27
|
*/
|
|
34
|
-
private stepForwardAvailability$;
|
|
28
|
+
private readonly stepForwardAvailability$;
|
|
35
29
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* @param router - Angular Router used to update the URL when step changes occur.
|
|
39
|
-
* @param activatedRoute - The current route used as the relative base for navigation.
|
|
30
|
+
* The step factory used to resolve active steps.
|
|
40
31
|
*/
|
|
32
|
+
private factory?;
|
|
41
33
|
constructor(router: Router, activatedRoute: ActivatedRoute);
|
|
42
34
|
/**
|
|
43
|
-
* Initializes the wizard
|
|
44
|
-
*
|
|
45
|
-
* This method must be called before navigation methods are used.
|
|
46
|
-
* It resets the wizard state and navigates to the first step.
|
|
35
|
+
* Initializes the wizard.
|
|
47
36
|
*
|
|
48
|
-
* @param
|
|
37
|
+
* @param factory The step factory defining the wizard flow.
|
|
38
|
+
* @param initialContext Initial shared context object.
|
|
49
39
|
*/
|
|
50
|
-
initialize(
|
|
40
|
+
initialize(factory: WizardStepFactory<T>, initialContext: T): void;
|
|
51
41
|
/**
|
|
52
|
-
* Returns the
|
|
53
|
-
*
|
|
54
|
-
* @returns The active {@link StepDefinition}, or `null` if not initialized.
|
|
42
|
+
* Returns the current step synchronously.
|
|
55
43
|
*/
|
|
56
44
|
getCurrentStep(): StepDefinition<T> | null;
|
|
57
45
|
/**
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
* @returns Observable stream of the active step or `null` if uninitialized.
|
|
46
|
+
* Observable stream of current step.
|
|
61
47
|
*/
|
|
62
48
|
getCurrentStep$(): Observable<StepDefinition<T> | null>;
|
|
63
49
|
/**
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
* @returns Observable stream of step definitions.
|
|
50
|
+
* Observable stream of all active steps.
|
|
67
51
|
*/
|
|
68
52
|
getSteps$(): Observable<StepDefinition<T>[]>;
|
|
69
53
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* @returns Observable stream of the current index (0-based).
|
|
54
|
+
* Observable stream of the current index.
|
|
73
55
|
*/
|
|
74
56
|
getCurrentIndex$(): Observable<number>;
|
|
75
57
|
/**
|
|
76
|
-
*
|
|
58
|
+
* Returns the shared wizard context.
|
|
59
|
+
*/
|
|
60
|
+
getContext(): T | null;
|
|
61
|
+
/**
|
|
62
|
+
* Advances to the next step.
|
|
77
63
|
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
64
|
+
* Executes:
|
|
65
|
+
* - onExit guard
|
|
66
|
+
* - context merge
|
|
67
|
+
* - step recomposition
|
|
68
|
+
* - navigation
|
|
81
69
|
*
|
|
82
|
-
* @param
|
|
70
|
+
* @param partialContext Optional context updates.
|
|
83
71
|
*/
|
|
84
|
-
next(
|
|
72
|
+
next(partialContext?: Partial<T>): Promise<void>;
|
|
85
73
|
/**
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
* No guards are executed during backward navigation.
|
|
74
|
+
* Navigates to the previous step.
|
|
89
75
|
*/
|
|
90
76
|
previous(): void;
|
|
91
77
|
/**
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
* @returns `true` if on the last step; otherwise `false`.
|
|
78
|
+
* Returns whether the wizard is currently on the last step.
|
|
95
79
|
*/
|
|
96
80
|
isLast(): boolean;
|
|
97
81
|
/**
|
|
98
|
-
* Sets
|
|
99
|
-
*
|
|
100
|
-
* This is typically controlled by external validation logic (e.g., form state).
|
|
101
|
-
*
|
|
102
|
-
* @param available - `true` if forward navigation should be allowed.
|
|
82
|
+
* Sets forward navigation availability.
|
|
103
83
|
*/
|
|
104
84
|
setStepForwardAvailability(available: boolean): void;
|
|
105
85
|
/**
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
* @returns Observable stream of the forward navigation flag.
|
|
86
|
+
* Returns observable forward navigation state.
|
|
109
87
|
*/
|
|
110
88
|
getStepForwardAvailability(): Observable<boolean>;
|
|
111
89
|
/**
|
|
112
|
-
* Navigates the router to the
|
|
113
|
-
*
|
|
114
|
-
* This method updates the URL relative to the injected route
|
|
115
|
-
* using the pattern: `step-{slug}`.
|
|
116
|
-
*
|
|
117
|
-
* @internal
|
|
90
|
+
* Navigates the Angular router to the current step.
|
|
118
91
|
*/
|
|
119
92
|
private navigate;
|
|
120
|
-
/**
|
|
121
|
-
* Navigates the router away from any "step" route.
|
|
122
|
-
*
|
|
123
|
-
* This methods updates the URL relative to the injected route, removing every after `/step-
|
|
124
|
-
*/
|
|
125
|
-
clearStepRoute(): void;
|
|
126
93
|
static ɵfac: i0.ɵɵFactoryDeclaration<WizardStepService<any>, never>;
|
|
127
94
|
static ɵprov: i0.ɵɵInjectableDeclaration<WizardStepService<any>>;
|
|
128
95
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "windows-plus-utilities",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.89",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/common": "^17.3.8",
|
|
6
6
|
"@angular/core": "^17.3.8",
|
|
@@ -37,23 +37,17 @@
|
|
|
37
37
|
"esm": "./esm2022/custom-card/windows-plus-utilities-custom-card.mjs",
|
|
38
38
|
"default": "./fesm2022/windows-plus-utilities-custom-card.mjs"
|
|
39
39
|
},
|
|
40
|
-
"./main-menu": {
|
|
41
|
-
"types": "./main-menu/index.d.ts",
|
|
42
|
-
"esm2022": "./esm2022/main-menu/windows-plus-utilities-main-menu.mjs",
|
|
43
|
-
"esm": "./esm2022/main-menu/windows-plus-utilities-main-menu.mjs",
|
|
44
|
-
"default": "./fesm2022/windows-plus-utilities-main-menu.mjs"
|
|
45
|
-
},
|
|
46
40
|
"./empty-display": {
|
|
47
41
|
"types": "./empty-display/index.d.ts",
|
|
48
42
|
"esm2022": "./esm2022/empty-display/windows-plus-utilities-empty-display.mjs",
|
|
49
43
|
"esm": "./esm2022/empty-display/windows-plus-utilities-empty-display.mjs",
|
|
50
44
|
"default": "./fesm2022/windows-plus-utilities-empty-display.mjs"
|
|
51
45
|
},
|
|
52
|
-
"./
|
|
53
|
-
"types": "./
|
|
54
|
-
"esm2022": "./esm2022/
|
|
55
|
-
"esm": "./esm2022/
|
|
56
|
-
"default": "./fesm2022/windows-plus-utilities-
|
|
46
|
+
"./main-menu": {
|
|
47
|
+
"types": "./main-menu/index.d.ts",
|
|
48
|
+
"esm2022": "./esm2022/main-menu/windows-plus-utilities-main-menu.mjs",
|
|
49
|
+
"esm": "./esm2022/main-menu/windows-plus-utilities-main-menu.mjs",
|
|
50
|
+
"default": "./fesm2022/windows-plus-utilities-main-menu.mjs"
|
|
57
51
|
},
|
|
58
52
|
"./modal-wizard": {
|
|
59
53
|
"types": "./modal-wizard/index.d.ts",
|
|
@@ -61,6 +55,12 @@
|
|
|
61
55
|
"esm": "./esm2022/modal-wizard/windows-plus-utilities-modal-wizard.mjs",
|
|
62
56
|
"default": "./fesm2022/windows-plus-utilities-modal-wizard.mjs"
|
|
63
57
|
},
|
|
58
|
+
"./job-label": {
|
|
59
|
+
"types": "./job-label/index.d.ts",
|
|
60
|
+
"esm2022": "./esm2022/job-label/windows-plus-utilities-job-label.mjs",
|
|
61
|
+
"esm": "./esm2022/job-label/windows-plus-utilities-job-label.mjs",
|
|
62
|
+
"default": "./fesm2022/windows-plus-utilities-job-label.mjs"
|
|
63
|
+
},
|
|
64
64
|
"./section-header": {
|
|
65
65
|
"types": "./section-header/index.d.ts",
|
|
66
66
|
"esm2022": "./esm2022/section-header/windows-plus-utilities-section-header.mjs",
|