From 5e5bdc4c8c1efec578e35621802f4169c388af9f Mon Sep 17 00:00:00 2001 From: Tristan Bastian Date: Thu, 2 Dec 2021 18:26:46 +0100 Subject: [PATCH] link firmware statistics to device lookup --- .../device-lookup/device-lookup.component.ts | 54 +++++++++++-- .../device-table-datasource.service.ts | 20 ++++- .../firmware-statistics.component.html | 2 +- .../firmware-statistics.component.ts | 76 +++++++++++++++---- .../pie-chart/pie-chart.component.html | 1 + .../pie-chart/pie-chart.component.ts | 9 ++- src/services/device-details.service.ts | 56 +++++++++----- 7 files changed, 170 insertions(+), 48 deletions(-) diff --git a/src/modules/lookup/device-lookup/device-lookup.component.ts b/src/modules/lookup/device-lookup/device-lookup.component.ts index 90736c8..4753cf8 100644 --- a/src/modules/lookup/device-lookup/device-lookup.component.ts +++ b/src/modules/lookup/device-lookup/device-lookup.component.ts @@ -1,11 +1,19 @@ -import { Component } from '@angular/core'; +import { Component, OnDestroy, ViewChild } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; import { IManagedObject } from '@c8y/client'; -import { AlertService, BulkActionControl, Column, ColumnDataType, ModalService } from '@c8y/ngx-components'; +import { + AlertService, + BulkActionControl, + Column, + ColumnDataType, + DataGridComponent, + ModalService +} from '@c8y/ngx-components'; import { DeviceAction } from '@models/extensions'; import { TenantSpecificDetails } from '@models/tenant-specific-details'; import { FakeMicroserviceService } from '@services/fake-microservice.service'; import { BsModalService } from 'ngx-bootstrap/modal'; -import { Subject } from 'rxjs'; +import { Subject, Subscription } from 'rxjs'; import { filter, take } from 'rxjs/operators'; import { ConfigurationUpdateModalComponent } from '../modals/configuration-update-modal/configuration-update-modal.component'; import { CustomFirmwareUpdateModalComponent } from '../modals/custom-firmware-update-modal/custom-firmware-update-modal.component'; @@ -17,7 +25,8 @@ import { DeviceTableDatasourceService } from './device-table-datasource.service' selector: 'ps-device-lookup', templateUrl: './device-lookup.component.html' }) -export class DeviceLookupComponent { +export class DeviceLookupComponent implements OnDestroy { + @ViewChild(DataGridComponent, { static: true }) dataGrid: DataGridComponent; columns: Column[]; bulkActionControls: BulkActionControl[] = [ { @@ -35,15 +44,46 @@ export class DeviceLookupComponent { this.updateFirmware(selectedItemIds as any as { tenant: string; id: string }[]) } ]; + private queryParamSub: Subscription; constructor( private credService: FakeMicroserviceService, private c8yModalService: ModalService, private modalService: BsModalService, private alertService: AlertService, - public datasource: DeviceTableDatasourceService + public datasource: DeviceTableDatasourceService, + private route: ActivatedRoute ) { this.columns = this.getDefaultColumns(); + this.queryParamSub = this.route.queryParams.subscribe((params) => { + const columns = this.dataGrid ? this.dataGrid.columns : this.columns; + if (params && this.columns && this.columns.length) { + const paramKeys = Object.keys(params); + let paramChanged = false; + columns.forEach((col) => { + if (paramKeys.includes(col.name)) { + if (col.filterPredicate !== params[col.name]) { + paramChanged = true; + col.filterPredicate = params[col.name]; + } + } else { + if (col.filterPredicate) { + paramChanged = true; + col.filterPredicate = undefined; + } + } + }); + if (paramChanged && this.dataGrid) { + this.dataGrid.reload(); + } + } + }); + } + + ngOnDestroy(): void { + if (this.queryParamSub) { + this.queryParamSub.unsubscribe(); + } } getDefaultColumns(): Column[] { @@ -92,7 +132,7 @@ export class DeviceLookupComponent { visible: false }, { - name: 'firmware_name', + name: 'firmwareName', header: 'Firmware Name', path: 'data.c8y_Firmware.name', dataType: ColumnDataType.TextShort, @@ -101,7 +141,7 @@ export class DeviceLookupComponent { visible: false }, { - name: 'firmware_version', + name: 'firmwareVersion', header: 'Firmware Version', path: 'data.c8y_Firmware.version', dataType: ColumnDataType.TextShort, diff --git a/src/modules/lookup/device-lookup/device-table-datasource.service.ts b/src/modules/lookup/device-lookup/device-table-datasource.service.ts index b0f33a7..9628c35 100644 --- a/src/modules/lookup/device-lookup/device-table-datasource.service.ts +++ b/src/modules/lookup/device-lookup/device-table-datasource.service.ts @@ -1,4 +1,5 @@ import { Inject, Injectable, Optional } from '@angular/core'; +import { ActivatedRoute, Router } from '@angular/router'; import { QueriesUtil, IResultList, IManagedObject, Client } from '@c8y/client'; import { ServerSideDataResult, Column, Pagination, DataSourceModifier } from '@c8y/ngx-components'; import { DeviceActionsFactory, HOOK_DEVICE_ACTION_FACTORY } from '@models/extensions'; @@ -34,7 +35,9 @@ export class DeviceTableDatasourceService { constructor( private credService: FakeMicroserviceService, private deviceDetailsService: DeviceDetailsService, - private extensionService: ExtensionsService + private extensionService: ExtensionsService, + private router: Router, + private activatedRoute: ActivatedRoute ) { this.deviceActionFactories = this.extensionService.getDeviceActionFactories(); this.serverSideDataCallback = this.onDataSourceModifier.bind(this); @@ -42,16 +45,27 @@ export class DeviceTableDatasourceService { async onDataSourceModifier(dataSourceModifier: DataSourceModifier): Promise { this.columns = [...(dataSourceModifier.columns || [])]; + const queryParams = {}; + this.columns.forEach((col) => { + if (col.filterPredicate) { + queryParams[col.name] = col.filterPredicate; + } + }); + + this.router.navigate([], { + relativeTo: this.activatedRoute, + queryParams + }); const credentials = await this.credService.prepareCachedDummyMicroserviceForAllSubtenants(); let clients = this.credService.createClients(credentials); + const columnsCopy = dataSourceModifier.columns.map((tmp) => Object.assign({}, tmp)); let tenantFilter = ''; - const tenantIdCol = dataSourceModifier.columns.find((tmp) => tmp.path === 'tenantId'); + const tenantIdCol = columnsCopy.find((tmp) => tmp.path === 'tenantId'); if (tenantIdCol && tenantIdCol.filterPredicate) { clients = clients.filter((tmp) => tmp.core.tenant.includes(tenantIdCol.filterPredicate as string)); tenantFilter = tenantIdCol.filterPredicate as string; tenantIdCol.filterPredicate = undefined; } - const columnsCopy = dataSourceModifier.columns.map((tmp) => Object.assign({}, tmp)); columnsCopy.forEach((entry) => { if (entry && entry.path) { diff --git a/src/modules/statistics/firmware-statistics/firmware-statistics.component.html b/src/modules/statistics/firmware-statistics/firmware-statistics.component.html index 28a3cd5..5ad93ab 100644 --- a/src/modules/statistics/firmware-statistics/firmware-statistics.component.html +++ b/src/modules/statistics/firmware-statistics/firmware-statistics.component.html @@ -28,7 +28,7 @@

{{ "No device/firmware combination selected." | translate }}

{{ currentChart.label }}

- +