diff --git a/ui-ngx/src/app/modules/home/pages/widget/widget-library.module.ts b/ui-ngx/src/app/modules/home/pages/widget/widget-library.module.ts
index f8a87d3960..fafb45d132 100644
--- a/ui-ngx/src/app/modules/home/pages/widget/widget-library.module.ts
+++ b/ui-ngx/src/app/modules/home/pages/widget/widget-library.module.ts
@@ -24,6 +24,7 @@ import { WidgetLibraryComponent } from './widget-library.component';
import { WidgetEditorComponent } from '@home/pages/widget/widget-editor.component';
import { SelectWidgetTypeDialogComponent } from '@home/pages/widget/select-widget-type-dialog.component';
import { SaveWidgetTypeAsDialogComponent } from './save-widget-type-as-dialog.component';
+import { WidgetsBundleTabsComponent } from '@home/pages/widget/widgets-bundle-tabs.component';
@NgModule({
declarations: [
@@ -31,7 +32,8 @@ import { SaveWidgetTypeAsDialogComponent } from './save-widget-type-as-dialog.co
WidgetLibraryComponent,
WidgetEditorComponent,
SelectWidgetTypeDialogComponent,
- SaveWidgetTypeAsDialogComponent
+ SaveWidgetTypeAsDialogComponent,
+ WidgetsBundleTabsComponent
],
imports: [
CommonModule,
diff --git a/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle-tabs.component.html b/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle-tabs.component.html
new file mode 100644
index 0000000000..0a90a829ee
--- /dev/null
+++ b/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle-tabs.component.html
@@ -0,0 +1,23 @@
+
+
+
+
diff --git a/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle-tabs.component.ts b/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle-tabs.component.ts
new file mode 100644
index 0000000000..00fef3adb8
--- /dev/null
+++ b/ui-ngx/src/app/modules/home/pages/widget/widgets-bundle-tabs.component.ts
@@ -0,0 +1,43 @@
+///
+/// Copyright © 2016-2022 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 { Component } from '@angular/core';
+import { Store } from '@ngrx/store';
+import { AppState } from '@core/core.state';
+import { EntityTabsComponent } from '../../components/entity/entity-tabs.component';
+import { WidgetsBundle } from '@shared/models/widgets-bundle.model';
+import { NULL_UUID } from '@shared/models/id/has-uuid';
+
+@Component({
+ selector: 'tb-widgets-bundle-tabs',
+ templateUrl: './widgets-bundle-tabs.component.html',
+ styleUrls: []
+})
+export class WidgetsBundleTabsComponent extends EntityTabsComponent {
+
+ constructor(protected store: Store) {
+ super(store);
+ }
+
+ isTenantWidgetsBundle() {
+ return this.entity && this.entity.tenantId.id !== NULL_UUID;
+ }
+
+ ngOnInit() {
+ super.ngOnInit();
+ }
+
+}
diff --git a/ui-ngx/src/app/modules/home/pages/widget/widgets-bundles-table-config.resolver.ts b/ui-ngx/src/app/modules/home/pages/widget/widgets-bundles-table-config.resolver.ts
index 9533af5782..b6b1396c11 100644
--- a/ui-ngx/src/app/modules/home/pages/widget/widgets-bundles-table-config.resolver.ts
+++ b/ui-ngx/src/app/modules/home/pages/widget/widgets-bundles-table-config.resolver.ts
@@ -39,6 +39,7 @@ import { DialogService } from '@core/services/dialog.service';
import { ImportExportService } from '@home/components/import-export/import-export.service';
import { Direction } from '@shared/models/page/sort-order';
import { map } from 'rxjs/operators';
+import { WidgetsBundleTabsComponent } from '@home/pages/widget/widgets-bundle-tabs.component';
@Injectable()
export class WidgetsBundlesTableConfigResolver implements Resolve> {
@@ -55,6 +56,7 @@ export class WidgetsBundlesTableConfigResolver implements Resolve = [
EntityType.DASHBOARD,
EntityType.CUSTOMER,
EntityType.DEVICE_PROFILE,
- EntityType.RULE_CHAIN
+ EntityType.RULE_CHAIN,
+ EntityType.WIDGETS_BUNDLE
];
export interface VersionCreateConfig {
diff --git a/ui-ngx/src/app/shared/models/widgets-bundle.model.ts b/ui-ngx/src/app/shared/models/widgets-bundle.model.ts
index 106438a591..235190ead2 100644
--- a/ui-ngx/src/app/shared/models/widgets-bundle.model.ts
+++ b/ui-ngx/src/app/shared/models/widgets-bundle.model.ts
@@ -14,11 +14,11 @@
/// limitations under the License.
///
-import { BaseData } from '@shared/models/base-data';
+import { BaseData, ExportableEntity } from '@shared/models/base-data';
import { TenantId } from '@shared/models/id/tenant-id';
import { WidgetsBundleId } from '@shared/models/id/widgets-bundle-id';
-export interface WidgetsBundle extends BaseData {
+export interface WidgetsBundle extends BaseData, ExportableEntity {
tenantId: TenantId;
alias: string;
title: string;
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 284fcaa763..19cd88b1a5 100644
--- a/ui-ngx/src/assets/locale/locale.constant-en_US.json
+++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json
@@ -1843,6 +1843,9 @@
"type-current-tenant": "Current Tenant",
"type-current-user": "Current User",
"type-current-user-owner": "Current User Owner",
+ "type-widgets-bundle": "Widgets bundle",
+ "type-widgets-bundles": "Widgets bundles",
+ "list-of-widgets-bundles": "{ count, plural, 1 {One widgets bundle} other {List of # widget bundles} }",
"search": "Search entities",
"selected-entities": "{ count, plural, 1 {1 entity} other {# entities} } selected",
"entity-name": "Entity name",