This commit is contained in:
Rampeur
2024-05-09 02:21:19 +02:00
parent 276da97003
commit 25d47bc3be
27 changed files with 49 additions and 371 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
import { Component, DestroyRef, inject, OnInit, OnDestroy } from '@angular/core';
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
import { FormControl, FormGroup, FormBuilder, FormArray, FormsModule, ReactiveFormsModule } from '@angular/forms';
import { /*FormControl,*/ FormGroup, FormBuilder, FormArray, FormsModule, ReactiveFormsModule } from '@angular/forms';
import { ActivatedRoute } from '@angular/router';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
@@ -1,9 +1,4 @@
import {
Directive,
OnInit,
AfterViewInit,
AfterContentChecked
} from '@angular/core';
import { Directive, AfterContentChecked } from '@angular/core';
import { Router, NavigationEnd } from '@angular/router';
import { AccordionLinkDirective } from './accordionlink.directive';
@@ -51,7 +46,7 @@ export class AccordionDirective implements AfterContentChecked {
ngAfterContentChecked(): void {
this.router.events
.pipe(filter(event => event instanceof NavigationEnd))
.subscribe(e => this.checkOpenLinks());
.subscribe(() => this.checkOpenLinks());
}
constructor(private router: Router) {
@@ -14,7 +14,7 @@ export class AccordionAnchorDirective {
}
@HostListener('click', ['$event'])
onClick(e: any) {
onClick() {
this.navlink.toggle();
}
}
@@ -15,7 +15,7 @@ import { AccordionDirective } from './accordion.directive';
})
export class AccordionLinkDirective implements OnInit, OnDestroy {
@Input()
public group: any;
public group!: string;
@HostBinding('class.selected')
@Input()
@@ -37,15 +37,15 @@ export class AccordionLinkDirective implements OnInit, OnDestroy {
this.nav = nav;
}
ngOnInit(): any {
ngOnInit() {
this.nav.addLink(this);
}
ngOnDestroy(): any {
ngOnDestroy(){
this.nav.removeGroup(this);
}
toggle(): any {
toggle() {
this.selected = !this.selected;
}
}
@@ -3,7 +3,7 @@
<canvas baseChart class="w-100 h-auto"
[data]="chartConfig.barChartData"
[options]="chartConfig.barChartOptions"
[plugins]="chartConfig.barChartPlugins"
[plugins]="chartConfig.barChartPlugins!"
[legend]="chartConfig.barChartLegend"
[type]="'bar'">
</canvas>
@@ -3,7 +3,7 @@
<canvas baseChart
[data]="chartConfig.barChartData"
[options]="chartConfig.barChartOptions"
[plugins]="chartConfig.barChartPlugins"
[plugins]="chartConfig.barChartPlugins!"
[legend]="chartConfig.barChartLegend"
[type]="'bar'">
</canvas>
@@ -3,7 +3,7 @@
<canvas baseChart class="w-100 h-auto"
[data]="chartConfig.barChartData"
[options]="chartConfig.barChartOptions"
[plugins]="chartConfig.barChartPlugins"
[plugins]="chartConfig.barChartPlugins!"
[legend]="chartConfig.barChartLegend"
[type]="'bar'">
</canvas>
@@ -1,4 +1,4 @@
import { Component, Input, OnChanges, AfterContentChecked } from '@angular/core';
import { Component, Input, AfterContentChecked } from '@angular/core';
import { NgIf, NgFor } from '@angular/common';
@Component({
@@ -10,7 +10,7 @@ import { NgIf, NgFor } from '@angular/common';
templateUrl: './history-table.component.html',
styleUrls: []
})
export class HistoryTableComponent implements OnChanges, AfterContentChecked {
export class HistoryTableComponent implements AfterContentChecked {
public seriesColTotal: number[] = [];
public grandTotal: number = 0;
@@ -22,10 +22,10 @@ export class HistoryTableComponent implements OnChanges, AfterContentChecked {
@Input() rows: Array<Array<number>> = [];
@Input() colors: string[] = [];
ngOnChanges() {
/*ngOnChanges() {
//this._loadHistoryTable();
//console.log('onChanges');
}
}*/
ngAfterContentChecked() {
if (this.rows !== undefined && this.rows.length) {
@@ -1,11 +1,10 @@
import { Component, OnInit, OnDestroy, Input, computed, Signal, WritableSignal } from '@angular/core';
import { Component, OnInit, OnDestroy, Input } from '@angular/core';
import { NgClass, DatePipe } from '@angular/common';
import { RouterLink } from '@angular/router';
import { MatButtonModule } from '@angular/material/button';
import { MatIconModule } from '@angular/material/icon';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { Observable, Subscription } from 'rxjs';
import { take } from 'rxjs/operators';
import { Errors, Jump, JumpList, JumpListConfig } from 'src/app/core/models';
import { JumpsService } from 'src/app/core/services';
@@ -39,7 +39,7 @@ export class JumpPreviewComponent implements OnDestroy {
deleteJump() {
this.isDeleting = true;
const jump$: Observable<any> = this.jumpsService.destroy(this.jump.slug);
const jump$: Observable<boolean> = this.jumpsService.destroy(this.jump.slug);
this._jump = jump$.subscribe({
next: () => {
this.router.navigateByUrl('/');
@@ -312,57 +312,3 @@
<tr mat-header-row *matHeaderRowDef="displayedColumns; sticky: true" class="accent"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;" class="text-middle accent"></tr>
</table>
<!--
<table mat-table [dataSource]="jumps">
<ng-container [matColumnDef]="col.key" *ngFor="let col of columnsSchema">
<th mat-header-cell *matHeaderCellDef [ngSwitch]="col.key">
<span *ngSwitchCase="'isSelected'">
<mat-checkbox (change)="selectAll($event)" [checked]="isAllSelected()" [indeterminate]="!isAllSelected() && isAnySelected()"></mat-checkbox>
</span>
<span *ngSwitchDefault>{{ col.label }}</span>
</th>
<td mat-cell *matCellDef="let element">
<div [ngSwitch]="col.type" *ngIf="!element.isEdit">
<ng-container *ngSwitchCase="'isSelected'">
<mat-checkbox (change)="element.isSelected = $event.checked" [checked]="element.isSelected">
</mat-checkbox>
</ng-container>
<div class="btn-edit" *ngSwitchCase="'isEdit'">
<button mat-button (click)="element.isEdit = !element.isEdit">
Modifier
</button>
<button mat-button class="button-remove" (click)="openDeleteDialog(element)">
Supprimer
</button>
</div>
<span *ngSwitchCase="'date'">
{{ element[col.key] | date: 'mediumDate' }}
</span>
<span *ngSwitchDefault>
{{ element[col.key] }}
</span>
</div>
<div [ngSwitch]="col.type" *ngIf="element.isEdit">
<div *ngSwitchCase="'isSelected'"></div>
<div class="btn-edit" *ngSwitchCase="'isEdit'">
<button mat-icon-button color="primary" [hidden]="!showAdd" (click)="openEditDialog(element)" [disabled]="disableSubmit(element.id)">
<mat-icon aria-label="Modifier" fontIcon="edit"></mat-icon>
</button>
</div>
<mat-form-field class="form-input" *ngSwitchCase="'date'" appearance="fill">
<mat-label>Choose a date</mat-label>
<input matInput [matDatepicker]="picker" [(ngModel)]="element[col.key]" />
<mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
<mat-datepicker #picker></mat-datepicker>
</mat-form-field>
<mat-form-field class="form-input" *ngSwitchDefault>
<input matInput [required]="col.required!" [pattern]="col.pattern!" [type]="col.type"
[(ngModel)]="element[col.key]" (change)="inputHandler($event, element.id, col.key)" />
</mat-form-field>
</div>
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns"></tr>
</table>
-->
@@ -11,7 +11,8 @@ export class ShowAuthedDirective implements OnInit, OnDestroy {
private _auth: Subscription = new Subscription();
constructor(
private templateRef: TemplateRef<any>,
//private templateRef: TemplateRef<any>,
private templateRef: TemplateRef<never>,
private userService: UserService,
private viewContainer: ViewContainerRef
) { }
+2 -2
View File
@@ -1,10 +1,10 @@
import { inject } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivateFn, Router, RouterStateSnapshot } from '@angular/router';
import { CanActivateFn, Router } from '@angular/router';
import { map, take } from 'rxjs/operators';
import { UserService } from 'src/app/core/services';
export const adminGuard: CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {
export const adminGuard: CanActivateFn = () => {
const router = inject(Router);
const userService = inject(UserService);
return userService.currentUser.pipe(take(1)).pipe(map(data => {
+2 -2
View File
@@ -1,10 +1,10 @@
import { inject } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivateFn, Router, RouterStateSnapshot } from '@angular/router';
import { CanActivateFn, Router } from '@angular/router';
import { map, take } from 'rxjs/operators';
import { UserService } from 'src/app/core/services';
export const authGuard: CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => {
export const authGuard: CanActivateFn = () => {
const router = inject(Router);
const userService = inject(UserService);
return userService.isAuthenticated.pipe(take(1)).pipe(map(data => {
+2 -2
View File
@@ -1,11 +1,11 @@
import { inject } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivateFn, Router, RouterStateSnapshot } from '@angular/router';
import { CanActivateFn } from '@angular/router';
import { Observable } from 'rxjs';
import { map, take } from 'rxjs/operators';
import { UserService } from 'src/app/core/services';
export const noauthGuard: CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> => {
export const noauthGuard: CanActivateFn = (): Observable<boolean> => {
/*
const router = inject(Router);
const userService = inject(UserService);
@@ -0,0 +1,6 @@
import { Application } from './application.model';
export interface ApplicationList {
applications: Array<Application>;
applicationsCount: number;
}
-13
View File
@@ -1,13 +0,0 @@
export interface CanopySize {
id: string;
key: any;
value: any;
doc?: CanopySizeDoc;
}
export interface CanopySizeDoc {
_id: string;
_rev: string;
type: string;
weight: number;
values: [];
}
+1 -1
View File
@@ -3,7 +3,7 @@ import { ChartConfiguration, ChartOptions } from 'chart.js';
export interface BarConfig {
barChartData: ChartConfiguration<'bar'>['data'],
barChartOptions: ChartConfiguration<'bar'>['options'],
barChartPlugins: any[],
barChartPlugins: ChartConfiguration<'bar'>['plugins'],
barChartLegend: boolean
}
+1 -1
View File
@@ -1,10 +1,10 @@
export * from './aeronef.model';
export * from './aeronef-list.model';
export * from './application.model';
export * from './application-list.model';
export * from './application-list-config.model';
export * from './calculator.model';
export * from './canopy.model';
export * from './canopysize.model';
export * from './chart.model';
export * from './dropzone.model';
export * from './errors.model';
+2 -1
View File
@@ -1,8 +1,9 @@
import { Injectable } from '@angular/core';
//import { environment } from 'src/environments/environment';
import { HttpClient, HttpParams } from '@angular/common/http';
import { Observable } from 'rxjs';
//import { environment } from 'src/environments/environment';
@Injectable({ providedIn: 'root' })
export class ApiService {
constructor(
@@ -3,7 +3,7 @@ import { HttpParams } from '@angular/common/http';
import { Observable } from 'rxjs';
import { ApiService } from './api.service';
import { Application, ApplicationListConfig, ApplicationListFilters } from 'src/app/core/models';
import { Application, ApplicationList, ApplicationListConfig, ApplicationListFilters } from 'src/app/core/models';
import { map } from 'rxjs/operators';
@Injectable({ providedIn: 'root' })
@@ -12,7 +12,7 @@ export class ApplicationsService {
private apiService: ApiService
) { }
query(config: ApplicationListConfig): Observable<{ applications: Application[], applicationsCount: number }> {
query(config: ApplicationListConfig): Observable<ApplicationList> {
// Convert any filters over to Angular's URLSearchParams
const params: ApplicationListFilters = {
apikey: config.filters.apikey,
@@ -34,8 +34,8 @@ export class ApplicationsService {
.pipe(map(data => data.application));
}
destroy(slug: string) {
return this.apiService.delete(`/applications/${slug}`);
destroy(slug: string): Observable<boolean> {
return this.apiService.delete(`/applications/${slug}`).pipe(map(data => data.deleted));
}
save(application: Application): Observable<Application> {
-244
View File
@@ -1,244 +0,0 @@
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs';
import { Jump } from 'src/app/core/models';
import { environment } from 'src/environments/environment';
export interface JumpDoc {
_id?: string;
_rev?: string;
type: string;
date: string;
numero: number,
lieu?: string;
oaci?: string;
aeronef?: string;
imat?: string;
hauteur?: number,
voile?: string;
taille?: number,
categorie?: string;
module?: string;
participants?: number,
programme?: string;
accessoires?: string;
zone?: string;
dossier?: string;
video?: string;
}
export interface JumpViewResults {
rows: Array<Jump>;
total_rows: number;
}
@Injectable({ providedIn: 'root' })
export class BackendService {
private _couchdbUrl = environment.couchdbUrl;
private _couchdbDatabase = environment.couchdbDatabase;
private _couchdbDesign = environment.couchdbDesign;
private _couchdbCredential = environment.couchdbCredential;
//private _couchdbUrl = "http://couchdb.unespace.com/material_grow/_design/netgrowing_app/_view/allDevices";
httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
'Authorization': 'Basic ' + this._couchdbCredential
})
}
constructor(private _http: HttpClient) { }
writeDoc(doc: Object): Promise<Object | undefined> {
const url = this._couchdbUrl + '/' + this._couchdbDatabase;
return this._http.post<Object>(url, doc, this.httpOptions).toPromise();
}
updateDoc(doc: JumpDoc): Promise<Object | undefined> {
const url = `${this._couchdbUrl}/${this._couchdbDatabase}/${doc._id}`;
return this._http.put<Object>(url, doc, this.httpOptions).toPromise();
}
deleteDoc(id: string, rev: string): Promise<Object | undefined> {
//const url = this._couchdbUrl + '/' + this._couchdbDatabase + '/' + id + '?rev=' + rev;
const url = `${this._couchdbUrl}/${this._couchdbDatabase}/${id}?rev=${rev}`;
return this._http.delete(url, this.httpOptions).toPromise();
}
/* get all docs from couchDB view 'allJumps' */
getJumps(): Observable<JumpViewResults> {
//const url = this._couchdbUrl + '/' + this._couchdbDatabase + '/_design/' + this._couchdbDesign + '/_view/allJumps/';
//return this._http.get(url, this.httpOptions);
const payload = {
"include_docs": false,
"reduce": false,
"descending": false
}
const url = `${this._couchdbUrl}/${this._couchdbDatabase}/_design/${this._couchdbDesign}/_view/allJumps/`;
return this._http.post<JumpViewResults>(url, payload, this.httpOptions);
}
/* get all docs from couchDB view 'allJumpsByDate' */
getJumpsByDate(level: number): Observable<Object> {
const payload = {
"reduce": true,
"group": true,
"group_level": level
}
const url = `${this._couchdbUrl}/${this._couchdbDatabase}/_design/${this._couchdbDesign}/_view/allJumpsByDate/`;
return this._http.post(url, payload, this.httpOptions);
}
/* get all docs from couchDB view 'filterAeronef' */
getAeronefs(): Observable<Object> {
const payload = {
"reduce": true,
"group": true
}
const url = `${this._couchdbUrl}/${this._couchdbDatabase}/_design/${this._couchdbDesign}/_view/filterAeronef/`;
return this._http.post(url, payload, this.httpOptions);
}
/* get all docs from couchDB view 'filterAeronefByDate' */
getAeronefsByDate(level: number): Observable<Object> {
const payload = {
"reduce": true,
"group": true,
"group_level": level
}
const url = `${this._couchdbUrl}/${this._couchdbDatabase}/_design/${this._couchdbDesign}/_view/filterAeronefByDate/`;
return this._http.post(url, payload, this.httpOptions);
}
/* get all docs from couchDB view 'filterCanopyModel' */
getCanopyModels(): Observable<Object> {
const payload = {
"reduce": true,
"group": true
}
const url = `${this._couchdbUrl}/${this._couchdbDatabase}/_design/${this._couchdbDesign}/_view/filterCanopyModel/`;
return this._http.post(url, payload, this.httpOptions);
}
/* get all docs from couchDB view 'filterCanopyModelByDate' */
getCanopyModelsByDate(level: number): Observable<Object> {
const payload = {
"reduce": true,
"group": true,
"group_level": level
}
const url = `${this._couchdbUrl}/${this._couchdbDatabase}/_design/${this._couchdbDesign}/_view/filterCanopyModelByDate/`;
return this._http.post(url, payload, this.httpOptions);
}
/* get all docs from couchDB view 'filterCanopySize' */
getCanopySizes(): Observable<Object> {
const payload = {
"reduce": true,
"group": true
}
const url = `${this._couchdbUrl}/${this._couchdbDatabase}/_design/${this._couchdbDesign}/_view/filterCanopySize/`;
return this._http.post(url, payload, this.httpOptions);
}
/* get all docs from couchDB view 'filterCanopySizeByDate' */
getCanopySizesByDate(level: number): Observable<Object> {
const payload = {
"reduce": true,
"group": true,
"group_level": level
}
const url = `${this._couchdbUrl}/${this._couchdbDatabase}/_design/${this._couchdbDesign}/_view/filterCanopySizeByDate/`;
return this._http.post(url, payload, this.httpOptions);
}
/* get all docs from couchDB view 'allDropZones' */
getDropZones(): Observable<Object> {
const payload = {
"reduce": true,
"group": true
}
const url = `${this._couchdbUrl}/${this._couchdbDatabase}/_design/${this._couchdbDesign}/_view/allDropZones/`;
return this._http.post(url, payload, this.httpOptions);
}
/* get all docs from couchDB view 'allDropZonesByDate' */
getDropZonesByDate(level: number): Observable<Object> {
const payload = {
"reduce": true,
"group": true,
"group_level": level
}
const url = `${this._couchdbUrl}/${this._couchdbDatabase}/_design/${this._couchdbDesign}/_view/allDropZonesByDate/`;
return this._http.post(url, payload, this.httpOptions);
}
/* get all docs from couchDB view 'allJumps' */
getTotalJumps(): Observable<Object> {
const payload = {
"reduce": true,
"group": true,
"group_level": 1
}
const url = `${this._couchdbUrl}/${this._couchdbDatabase}/_design/${this._couchdbDesign}/_view/allJumps/`;
return this._http.post(url, payload, this.httpOptions);
}
/* get all docs from couchDB view 'allDevices' */
getDeviceActivities(deviceId: string, limit: number, start: number, end: number): Observable<Object> {
const payload = {
"selector": {
"type": {
"$eq": "activity"
},
"device_id": {
"$eq": deviceId
},
"created_time": {
"$gte": start,
"$lte": end
}
},
"fields": [
"created_time",
"device_id",
"values"
],
"sort": [
{
"created_time": "desc"
}
],
"limit": limit
}
//const url = this._couchdbUrl + '/' + this._couchdbDatabase + '/_find';
const url = `${this._couchdbUrl}/material_grow/_find`;
return this._http.post(url, payload, this.httpOptions);
}
/* get all docs from couchDB view 'getDevicesActivities' */
getDevicesActivities(key: string, limit: number, start: any, end: any): Observable<Object> {
/*
const payload = {
"start_key": [deviceId, end],
"end_key": [deviceId, start],
"descending": true,
"limit": limit,
"reduce": false
}
const url = this._couchdbUrl + '/' + this._couchdbDatabase + '/_design/' + this._couchdbDesign + '/_view/allActivitiesByDevice/';
*/
const payload = {
"start_key": [key, 1, start],
"end_key": [key, 1, end],
"limit": limit,
"descending": true,
"include_docs": true,
"reduce": false
}
const url = `${this._couchdbUrl}/netgrowing/_design/app/_view/getDevicesActivities`;
return this._http.post(url, payload, this.httpOptions);
}
}
-1
View File
@@ -1,7 +1,6 @@
export * from './aeronefs.service';
export * from './api.service';
export * from './applications.service';
export * from './backend.service';
export * from './calculator.service';
export * from './canopies.service';
export * from './dropzones.service';
+2 -2
View File
@@ -111,8 +111,8 @@ export class JumpsService {
return this.apiService.put(`/jumps/${jump.slug}`, { jump: jump }).pipe(map(data => data.jump));
}
destroy(slug: string) {
return this.apiService.delete(`/jumps/${slug}`);
destroy(slug: string): Observable<boolean> {
return this.apiService.delete(`/jumps/${slug}`).pipe(map(data => data.deleted));
}
save(jump: Jump): Observable<Jump> {
+1 -5
View File
@@ -3,9 +3,5 @@ export const environment = {
api_url:<string> 'http://localhost:3200/api', //'https://api.rampeur.com/api'
api_key:<string> '9f5a9b80a39b4788be2f12941b766aba',
use_api_key:<boolean> true,
refresh_interval:<number> 30000,
couchdbUrl:<string> 'http://couchdb.unespace.com',
couchdbDatabase:<string> 'headupdb',
couchdbDesign:<string> 'headup_app',
couchdbCredential:<string> 'cmFtcGV1cjpES3hwMjRQUw=='
refresh_interval:<number> 30000
};
+1 -5
View File
@@ -3,9 +3,5 @@ export const environment = {
api_url:<string> 'http://localhost:3200/api', //'https://api.rampeur.com/api'
api_key:<string> '9f5a9b80a39b4788be2f12941b766aba',
use_api_key:<boolean> true,
refresh_interval:<number> 30000,
couchdbUrl:<string> 'http://couchdb.unespace.com',
couchdbDatabase:<string> 'headupdb',
couchdbDesign:<string> 'headup_app',
couchdbCredential:<string> 'cmFtcGV1cjpES3hwMjRQUw=='
refresh_interval:<number> 30000
};
+1 -5
View File
@@ -3,9 +3,5 @@ export const environment = {
api_url:<string> 'http://localhost:3200/api', //'https://api.rampeur.com/api'
api_key:<string> '9f5a9b80a39b4788be2f12941b766aba',
use_api_key:<boolean> true,
refresh_interval:<number> 30000,
couchdbUrl:<string> 'http://couchdb.unespace.com',
couchdbDatabase:<string> 'headupdb',
couchdbDesign:<string> 'headup_app',
couchdbCredential:<string> 'cmFtcGV1cjpES3hwMjRQUw=='
refresh_interval:<number> 30000
};