andika-ai / andika

AI writing Assistant UI
https://andika-16cf6.web.app
0 stars 0 forks source link

Add tour #133

Open pmutua opened 1 year ago

pmutua commented 1 year ago

Apologies for the oversight. Let's modify the example to follow best practices by creating a tour service with dynamic functionality. This will allow us to separate the tour logic and make it reusable across different components.

Create a new Angular service for the tour: shell Copy code ng generate service tour Open the src/app/tour.service.ts file and update it with the following code: typescript Copy code import { Injectable } from '@angular/core'; import introJs, { IntroOptions } from 'intro.js';

@Injectable({ providedIn: 'root' }) export class TourService { private introInstance: introJs.IntroJs;

startTour(steps: introJs.Step[], options?: IntroOptions): void { this.introInstance = introJs(); this.introInstance.setOptions(options); this.introInstance.setOptions({ steps: steps, // Add more options as per your requirements }); this.introInstance.start(); }

nextStep(): void { if (this.introInstance) { this.introInstance.nextStep(); } }

exitTour(): void { if (this.introInstance) { this.introInstance.exit(); } } } Open the src/app/tour/tour.component.ts file and update it with the following code: typescript Copy code import { Component, OnInit } from '@angular/core'; import { TourService } from '../tour.service'; import { introJs } from 'intro.js';

@Component({ selector: 'app-tour', templateUrl: './tour.component.html', styleUrls: ['./tour.component.css'] }) export class TourComponent implements OnInit {

constructor(private tourService: TourService) { }

ngOnInit(): void { const steps: introJs.Step[] = [ { element: '#step1', intro: 'Welcome to Step 1! This is a description of the first step.', }, { element: '#step2', intro: 'Step 2 is here! You can provide instructions or explanations for this step.', }, { element: '#step3', intro: 'Step 3 is all about this specific element. Highlight its importance and usage.', }, { element: '#step4', intro: 'You made it to the final step! Feel free to provide any additional information or guidance.', }, ];

this.tourService.startTour(steps);

}

nextStep(): void { this.tourService.nextStep(); }

exitTour(): void { this.tourService.exitTour(); } } Open the src/app/tour/tour.component.html file and update it with the following code: html Copy code <button (click)="nextStep()">Next Step <button (click)="exitTour()">Exit Tour

Step 1 Element
Step 2 Element
Step 3 Element
Step 4 Element

Open the src/app/app.module.ts file and update it with the following code: typescript Copy code import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { AppComponent } from './app.component'; import { TourComponent } from './tour/tour.component';

@NgModule({ declarations: [ AppComponent, TourComponent ], imports: [ BrowserModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { } Open the src/app/app.component.html

User how do you know the tarhet elements in tour steps they are not dynamic ChatGPT Apologies for the confusion. If you want to dynamically determine the target elements for the tour steps, you can modify the code as follows:

Update the TourComponent to retrieve the target elements dynamically using ElementRef and ViewChild. Modify the ngOnInit method as shown below: typescript Copy code import { Component, OnInit, AfterViewInit, ElementRef, ViewChild } from '@angular/core'; import { TourService } from '../tour.service'; import { introJs } from 'intro.js';

@Component({ selector: 'app-tour', templateUrl: './tour.component.html', styleUrls: ['./tour.component.css'] }) export class TourComponent implements OnInit, AfterViewInit { @ViewChild('step1Ref', { static: false }) step1Ref: ElementRef; @ViewChild('step2Ref', { static: false }) step2Ref: ElementRef; @ViewChild('step3Ref', { static: false }) step3Ref: ElementRef; @ViewChild('step4Ref', { static: false }) step4Ref: ElementRef;

constructor(private tourService: TourService) { }

ngOnInit(): void { // Do initialization tasks }

ngAfterViewInit(): void { const steps: introJs.Step[] = [ { element: this.step1Ref.nativeElement, intro: 'Welcome to Step 1! This is a description of the first step.', }, { element: this.step2Ref.nativeElement, intro: 'Step 2 is here! You can provide instructions or explanations for this step.', }, { element: this.step3Ref.nativeElement, intro: 'Step 3 is all about this specific element. Highlight its importance and usage.', }, { element: this.step4Ref.nativeElement, intro: 'You made it to the final step! Feel free to provide any additional information or guidance.', }, ];

this.tourService.startTour(steps);

}

nextStep(): void { this.tourService.nextStep(); }

exitTour(): void { this.tourService.exitTour(); } } Update the src/app/tour/tour.component.html file to add template reference variables for the target elements: html Copy code <button (click)="nextStep()">Next Step <button (click)="exitTour()">Exit Tour

<div #step1Ref id="step1">Step 1 Element

<div #step2Ref id="step2">Step 2 Element
<div #step3Ref id="step3">Step 3 Element <div #step4Ref id="step4">Step 4 Element Now, the target elements for the tour steps will be dynamically retrieved based on the template reference variables (step1Ref, step2Ref, step3Ref, step4Ref). Make sure to assign appropriate IDs to the target elements in your actual application for this to work correctly.

With these modifications, the tour will use the dynamically retrieved target elements for each step.