diff --git a/angular.json b/angular.json index 77f835ea67dcb0c382e937c2462240cf7c31422c..042dac9ae5ab1b7898b975c715ca0b9d7e10b4fe 100755 --- a/angular.json +++ b/angular.json @@ -33,7 +33,7 @@ "./node_modules/jstree-bootstrap-theme/dist/jstree.min.js", "./node_modules/jquery.nicescroll/dist/jquery.nicescroll.min.js", "./node_modules/tooltipster/dist/js/tooltipster.bundle.min.js", - "node_modules/tinymce/tinymce.min.js" + "./node_modules/tinymce/tinymce.min.js" ], "assets": [ "./src/frontend/assets", diff --git a/package.json b/package.json index 86a0294d9c335f88a0cc8979eb30d506beffeae9..f1039f480079f779499635f6f79264811c5034f2 100755 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "license": "GPL-3.0", "dependencies": { "core-js": "^3.6.5", + "ngx-joyride": "^2.2.11", "zone.js": "~0.10.2" }, "devDependencies": { diff --git a/src/frontend/app/administration/administration.module.ts b/src/frontend/app/administration/administration.module.ts index 8dbd52df005c96ace1ea6e4783ec76e810a4c5c5..947df92a7a3e8333f9cfba2e591391afaa561614 100755 --- a/src/frontend/app/administration/administration.module.ts +++ b/src/frontend/app/administration/administration.module.ts @@ -4,6 +4,7 @@ import { SharedModule } from '../app-common.module'; import { AdministrationRoutingModule } from './administration-routing.module'; // import { NgxChartsModule } from '@swimlane/ngx-charts'; +import { JoyrideModule } from 'ngx-joyride'; import { DocumentViewerModule } from '../viewer/document-viewer.module'; @@ -67,6 +68,7 @@ import { UsersAdministrationComponent, UsersAdministrationRedirectModalComponent imports: [ SharedModule, // NgxChartsModule, + JoyrideModule.forChild(), DocumentFormModule, AdministrationRoutingModule, DocumentViewerModule diff --git a/src/frontend/app/administration/home/administration.component.html b/src/frontend/app/administration/home/administration.component.html index cfd0866eca684c5910af025455fd79c4a96557f5..3fc96874ed37a3afa07e7b7974fa460b658ad2e0 100644 --- a/src/frontend/app/administration/home/administration.component.html +++ b/src/frontend/app/administration/home/administration.component.html @@ -5,7 +5,7 @@ <div class="bg-head-title-label"> <header-left></header-left> </div> - <div class="bg-head-title-tool"> + <div class="bg-head-title-tool" stepNumber="1" joyrideStep="firstStep" title="demoTour" text="Hi, Welcome to demo tour"> <header-right></header-right> </div> </div> @@ -34,7 +34,7 @@ </mat-form-field> <div style="margin: 20px;display: grid;grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));gap: 20px;padding:20px;padding-top:0px;margin-top:0px;"> - <button mat-button *ngFor="let administration of filteredAdministrations | async | sortBy : 'label'" + <button [joyrideStep]="administration.id" [text]="lang[administration.id+'Tour']" mat-button *ngFor="let administration of filteredAdministrations | async | sortBy : 'label'" [title]="administration.comment" style="font-size:20px;height:80px;" (click)="goToSpecifiedAdministration(administration)"> <div style="display: flex;align-items: center;"> diff --git a/src/frontend/app/administration/home/administration.component.ts b/src/frontend/app/administration/home/administration.component.ts index fdfea72fee960ef9d8b0bcf8ae24227ad4055a87..4148c3daaf42da6ff8be071e95b874993ea2c7a7 100644 --- a/src/frontend/app/administration/home/administration.component.ts +++ b/src/frontend/app/administration/home/administration.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, ViewChild, ElementRef } from '@angular/core'; +import { Component, OnInit, ViewChild, ElementRef, AfterViewInit } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Router } from '@angular/router'; import { LANG } from '../../translate.component'; @@ -12,12 +12,13 @@ import { startWith, map, tap, catchError, exhaustMap } from 'rxjs/operators'; import { LatinisePipe } from 'ngx-pipes'; import { NotificationService } from '../../../service/notification/notification.service'; import { FunctionsService } from '../../../service/functions.service'; +import { FeatureTourService } from '../../../service/featureTour.service'; @Component({ templateUrl: 'administration.component.html', styleUrls: ['administration.component.scss'] }) -export class AdministrationComponent implements OnInit { +export class AdministrationComponent implements OnInit, AfterViewInit { lang: any = LANG; loading: boolean = false; @@ -44,7 +45,9 @@ export class AdministrationComponent implements OnInit { private privilegeService: PrivilegeService, private latinisePipe: LatinisePipe, private notify: NotificationService, - private functionService: FunctionsService) { } + private functionService: FunctionsService, + private featureTourService: FeatureTourService + ) { } ngOnInit(): void { this.headerService.setHeader(this.lang.administration); @@ -80,6 +83,12 @@ export class AdministrationComponent implements OnInit { }, 0); } + ngAfterViewInit(): void { + if (this.headerService.user.userId === 'superadmin') { + this.featureTourService.init(); + } + } + goToSpecifiedAdministration(service: any): void { if (service.angular === true) { this.router.navigate([service.route]); diff --git a/src/frontend/app/administration/notification/notifications-administration.component.html b/src/frontend/app/administration/notification/notifications-administration.component.html index 3656fa70d3a861d016df990fe6b3c6a5c477eb1d..89fc6e42b3c73414eec4f1858581cbd4669a93a1 100755 --- a/src/frontend/app/administration/notification/notifications-administration.component.html +++ b/src/frontend/app/administration/notification/notifications-administration.component.html @@ -8,7 +8,7 @@ {{lang.add}} </p> </a> - <a mat-list-item (click)="loadCron();snav2.toggle();"> + <a mat-list-item (click)="loadCron();snav2.toggle();" (next)="loadCron();snav2.toggle()" joyrideStep="notifTour" [text]="'Cliquez ici pour plannifier une tâche éxistante. Plannifions <b>Notification de bannettes</b>'"> <mat-icon color="primary" mat-list-icon class="fa fa-clock"></mat-icon> <p mat-line> {{lang.toSchedule}} @@ -94,8 +94,8 @@ </div> </mat-sidenav-content> <mat-sidenav #snav2 [mode]="appService.getViewMode() ? 'over' : 'side'" [fixedInViewport]="appService.getViewMode()" - fixedTopGap="56" position='end' [opened]="appService.getViewMode() ? false : false"> - <mat-list> + fixedTopGap="56" position='end' [opened]="appService.getViewMode() ? false : false" (next)="paramCron()" stepPosition="center" joyrideStep="notifTour2" [text]="'Nous allons la plannifier pour chaque jour à 8h00 du lundi au vendredi'"> + <mat-list (next)="saveCron()" joyrideStep="notifTour3" [text]="'Pouvez choisir différentes périodes pour paramétrer votre tâche'"> <h3 mat-subheader>{{lang.notificationSchedule}}</h3> <form class="form-horizontal" #notifForm="ngForm" style="overflow:hidden;"> <div class="form-group" style="padding-left:15px;padding-right:15px;"> @@ -172,7 +172,7 @@ <div class="alert alert-info" role="alert" style="margin:15px;"> {{lang.NotificationScheduleInfo}} </div> - <mat-list> + <mat-list joyrideStep="notifTour4" [text]="'La liste de vos tâche actives apparait ici'"> <h3 mat-subheader>{{lang.activeCron}}</h3> <mat-chip-list #chipList class="mat-chip-list-stacked"> <span *ngFor="let notif of crontab;let i = index"> diff --git a/src/frontend/app/administration/notification/notifications-administration.component.ts b/src/frontend/app/administration/notification/notifications-administration.component.ts index 4640c1800e54d5c3ebf767793700f4d10e90ff75..67e657086210fa18413ba92025f2bcaa90e6787c 100755 --- a/src/frontend/app/administration/notification/notifications-administration.component.ts +++ b/src/frontend/app/administration/notification/notifications-administration.component.ts @@ -206,4 +206,24 @@ export class NotificationsAdministrationComponent implements OnInit { this.notify.error(err.error.errors); }); } + + /* FEATURE TOUR */ + + onNext() { + console.log('next'); + this.sidenavRight.open(); + return false; + } + + paramCron() { + this.newCron = { + 'm': '0', + 'h': '8', + 'dom': '*', + 'mon': '*', + 'cmd': '/var/www/html/maarch_courrier_develop/custom/cs_recette/bin/notification/scripts/notification_cs_recette_BASKETS.sh', + 'description': 'notification_cs_recette_BASKETS.sh', + 'state': 'normal' + }; + } } diff --git a/src/frontend/app/app.module.ts b/src/frontend/app/app.module.ts index 9f1408d42691938b1355f54c6d9d11e65a30e4ab..f99c072d43bbad707c71df22dbf7100bcc7476cc 100755 --- a/src/frontend/app/app.module.ts +++ b/src/frontend/app/app.module.ts @@ -7,6 +7,8 @@ import { BrowserModule, HammerGestureConfig, HAMMER_GESTURE_CONFIG } from '@angu import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; +import { JoyrideModule } from 'ngx-joyride'; + import { ProcessModule } from './process/process.module'; import { DocumentViewerModule } from './viewer/document-viewer.module'; import { AppListModule } from './app-list.module'; @@ -65,6 +67,7 @@ export class MyHammerConfig extends HammerGestureConfig { BrowserModule, BrowserAnimationsModule, HttpClientModule, + JoyrideModule.forRoot(), SharedModule, AppRoutingModule, DocumentViewerModule, diff --git a/src/frontend/lang/lang-fr.ts b/src/frontend/lang/lang-fr.ts index def1fed9ca94ef81f21c78517d38f9f81e8bcddd..1768f3e82316e5cbb254822b9fc3064ca818ece6 100755 --- a/src/frontend/lang/lang-fr.ts +++ b/src/frontend/lang/lang-fr.ts @@ -1831,5 +1831,7 @@ export const LANG_FR = { "collaboraOnlineEditDenied": "Ce document ne peut pas être édité avec Collabora Online", "collaboraOnlineEditDenied2": "ne peut pas être édité avec Collabora Online", "documentEditor_collaboraonline": "Ouvre la suite Collabora Online directement dans l'application Maarch Courrier", - "canUpdateResourcesInSignatureBook": "Pouvoir modifier les documents intégrés au parapheur" + "canUpdateResourcesInSignatureBook": "Pouvoir modifier les documents intégrés au parapheur", + "admin_email_serverTour": "Vous devez paramétrer un serveur de mail afin de pouvoir créer des utilisateurs ou d'activer les notifications.", + "admin_notifTour": "Nous vous conseillons de paramétrer les notifications de bannettes" }; diff --git a/src/frontend/service/featureTour.service.ts b/src/frontend/service/featureTour.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..d2bd1ba64cd53335e3af6eace58913781fb0c9ac --- /dev/null +++ b/src/frontend/service/featureTour.service.ts @@ -0,0 +1,98 @@ +import { Injectable } from '@angular/core'; +import { LANG } from '../app/translate.component'; +import { JoyrideService } from 'ngx-joyride'; +import { LocalStorageService } from './local-storage.service'; +import { HeaderService } from './header.service'; +import { FunctionsService } from './functions.service'; +import { Router } from '@angular/router'; + +@Injectable({ + providedIn: 'root' +}) +export class FeatureTourService { + + lang: any = LANG; + + currentStepType: string = ''; + + tour: any[] = [ + { + type: 'notification', + stepId: 'admin_notif', + }, + { + type: 'notification', + stepId: 'notifTour@administration/notifications', + }, + { + type: 'notification', + stepId: 'notifTour2@administration/notifications', + }, + { + type: 'notification', + stepId: 'notifTour3@administration/notifications', + }, + { + type: 'notification', + stepId: 'notifTour4@administration/notifications', + }, + { + type: 'email', + stepId: 'admin_email_server', + }, + ]; + + featureTourEnd: any[] = []; + + constructor( + private readonly joyrideService: JoyrideService, + private localStorage: LocalStorageService, + private headerService: HeaderService, + private functionService: FunctionsService, + private router: Router + ) { + this.getCurrentStepType(); + } + + init() { + if (!this.functionService.empty(this.currentStepType)) { + setTimeout(() => { + const steps = this.tour.filter(step => step.type === this.currentStepType).map(step => step.stepId); + this.joyrideService.startTour( + { steps: steps } + ).subscribe( + step => { + /*Do something*/ + }, + error => { + /*handle error*/ + }, + () => { + console.log('end tour'); + this.router.navigate(['/administration']); + this.endTour(); + } + ); + /*this.joyrideService.startTour( + { steps: ['admin_email_server', 'admin_notif', 'notifTour@administration/notifications', 'notifTour2@administration/notifications', 'notifTour3@administration/notifications', 'notifTour4@administration/notifications', 'admin_users'] } + );*/ + }, 500); + } + } + + getCurrentStepType() { + if (this.localStorage.get(`featureTourEnd_${this.headerService.user.id}`) !== null) { + this.featureTourEnd = JSON.parse(this.localStorage.get(`featureTourEnd_${this.headerService.user.id}`)); + } + const unique = [...new Set(this.tour.map(item => item.type))]; + + this.currentStepType = unique.filter(stepType => this.featureTourEnd.indexOf(stepType) === -1)[0]; + } + + endTour() { + this.featureTourEnd.push(this.currentStepType); + this.localStorage.save(`featureTourEnd_${this.headerService.user.id}`, JSON.stringify(this.featureTourEnd)); + this.getCurrentStepType(); + } + +}