UNPKG

@y3krulez/angular-archwizard

Version:

The port of angular-archwizard, supporting IVY and thus being compatible with Angular16+

117 lines 16.3 kB
import { BaseNavigationMode } from './base-navigation-mode.interface'; import { WizardCompletionStep } from '../util/wizard-completion-step.interface'; /** * The default navigation mode used by [[WizardComponent]] and [[NavigationModeDirective]]. * * It is parameterized with two navigation policies passed to constructor: * * - [[navigateBackward]] policy controls whether wizard steps before the current step are navigable: * * - `"deny"` -- the steps are not navigable * - `"allow"` -- the steps are navigable * - If the corresponding constructor argument is omitted or is `null` or `undefined`, * then the default value is applied which is `"deny"` * * - [[navigateForward]] policy controls whether wizard steps after the current step are navigable: * * - `"deny"` -- the steps are not navigable * - `"allow"` -- the steps are navigable * - `"visited"` -- a step is navigable iff it was already visited before * - If the corresponding constructor argument is omitted or is `null` or `undefined`, * then the default value is applied which is `"allow"` */ export class ConfigurableNavigationMode extends BaseNavigationMode { /** * Constructor * * @param navigateBackward Controls whether wizard steps before the current step are navigable * @param navigateForward Controls whether wizard steps before the current step are navigable */ constructor(navigateBackward = null, navigateForward = null) { super(); this.navigateBackward = navigateBackward; this.navigateForward = navigateForward; this.navigateBackward = this.navigateBackward || 'allow'; this.navigateForward = this.navigateForward || 'deny'; } /** * @inheritDoc */ canTransitionToStep(wizard, destinationIndex) { // if the destination step can be navigated to using the navigation bar, // it should be accessible with [goToStep] as well if (this.isNavigable(wizard, destinationIndex)) { return true; } // navigation with [goToStep] is permitted if all previous steps // to the destination step have been completed or are optional return wizard.wizardSteps .filter((step, index) => index < destinationIndex && index !== wizard.currentStepIndex) .every(step => step.completed || step.optional); } /** * @inheritDoc */ transition(wizard, destinationIndex) { if (this.navigateForward === 'deny') { // set all steps after the destination step to incomplete wizard.wizardSteps .filter((step, index) => wizard.currentStepIndex > destinationIndex && index > destinationIndex) .forEach(step => step.completed = false); } super.transition(wizard, destinationIndex); } /** * @inheritDoc */ isNavigable(wizard, destinationIndex) { // Check if the destination step can be navigated to const destinationStep = wizard.getStepAtIndex(destinationIndex); if (destinationStep instanceof WizardCompletionStep) { // A completion step can only be entered, if all previous steps have been completed, are optional, or selected const previousStepsCompleted = wizard.wizardSteps .filter((step, index) => index < destinationIndex) .every(step => step.completed || step.optional || step.selected); if (!previousStepsCompleted) { return false; } } // Apply navigation pocicies if (destinationIndex < wizard.currentStepIndex) { // If the destination step is before current, apply the `navigateBackward` policy switch (this.navigateBackward) { case 'allow': return true; case 'deny': return false; default: throw new Error(`Invalid value for navigateBackward: ${this.navigateBackward}`); } } else if (destinationIndex > wizard.currentStepIndex) { // If the destination step is after current, apply the `navigateForward` policy switch (this.navigateForward) { case 'allow': return true; case 'deny': return false; case 'visited': return destinationStep.completed; default: throw new Error(`Invalid value for navigateForward: ${this.navigateForward}`); } } else { // Re-entering the current step is not allowed return false; } } /** * @inheritDoc */ ensureCanReset(wizard) { super.ensureCanReset(wizard); // the default step is a completion step and the wizard contains more than one step const defaultWizardStep = wizard.getStepAtIndex(wizard.defaultStepIndex); const defaultCompletionStep = defaultWizardStep instanceof WizardCompletionStep; if (defaultCompletionStep && wizard.wizardSteps.length !== 1) { throw new Error(`The default step index ${wizard.defaultStepIndex} references a completion step`); } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhYmxlLW5hdmlnYXRpb24tbW9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbmF2aWdhdGlvbi9jb25maWd1cmFibGUtbmF2aWdhdGlvbi1tb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBRXBFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBRTlFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxPQUFPLDBCQUEyQixTQUFRLGtCQUFrQjtJQUVoRTs7Ozs7T0FLRztJQUNILFlBQ1UsbUJBQXdDLElBQUksRUFDNUMsa0JBQWlELElBQUk7UUFFN0QsS0FBSyxFQUFFLENBQUM7UUFIQSxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQTRCO1FBQzVDLG9CQUFlLEdBQWYsZUFBZSxDQUFzQztRQUc3RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixJQUFJLE9BQU8sQ0FBQztRQUN6RCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLElBQUksTUFBTSxDQUFDO0lBQ3hELENBQUM7SUFFRDs7T0FFRztJQUNPLG1CQUFtQixDQUFDLE1BQXVCLEVBQUUsZ0JBQXdCO1FBQzdFLHdFQUF3RTtRQUN4RSxrREFBa0Q7UUFDbEQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFO1lBQzlDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxnRUFBZ0U7UUFDaEUsOERBQThEO1FBQzlELE9BQU8sTUFBTSxDQUFDLFdBQVc7YUFDcEIsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLGdCQUFnQixJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7YUFD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LEtBQUssQ0FBQywwQkFBMEIsTUFBTSxDQUFDLGdCQUFnQiwrQkFBK0IsQ0FBQyxDQUFDO1NBQ25HO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtCYXNlTmF2aWdhdGlvbk1vZGV9IGZyb20gJy4vYmFzZS1uYXZpZ2F0aW9uLW1vZGUuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtXaXphcmRDb21wb25lbnR9IGZyb20gJy4uL2NvbXBvbmVudHMvd2l6YXJkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7V2l6YXJkQ29tcGxldGlvblN0ZXB9IGZyb20gJy4uL3V0aWwvd2l6YXJkLWNvbXBsZXRpb24tc3RlcC5pbnRlcmZhY2UnO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBkZWZhdWx0IG5hdmlnYXRpb24gbW9kZSB1c2VkIGJ5IFtbV2l6YXJkQ29tcG9uZW50XV0gYW5kIFtbTmF2aWdhdGlvbk1vZGVEaXJlY3RpdmVdXS5cclxuICpcclxuICogSXQgaXMgcGFyYW1ldGVyaXplZCB3aXRoIHR3byBuYXZpZ2F0aW9uIHBvbGljaWVzIHBhc3NlZCB0byBjb25zdHJ1Y3RvcjpcclxuICpcclxuICogLSBbW25hdmlnYXRlQmFja3dhcmRdXSBwb2xpY3kgY29udHJvbHMgd2hldGhlciB3aXphcmQgc3RlcHMgYmVmb3JlIHRoZSBjdXJyZW50IHN0ZXAgYXJlIG5hdmlnYWJsZTpcclxuICpcclxuICogICAtIGBcImRlbnlcImAgLS0gdGhlIHN0ZXBzIGFyZSBub3QgbmF2aWdhYmxlXHJcbiAqICAgLSBgXCJhbGxvd1wiYCAtLSB0aGUgc3RlcHMgYXJlIG5hdmlnYWJsZVxyXG4gKiAgIC0gSWYgdGhlIGNvcnJlc3BvbmRpbmcgY29uc3RydWN0b3IgYXJndW1lbnQgaXMgb21pdHRlZCBvciBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsXHJcbiAqICAgICB0aGVuIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGxpZWQgd2hpY2ggaXMgYFwiZGVueVwiYFxyXG4gKlxyXG4gKiAtIFtbbmF2aWdhdGVGb3J3YXJkXV0gcG9saWN5IGNvbnRyb2xzIHdoZXRoZXIgd2l6YXJkIHN0ZXBzIGFmdGVyIHRoZSBjdXJyZW50IHN0ZXAgYXJlIG5hdmlnYWJsZTpcclxuICpcclxuICogICAtIGBcImRlbnlcImAgLS0gdGhlIHN0ZXBzIGFyZSBub3QgbmF2aWdhYmxlXHJcbiAqICAgLSBgXCJhbGxvd1wiYCAtLSB0aGUgc3RlcHMgYXJlIG5hdmlnYWJsZVxyXG4gKiAgIC0gYFwidmlzaXRlZFwiYCAtLSBhIHN0ZXAgaXMgbmF2aWdhYmxlIGlmZiBpdCB3YXMgYWxyZWFkeSB2aXNpdGVkIGJlZm9yZVxyXG4gKiAgIC0gSWYgdGhlIGNvcnJlc3BvbmRpbmcgY29uc3RydWN0b3IgYXJndW1lbnQgaXMgb21pdHRlZCBvciBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsXHJcbiAqICAgICB0aGVuIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGFwcGxpZWQgd2hpY2ggaXMgYFwiYWxsb3dcImBcclxuICovXHJcbmV4cG9ydCBjbGFzcyBDb25maWd1cmFibGVOYXZpZ2F0aW9uTW9kZSBleHRlbmRzIEJhc2VOYXZpZ2F0aW9uTW9kZSB7XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdG9yXHJcbiAgICpcclxuICAgKiBAcGFyYW0gbmF2aWdhdGVCYWNrd2FyZCBDb250cm9scyB3aGV0aGVyIHdpemFyZCBzdGVwcyBiZWZvcmUgdGhlIGN1cnJlbnQgc3RlcCBhcmUgbmF2aWdhYmxlXHJcbiAgICogQHBhcmFtIG5hdmlnYXRlRm9yd2FyZCBDb250cm9scyB3aGV0aGVyIHdpemFyZCBzdGVwcyBiZWZvcmUgdGhlIGN1cnJlbnQgc3RlcCBhcmUgbmF2aWdhYmxlXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG5hdmlnYXRlQmFja3dhcmQ6ICdhbGxvdyd8J2RlbnknfG51bGwgPSBudWxsLFxyXG4gICAgcHJpdmF0ZSBuYXZpZ2F0ZUZvcndhcmQ6ICdhbGxvdyd8J2RlbnknfCd2aXNpdGVkJ3xudWxsID0gbnVsbCxcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLm5hdmlnYXRlQmFja3dhcmQgPSB0aGlzLm5hdmlnYXRlQmFja3dhcmQgfHwgJ2FsbG93JztcclxuICAgIHRoaXMubmF2aWdhdGVGb3J3YXJkID0gdGhpcy5uYXZpZ2F0ZUZvcndhcmQgfHwgJ2RlbnknO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGluaGVyaXREb2NcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgY2FuVHJhbnNpdGlvblRvU3RlcCh3aXphcmQ6IFdpemFyZENvbXBvbmVudCwgZGVzdGluYXRpb25JbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICAvLyBpZiB0aGUgZGVzdGluYXRpb24gc3RlcCBjYW4gYmUgbmF2aWdhdGVkIHRvIHVzaW5nIHRoZSBuYXZpZ2F0aW9uIGJhcixcclxuICAgIC8vIGl0IHNob3VsZCBiZSBhY2Nlc3NpYmxlIHdpdGggW2dvVG9TdGVwXSBhcyB3ZWxsXHJcbiAgICBpZiAodGhpcy5pc05hdmlnYWJsZSh3aXphcmQsIGRlc3RpbmF0aW9uSW5kZXgpKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIG5hdmlnYXRpb24gd2l0aCBbZ29Ub1N0ZXBdIGlzIHBlcm1pdHRlZCBpZiBhbGwgcHJldmlvdXMgc3RlcHNcclxuICAgIC8vIHRvIHRoZSBkZXN0aW5hdGlvbiBzdGVwIGhhdmUgYmVlbiBjb21wbGV0ZWQgb3IgYXJlIG9wdGlvbmFsXHJcbiAgICByZXR1cm4gd2l6YXJkLndpemFyZFN0ZXBzXHJcbiAgICAgICAgLmZpbHRlcigoc3RlcCwgaW5kZXgpID0+IGluZGV4IDwgZGVzdGluYXRpb25JbmRleCAmJiBpbmRleCAhPT0gd2l6YXJkLmN1cnJlbnRTdGVwSW5kZXgpXHJcbiAgICAgICAgLmV2ZXJ5KHN0ZXAgPT4gc3RlcC5jb21wbGV0ZWQgfHwgc3RlcC5vcHRpb25hbCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaW5oZXJpdERvY1xyXG4gICAqL1xyXG4gIHByb3RlY3RlZCB0cmFuc2l0aW9uKHdpemFyZDogV2l6YXJkQ29tcG9uZW50LCBkZXN0aW5hdGlvbkluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm5hdmlnYXRlRm9yd2FyZCA9PT0gJ2RlbnknKSB7XHJcbiAgICAgIC8vIHNldCBhbGwgc3RlcHMgYWZ0ZXIgdGhlIGRlc3RpbmF0aW9uIHN0ZXAgdG8gaW5jb21wbGV0ZVxyXG4gICAgICB3aXphcmQud2l6YXJkU3RlcHNcclxuICAgICAgICAuZmlsdGVyKChzdGVwLCBpbmRleCkgPT4gd2l6YXJkLmN1cnJlbnRTdGVwSW5kZXggPiBkZXN0aW5hdGlvbkluZGV4ICYmIGluZGV4ID4gZGVzdGluYXRpb25JbmRleClcclxuICAgICAgICAuZm9yRWFjaChzdGVwID0+IHN0ZXAuY29tcGxldGVkID0gZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHN1cGVyLnRyYW5zaXRpb24od2l6YXJkLCBkZXN0aW5hdGlvbkluZGV4KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpbmhlcml0RG9jXHJcbiAgICovXHJcbiAgcHVibGljIGlzTmF2aWdhYmxlKHdpemFyZDogV2l6YXJkQ29tcG9uZW50LCBkZXN0aW5hdGlvbkluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIC8vIENoZWNrIGlmIHRoZSBkZXN0aW5hdGlvbiBzdGVwIGNhbiBiZSBuYXZpZ2F0ZWQgdG9cclxuICAgIGNvbnN0IGRlc3RpbmF0aW9uU3RlcCA9IHdpemFyZC5nZXRTdGVwQXRJbmRleChkZXN0aW5hdGlvbkluZGV4KTtcclxuICAgIGlmIChkZXN0aW5hdGlvblN0ZXAgaW5zdGFuY2VvZiBXaXphcmRDb21wbGV0aW9uU3RlcCkge1xyXG4gICAgICAvLyBBIGNvbXBsZXRpb24gc3RlcCBjYW4gb25seSBiZSBlbnRlcmVkLCBpZiBhbGwgcHJldmlvdXMgc3RlcHMgaGF2ZSBiZWVuIGNvbXBsZXRlZCwgYXJlIG9wdGlvbmFsLCBvciBzZWxlY3RlZFxyXG4gICAgICBjb25zdCBwcmV2aW91c1N0ZXBzQ29tcGxldGVkID0gd2l6YXJkLndpemFyZFN0ZXBzXHJcbiAgICAgICAgLmZpbHRlcigoc3RlcCwgaW5kZXgpID0+IGluZGV4IDwgZGVzdGluYXRpb25JbmRleClcclxuICAgICAgICAuZXZlcnkoc3RlcCA9PiBzdGVwLmNvbXBsZXRlZCB8fCBzdGVwLm9wdGlvbmFsIHx8IHN0ZXAuc2VsZWN0ZWQpO1xyXG4gICAgICBpZiAoIXByZXZpb3VzU3RlcHNDb21wbGV0ZWQpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBBcHBseSBuYXZpZ2F0aW9uIHBvY2ljaWVzXHJcbiAgICBpZiAoZGVzdGluYXRpb25JbmRleCA8IHdpemFyZC5jdXJyZW50U3RlcEluZGV4KSB7XHJcbiAgICAgIC8vIElmIHRoZSBkZXN0aW5hdGlvbiBzdGVwIGlzIGJlZm9yZSBjdXJyZW50LCBhcHBseSB0aGUgYG5hdmlnYXRlQmFja3dhcmRgIHBvbGljeVxyXG4gICAgICBzd2l0Y2ggKHRoaXMubmF2aWdhdGVCYWNrd2FyZCkge1xyXG4gICAgICAgIGNhc2UgJ2FsbG93JzogcmV0dXJuIHRydWU7XHJcbiAgICAgICAgY2FzZSAnZGVueSc6IHJldHVybiBmYWxzZTtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlIGZvciBuYXZpZ2F0ZUJhY2t3YXJkOiAke3RoaXMubmF2aWdhdGVCYWNrd2FyZH1gKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChkZXN0aW5hdGlvbkluZGV4ID4gd2l6YXJkLmN1cnJlbnRTdGVwSW5kZXgpIHtcclxuICAgICAgLy8gSWYgdGhlIGRlc3RpbmF0aW9uIHN0ZXAgaXMgYWZ0ZXIgY3VycmVudCwgYXBwbHkgdGhlIGBuYXZpZ2F0ZUZvcndhcmRgIHBvbGljeVxyXG4gICAgICBzd2l0Y2ggKHRoaXMubmF2aWdhdGVGb3J3YXJkKSB7XHJcbiAgICAgICAgY2FzZSAnYWxsb3cnOiByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBjYXNlICdkZW55JzogcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNhc2UgJ3Zpc2l0ZWQnOiByZXR1cm4gZGVzdGluYXRpb25TdGVwLmNvbXBsZXRlZDtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlIGZvciBuYXZpZ2F0ZUZvcndhcmQ6ICR7dGhpcy5uYXZpZ2F0ZUZvcndhcmR9YCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIFJlLWVudGVyaW5nIHRoZSBjdXJyZW50IHN0ZXAgaXMgbm90IGFsbG93ZWRcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGluaGVyaXREb2NcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgZW5zdXJlQ2FuUmVzZXQod2l6YXJkOiBXaXphcmRDb21wb25lbnQpOiB2b2lkIHtcclxuICAgIHN1cGVyLmVuc3VyZUNhblJlc2V0KHdpemFyZCk7XHJcblxyXG4gICAgLy8gdGhlIGRlZmF1bHQgc3RlcCBpcyBhIGNvbXBsZXRpb24gc3RlcCBhbmQgdGhlIHdpemFyZCBjb250YWlucyBtb3JlIHRoYW4gb25lIHN0ZXBcclxuICAgIGNvbnN0IGRlZmF1bHRXaXphcmRTdGVwID0gd2l6YXJkLmdldFN0ZXBBdEluZGV4KHdpemFyZC5kZWZhdWx0U3RlcEluZGV4KTtcclxuICAgIGNvbnN0IGRlZmF1bHRDb21wbGV0aW9uU3RlcCA9IGRlZmF1bHRXaXphcmRTdGVwIGluc3RhbmNlb2YgV2l6YXJkQ29tcGxldGlvblN0ZXA7XHJcbiAgICBpZiAoZGVmYXVsdENvbXBsZXRpb25TdGVwICYmIHdpemFyZC53aXphcmRTdGVwcy5sZW5ndGggIT09IDEpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZGVmYXVsdCBzdGVwIGluZGV4ICR7d2l6YXJkLmRlZmF1bHRTdGVwSW5kZXh9IHJlZmVyZW5jZXMgYSBjb21wbGV0aW9uIHN0ZXBgKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19