ngx-joyride
Version:
An Angular Tour (Joyride) library built entirely in Angular, without using any heavy external dependencies like Bootstrap or JQuery. From now on you can easily guide your users through your site showing them all the sections and features.
114 lines • 17.9 kB
JavaScript
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import { JoyrideError, JoyrideStepOutOfRange } from '../models/joyride-error.class';
import * as i0 from "@angular/core";
import * as i1 from "./joyride-options.service";
import * as i2 from "./logger.service";
const ROUTE_SEPARATOR = '@';
class Step {
}
export var StepActionType;
(function (StepActionType) {
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.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: JoyrideStepsContainerService, deps: [{ token: i1.JoyrideOptionsService }, { token: i2.LoggerService }], target: i0.ɵɵFactoryTarget.Injectable });
JoyrideStepsContainerService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: JoyrideStepsContainerService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: JoyrideStepsContainerService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.JoyrideOptionsService }, { type: i2.LoggerService }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiam95cmlkZS1zdGVwcy1jb250YWluZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1qb3lyaWRlL3NyYy9saWIvc2VydmljZXMvam95cmlkZS1zdGVwcy1jb250YWluZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7O0FBRXBGLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQztBQUU1QixNQUFNLElBQUk7Q0FHVDtBQUVELE1BQU0sQ0FBTixJQUFZLGNBR1g7QUFIRCxXQUFZLGNBQWM7SUFDdEIsK0JBQWEsQ0FBQTtJQUNiLCtCQUFhLENBQUE7QUFDakIsQ0FBQyxFQUhXLGNBQWMsS0FBZCxjQUFjLFFBR3pCO0FBR0QsTUFBTSxPQUFPLDRCQUE0QjtJQU1yQyxZQUE2QixXQUFrQyxFQUFtQixNQUFxQjtRQUExRSxnQkFBVyxHQUFYLFdBQVcsQ0FBdUI7UUFBbUIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUovRixjQUFTLEdBQWtCLEVBQUUsQ0FBQztRQUM5QixxQkFBZ0IsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5Qix3QkFBbUIsR0FBeUIsSUFBSSxPQUFPLEVBQWUsQ0FBQztJQUVtQyxDQUFDO0lBRW5HLGlCQUFpQjtRQUNyQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ2xELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFakQsSUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2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QyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDdEcsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQzs7eUhBckdRLDRCQUE0Qjs2SEFBNUIsNEJBQTRCOzJGQUE1Qiw0QkFBNEI7a0JBRHhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBKb3lyaWRlU3RlcCB9IGZyb20gJy4uL21vZGVscy9qb3lyaWRlLXN0ZXAuY2xhc3MnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSm95cmlkZU9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi9qb3lyaWRlLW9wdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBKb3lyaWRlRXJyb3IsIEpveXJpZGVTdGVwT3V0T2ZSYW5nZSB9IGZyb20gJy4uL21vZGVscy9qb3lyaWRlLWVycm9yLmNsYXNzJztcblxuY29uc3QgUk9VVEVfU0VQQVJBVE9SID0gJ0AnO1xuXG5jbGFzcyBTdGVwIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHN0ZXA6IEpveXJpZGVTdGVwO1xufVxuXG5leHBvcnQgZW51bSBTdGVwQWN0aW9uVHlwZSB7XG4gICAgTkVYVCA9ICdORVhUJyxcbiAgICBQUkVWID0gJ1BSRVYnXG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBKb3lyaWRlU3RlcHNDb250YWluZXJTZXJ2aWNlIHtcbiAgICBwcml2YXRlIHN0ZXBzOiBTdGVwW107XG4gICAgcHJpdmF0ZSB0ZW1wU3RlcHM6IEpveXJpZGVTdGVwW10gPSBbXTtcbiAgICBwcml2YXRlIGN1cnJlbnRTdGVwSW5kZXggPSAtMjtcbiAgICBzdGVwSGFzQmVlbk1vZGlmaWVkOiBTdWJqZWN0PEpveXJpZGVTdGVwPiA9IG5ldyBTdWJqZWN0PEpveXJpZGVTdGVwPigpO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBzdGVwT3B0aW9uczogSm95cmlkZU9wdGlvbnNTZXJ2aWNlLCBwcml2YXRlIHJlYWRvbmx5IGxvZ2dlcjogTG9nZ2VyU2VydmljZSkge31cblxuICAgIHByaXZhdGUgZ2V0Rmlyc3RTdGVwSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgZmlyc3RTdGVwID0gdGhpcy5zdGVwT3B0aW9ucy5nZXRGaXJzdFN0ZXAoKTtcbiAgICAgICAgY29uc3Qgc3RlcElkcyA9IHRoaXMuc3RlcE9wdGlvbnMuZ2V0U3RlcHNPcmRlcigpO1xuXG4gICAgICAgIGxldCBpbmRleCA9IHN0ZXBJZHMuaW5kZXhPZihmaXJzdFN0ZXApO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICBpbmRleCA9IDA7XG4gICAgICAgICAgICBpZiAoZmlyc3RTdGVwICE9PSB1bmRlZmluZWQpIHRoaXMubG9nZ2VyLndhcm4oYFRoZSBzdGVwICR7Zmlyc3RTdGVwfSBkb2VzIG5vdCBleGlzdC4gQ2hlY2sgaW4geW91ciBzdGVwIGxpc3QgaWYgaXQncyBwcmVzZW50LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cblxuICAgIGluaXQoKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyLmluZm8oJ0luaXRpYWxpemluZyB0aGUgc3RlcHMgYXJyYXkuJyk7XG4gICAgICAgIHRoaXMuc3RlcHMgPSBbXTtcbiAgICAgICAgdGhpcy5jdXJyZW50U3RlcEluZGV4ID0gdGhpcy5nZXRGaXJzdFN0ZXBJbmRleCgpIC0gMTtcbiAgICAgICAgbGV0IHN0ZXBJZHMgPSB0aGlzLnN0ZXBPcHRpb25zLmdldFN0ZXBzT3JkZXIoKTtcbiAgICAgICAgc3RlcElkcy5mb3JFYWNoKHN0ZXBJZCA9PiB0aGlzLnN0ZXBzLnB1c2goeyBpZDogc3RlcElkLCBzdGVwOiBudWxsIH0pKTtcbiAgICB9XG5cbiAgICBhZGRTdGVwKHN0ZXBUb0FkZDogSm95cmlkZVN0ZXApIHtcbiAgICAgICAgbGV0IHN0ZXBFeGlzdCA9IHRoaXMudGVtcFN0ZXBzLmZpbHRlcihzdGVwID0+IHN0ZXAubmFtZSA9PT0gc3RlcFRvQWRkLm5hbWUpLmxlbmd0aCA+IDA7XG4gICAgICAgIGlmICghc3RlcEV4aXN0KSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKGBBZGRpbmcgc3RlcCAke3N0ZXBUb0FkZC5uYW1lfSB0byB0aGUgc3RlcHMgbGlzdC5gKTtcbiAgICAgICAgICAgIHRoaXMudGVtcFN0ZXBzLnB1c2goc3RlcFRvQWRkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBzdGVwSW5kZXhUb1JlcGxhY2UgPSB0aGlzLnRlbXBTdGVwcy5maW5kSW5kZXgoc3RlcCA9PiBzdGVwLm5hbWUgPT09IHN0ZXBUb0FkZC5uYW1lKTtcbiAgICAgICAgICAgIHRoaXMudGVtcFN0ZXBzW3N0ZXBJbmRleFRvUmVwbGFjZV0gPSBzdGVwVG9BZGQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0KGFjdGlvbjogU3RlcEFjdGlvblR5cGUpOiBKb3lyaWRlU3RlcCB7XG4gICAgICAgIGlmIChhY3Rpb24gPT09IFN0ZXBBY3Rpb25UeXBlLk5FWFQpIHRoaXMuY3VycmVudFN0ZXBJbmRleCsrO1xuICAgICAgICBlbHNlIHRoaXMuY3VycmVudFN0ZXBJbmRleC0tO1xuXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwSW5kZXggPCAwIHx8IHRoaXMuY3VycmVudFN0ZXBJbmRleCA+PSB0aGlzLnN0ZXBzLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBKb3lyaWRlU3RlcE91dE9mUmFuZ2UoJ1RoZSBmaXJzdCBvciBsYXN0IHN0ZXAgb2YgdGhlIHRvdXIgY2Fubm90IGJlIGZvdW5kIScpO1xuXG4gICAgICAgIGNvbnN0IHN0ZXBOYW1lID0gdGhpcy5nZXRTdGVwTmFtZSh0aGlzLnN0ZXBzW3RoaXMuY3VycmVudFN0ZXBJbmRleF0uaWQpO1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMudGVtcFN0ZXBzLmZpbmRJbmRleChzdGVwID0+IHN0ZXAubmFtZSA9PT0gc3RlcE5hbWUpO1xuICAgICAgICBsZXQgc3RlcEZvdW5kID0gdGhpcy50ZW1wU3RlcHNbaW5kZXhdO1xuICAgICAgICB0aGlzLnN0ZXBzW3RoaXMuY3VycmVudFN0ZXBJbmRleF0uc3RlcCA9IHN0ZXBGb3VuZDtcblxuICAgICAgICBpZiAoc3RlcEZvdW5kID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFN0ZXAgJHt0aGlzLnN0ZXBzW3RoaXMuY3VycmVudFN0ZXBJbmRleF0uaWR9IG5vdCBmb3VuZCBpbiB0aGUgRE9NLiBDaGVjayBpZiBpdCdzIGhpZGRlbiBieSAqbmdJZiBkaXJlY3RpdmUuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RlcEZvdW5kO1xuICAgIH1cblxuICAgIGdldFN0ZXBSb3V0ZShhY3Rpb246IFN0ZXBBY3Rpb25UeXBlKSB7XG4gICAgICAgIGxldCBzdGVwSUQ6IHN0cmluZztcbiAgICAgICAgaWYgKGFjdGlvbiA9PT0gU3RlcEFjdGlvblR5cGUuTkVYVCkge1xuICAgICAgICAgICAgc3RlcElEID0gdGhpcy5zdGVwc1t0aGlzLmN1cnJlbnRTdGVwSW5kZXggKyAxXSA/IHRoaXMuc3RlcHNbdGhpcy5jdXJyZW50U3RlcEluZGV4ICsgMV0uaWQgOiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3RlcElEID0gdGhpcy5zdGVwc1t0aGlzLmN1cnJlbnRTdGVwSW5kZXggLSAxXSA/IHRoaXMuc3RlcHNbdGhpcy5jdXJyZW50U3RlcEluZGV4IC0gMV0uaWQgOiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzdGVwUm91dGUgPSBzdGVwSUQgJiYgc3RlcElELmluY2x1ZGVzKFJPVVRFX1NFUEFSQVRPUikgPyBzdGVwSUQuc3BsaXQoUk9VVEVfU0VQQVJBVE9SKVsxXSA6ICcnO1xuXG4gICAgICAgIHJldHVybiBzdGVwUm91dGU7XG4gICAgfVxuXG4gICAgdXBkYXRlUG9zaXRpb24oc3RlcE5hbWU6IHN0cmluZywgcG9zaXRpb246IHN0cmluZykge1xuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmdldFN0ZXBJbmRleChzdGVwTmFtZSk7XG4gICAgICAgIGlmICh0aGlzLnN0ZXBzW2luZGV4XS5zdGVwKSB7XG4gICAgICAgICAgICB0aGlzLnN0ZXBzW2luZGV4XS5zdGVwLnBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgICAgICAgICB0aGlzLnN0ZXBIYXNCZWVuTW9kaWZpZWQubmV4dCh0aGlzLnN0ZXBzW2luZGV4XS5zdGVwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgYFRyeWluZyB0byBtb2RpZnkgdGhlIHBvc2l0aW9uIG9mICR7c3RlcE5hbWV9IHRvICR7cG9zaXRpb259LiBTdGVwIG5vdCBmb3VuZCFJcyB0aGlzIHN0ZXAgbG9jYXRlZCBpbiBhIGRpZmZlcmVudCByb3V0ZT9gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldFN0ZXBOdW1iZXIoc3RlcE5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFN0ZXBJbmRleChzdGVwTmFtZSkgKyAxO1xuICAgIH1cblxuICAgIGdldFN0ZXBzQ291bnQoKSB7XG4gICAgICAgIGxldCBzdGVwc09yZGVyID0gdGhpcy5zdGVwT3B0aW9ucy5nZXRTdGVwc09yZGVyKCk7XG4gICAgICAgIHJldHVybiBzdGVwc09yZGVyLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFN0ZXBJbmRleChzdGVwTmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnN0ZXBzXG4gICAgICAgICAgICAubWFwKHN0ZXAgPT4gKHN0ZXAuaWQuaW5jbHVkZXMoUk9VVEVfU0VQQVJBVE9SKSA/IHN0ZXAuaWQuc3BsaXQoUk9VVEVfU0VQQVJBVE9SKVswXSA6IHN0ZXAuaWQpKVxuICAgICAgICAgICAgLmZpbmRJbmRleChuYW1lID0+IHN0ZXBOYW1lID09PSBuYW1lKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgdGhyb3cgbmV3IEpveXJpZGVFcnJvcihgVGhlIHN0ZXAgd2l0aCBuYW1lOiAke3N0ZXBOYW1lfSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgc3RlcCBsaXN0LmApO1xuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTdGVwTmFtZShzdGVwSUQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCBzdGVwTmFtZSA9IHN0ZXBJRCAmJiBzdGVwSUQuaW5jbHVkZXMoUk9VVEVfU0VQQVJBVE9SKSA/IHN0ZXBJRC5zcGxpdChST1VURV9TRVBBUkFUT1IpWzBdIDogc3RlcElEO1xuICAgICAgICByZXR1cm4gc3RlcE5hbWU7XG4gICAgfVxufVxuIl19