From 7229b880ae48a8ab0472964c878cf122c1ad1ce7 Mon Sep 17 00:00:00 2001 From: Igor Kulikov Date: Mon, 6 Apr 2026 18:14:12 +0300 Subject: [PATCH] Add IoT Hub widgets integration to dashboard widget select - Move item detail dialog to home/components/iot-hub for shared access - Register in HomeComponentsModule (declarations + exports) - Add 'add' mode to item detail dialog showing "Add" button instead of install - Add 'iotHub' mode to dashboard-widget-select with IoT Hub widget grid - IoT Hub cards show author + install count footer - Clicking card opens detail dialog in 'add' mode - Add installs widget via IoT Hub API then emits widgetSelected with full type info - Add "IoT Hub" option to mode toggle in dashboard page header - Hide filter/deprecated controls in IoT Hub mode - Hero keywords clickable to navigate to items pages --- .../dashboard-page.component.html | 12 +-- .../dashboard-widget-select.component.html | 68 ++++++++++++++-- .../dashboard-widget-select.component.scss | 40 ++++++++++ .../dashboard-widget-select.component.ts | 78 ++++++++++++++++++- .../home/components/home-components.module.ts | 3 + .../iot-hub-item-detail-dialog.component.html | 64 ++++++++------- .../iot-hub-item-detail-dialog.component.scss | 0 .../iot-hub-item-detail-dialog.component.ts | 17 +++- .../pages/iot-hub/iot-hub-browse.component.ts | 2 +- .../pages/iot-hub/iot-hub-home.component.html | 3 +- .../pages/iot-hub/iot-hub-home.component.ts | 2 +- .../iot-hub-installed-items.component.ts | 2 +- .../pages/iot-hub/iot-hub-search.component.ts | 2 +- .../home/pages/iot-hub/iot-hub.module.ts | 2 - .../assets/locale/locale.constant-en_US.json | 1 + 15 files changed, 246 insertions(+), 50 deletions(-) rename ui-ngx/src/app/modules/home/{pages => components}/iot-hub/iot-hub-item-detail-dialog.component.html (89%) rename ui-ngx/src/app/modules/home/{pages => components}/iot-hub/iot-hub-item-detail-dialog.component.scss (100%) rename ui-ngx/src/app/modules/home/{pages => components}/iot-hub/iot-hub-item-detail-dialog.component.ts (96%) diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.component.html b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.component.html index ce1f0d1a7d..78dab85ad9 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.component.html +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-page.component.html @@ -402,7 +402,8 @@ -
+
@@ -429,22 +430,23 @@ - {{ 'widgets-bundle.widgets-bundles' | translate }} {{ 'widget.all-widgets' | translate }} + {{ 'iot-hub.iot-hub' | translate }} -
- - - - + + - - + + + + + + + + + + + + + + + +
+
+ {{item.name}} +
+
+
i
+
+
+
+
+ {{ item.name }} + {{ item.name }} +
+ +
+
+ +
+ + {{ 'widget.loading-widgets' | translate }} + + +
+
+ + {{ 'iot-hub.no-items-found' | translate }} + +
diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-widget-select.component.scss b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-widget-select.component.scss index 04803e6a00..1c40348ef4 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-widget-select.component.scss +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-widget-select.component.scss @@ -139,6 +139,46 @@ } } + // IoT Hub widget card footer + .tb-iot-hub-widget-card { + .tb-iot-hub-widget-footer { + display: flex; + align-items: center; + justify-content: space-between; + padding-top: 4px; + } + + .tb-iot-hub-widget-author, + .tb-iot-hub-widget-installs { + display: flex; + align-items: center; + gap: 4px; + font-size: 12px; + font-weight: 400; + line-height: 16px; + letter-spacing: 0.25px; + color: rgba(0, 0, 0, 0.54); + + mat-icon { + font-size: 16px; + width: 16px; + height: 16px; + color: rgba(0, 0, 0, 0.54); + } + } + + .tb-iot-hub-widget-installs { + font-weight: 500; + + mat-icon { + font-size: 12px; + width: 12px; + height: 12px; + } + } + } +} + @keyframes shine { to { background-position-x: -200%; diff --git a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-widget-select.component.ts b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-widget-select.component.ts index bf4a7b78eb..7123f43732 100644 --- a/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-widget-select.component.ts +++ b/ui-ngx/src/app/modules/home/components/dashboard-page/dashboard-widget-select.component.ts @@ -30,12 +30,20 @@ import { debounceTime, distinctUntilChanged, map, skip } from 'rxjs/operators'; import { BehaviorSubject, combineLatest } from 'rxjs'; import { isObject } from '@core/utils'; import { PageLink } from '@shared/models/page/page-link'; -import { Direction } from '@shared/models/page/sort-order'; +import { Direction, SortOrder } from '@shared/models/page/sort-order'; import { GridEntitiesFetchFunction, ScrollGridColumns } from '@shared/components/grid/scroll-grid-datasource'; import { ItemSizeStrategy } from '@shared/components/grid/scroll-grid.component'; import { coerceBoolean } from '@shared/decorators/coercion'; +import { MatDialog } from '@angular/material/dialog'; +import { MpItemVersionQuery, MpItemVersionView } from '@shared/models/iot-hub/iot-hub-version.models'; +import { ItemType } from '@shared/models/iot-hub/iot-hub-item.models'; +import { IotHubApiService } from '@core/http/iot-hub-api.service'; +import { + TbIotHubItemDetailDialogComponent, + IotHubItemDetailDialogData +} from '@home/components/iot-hub/iot-hub-item-detail-dialog.component'; -type selectWidgetMode = 'bundles' | 'allWidgets'; +type selectWidgetMode = 'bundles' | 'allWidgets' | 'iotHub'; interface WidgetsFilter { search: string; @@ -163,12 +171,16 @@ export class DashboardWidgetSelectComponent implements OnInit { widgetBundlesFetchFunction: GridEntitiesFetchFunction; allWidgetsFetchFunction: GridEntitiesFetchFunction; widgetsFetchFunction: GridEntitiesFetchFunction; + iotHubWidgetsFetchFunction: GridEntitiesFetchFunction; widgetsBundleFilter = ''; allWidgetsFilter: WidgetsFilter = {search: '', filter: null, deprecatedFilter: DeprecatedFilter.ACTUAL}; widgetsFilter: BundleWidgetsFilter = {search: '', filter: null, deprecatedFilter: DeprecatedFilter.ACTUAL, widgetsBundleId: null}; + iotHubWidgetsFilter = ''; constructor(private widgetsService: WidgetService, + private iotHubApiService: IotHubApiService, + private dialog: MatDialog, private cd: ChangeDetectorRef) { this.widgetBundlesFetchFunction = (pageSize, page, filter) => { @@ -197,12 +209,20 @@ export class DashboardWidgetSelectComponent implements OnInit { true, filter.deprecatedFilter, filter.filter); }; + this.iotHubWidgetsFetchFunction = (pageSize, page, filter) => { + const sortOrder: SortOrder = { property: 'totalInstallCount', direction: Direction.DESC }; + const pageLink = new PageLink(pageSize, page, filter || null, sortOrder); + const query = new MpItemVersionQuery(pageLink, ItemType.WIDGET); + return this.iotHubApiService.getPublishedVersions(query, { ignoreLoading: true }); + }; + this.search$.pipe( distinctUntilChanged(), skip(1) ).subscribe( (search) => { this.widgetsBundleFilter = search; + this.iotHubWidgetsFilter = search; this.cd.markForCheck(); } ); @@ -252,10 +272,64 @@ export class DashboardWidgetSelectComponent implements OnInit { } } + onIotHubWidgetClicked($event: Event, item: MpItemVersionView): void { + $event.preventDefault(); + const dialogRef = this.dialog.open(TbIotHubItemDetailDialogComponent, { + panelClass: ['tb-dialog', 'tb-fullscreen-dialog'], + autoFocus: false, + data: { + item, + iotHubApiService: this.iotHubApiService, + mode: 'add' + } as IotHubItemDetailDialogData + }); + dialogRef.afterClosed().subscribe(result => { + if (result?.action === 'add') { + this.installAndAddWidget(result.item); + } + }); + } + + getIotHubItemImage(item: MpItemVersionView): string | null { + if (item.image) { + return this.iotHubApiService.resolveResourceUrl(item.image); + } + const resource = item.resources?.find(r => r.type === 'SCREENSHOT') || item.resources?.find(r => r.type === 'ICON'); + if (resource) { + return this.iotHubApiService.resolveResourceUrl(`/api/resources/${resource.id}`); + } + return null; + } + isObject(value: any): boolean { return isObject(value); } + private installAndAddWidget(item: MpItemVersionView): void { + const versionId = item.id as string; + this.iotHubApiService.installItemVersion(versionId, { ignoreLoading: true }).subscribe({ + next: (result) => { + if (result.success && result.descriptor?.type === 'WIDGET') { + const widgetTypeId = result.descriptor.widgetTypeId?.id; + if (widgetTypeId) { + this.widgetsService.getWidgetTypeInfoById(widgetTypeId).subscribe(widgetType => { + if (widgetType) { + this.widgetSelected.emit({ + typeFullFqn: fullWidgetTypeFqn(widgetType), + type: widgetType.widgetType, + title: widgetType.name, + image: widgetType.image, + description: widgetType.description, + deprecated: widgetType.deprecated + }); + } + }); + } + } + } + }); + } + private toWidgetInfo(widgetTypeInfo: WidgetTypeInfo): WidgetInfo { return { typeFullFqn: fullWidgetTypeFqn(widgetTypeInfo), diff --git a/ui-ngx/src/app/modules/home/components/home-components.module.ts b/ui-ngx/src/app/modules/home/components/home-components.module.ts index 361062149c..9eb6609f25 100644 --- a/ui-ngx/src/app/modules/home/components/home-components.module.ts +++ b/ui-ngx/src/app/modules/home/components/home-components.module.ts @@ -112,6 +112,7 @@ import { StatesControllerModule } from '@home/components/dashboard-page/states/s import { DashboardLayoutComponent } from '@home/components/dashboard-page/layout/dashboard-layout.component'; import { EditWidgetComponent } from '@home/components/dashboard-page/edit-widget.component'; import { DashboardWidgetSelectComponent } from '@home/components/dashboard-page/dashboard-widget-select.component'; +import { TbIotHubItemDetailDialogComponent } from '@home/components/iot-hub/iot-hub-item-detail-dialog.component'; import { AddWidgetDialogComponent } from '@home/components/dashboard-page/add-widget-dialog.component'; import { ManageDashboardLayoutsDialogComponent } from '@home/components/dashboard-page/layout/manage-dashboard-layouts-dialog.component'; import { @@ -321,6 +322,7 @@ import { SolutionInstallDialogComponent } from '@home/components/solution/soluti SelectDashboardBreakpointComponent, EditWidgetComponent, DashboardWidgetSelectComponent, + TbIotHubItemDetailDialogComponent, AddWidgetDialogComponent, MoveWidgetsDialogComponent, ManageDashboardLayoutsDialogComponent, @@ -471,6 +473,7 @@ import { SolutionInstallDialogComponent } from '@home/components/solution/soluti SelectDashboardBreakpointComponent, EditWidgetComponent, DashboardWidgetSelectComponent, + TbIotHubItemDetailDialogComponent, AddWidgetDialogComponent, MoveWidgetsDialogComponent, ManageDashboardLayoutsDialogComponent, diff --git a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-item-detail-dialog.component.html b/ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-item-detail-dialog.component.html similarity index 89% rename from ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-item-detail-dialog.component.html rename to ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-item-detail-dialog.component.html index 48cce316cd..eea38f2a55 100644 --- a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-item-detail-dialog.component.html +++ b/ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-item-detail-dialog.component.html @@ -79,20 +79,26 @@
- @if (!isInstalled()) { - - } @else if (hasUpdate()) { - - } - @if (isInstalled()) { - + } @else { + @if (!isInstalled()) { + + } @else if (hasUpdate()) { + + } + @if (isInstalled()) { + + } }
@@ -192,20 +198,26 @@
- @if (!isInstalled()) { - - } @else if (hasUpdate()) { - - } - @if (isInstalled()) { - + } @else { + @if (!isInstalled()) { + + } @else if (hasUpdate()) { + + } + @if (isInstalled()) { + + } }
diff --git a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-item-detail-dialog.component.scss b/ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-item-detail-dialog.component.scss similarity index 100% rename from ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-item-detail-dialog.component.scss rename to ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-item-detail-dialog.component.scss diff --git a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-item-detail-dialog.component.ts b/ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-item-detail-dialog.component.ts similarity index 96% rename from ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-item-detail-dialog.component.ts rename to ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-item-detail-dialog.component.ts index f2de08de2d..732bd80754 100644 --- a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-item-detail-dialog.component.ts +++ b/ui-ngx/src/app/modules/home/components/iot-hub/iot-hub-item-detail-dialog.component.ts @@ -24,17 +24,20 @@ import { IotHubApiService } from '@core/http/iot-hub-api.service'; import { TranslateService } from '@ngx-translate/core'; import { EntityType } from '@shared/models/entity-type.models'; import { getEntityDetailsPageURL } from '@core/utils'; -import { TbIotHubInstallDialogComponent, IotHubInstallDialogData } from './iot-hub-install-dialog.component'; -import { TbIotHubUpdateDialogComponent, IotHubUpdateDialogData } from './iot-hub-update-dialog.component'; -import { TbIotHubDeleteDialogComponent, IotHubDeleteDialogData } from './iot-hub-delete-dialog.component'; -import { TbDeviceInstallDialogComponent, DeviceInstallDialogData } from './device-install-dialog/device-install-dialog.component'; +import { TbIotHubInstallDialogComponent, IotHubInstallDialogData } from '@home/pages/iot-hub/iot-hub-install-dialog.component'; +import { TbIotHubUpdateDialogComponent, IotHubUpdateDialogData } from '@home/pages/iot-hub/iot-hub-update-dialog.component'; +import { TbIotHubDeleteDialogComponent, IotHubDeleteDialogData } from '@home/pages/iot-hub/iot-hub-delete-dialog.component'; +import { TbDeviceInstallDialogComponent, DeviceInstallDialogData } from '@home/pages/iot-hub/device-install-dialog/device-install-dialog.component'; import { SolutionInstallDialogComponent } from '@home/components/solution/solution-install-dialog.component'; import { SolutionTemplateInstalledItemDescriptor } from '@shared/models/iot-hub/iot-hub-installed-item.models'; +export type IotHubItemDetailDialogMode = 'default' | 'add'; + export interface IotHubItemDetailDialogData { item: MpItemVersionView; iotHubApiService: IotHubApiService; installedItem?: IotHubInstalledItem; + mode?: IotHubItemDetailDialogMode; } @Component({ @@ -47,6 +50,7 @@ export class TbIotHubItemDetailDialogComponent { readonly ItemType = ItemType; item: MpItemVersionView; + mode: IotHubItemDetailDialogMode; typeTranslations = itemTypeTranslations; readmeContent: string = ''; installedItem?: IotHubInstalledItem; @@ -64,6 +68,7 @@ export class TbIotHubItemDetailDialogComponent { private translate: TranslateService ) { this.item = data.item; + this.mode = data.mode || 'default'; this.installedItem = data.installedItem; this.categoryMap = getCategoriesForType(this.item.type); this.buildCarouselImages(); @@ -368,6 +373,10 @@ export class TbIotHubItemDetailDialogComponent { }); } + addItem(): void { + this.dialogRef.close({ action: 'add', item: this.item }); + } + close(): void { this.dialogRef.close(); } diff --git a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-browse.component.ts b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-browse.component.ts index 7ca9e02821..eaeb4ed0cf 100644 --- a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-browse.component.ts +++ b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-browse.component.ts @@ -31,7 +31,7 @@ import { IotHubApiService } from '@core/http/iot-hub-api.service'; import { MatDialog } from '@angular/material/dialog'; import { TranslateService } from '@ngx-translate/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { TbIotHubItemDetailDialogComponent, IotHubItemDetailDialogData } from './iot-hub-item-detail-dialog.component'; +import { TbIotHubItemDetailDialogComponent, IotHubItemDetailDialogData } from '@home/components/iot-hub/iot-hub-item-detail-dialog.component'; import { TbIotHubInstallDialogComponent, IotHubInstallDialogData } from './iot-hub-install-dialog.component'; import { TbIotHubUpdateDialogComponent, IotHubUpdateDialogData } from './iot-hub-update-dialog.component'; import { TbIotHubDeleteDialogComponent, IotHubDeleteDialogData } from './iot-hub-delete-dialog.component'; diff --git a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-home.component.html b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-home.component.html index 36cb09a5cd..8b468bc94e 100644 --- a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-home.component.html +++ b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-home.component.html @@ -54,7 +54,8 @@ [class.active]="activeHeroType === ht" [style.--keyword-color]="ht.color" (mouseenter)="onHeroTypeHover(ht)" - (mouseleave)="onHeroTypeLeave()">{{ ht.labelKey | translate }}@if (!last) {,} + (mouseleave)="onHeroTypeLeave()" + (click)="navigateToBrowse(ht.type)">{{ ht.labelKey | translate }}@if (!last) {,} @if (i === 2) { } diff --git a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-home.component.ts b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-home.component.ts index 00f49903b4..cc3fefd369 100644 --- a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-home.component.ts +++ b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-home.component.ts @@ -30,7 +30,7 @@ import { ItemType, itemTypeTranslations } from '@shared/models/iot-hub/iot-hub-i import { IotHubInstalledItem } from '@shared/models/iot-hub/iot-hub-installed-item.models'; import { IotHubApiService } from '@core/http/iot-hub-api.service'; import { TranslateService } from '@ngx-translate/core'; -import { TbIotHubItemDetailDialogComponent, IotHubItemDetailDialogData } from './iot-hub-item-detail-dialog.component'; +import { TbIotHubItemDetailDialogComponent, IotHubItemDetailDialogData } from '@home/components/iot-hub/iot-hub-item-detail-dialog.component'; import { TbIotHubInstallDialogComponent, IotHubInstallDialogData } from './iot-hub-install-dialog.component'; import { TbIotHubUpdateDialogComponent, IotHubUpdateDialogData } from './iot-hub-update-dialog.component'; import { TbIotHubDeleteDialogComponent, IotHubDeleteDialogData } from './iot-hub-delete-dialog.component'; diff --git a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-installed-items.component.ts b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-installed-items.component.ts index 8fedd5b827..631e1c15ff 100644 --- a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-installed-items.component.ts +++ b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-installed-items.component.ts @@ -33,7 +33,7 @@ import { IotHubInstalledItem, ItemPublishedVersionInfo } from '@shared/models/io import { ItemType, itemTypeTranslations } from '@shared/models/iot-hub/iot-hub-item.models'; import { EntityType } from '@shared/models/entity-type.models'; import { getEntityDetailsPageURL } from '@core/utils'; -import { TbIotHubItemDetailDialogComponent, IotHubItemDetailDialogData } from './iot-hub-item-detail-dialog.component'; +import { TbIotHubItemDetailDialogComponent, IotHubItemDetailDialogData } from '@home/components/iot-hub/iot-hub-item-detail-dialog.component'; import { TbIotHubUpdateDialogComponent, IotHubUpdateDialogData } from './iot-hub-update-dialog.component'; import { TbIotHubDeleteDialogComponent, IotHubDeleteDialogData } from './iot-hub-delete-dialog.component'; diff --git a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-search.component.ts b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-search.component.ts index b1b3252b7b..908227492c 100644 --- a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-search.component.ts +++ b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub-search.component.ts @@ -26,7 +26,7 @@ import { MpItemVersionQuery, MpItemVersionView } from '@shared/models/iot-hub/io import { ItemType, itemTypeTranslations } from '@shared/models/iot-hub/iot-hub-item.models'; import { IotHubInstalledItem } from '@shared/models/iot-hub/iot-hub-installed-item.models'; import { IotHubApiService } from '@core/http/iot-hub-api.service'; -import { TbIotHubItemDetailDialogComponent, IotHubItemDetailDialogData } from './iot-hub-item-detail-dialog.component'; +import { TbIotHubItemDetailDialogComponent, IotHubItemDetailDialogData } from '@home/components/iot-hub/iot-hub-item-detail-dialog.component'; import { TbIotHubInstallDialogComponent, IotHubInstallDialogData } from './iot-hub-install-dialog.component'; import { TbIotHubUpdateDialogComponent, IotHubUpdateDialogData } from './iot-hub-update-dialog.component'; import { TbIotHubDeleteDialogComponent, IotHubDeleteDialogData } from './iot-hub-delete-dialog.component'; diff --git a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub.module.ts b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub.module.ts index 9016dbe4ba..ac2bda4b50 100644 --- a/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub.module.ts +++ b/ui-ngx/src/app/modules/home/pages/iot-hub/iot-hub.module.ts @@ -22,7 +22,6 @@ import { TbIotHubHomeComponent } from './iot-hub-home.component'; import { TbIotHubItemsPageComponent } from './iot-hub-items-page.component'; import { TbIotHubBrowseComponent } from './iot-hub-browse.component'; import { TbIotHubCreatorProfileComponent } from './iot-hub-creator-profile.component'; -import { TbIotHubItemDetailDialogComponent } from './iot-hub-item-detail-dialog.component'; import { TbIotHubInstallDialogComponent } from './iot-hub-install-dialog.component'; import { TbIotHubItemCardComponent } from './iot-hub-item-card.component'; import { TbIotHubInstalledItemsComponent } from './iot-hub-installed-items.component'; @@ -37,7 +36,6 @@ import { TbIotHubSearchComponent } from './iot-hub-search.component'; TbIotHubItemsPageComponent, TbIotHubBrowseComponent, TbIotHubCreatorProfileComponent, - TbIotHubItemDetailDialogComponent, TbIotHubInstallDialogComponent, TbIotHubItemCardComponent, TbIotHubInstalledItemsComponent, diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json index 550ef19222..b41fe5adf2 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -3710,6 +3710,7 @@ "search-results": "Search results", "search-results-for": "Search results for ", "try-adjusting-search": "Try adjusting your search", + "add-widget-from-iot-hub": "Add widget from IoT Hub", "items-per-page": "Items per page", "filter": "Filter", "available": "Available",