ngx-joyride
Version:
[](https://badge.fury.io/js/ngx-joyride) [](https://travis-ci.org/tnicola/ngx-joyride) [ {
StepActionType["NEXT"] = "NEXT";
StepActionType["PREV"] = "PREV";
})(StepActionType || (StepActionType = {}));
export class JoyrideStepsContainerService {
constructor(stepOptions, logger) {
this.stepOptions = stepOptions;
this.logger = logger;
this.tempSteps = [];
this.currentStepIndex = -2;
this.stepHasBeenModified = new Subject();
}
getFirstStepIndex() {
const firstStep = this.stepOptions.getFirstStep();
const stepIds = this.stepOptions.getStepsOrder();
let index = stepIds.indexOf(firstStep);
if (index < 0) {
index = 0;
if (firstStep !== undefined)
this.logger.warn(`The step ${firstStep} does not exist. Check in your step list if it's present.`);
}
return index;
}
init() {
this.logger.info('Initializing the steps array.');
this.steps = [];
this.currentStepIndex = this.getFirstStepIndex() - 1;
let stepIds = this.stepOptions.getStepsOrder();
stepIds.forEach(stepId => this.steps.push({ id: stepId, step: null }));
}
addStep(stepToAdd) {
let stepExist = this.tempSteps.filter(step => step.name === stepToAdd.name).length > 0;
if (!stepExist) {
this.logger.info(`Adding step ${stepToAdd.name} to the steps list.`);
this.tempSteps.push(stepToAdd);
}
else {
let stepIndexToReplace = this.tempSteps.findIndex(step => step.name === stepToAdd.name);
this.tempSteps[stepIndexToReplace] = stepToAdd;
}
}
get(action) {
if (action === StepActionType.NEXT)
this.currentStepIndex++;
else
this.currentStepIndex--;
if (this.currentStepIndex < 0 || this.currentStepIndex >= this.steps.length)
throw new JoyrideStepOutOfRange('The first or last step of the tour cannot be found!');
const stepName = this.getStepName(this.steps[this.currentStepIndex].id);
const index = this.tempSteps.findIndex(step => step.name === stepName);
let stepFound = this.tempSteps[index];
this.steps[this.currentStepIndex].step = stepFound;
if (stepFound == null) {
this.logger.warn(`Step ${this.steps[this.currentStepIndex].id} not found in the DOM. Check if it's hidden by *ngIf directive.`);
}
return stepFound;
}
getStepRoute(action) {
let stepID;
if (action === StepActionType.NEXT) {
stepID = this.steps[this.currentStepIndex + 1] ? this.steps[this.currentStepIndex + 1].id : null;
}
else {
stepID = this.steps[this.currentStepIndex - 1] ? this.steps[this.currentStepIndex - 1].id : null;
}
let stepRoute = stepID && stepID.includes(ROUTE_SEPARATOR) ? stepID.split(ROUTE_SEPARATOR)[1] : '';
return stepRoute;
}
updatePosition(stepName, position) {
let index = this.getStepIndex(stepName);
if (this.steps[index].step) {
this.steps[index].step.position = position;
this.stepHasBeenModified.next(this.steps[index].step);
}
else {
this.logger.warn(`Trying to modify the position of ${stepName} to ${position}. Step not found!Is this step located in a different route?`);
}
}
getStepNumber(stepName) {
return this.getStepIndex(stepName) + 1;
}
getStepsCount() {
let stepsOrder = this.stepOptions.getStepsOrder();
return stepsOrder.length;
}
getStepIndex(stepName) {
const index = this.steps
.map(step => (step.id.includes(ROUTE_SEPARATOR) ? step.id.split(ROUTE_SEPARATOR)[0] : step.id))
.findIndex(name => stepName === name);
if (index === -1)
throw new JoyrideError(`The step with name: ${stepName} does not exist in the step list.`);
return index;
}
getStepName(stepID) {
let stepName = stepID && stepID.includes(ROUTE_SEPARATOR) ? stepID.split(ROUTE_SEPARATOR)[0] : stepID;
return stepName;
}
}
JoyrideStepsContainerService.decorators = [
{ type: Injectable }
];
JoyrideStepsContainerService.ctorParameters = () => [
{ type: JoyrideOptionsService },
{ type: LoggerService }
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam95cmlkZS1zdGVwcy1jb250YWluZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1qb3lyaWRlL3NyYy9saWIvc2VydmljZXMvam95cmlkZS1zdGVwcy1jb250YWluZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVwRixNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFFNUIsTUFBTSxJQUFJO0NBR1Q7QUFFRCxNQUFNLENBQU4sSUFBWSxjQUdYO0FBSEQsV0FBWSxjQUFjO0lBQ3RCLCtCQUFhLENBQUE7SUFDYiwrQkFBYSxDQUFBO0FBQ2pCLENBQUMsRUFIVyxjQUFjLEtBQWQsY0FBYyxRQUd6QjtBQUdELE1BQU0sT0FBTyw0QkFBNEI7SUFNckMsWUFBNkIsV0FBa0MsRUFBbUIsTUFBcUI7UUFBMUUsZ0JBQVcsR0FBWCxXQUFXLENBQXVCO1FBQW1CLFdBQU0sR0FBTixNQUFNLENBQWU7UUFKL0YsY0FBUyxHQUFrQixFQUFFLENBQUM7UUFDOUIscUJBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUIsd0JBQW1CLEdBQXlCLElBQUksT0FBTyxFQUFlLENBQUM7SUFFbUMsQ0FBQztJQUVuRyxpQkFBaUI7UUFDckIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMs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TSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3RHLE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7OztZQXRHSixVQUFVOzs7WUFoQkYscUJBQXFCO1lBQ3JCLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEpveXJpZGVTdGVwIH0gZnJvbSAnLi4vbW9kZWxzL2pveXJpZGUtc3RlcC5jbGFzcyc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgSm95cmlkZU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi9qb3lyaWRlLW9wdGlvbnMuc2VydmljZSc7XHJcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tICcuL2xvZ2dlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSm95cmlkZUVycm9yLCBKb3lyaWRlU3RlcE91dE9mUmFuZ2UgfSBmcm9tICcuLi9tb2RlbHMvam95cmlkZS1lcnJvci5jbGFzcyc7XHJcblxyXG5jb25zdCBST1VURV9TRVBBUkFUT1IgPSAnQCc7XHJcblxyXG5jbGFzcyBTdGVwIHtcclxuICAgIGlkOiBzdHJpbmc7XHJcbiAgICBzdGVwOiBKb3lyaWRlU3RlcDtcclxufVxyXG5cclxuZXhwb3J0IGVudW0gU3RlcEFjdGlvblR5cGUge1xyXG4gICAgTkVYVCA9ICdORVhUJyxcclxuICAgIFBSRVYgPSAnUFJFVidcclxufVxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgSm95cmlkZVN0ZXBzQ29udGFpbmVyU2VydmljZSB7XHJcbiAgICBwcml2YXRlIHN0ZXBzOiBTdGVwW107XHJcbiAgICBwcml2YXRlIHRlbXBTdGVwczogSm95cmlkZVN0ZXBbXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBjdXJyZW50U3RlcEluZGV4ID0gLTI7XHJcbiAgICBzdGVwSGFzQmVlbk1vZGlmaWVkOiBTdWJqZWN0PEpveXJpZGVTdGVwPiA9IG5ldyBTdWJqZWN0PEpveXJpZGVTdGVwPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgc3RlcE9wdGlvbnM6IEpveXJpZGVPcHRpb25zU2VydmljZSwgcHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlclNlcnZpY2UpIHt9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRGaXJzdFN0ZXBJbmRleCgpOiBudW1iZXIge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0U3RlcCA9IHRoaXMuc3RlcE9wdGlvbnMuZ2V0Rmlyc3RTdGVwKCk7XHJcbiAgICAgICAgY29uc3Qgc3RlcElkcyA9IHRoaXMuc3RlcE9wdGlvbnMuZ2V0U3RlcHNPcmRlcigpO1xyXG5cclxuICAgICAgICBsZXQgaW5kZXggPSBzdGVwSWRzLmluZGV4T2YoZmlyc3RTdGVwKTtcclxuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gMDtcclxuICAgICAgICAgICAgaWYgKGZpcnN0U3RlcCAhPT0gdW5kZWZpbmVkKSB0aGlzLmxvZ2dlci53YXJuKGBUaGUgc3RlcCAke2ZpcnN0U3RlcH0gZG9lcyBub3QgZXhpc3QuIENoZWNrIGluIHlvdXIgc3RlcCBsaXN0IGlmIGl0J3MgcHJlc2VudC5gKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBpbmRleDtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCkge1xyXG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ0luaXRpYWxpemluZyB0aGUgc3RlcHMgYXJyYXkuJyk7XHJcbiAgICAgICAgdGhpcy5zdGVwcyA9IFtdO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleCA9IHRoaXMuZ2V0Rmlyc3RTdGVwSW5kZXgoKSAtIDE7XHJcbiAgICAgICAgbGV0IHN0ZXBJZHMgPSB0aGlzLnN0ZXBPcHRpb25zLmdldFN0ZXBzT3JkZXIoKTtcclxuICAgICAgICBzdGVwSWRzLmZvckVhY2goc3RlcElkID0+IHRoaXMuc3RlcHMucHVzaCh7IGlkOiBzdGVwSWQsIHN0ZXA6IG51bGwgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZFN0ZXAoc3RlcFRvQWRkOiBKb3lyaWRlU3RlcCkge1xyXG4gICAgICAgIGxldCBzdGVwRXhpc3QgPSB0aGlzLnRlbXBTdGVwcy5maWx0ZXIoc3RlcCA9PiBzdGVwLm5hbWUgPT09IHN0ZXBUb0FkZC5uYW1lKS5sZW5ndGggPiAwO1xyXG4gICAgICAgIGlmICghc3RlcEV4aXN0KSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmluZm8oYEFkZGluZyBzdGVwICR7c3RlcFRvQWRkLm5hbWV9IHRvIHRoZSBzdGVwcyBsaXN0LmApO1xyXG4gICAgICAgICAgICB0aGlzLnRlbXBTdGVwcy5wdXNoKHN0ZXBUb0FkZCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHN0ZXBJbmRleFRvUmVwbGFjZSA9IHRoaXMudGVtcFN0ZXBzLmZpbmRJbmRleChzdGVwID0+IHN0ZXAubmFtZSA9PT0gc3RlcFRvQWRkLm5hbWUpO1xyXG4gICAgICAgICAgICB0aGlzLnRlbXBTdGVwc1tzdGVwSW5kZXhUb1JlcGxhY2VdID0gc3RlcFRvQWRkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldChhY3Rpb246IFN0ZXBBY3Rpb25UeXBlKTogSm95cmlkZVN0ZXAge1xyXG4gICAgICAgIGlmIChhY3Rpb24gPT09IFN0ZXBBY3Rpb25UeXBlLk5FWFQpIHRoaXMuY3VycmVudFN0ZXBJbmRleCsrO1xyXG4gICAgICAgIGVsc2UgdGhpcy5jdXJyZW50U3RlcEluZGV4LS07XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwSW5kZXggPCAwIHx8IHRoaXMuY3VycmVudFN0ZXBJbmRleCA+PSB0aGlzLnN0ZXBzLmxlbmd0aClcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEpveXJpZGVTdGVwT3V0T2ZSYW5nZSgnVGhlIGZpcnN0IG9yIGxhc3Qgc3RlcCBvZiB0aGUgdG91ciBjYW5ub3QgYmUgZm91bmQhJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0ZXBOYW1lID0gdGhpcy5nZXRTdGVwTmFtZSh0aGlzLnN0ZXBzW3RoaXMuY3VycmVudFN0ZXBJbmRleF0uaWQpO1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy50ZW1wU3RlcHMuZmluZEluZGV4KHN0ZXAgPT4gc3RlcC5uYW1lID09PSBzdGVwTmFtZSk7XHJcbiAgICAgICAgbGV0IHN0ZXBGb3VuZCA9IHRoaXMudGVtcFN0ZXBzW2luZGV4XTtcclxuICAgICAgICB0aGlzLnN0ZXBzW3RoaXMuY3VycmVudFN0ZXBJbmRleF0uc3RlcCA9IHN0ZXBGb3VuZDtcclxuXHJcbiAgICAgICAgaWYgKHN0ZXBGb3VuZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFN0ZXAgJHt0aGlzLnN0ZXBzW3RoaXMuY3VycmVudFN0ZXBJbmRleF0uaWR9IG5vdCBmb3VuZCBpbiB0aGUgRE9NLiBDaGVjayBpZiBpdCdzIGhpZGRlbiBieSAqbmdJZiBkaXJlY3RpdmUuYCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gc3RlcEZvdW5kO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFN0ZXBSb3V0ZShhY3Rpb246IFN0ZXBBY3Rpb25UeXBlKSB7XHJcbiAgICAgICAgbGV0IHN0ZXBJRDogc3RyaW5nO1xyXG4gICAgICAgIGlmIChhY3Rpb24gPT09IFN0ZXBBY3Rpb25UeXBlLk5FWFQpIHtcclxuICAgICAgICAgICAgc3RlcElEID0gdGhpcy5zdGVwc1t0aGlzLmN1cnJlbnRTdGVwSW5kZXggKyAxXSA/IHRoaXMuc3RlcHNbdGhpcy5jdXJyZW50U3RlcEluZGV4ICsgMV0uaWQgOiBudWxsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHN0ZXBJRCA9IHRoaXMuc3RlcHNbdGhpcy5jdXJyZW50U3RlcEluZGV4IC0gMV0gPyB0aGlzLnN0ZXBzW3RoaXMuY3VycmVudFN0ZXBJbmRleCAtIDFdLmlkIDogbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHN0ZXBSb3V0ZSA9IHN0ZXBJRCAmJiBzdGVwSUQuaW5jbHVkZXMoUk9VVEVfU0VQQVJBVE9SKSA/IHN0ZXBJRC5zcGxpdChST1VURV9TRVBBUkFUT1IpWzFdIDogJyc7XHJcblxyXG4gICAgICAgIHJldHVybiBzdGVwUm91dGU7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlUG9zaXRpb24oc3RlcE5hbWU6IHN0cmluZywgcG9zaXRpb246IHN0cmluZykge1xyXG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuZ2V0U3RlcEluZGV4KHN0ZXBOYW1lKTtcclxuICAgICAgICBpZiAodGhpcy5zdGVwc1tpbmRleF0uc3RlcCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0ZXBzW2luZGV4XS5zdGVwLnBvc2l0aW9uID0gcG9zaXRpb247XHJcbiAgICAgICAgICAgIHRoaXMuc3RlcEhhc0JlZW5Nb2RpZmllZC5uZXh0KHRoaXMuc3RlcHNbaW5kZXhdLnN0ZXApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXHJcbiAgICAgICAgICAgICAgICBgVHJ5aW5nIHRvIG1vZGlmeSB0aGUgcG9zaXRpb24gb2YgJHtzdGVwTmFtZX0gdG8gJHtwb3NpdGlvbn0uIFN0ZXAgbm90IGZvdW5kIUlzIHRoaXMgc3RlcCBsb2NhdGVkIGluIGEgZGlmZmVyZW50IHJvdXRlP2BcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXRTdGVwTnVtYmVyKHN0ZXBOYW1lOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFN0ZXBJbmRleChzdGVwTmFtZSkgKyAxO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFN0ZXBzQ291bnQoKSB7XHJcbiAgICAgICAgbGV0IHN0ZXBzT3JkZXIgPSB0aGlzLnN0ZXBPcHRpb25zLmdldFN0ZXBzT3JkZXIoKTtcclxuICAgICAgICByZXR1cm4gc3RlcHNPcmRlci5sZW5ndGg7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTdGVwSW5kZXgoc3RlcE5hbWU6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnN0ZXBzXHJcbiAgICAgICAgICAgIC5tYXAoc3RlcCA9PiAoc3RlcC5pZC5pbmNsdWRlcyhST1VURV9TRVBBUkFUT1IpID8gc3RlcC5pZC5zcGxpdChST1VURV9TRVBBUkFUT1IpWzBdIDogc3RlcC5pZCkpXHJcbiAgICAgICAgICAgIC5maW5kSW5kZXgobmFtZSA9PiBzdGVwTmFtZSA9PT0gbmFtZSk7XHJcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgdGhyb3cgbmV3IEpveXJpZGVFcnJvcihgVGhlIHN0ZXAgd2l0aCBuYW1lOiAke3N0ZXBOYW1lfSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgc3RlcCBsaXN0LmApO1xyXG4gICAgICAgIHJldHVybiBpbmRleDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFN0ZXBOYW1lKHN0ZXBJRDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgc3RlcE5hbWUgPSBzdGVwSUQgJiYgc3RlcElELmluY2x1ZGVzKFJPVVRFX1NFUEFSQVRPUikgPyBzdGVwSUQuc3BsaXQoUk9VVEVfU0VQQVJBVE9SKVswXSA6IHN0ZXBJRDtcclxuICAgICAgICByZXR1cm4gc3RlcE5hbWU7XHJcbiAgICB9XHJcbn1cclxuIl19