diff --git a/src/app/_services/apollo.service.ts b/src/app/_services/apollo.service.ts index dfd7af0..67be461 100644 --- a/src/app/_services/apollo.service.ts +++ b/src/app/_services/apollo.service.ts @@ -6,8 +6,6 @@ import { MatTableDataSource } from '@angular/material/table' import { Observable, forkJoin, of as observableOf } from 'rxjs' import { map, mergeMap } from 'rxjs/operators' -// import { Apollo, gql } from 'apollo-angular' - const fieldTypeMap = { Int: 'number', Float: 'number', @@ -167,22 +165,22 @@ export class DashboardPageSection { ) {} } -export class DashboardPage { - constructor( - public name: string, - public group: string, - public errors: string = undefined, - public description: string = undefined, - public html: string = undefined, - public notebook: string = undefined, - public dfData: MatTableDataSource = undefined, - public plotData: Object = undefined, - public time: Date = undefined, - public attachment: string = undefined, - public expandedPanes: string[] = [], - public sections: DashboardPageSection[] = [] - ) {} -} +// export class DashboardPage { +// constructor( +// public name: string, +// public group: string, +// public errors: string = undefined, +// public description: string = undefined, +// public html: string = undefined, +// public notebook: string = undefined, +// public dfData: MatTableDataSource = undefined, +// public plotData: Object = undefined, +// public time: Date = undefined, +// public attachment: string = undefined, +// public expandedPanes: string[] = [], +// public sections: DashboardPageSection[] = [] +// ) {} +// } export class Model { constructor( @@ -361,62 +359,63 @@ export class ModelDataService { } } -@Injectable() -export class DashboardDataService { - constructor( - // private apollo: Apollo - ) {} +// @Injectable() +// export class DashboardDataService { +// constructor( +// public dashboardService: DashboardService, +// ) {} - getDashboardPage(group: string, name: string): Observable { - console.warn('Migrate Graphql') - return observableOf() - // return this.get(dashboardPageQuery, {'name': name, 'group': group}).pipe(map( - // res => { - // if (res['errors'] && res['errors'].length > 0) { - // return new DashboardPage( - // name, - // group, - // res['errors'].map(e => e.message).join(', '), - // ) - // } +// getDashboardPage(group: string, name: string): Observable { +// return this.dashboardService.getDashboardPageApiDashboardPageGroupNameGet( +// group, name +// ) +// // return this.get(dashboardPageQuery, {'name': name, 'group': group}).pipe(map( +// // res => { +// // if (res['errors'] && res['errors'].length > 0) { +// // return new DashboardPage( +// // name, +// // group, +// // res['errors'].map(e => e.message).join(', '), +// // ) +// // } - // let page = res['dashboard_page'] - // return new DashboardPage( - // page['name'], - // page['group'], - // '', - // page['description'], - // page['html'], - // page['notebook'], - // JSON.parse(page['dfData']), - // JSON.parse(page['plotData']), - // page['time'], - // page['attachment'], - // page['expandedPanes'], - // page['sections'] ? page['sections'].map( - // section => new DashboardPageSection( - // section['name'], - // section['plot'] - // ) - // ) : [] - // ) - // } - // )) - } +// // let page = res['dashboard_page'] +// // return new DashboardPage( +// // page['name'], +// // page['group'], +// // '', +// // page['description'], +// // page['html'], +// // page['notebook'], +// // JSON.parse(page['dfData']), +// // JSON.parse(page['plotData']), +// // page['time'], +// // page['attachment'], +// // page['expandedPanes'], +// // page['sections'] ? page['sections'].map( +// // section => new DashboardPageSection( +// // section['name'], +// // section['plot'] +// // ) +// // ) : [] +// // ) +// // } +// // )) +// } - get(query, vars: object = {}): Observable { - console.warn('Migrate Graphql') - return observableOf() - // return this.apollo.query({ - // query: query, - // variables: vars - // }).pipe(map( - // result => { - // if (result.errors && result.errors.length > 0) { - // return result - // } - // return result.data - // } - // )) - } -} +// get(query, vars: object = {}): Observable { +// console.warn('Migrate Graphql') +// return observableOf() +// // return this.apollo.query({ +// // query: query, +// // variables: vars +// // }).pipe(map( +// // result => { +// // if (result.errors && result.errors.length > 0) { +// // return result +// // } +// // return result.data +// // } +// // )) +// } +// } diff --git a/src/app/_services/authentication.service.ts b/src/app/_services/authentication.service.ts index 7f2b392..727ad02 100644 --- a/src/app/_services/authentication.service.ts +++ b/src/app/_services/authentication.service.ts @@ -128,6 +128,7 @@ export class AuthenticationService { isAuthorized(roles: string[]): Observable { // Return true if at least one role in given list matches one role of the authenticated user if (roles.length == 0) return of(true) + if (roles.every(role => role == undefined)) return of(true) // return this.roles.filter(value => -1 !== roles.indexOf(value.name)).length > 0 return this.configService.conf.pipe(map( conf => conf.bsData?.user?.roles?.filter(value => -1 !== roles.indexOf(value.name)).length > 0 diff --git a/src/app/dashboard/dashboard-menu/dashboard-menu.component.html b/src/app/dashboard/dashboard-menu/dashboard-menu.component.html index 31dfc9c..3f00b5a 100644 --- a/src/app/dashboard/dashboard-menu/dashboard-menu.component.html +++ b/src/app/dashboard/dashboard-menu/dashboard-menu.component.html @@ -5,19 +5,20 @@ > - {{ menuItem['name'] }} + {{ menuItem.name }} diff --git a/src/app/dashboard/dashboard-menu/dashboard-menu.component.ts b/src/app/dashboard/dashboard-menu/dashboard-menu.component.ts index 6b174d6..835e561 100644 --- a/src/app/dashboard/dashboard-menu/dashboard-menu.component.ts +++ b/src/app/dashboard/dashboard-menu/dashboard-menu.component.ts @@ -1,8 +1,10 @@ import { Component, OnInit, Input, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core' -import { DashboardService, DashboardGroup } from '../../openapi' - +import { DashboardService, DashboardGroup, DashboardPageMetaData } from '../../openapi' +import { AuthenticationService } from '../../_services/authentication.service' +import { Observable, map, of } from 'rxjs' +import { Dash } from 'plotly.js-dist-min' @Component({ selector: 'gisaf-dashboard-menu', @@ -15,6 +17,7 @@ export class DashboardMenuComponent implements OnInit { constructor( public dashboardService: DashboardService, + public authenticationService: AuthenticationService, private cdr: ChangeDetectorRef, ) {} @@ -26,4 +29,10 @@ export class DashboardMenuComponent implements OnInit { } ) } + + isHidden(dashboard: DashboardPageMetaData): Observable { + return this.authenticationService.isAuthorized([dashboard.viewable_role]).pipe(map( + r => !r + )) + } } diff --git a/src/app/dashboard/dashboard-page/dashboard-page-resolver.service.ts b/src/app/dashboard/dashboard-page/dashboard-page-resolver.service.ts index ec2d04c..fb698a6 100644 --- a/src/app/dashboard/dashboard-page/dashboard-page-resolver.service.ts +++ b/src/app/dashboard/dashboard-page/dashboard-page-resolver.service.ts @@ -2,16 +2,17 @@ import { Injectable } from '@angular/core' import { RouterStateSnapshot, ActivatedRouteSnapshot } from '@angular/router' import { Observable } from 'rxjs' -import { DashboardDataService } from '../../_services/apollo.service' +// import { DashboardDataService } from '../../_services/apollo.service' +import { DashboardService, Dashboard } from '../../openapi' @Injectable() export class DashboardPageResolver { constructor( - private dashboardDataService: DashboardDataService, + private dashboardService: DashboardService, ) {} - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { - return this.dashboardDataService.getDashboardPage( + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + return this.dashboardService.getDashboardPageApiDashboardPageGroupNameGet( route.paramMap.get('group'), route.paramMap.get('name') ) diff --git a/src/app/dashboard/dashboard-page/dashboard-page-sections.component.ts b/src/app/dashboard/dashboard-page/dashboard-page-sections.component.ts index af643f0..416faec 100644 --- a/src/app/dashboard/dashboard-page/dashboard-page-sections.component.ts +++ b/src/app/dashboard/dashboard-page/dashboard-page-sections.component.ts @@ -6,8 +6,7 @@ import { Observable, of } from 'rxjs' import { map, startWith } from 'rxjs/operators' import { UntypedFormControl } from '@angular/forms' - -import { DashboardPage, DashboardPageSection } from '../../_services/apollo.service' +import { Dashboard, DashboardSection } from '../../openapi' const expandDefault = ['attachment', 'plot', 'html'] @@ -25,12 +24,12 @@ export class Section { changeDetection: ChangeDetectionStrategy.OnPush }) export class DashboardPageSectionsComponent implements OnInit { - @Input() page: DashboardPage - currentSection: DashboardPageSection + @Input() page: Dashboard + currentSection: DashboardSection myControl: UntypedFormControl = new UntypedFormControl() @ViewChild('ipt', { static: true }) ipt: ElementRef //sections: Section[] = [] - filteredOptions: Observable + filteredOptions: Observable constructor( protected route: ActivatedRoute, @@ -41,7 +40,7 @@ export class DashboardPageSectionsComponent implements OnInit { ngOnInit() { this.route.queryParams.subscribe( (params: Params) => { - let s: DashboardPageSection[] = this.page.sections.filter(s=>s.name == params['section']) + let s: DashboardSection[] = this.page.sections.filter(s=>s.name == params['section']) if (s.length > 0) { this.select(s[0]) } @@ -81,14 +80,14 @@ export class DashboardPageSectionsComponent implements OnInit { ) } - filter(val: string): DashboardPageSection[] { + filter(val: string): DashboardSection[] { let filter = val.toLowerCase() return this.page.sections.filter(option => { return option.name.toLowerCase().indexOf(filter) != -1 }) } - select(section: DashboardPageSection) { + select(section: DashboardSection) { this.currentSection = section this.cdr.markForCheck() } diff --git a/src/app/dashboard/dashboard-page/dashboard-page.component.css b/src/app/dashboard/dashboard-page/dashboard-page.component.css index a2b30ea..332478e 100644 --- a/src/app/dashboard/dashboard-page/dashboard-page.component.css +++ b/src/app/dashboard/dashboard-page/dashboard-page.component.css @@ -18,6 +18,8 @@ a { :host ::ng-deep table th.mat-mdc-header-cell { padding: 0 0.5em; + text-transform: capitalize; + font-weight: bolder; } :host ::ng-deep table td.mat-mdc-cell { diff --git a/src/app/dashboard/dashboard-page/dashboard-page.component.html b/src/app/dashboard/dashboard-page/dashboard-page.component.html index c984f53..7eba515 100644 --- a/src/app/dashboard/dashboard-page/dashboard-page.component.html +++ b/src/app/dashboard/dashboard-page/dashboard-page.component.html @@ -1,14 +1,14 @@ - {{ page.group }} / {{ page.name }} + {{ page?.group }} / {{ page.name }} {{ page.description }} -

+

- @@ -49,17 +49,17 @@ + [dataSource]='getTableData()'> - +
{{ colName }} {{ value[colName] }} {{ formatCell(value[colName]) }}
- +
diff --git a/src/app/dashboard/dashboard-page/dashboard-page.component.ts b/src/app/dashboard/dashboard-page/dashboard-page.component.ts index f9357b0..6304dce 100644 --- a/src/app/dashboard/dashboard-page/dashboard-page.component.ts +++ b/src/app/dashboard/dashboard-page/dashboard-page.component.ts @@ -2,7 +2,8 @@ import { Component, OnInit, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core' import { ActivatedRoute, Router } from '@angular/router' -import { DashboardPage } from '../../_services/apollo.service' +import { Dashboard } from '../../openapi' +import { CdkTableDataSourceInput } from '@angular/cdk/table' const expandDefault = ['attachment', 'plot', 'html'] @@ -13,7 +14,11 @@ const expandDefault = ['attachment', 'plot', 'html'] changeDetection: ChangeDetectionStrategy.OnPush }) export class DashboardPageComponent implements OnInit { - page: DashboardPage + page: Dashboard = { + name: '', + group: '', + description: '', + } multiPanel: boolean = true df_columns: string[] // Default expanded panels @@ -40,14 +45,13 @@ export class DashboardPageComponent implements OnInit { ngOnInit() { this.route.data.subscribe( - (data: DashboardPage) => { - let item = data['item'] - if (item.dfData) { - this.df_columns = item.dfData['schema']['fields'].map(f => f.name) - item.dfData = item.dfData['data'] + data => { + this.page = data['dashboard'] + if (this.page.dfData && this.page.dfData.length > 0) { + // this.df_columns = item.dfData['schema']['fields'].map(f => f.name) + this.df_columns = Object.keys(this.page.dfData[0]) } - this.page = item - if (this.page.expandedPanes.length > 0) { + if (this.page.expandedPanes?.length > 0) { this.expand = this.page.expandedPanes } else { @@ -57,4 +61,17 @@ export class DashboardPageComponent implements OnInit { } ) } + + getTableData(): CdkTableDataSourceInput { + return this.page.dfData as CdkTableDataSourceInput + } + + formatCell(value) { + if (typeof value === 'number') { + return value.toFixed(1) + } + else { + return value + } + } } diff --git a/src/app/dashboard/dashboard-routing.module.ts b/src/app/dashboard/dashboard-routing.module.ts index f3255bb..5dd174c 100644 --- a/src/app/dashboard/dashboard-routing.module.ts +++ b/src/app/dashboard/dashboard-routing.module.ts @@ -14,7 +14,7 @@ const routes: Routes = [ path: ':group/:name', component: DashboardPageComponent, resolve: { - item: DashboardPageResolver + dashboard: DashboardPageResolver } }, ] diff --git a/src/app/dashboard/dashboard.module.ts b/src/app/dashboard/dashboard.module.ts index 15ec44e..3551b7d 100644 --- a/src/app/dashboard/dashboard.module.ts +++ b/src/app/dashboard/dashboard.module.ts @@ -26,7 +26,7 @@ import { PlotlyViaWindowModule } from 'angular-plotly.js' import { PipesModule } from '../pipes.module' -import { DashboardDataService } from '../_services/apollo.service' +// import { DashboardDataService } from '../_services/apollo.service' import { DashboardComponent } from './dashboard.component' import { DashboardRoutingModule } from './dashboard-routing.module' import { DashboardMenuComponent } from './dashboard-menu/dashboard-menu.component' @@ -69,7 +69,7 @@ import { DashboardHomeComponent } from './dashboard-home/dashboard-home.componen DashboardHomeComponent, ], providers: [ - DashboardDataService + // DashboardDataService ] }) diff --git a/src/app/info/info.module.ts b/src/app/info/info.module.ts index cdce196..4ed99ac 100644 --- a/src/app/info/info.module.ts +++ b/src/app/info/info.module.ts @@ -27,7 +27,6 @@ import { FlexLayoutModule } from 'ngx-flexible-layout' import { PipesModule } from '../pipes.module' import { AdminDetailModule } from '../admin/admin-detail/admin-detail.module' -import { DashboardDataService } from '../_services/apollo.service' import { InfoDataService } from './info-data.service' import { InfoComponent } from './info.component' @@ -112,7 +111,6 @@ import { DownloaderComponent } from './info-tools/downloader.component' ], providers: [ InfoDataService, - DashboardDataService, TagsPluginsService, ] }) diff --git a/src/app/openapi/core/OpenAPI.ts b/src/app/openapi/core/OpenAPI.ts index 84ea507..a381501 100644 --- a/src/app/openapi/core/OpenAPI.ts +++ b/src/app/openapi/core/OpenAPI.ts @@ -21,7 +21,7 @@ export type OpenAPIConfig = { export const OpenAPI: OpenAPIConfig = { BASE: '', - VERSION: '2023.4.dev51+g15fe7fa.d20240318', + VERSION: '2023.4.dev53+gd539a72.d20240320', WITH_CREDENTIALS: false, CREDENTIALS: 'include', TOKEN: undefined, diff --git a/src/app/openapi/index.ts b/src/app/openapi/index.ts index 92970da..009b78f 100644 --- a/src/app/openapi/index.ts +++ b/src/app/openapi/index.ts @@ -16,10 +16,11 @@ export type { Body_login_for_access_token_api_token_post } from './models/Body_l export type { BootstrapData } from './models/BootstrapData'; export type { CategoryGroup } from './models/CategoryGroup'; export type { CategoryRead } from './models/CategoryRead'; -export type { DashboadPageSectionType } from './models/DashboadPageSectionType'; +export type { Dashboard } from './models/Dashboard'; export type { DashboardGroup } from './models/DashboardGroup'; export type { DashboardHome } from './models/DashboardHome'; -export type { DashboardPage_ } from './models/DashboardPage_'; +export type { DashboardPageMetaData } from './models/DashboardPageMetaData'; +export type { DashboardSection } from './models/DashboardSection'; export type { DataProvider } from './models/DataProvider'; export type { Downloader } from './models/Downloader'; export type { Equipment } from './models/Equipment'; diff --git a/src/app/openapi/models/DashboardPage_.ts b/src/app/openapi/models/Dashboard.ts similarity index 67% rename from src/app/openapi/models/DashboardPage_.ts rename to src/app/openapi/models/Dashboard.ts index 5946586..a80dad5 100644 --- a/src/app/openapi/models/DashboardPage_.ts +++ b/src/app/openapi/models/Dashboard.ts @@ -2,18 +2,18 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { DashboadPageSectionType } from './DashboadPageSectionType'; -export type DashboardPage_ = { +import type { DashboardSection } from './DashboardSection'; +export type Dashboard = { name: string; group: string; description: string; time?: (string | null); html?: (string | null); attachment?: (string | null); - dfData?: (string | null); + dfData?: Array; plotData?: (string | null); notebook?: (string | null); expandedPanes?: (Array | null); - sections?: (Array | null); + sections?: (Array | null); }; diff --git a/src/app/openapi/models/DashboardGroup.ts b/src/app/openapi/models/DashboardGroup.ts index 33e802e..f2d1348 100644 --- a/src/app/openapi/models/DashboardGroup.ts +++ b/src/app/openapi/models/DashboardGroup.ts @@ -2,9 +2,9 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -import type { DashboardPage_ } from './DashboardPage_'; +import type { DashboardPageMetaData } from './DashboardPageMetaData'; export type DashboardGroup = { name: string; - pages: Array; + pages: Array; }; diff --git a/src/app/openapi/models/DashboardPageMetaData.ts b/src/app/openapi/models/DashboardPageMetaData.ts new file mode 100644 index 0000000..4056fa2 --- /dev/null +++ b/src/app/openapi/models/DashboardPageMetaData.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type DashboardPageMetaData = { + name: string; + group: string; + description: string; + viewable_role?: (string | null); +}; + diff --git a/src/app/openapi/models/DashboadPageSectionType.ts b/src/app/openapi/models/DashboardSection.ts similarity index 81% rename from src/app/openapi/models/DashboadPageSectionType.ts rename to src/app/openapi/models/DashboardSection.ts index 52d1ff8..04392a9 100644 --- a/src/app/openapi/models/DashboadPageSectionType.ts +++ b/src/app/openapi/models/DashboardSection.ts @@ -2,7 +2,7 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -export type DashboadPageSectionType = { +export type DashboardSection = { name: string; plot: string; }; diff --git a/src/app/openapi/services/DashboardService.ts b/src/app/openapi/services/DashboardService.ts index 8c26d18..80f875f 100644 --- a/src/app/openapi/services/DashboardService.ts +++ b/src/app/openapi/services/DashboardService.ts @@ -5,9 +5,9 @@ import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import type { Observable } from 'rxjs'; +import type { Dashboard } from '../models/Dashboard'; import type { DashboardGroup } from '../models/DashboardGroup'; import type { DashboardHome } from '../models/DashboardHome'; -import type { DashboardPage_ } from '../models/DashboardPage_'; import { OpenAPI } from '../core/OpenAPI'; import { request as __request } from '../core/request'; @Injectable({ @@ -47,13 +47,13 @@ export class DashboardService { * Get Dashboard Page * @param group * @param name - * @returns DashboardPage_ Successful Response + * @returns Dashboard Successful Response * @throws ApiError */ public getDashboardPageApiDashboardPageGroupNameGet( group: string, name: string, - ): Observable { + ): Observable { return __request(OpenAPI, this.http, { method: 'GET', url: '/api/dashboard/page/{group}/{name}',