From 467c5d8445341545de51e6298bbf0463e4fb7e34 Mon Sep 17 00:00:00 2001
From: Xiao Gui <xgui3783@gmail.com>
Date: Fri, 9 Apr 2021 17:58:48 +0200
Subject: [PATCH] chore: re-added tour pagination/position

---
 src/res/css/extra_styles.css                  |  5 +++++
 src/ui/quickTour/quickTour.service.ts         |  7 +------
 .../quickTourComponent/quickTour.component.ts | 19 ++++++++++++++++++-
 .../quickTour.template.html                   |  5 +++++
 src/util/LinkedList.ts                        | 16 ++++++++++++++--
 5 files changed, 43 insertions(+), 9 deletions(-)

diff --git a/src/res/css/extra_styles.css b/src/res/css/extra_styles.css
index 88e4a8d10..c52fbef10 100644
--- a/src/res/css/extra_styles.css
+++ b/src/res/css/extra_styles.css
@@ -438,6 +438,11 @@ markdown-dom pre code
   opacity: 0.5!important;
 }
 
+.muted-3
+{
+  opacity: 0.3!important;
+}
+
 .card
 {
   background:none;
diff --git a/src/ui/quickTour/quickTour.service.ts b/src/ui/quickTour/quickTour.service.ts
index 5bac137e8..d4a7552c2 100644
--- a/src/ui/quickTour/quickTour.service.ts
+++ b/src/ui/quickTour/quickTour.service.ts
@@ -6,7 +6,7 @@ import { QuickTourThis } from "./quickTourThis.directive";
 import { DoublyLinkedList, IDoublyLinkedItem } from 'src/util'
 import { QUICK_TOUR_CMP_INJTKN } from "./constrants";
 
-export function findInLinkedList<T>(first: IDoublyLinkedItem<T>, predicate: (linkedObj: IDoublyLinkedItem<T>) => boolean): IDoublyLinkedItem<T>{
+export function findInLinkedList<T extends object>(first: IDoublyLinkedItem<T>, predicate: (linkedObj: IDoublyLinkedItem<T>) => boolean): IDoublyLinkedItem<T>{
   let compareObj = first,
     returnObj: IDoublyLinkedItem<T> = null
 
@@ -43,11 +43,6 @@ export class QuickTourService {
      */
     @Inject(QUICK_TOUR_CMP_INJTKN) private quickTourCmp: any,
   ){
-
-    // todo remove in production
-    setTimeout(() => {
-      this.startTour()
-    }, 2500)
   }
 
   public register(dir: QuickTourThis) {
diff --git a/src/ui/quickTour/quickTourComponent/quickTour.component.ts b/src/ui/quickTour/quickTourComponent/quickTour.component.ts
index 471bd58f7..393b025d2 100644
--- a/src/ui/quickTour/quickTourComponent/quickTour.component.ts
+++ b/src/ui/quickTour/quickTourComponent/quickTour.component.ts
@@ -5,7 +5,7 @@ import {
   SecurityContext,
   TemplateRef,
 } from "@angular/core";
-import { Subscription } from "rxjs";
+import { combineLatest, Subscription } from "rxjs";
 import { QuickTourService } from "../quickTour.service";
 import { debounceTime, map, shareReplay} from "rxjs/operators";
 import { DomSanitizer } from "@angular/platform-browser";
@@ -68,6 +68,23 @@ export class QuickTourComponent {
     map(val => val.thisObj.description)
   )
 
+  private quickTourSize$ = this.currTipLinkedObj$.pipe(
+    map(val => val.list.size())
+  )
+
+  private quickTourIdx$ = this.currTipLinkedObj$.pipe(
+    map(val => val.index)
+  )
+
+  public quickTourProgress$ = combineLatest([
+    this.quickTourSize$,
+    this.quickTourIdx$
+  ]).pipe(
+    map(([ size, idx ]) => {
+      return Array(size).fill(false).map((_, index) => index === idx ? 'active' : _)
+    })
+  )
+
   public overwrittenPosition = this.currTipLinkedObj$.pipe(
     map(val => val.thisObj.overwritePosition)
   )
diff --git a/src/ui/quickTour/quickTourComponent/quickTour.template.html b/src/ui/quickTour/quickTourComponent/quickTour.template.html
index af7277221..d99b89dbe 100644
--- a/src/ui/quickTour/quickTourComponent/quickTour.template.html
+++ b/src/ui/quickTour/quickTourComponent/quickTour.template.html
@@ -22,6 +22,11 @@
             (click)="endTour()">
             <i class="fas fa-times"></i>
         </button>
+        <span class="muted d-inline-flex align-items-center">
+            <i *ngFor="let active of quickTourProgress$ | async"
+                [ngClass]="{ 'fa-xs muted-3': !active }"
+                class="ml-1 fas fa-circle"></i>
+        </span>
     </mat-card-actions>
 </mat-card>
 
diff --git a/src/util/LinkedList.ts b/src/util/LinkedList.ts
index 86f2ab618..5432aaafe 100644
--- a/src/util/LinkedList.ts
+++ b/src/util/LinkedList.ts
@@ -1,7 +1,9 @@
-export interface IDoublyLinkedItem<T> {
+export interface IDoublyLinkedItem<T extends object> {
   next: IDoublyLinkedItem<T>
   prev: IDoublyLinkedItem<T>
   thisObj: T
+  readonly index: number
+  list: DoublyLinkedList<T>
 }
 
 export class DoublyLinkedList<T extends object>{
@@ -32,7 +34,17 @@ export class DoublyLinkedList<T extends object>{
     const newDoublyLinkedItem: IDoublyLinkedItem<T> = {
       prev: insertAfter,
       next: newDoublyLinkedItemNext,
-      thisObj: element
+      thisObj: element,
+      get index() {
+        let count = 0, prev: IDoublyLinkedItem<T>
+        prev = this.prev
+        while (prev) {
+          prev = prev.prev
+          count ++
+        }
+        return count
+      },
+      list: this
     }
 
     /**
-- 
GitLab