diff --git a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc-connector-templates.component.html b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc-connector-templates.component.html index 2fdfcfbf0a..ee644c54c7 100644 --- a/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc-connector-templates.component.html +++ b/ui-ngx/src/app/modules/home/components/widget/lib/gateway/gateway-service-rpc-connector-templates.component.html @@ -32,7 +32,7 @@ diff --git a/ui-ngx/src/app/modules/home/components/widget/widget-components.module.ts b/ui-ngx/src/app/modules/home/components/widget/widget-components.module.ts index 04f3e5b996..b391f3367f 100644 --- a/ui-ngx/src/app/modules/home/components/widget/widget-components.module.ts +++ b/ui-ngx/src/app/modules/home/components/widget/widget-components.module.ts @@ -100,6 +100,7 @@ import { BarChartWidgetComponent } from '@home/components/widget/lib/chart/bar-c import { PolarAreaWidgetComponent } from '@home/components/widget/lib/chart/polar-area-widget.component'; import { RadarChartWidgetComponent } from '@home/components/widget/lib/chart/radar-chart-widget.component'; import { MobileAppQrcodeWidgetComponent } from '@home/components/widget/lib/mobile-app-qrcode-widget.component'; +import { KeyValueIsNotEmptyPipe } from '@shared/pipe/key-value-not-empty.pipe'; import { LabelCardWidgetComponent } from '@home/components/widget/lib/cards/label-card-widget.component'; import { LabelValueCardWidgetComponent } from '@home/components/widget/lib/cards/label-value-card-widget.component'; import { @@ -181,7 +182,8 @@ import { RpcWidgetsModule, HomePageWidgetsModule, SharedHomeComponentsModule, - RestConnectorSecurityComponent + RestConnectorSecurityComponent, + KeyValueIsNotEmptyPipe ], exports: [ EntitiesTableWidgetComponent, diff --git a/ui-ngx/src/app/shared/pipe/key-value-not-empty.pipe.ts b/ui-ngx/src/app/shared/pipe/key-value-not-empty.pipe.ts new file mode 100644 index 0000000000..94eeced50e --- /dev/null +++ b/ui-ngx/src/app/shared/pipe/key-value-not-empty.pipe.ts @@ -0,0 +1,67 @@ +/// +/// Copyright © 2016-2024 The Thingsboard Authors +/// +/// Licensed under the Apache License, Version 2.0 (the "License"); +/// you may not use this file except in compliance with the License. +/// You may obtain a copy of the License at +/// +/// http://www.apache.org/licenses/LICENSE-2.0 +/// +/// Unless required by applicable law or agreed to in writing, software +/// distributed under the License is distributed on an "AS IS" BASIS, +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +/// See the License for the specific language governing permissions and +/// limitations under the License. +/// + +import { + inject, + KeyValueChangeRecord, + KeyValueChanges, + KeyValueDiffer, + KeyValueDiffers, + Pipe, + PipeTransform +} from '@angular/core'; +import { KeyValue } from '@angular/common'; +import { isDefinedAndNotNull } from '@core/utils'; + +@Pipe({ + name: 'keyValueIsNotEmpty', + pure: false, + standalone: true, +}) +export class KeyValueIsNotEmptyPipe implements PipeTransform { + private differs: KeyValueDiffers = inject(KeyValueDiffers); + private differ!: KeyValueDiffer; + private keyValues: Array> = []; + + // This is a custom implementation of angular keyvalue pipe + // https://github.com/angular/angular/blob/main/packages/common/src/pipes/keyvalue_pipe.ts + transform( + input: Record, + ): Array> { + if (!input || (!(input instanceof Map) && typeof input !== 'object')) { + return null; + } + + this.differ ??= this.differs.find(input).create(); + + const differChanges: KeyValueChanges | null = this.differ.diff(input); + + if (differChanges) { + this.keyValues = []; + differChanges.forEachItem((r: KeyValueChangeRecord) => { + if (isDefinedAndNotNull(r.currentValue)) { + this.keyValues.push(this.makeKeyValuePair(r.key, r.currentValue!)); + } + }); + } + + return this.keyValues; + } + + private makeKeyValuePair(key: string, value: unknown): KeyValue { + return {key: key, value: value}; + } +}