ajout de la page de configuration de la date et l'heure du système
This commit is contained in:
9669
package-lock.json
generated
9669
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -28,7 +28,9 @@
|
|||||||
"font-awesome": "^4.7.0",
|
"font-awesome": "^4.7.0",
|
||||||
"jquery": "^3.6.1",
|
"jquery": "^3.6.1",
|
||||||
"material-icons": "^1.12.0",
|
"material-icons": "^1.12.0",
|
||||||
|
"moment": "^2.29.4",
|
||||||
"ngx-cookie-service": "^13.2.0",
|
"ngx-cookie-service": "^13.2.0",
|
||||||
|
"ngx-mat-timepicker": "^13.2.6",
|
||||||
"ngx-toastr": "^14.3.0",
|
"ngx-toastr": "^14.3.0",
|
||||||
"rxjs": "~7.5.0",
|
"rxjs": "~7.5.0",
|
||||||
"sha.js": "^2.4.11",
|
"sha.js": "^2.4.11",
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import { LoginComponent } from './components/login/login.component';
|
|||||||
import { NotFoundComponent } from './components/not-found/not-found.component';
|
import { NotFoundComponent } from './components/not-found/not-found.component';
|
||||||
import { AccountComponent } from './components/home/workspace/account/account.component';
|
import { AccountComponent } from './components/home/workspace/account/account.component';
|
||||||
import { ParametresComponent } from './components/home/workspace/parametres/parametres.component';
|
import { ParametresComponent } from './components/home/workspace/parametres/parametres.component';
|
||||||
|
import { DatetimeComponent } from './components/home/workspace/datetime/datetime.component';
|
||||||
import { InfosComponent } from './components/home/workspace/infos/infos.component';
|
import { InfosComponent } from './components/home/workspace/infos/infos.component';
|
||||||
import { HoursComponent } from './components/home/workspace/hours/hours.component';
|
import { HoursComponent } from './components/home/workspace/hours/hours.component';
|
||||||
import { LogsComponent } from './components/home/workspace/logs/logs.component';
|
import { LogsComponent } from './components/home/workspace/logs/logs.component';
|
||||||
@@ -28,6 +29,10 @@ const routes: Routes = [
|
|||||||
path:"parameters",
|
path:"parameters",
|
||||||
component:ParametresComponent
|
component:ParametresComponent
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path:"datetime",
|
||||||
|
component:DatetimeComponent
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path:"infos",
|
path:"infos",
|
||||||
component:InfosComponent
|
component:InfosComponent
|
||||||
|
|||||||
@@ -31,8 +31,11 @@ import { MatGridListModule } from '@angular/material/grid-list';
|
|||||||
import { MatTabsModule } from '@angular/material/tabs';
|
import { MatTabsModule } from '@angular/material/tabs';
|
||||||
import { MatSliderModule } from '@angular/material/slider';
|
import { MatSliderModule } from '@angular/material/slider';
|
||||||
import { MatRadioModule } from '@angular/material/radio';
|
import { MatRadioModule } from '@angular/material/radio';
|
||||||
|
import { MatDatepickerModule } from '@angular/material/datepicker';
|
||||||
|
import { MatNativeDateModule, MAT_DATE_LOCALE } from '@angular/material/core';
|
||||||
import { ToastrModule } from 'ngx-toastr';
|
import { ToastrModule } from 'ngx-toastr';
|
||||||
import { CodeInputModule } from 'angular-code-input';
|
import { CodeInputModule } from 'angular-code-input';
|
||||||
|
import { NgxMatTimepickerModule } from 'ngx-mat-timepicker';
|
||||||
|
|
||||||
import { HttpXsrfInterceptorService } from './interceptors/http-xsrf-interceptor/http-xsrf-interceptor.service';
|
import { HttpXsrfInterceptorService } from './interceptors/http-xsrf-interceptor/http-xsrf-interceptor.service';
|
||||||
import { AppRoutingModule } from './app-routing.module';
|
import { AppRoutingModule } from './app-routing.module';
|
||||||
@@ -47,6 +50,7 @@ import { InfosComponent } from './components/home/workspace/infos/infos.componen
|
|||||||
import { HoursComponent } from './components/home/workspace/hours/hours.component';
|
import { HoursComponent } from './components/home/workspace/hours/hours.component';
|
||||||
import { LogsComponent } from './components/home/workspace/logs/logs.component';
|
import { LogsComponent } from './components/home/workspace/logs/logs.component';
|
||||||
import { ConfirmComponent } from './components/dialog/confirm/confirm.component';
|
import { ConfirmComponent } from './components/dialog/confirm/confirm.component';
|
||||||
|
import { DatetimeComponent } from './components/home/workspace/datetime/datetime.component';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
declarations: [
|
declarations: [
|
||||||
@@ -60,7 +64,8 @@ import { ConfirmComponent } from './components/dialog/confirm/confirm.component'
|
|||||||
InfosComponent,
|
InfosComponent,
|
||||||
HoursComponent,
|
HoursComponent,
|
||||||
LogsComponent,
|
LogsComponent,
|
||||||
ConfirmComponent
|
ConfirmComponent,
|
||||||
|
DatetimeComponent
|
||||||
],
|
],
|
||||||
imports: [
|
imports: [
|
||||||
BrowserModule,
|
BrowserModule,
|
||||||
@@ -95,14 +100,18 @@ import { ConfirmComponent } from './components/dialog/confirm/confirm.component'
|
|||||||
MatTabsModule,
|
MatTabsModule,
|
||||||
MatSliderModule,
|
MatSliderModule,
|
||||||
MatRadioModule,
|
MatRadioModule,
|
||||||
|
MatDatepickerModule,
|
||||||
|
MatNativeDateModule,
|
||||||
FlexLayoutModule,
|
FlexLayoutModule,
|
||||||
RouterModule,
|
RouterModule,
|
||||||
FontAwesomeModule,
|
FontAwesomeModule,
|
||||||
ToastrModule.forRoot(),
|
ToastrModule.forRoot(),
|
||||||
|
NgxMatTimepickerModule.setLocale('fr-FR'),
|
||||||
CodeInputModule
|
CodeInputModule
|
||||||
],
|
],
|
||||||
providers: [
|
providers: [
|
||||||
{ provide: HTTP_INTERCEPTORS, useClass: HttpXsrfInterceptorService, multi: true }
|
{ provide: HTTP_INTERCEPTORS, useClass: HttpXsrfInterceptorService, multi: true },
|
||||||
|
{ provide: MAT_DATE_LOCALE, useValue: 'fr-FR' }
|
||||||
],
|
],
|
||||||
bootstrap: [AppComponent]
|
bootstrap: [AppComponent]
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
<!-- The following menu items will be hidden on both SM and XS screen sizes -->
|
<!-- The following menu items will be hidden on both SM and XS screen sizes -->
|
||||||
<a href="/compte" mat-button>Compte</a>
|
<a href="/compte" mat-button>Compte</a>
|
||||||
<a href="/parameters" mat-button>Paramètres</a>
|
<a href="/parameters" mat-button>Paramètres</a>
|
||||||
|
<a href="/datetime" mat-button>Date & Heure</a>
|
||||||
<a href="/hours" mat-button>Horaires</a>
|
<a href="/hours" mat-button>Horaires</a>
|
||||||
<a href="/infos" mat-button>Informations</a>
|
<a href="/infos" mat-button>Informations</a>
|
||||||
<a href="/logs" mat-button>Logs</a>
|
<a href="/logs" mat-button>Logs</a>
|
||||||
@@ -29,6 +30,10 @@
|
|||||||
<mat-icon>build</mat-icon>
|
<mat-icon>build</mat-icon>
|
||||||
<span> Paramètres</span>
|
<span> Paramètres</span>
|
||||||
</button>
|
</button>
|
||||||
|
<button mat-button routerLink="/datetime" class="menu-button">
|
||||||
|
<mat-icon>update</mat-icon>
|
||||||
|
<span> Date & Heure</span>
|
||||||
|
</button>
|
||||||
<button mat-button routerLink="/hours" class="menu-button">
|
<button mat-button routerLink="/hours" class="menu-button">
|
||||||
<mat-icon>calendar_today</mat-icon>
|
<mat-icon>calendar_today</mat-icon>
|
||||||
<span> Horaires</span>
|
<span> Horaires</span>
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
.container {
|
||||||
|
margin-bottom: 100px;
|
||||||
|
overflow-x: hidden;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.process {
|
||||||
|
width: 100%;
|
||||||
|
height: 75%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-field {
|
||||||
|
width: 80%;
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ngx-timepicker-field {
|
||||||
|
width: 80%;
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
width: 80%;
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
<div *ngIf="isProcessing" class="process"
|
||||||
|
fxLayout="column"
|
||||||
|
fxLayoutAlign="space-around center">
|
||||||
|
<mat-spinner></mat-spinner>
|
||||||
|
</div>
|
||||||
|
<div *ngIf="!isProcessing" class="container"
|
||||||
|
fxLayout="column"
|
||||||
|
fxLayoutAlign="space-around center">
|
||||||
|
<mat-form-field appearance="fill" class="form-field">
|
||||||
|
<input matInput (dateChange)="dateChanged($event)" [matDatepicker]="datepicker" placeholder="Choisissez une date">
|
||||||
|
<mat-hint>DD/MM/YYYY</mat-hint>
|
||||||
|
<mat-datepicker-toggle matSuffix [for]="datepicker">
|
||||||
|
</mat-datepicker-toggle>
|
||||||
|
<mat-datepicker #datepicker>
|
||||||
|
<mat-datepicker-actions>
|
||||||
|
<button mat-button matDatepickerCancel>Annuler</button>
|
||||||
|
<button mat-raised-button color="primary" matDatepickerApply>Appliquer</button>
|
||||||
|
</mat-datepicker-actions>
|
||||||
|
</mat-datepicker>
|
||||||
|
</mat-form-field>
|
||||||
|
<mat-form-field appearance="fill" class="form-field">
|
||||||
|
<input matInput name="selected_time_B" [format]="24" [ngxMatTimepicker]="pickerB" placeholder="Choisissez une heure" readonly />
|
||||||
|
<mat-hint>HH:MM</mat-hint>
|
||||||
|
<mat-icon matSuffix (click)="pickerB.open()">
|
||||||
|
watch_later
|
||||||
|
</mat-icon>
|
||||||
|
</mat-form-field>
|
||||||
|
<ngx-mat-timepicker color="primary" (timeChanged)="timeChanged($event)" #pickerB></ngx-mat-timepicker>
|
||||||
|
|
||||||
|
<button mat-raised-button color="primary" [disabled]="isDisabled" (click)="onUpdate()">{{buttonText}}</button>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
|
import { DatetimeComponent } from './datetime.component';
|
||||||
|
|
||||||
|
describe('DatetimeComponent', () => {
|
||||||
|
let component: DatetimeComponent;
|
||||||
|
let fixture: ComponentFixture<DatetimeComponent>;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
await TestBed.configureTestingModule({
|
||||||
|
declarations: [ DatetimeComponent ]
|
||||||
|
})
|
||||||
|
.compileComponents();
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
fixture = TestBed.createComponent(DatetimeComponent);
|
||||||
|
component = fixture.componentInstance;
|
||||||
|
fixture.detectChanges();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should create', () => {
|
||||||
|
expect(component).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
import { Router } from '@angular/router';
|
||||||
|
import { MatDatepickerInputEvent } from '@angular/material/datepicker';
|
||||||
|
import { BackendService } from '../../../../services/backend/backend.service';
|
||||||
|
import { ToastrService } from 'ngx-toastr';
|
||||||
|
import * as moment from 'moment';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-datetime',
|
||||||
|
templateUrl: './datetime.component.html',
|
||||||
|
styleUrls: ['./datetime.component.css']
|
||||||
|
})
|
||||||
|
export class DatetimeComponent implements OnInit {
|
||||||
|
isProcessing:boolean = true;
|
||||||
|
isDisabled:boolean = true;
|
||||||
|
timeLeft:number = 0;
|
||||||
|
buttonText:string = "Mise à jour";
|
||||||
|
interval:any;
|
||||||
|
time:string = "";
|
||||||
|
date:string = "";
|
||||||
|
|
||||||
|
constructor(private bs:BackendService,
|
||||||
|
private router:Router,
|
||||||
|
private toast:ToastrService) { }
|
||||||
|
|
||||||
|
ngOnInit(): void {
|
||||||
|
this.isProcessing = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
timeChanged(time:string): void {
|
||||||
|
console.log("Nouvelle heure: ", time);
|
||||||
|
this.time = time;
|
||||||
|
if(this.time && this.date) {
|
||||||
|
this.isDisabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dateChanged(event:MatDatepickerInputEvent<Date>): void {
|
||||||
|
var date = moment(event.value);
|
||||||
|
this.date = date.format("DD/MM/YYYY").toString();
|
||||||
|
if(this.time && this.date) {
|
||||||
|
this.isDisabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setTimeoutDisabledButton(timeout:number): void {
|
||||||
|
this.timeLeft = timeout;
|
||||||
|
this.isDisabled = true;
|
||||||
|
this.buttonText = "Mise à jour" + " ... (" + this.timeLeft + ")";
|
||||||
|
this.interval = setInterval(() => {
|
||||||
|
if(this.timeLeft > 0) {
|
||||||
|
this.timeLeft--;
|
||||||
|
this.buttonText = "Mise à jour" + " ... (" + this.timeLeft + ")";
|
||||||
|
} else {
|
||||||
|
this.isDisabled = false;
|
||||||
|
this.buttonText = "Mise à jour";
|
||||||
|
clearInterval(this.interval);
|
||||||
|
}
|
||||||
|
},1000)
|
||||||
|
}
|
||||||
|
|
||||||
|
onUpdate(): void {
|
||||||
|
this.setTimeoutDisabledButton(5);
|
||||||
|
var newDateTime:string = this.date + " " + this.time;
|
||||||
|
console.log("Nouvelle date et heure: ", newDateTime);
|
||||||
|
this.bs.updateDatetime(newDateTime).subscribe(
|
||||||
|
data => {
|
||||||
|
this.toast.success("Mise à jour de la date et heure réussie");
|
||||||
|
}, err => {
|
||||||
|
if(err.status == 401) {
|
||||||
|
this.router.navigateByUrl("/login");
|
||||||
|
} else {
|
||||||
|
this.toast.error(err.error.description);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,6 +8,15 @@
|
|||||||
fxLayoutAlign="space-around center">
|
fxLayoutAlign="space-around center">
|
||||||
<mat-card class="info-card">
|
<mat-card class="info-card">
|
||||||
<mat-card-content class="info-content">
|
<mat-card-content class="info-content">
|
||||||
|
<div fxLayout="row" style="width:100%; margin-bottom: 0.25rem;">
|
||||||
|
<span fxFlex="50" style="display: grid; align-items: center;"><b>Date:</b></span>
|
||||||
|
<div style="display: grid; align-items: center;">{{today | date:'dd/MM/yyyy HH:mm:ss'}}</div>
|
||||||
|
</div>
|
||||||
|
<div fxLayout="row" style="width:100%; margin-bottom: 0.25rem;">
|
||||||
|
<span fxFlex="50" style="display: grid; align-items: center;"><b>RTC:</b></span>
|
||||||
|
<div *ngIf="RTCisAlive" style="display: grid; align-items: center;"><mat-icon style="color: green;">check_circle</mat-icon></div>
|
||||||
|
<div *ngIf="!RTCisAlive" style="display: grid; align-items: center;"><mat-icon style="color: red;">cancel</mat-icon></div>
|
||||||
|
</div>
|
||||||
<div fxLayout="row" style="width:100%; margin-bottom: 0.25rem;">
|
<div fxLayout="row" style="width:100%; margin-bottom: 0.25rem;">
|
||||||
<span fxFlex="50" style="display: grid; align-items: center;"><b>Processus InterCOM:</b></span>
|
<span fxFlex="50" style="display: grid; align-items: center;"><b>Processus InterCOM:</b></span>
|
||||||
<div *ngIf="isAlive" style="display: grid; align-items: center;"><mat-icon style="color: green;">check_circle</mat-icon></div>
|
<div *ngIf="isAlive" style="display: grid; align-items: center;"><mat-icon style="color: green;">check_circle</mat-icon></div>
|
||||||
|
|||||||
@@ -19,6 +19,8 @@ export class InfosComponent implements OnInit {
|
|||||||
qos_color:string = "green";
|
qos_color:string = "green";
|
||||||
isProcessing:boolean = true;
|
isProcessing:boolean = true;
|
||||||
isAlive:boolean = false;
|
isAlive:boolean = false;
|
||||||
|
RTCisAlive:boolean = false;
|
||||||
|
today:number = Date.now();
|
||||||
|
|
||||||
constructor( private bs:BackendService,
|
constructor( private bs:BackendService,
|
||||||
private router:Router,
|
private router:Router,
|
||||||
@@ -26,6 +28,10 @@ export class InfosComponent implements OnInit {
|
|||||||
private toast:ToastrService ) { }
|
private toast:ToastrService ) { }
|
||||||
|
|
||||||
ngOnInit(): void {
|
ngOnInit(): void {
|
||||||
|
setInterval(() => {
|
||||||
|
this.today = Date.now();
|
||||||
|
}, 1000);
|
||||||
|
|
||||||
this.bs.retreiveInfos().subscribe(
|
this.bs.retreiveInfos().subscribe(
|
||||||
(data:Info) => {
|
(data:Info) => {
|
||||||
this.infos = data;
|
this.infos = data;
|
||||||
@@ -60,7 +66,17 @@ export class InfosComponent implements OnInit {
|
|||||||
this.bs.processAlive().subscribe(
|
this.bs.processAlive().subscribe(
|
||||||
data => {
|
data => {
|
||||||
this.isAlive = data['alive'];
|
this.isAlive = data['alive'];
|
||||||
this.isProcessing = false;
|
this.bs.RTCAlive().subscribe(
|
||||||
|
data => {
|
||||||
|
this.isProcessing = false;
|
||||||
|
}, err => {
|
||||||
|
if(err.status == 401) {
|
||||||
|
this.router.navigateByUrl("/login");
|
||||||
|
} else {
|
||||||
|
this.toast.error(err.error.description);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
}, err => {
|
}, err => {
|
||||||
if(err.status == 401) {
|
if(err.status == 401) {
|
||||||
this.router.navigateByUrl("/login");
|
this.router.navigateByUrl("/login");
|
||||||
@@ -68,7 +84,7 @@ export class InfosComponent implements OnInit {
|
|||||||
this.toast.error(err.error.description);
|
this.toast.error(err.error.description);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
);
|
||||||
}, err => {
|
}, err => {
|
||||||
if(err.status == 401) {
|
if(err.status == 401) {
|
||||||
this.router.navigateByUrl("/login");
|
this.router.navigateByUrl("/login");
|
||||||
|
|||||||
@@ -182,4 +182,27 @@ export class BackendService {
|
|||||||
};
|
};
|
||||||
return this.http.post<any>(host+"/api/configurateur/shutdown", {}, options);
|
return this.http.post<any>(host+"/api/configurateur/shutdown", {}, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateDatetime(val:string):Observable<any> {
|
||||||
|
let host=environment.host;
|
||||||
|
const options = {
|
||||||
|
headers: new HttpHeaders({
|
||||||
|
'Content-Type' : 'application/json',
|
||||||
|
}),
|
||||||
|
withCredentials: true
|
||||||
|
};
|
||||||
|
|
||||||
|
return this.http.post<any>(host+"/api/configurateur/update_datetime", val, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
RTCAlive():Observable<any> {
|
||||||
|
let host=environment.host;
|
||||||
|
const options = {
|
||||||
|
headers: new HttpHeaders({
|
||||||
|
'Content-Type' : 'application/json',
|
||||||
|
}),
|
||||||
|
withCredentials: true
|
||||||
|
};
|
||||||
|
return this.http.get<any>(host+"/api/configurateur/rtc_alive", options);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user