@c8y/ngx-components 1024.9.0 → 1024.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/fesm2022/c8y-ngx-components-ai-agents-scada.mjs +5 -12
  2. package/fesm2022/c8y-ngx-components-ai-agents-scada.mjs.map +1 -1
  3. package/fesm2022/c8y-ngx-components-application-select.mjs +86 -0
  4. package/fesm2022/c8y-ngx-components-application-select.mjs.map +1 -0
  5. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +55 -7
  6. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  7. package/fesm2022/c8y-ngx-components-dashboard-manager-devicemanagement.mjs +2 -1
  8. package/fesm2022/c8y-ngx-components-dashboard-manager-devicemanagement.mjs.map +1 -1
  9. package/fesm2022/c8y-ngx-components-dashboard-manager.mjs +281 -37
  10. package/fesm2022/c8y-ngx-components-dashboard-manager.mjs.map +1 -1
  11. package/fesm2022/c8y-ngx-components-widgets-implementations-scada.mjs +16 -2
  12. package/fesm2022/c8y-ngx-components-widgets-implementations-scada.mjs.map +1 -1
  13. package/locales/de.po +36 -12
  14. package/locales/es.po +36 -12
  15. package/locales/fr.po +36 -12
  16. package/locales/ja_JP.po +34 -12
  17. package/locales/ko.po +36 -12
  18. package/locales/locales.pot +33 -3
  19. package/locales/nl.po +36 -12
  20. package/locales/pl.po +36 -12
  21. package/locales/pt_BR.po +36 -12
  22. package/locales/zh_CN.po +36 -12
  23. package/locales/zh_TW.po +36 -12
  24. package/package.json +1 -1
  25. package/types/c8y-ngx-components-ai-agents-scada.d.ts +3 -7
  26. package/types/c8y-ngx-components-ai-agents-scada.d.ts.map +1 -1
  27. package/types/c8y-ngx-components-application-select.d.ts +31 -0
  28. package/types/c8y-ngx-components-application-select.d.ts.map +1 -0
  29. package/types/c8y-ngx-components-context-dashboard.d.ts +30 -6
  30. package/types/c8y-ngx-components-context-dashboard.d.ts.map +1 -1
  31. package/types/c8y-ngx-components-dashboard-manager.d.ts +76 -9
  32. package/types/c8y-ngx-components-dashboard-manager.d.ts.map +1 -1
  33. package/types/c8y-ngx-components-widgets-implementations-scada.d.ts +4 -1
  34. package/types/c8y-ngx-components-widgets-implementations-scada.d.ts.map +1 -1
@@ -74,7 +74,8 @@ const dashboardManagerFeatureProvider = [
74
74
  {
75
75
  path: `${DM_DASHBOARD_MANAGER_PATH}/type-dashboards`,
76
76
  component: TypeDashboardsListComponent,
77
- canActivate: [canActivateDashboardManager]
77
+ canActivate: [canActivateDashboardManager],
78
+ data: { strictAppFilter: true }
78
79
  }
79
80
  ]),
80
81
  hookNavigator(DashboardManagerNavigationFactory),
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-dashboard-manager-devicemanagement.mjs","sources":["../../dashboard-manager/devicemanagement/dashboard-manager-navigation.factory.ts","../../dashboard-manager/devicemanagement/dashboard-manager-tabs.factory.ts","../../dashboard-manager/devicemanagement/index.ts","../../dashboard-manager/devicemanagement/c8y-ngx-components-dashboard-manager-devicemanagement.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { NavigatorNode, NavigatorNodeFactory, PreviewService } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { map, Observable } from 'rxjs';\nimport { DM_DASHBOARD_MANAGER_PATH, DM_DASHBOARD_MANAGER_PREVIEW_KEY } from './index';\n\n@Injectable()\nexport class DashboardManagerNavigationFactory implements NavigatorNodeFactory {\n private readonly previewFeatureService = inject(PreviewService);\n\n get(): Observable<NavigatorNode[]> {\n return this.previewFeatureService.getState$(DM_DASHBOARD_MANAGER_PREVIEW_KEY).pipe(\n map(state => {\n if (state) {\n return [\n new NavigatorNode({\n parent: gettext('Management'),\n path: DM_DASHBOARD_MANAGER_PATH,\n label: gettext('Dashboard manager'),\n icon: 'management1',\n routerLinkExact: false,\n preventDuplicates: true,\n featureId: 'dashboardManager'\n })\n ];\n }\n return [];\n })\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Tab, TabFactory } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\n@Injectable()\nexport class DashboardManagerTabsFactory implements TabFactory {\n constructor(public router: Router) {}\n\n get() {\n const tabs: Tab[] = [];\n\n if (this.router.url.match(/\\/dashboard-manager/g)) {\n tabs.push({\n path: 'dashboard-manager/type-dashboards',\n priority: 1000,\n label: gettext('Type dashboards')\n } as Tab);\n }\n\n return tabs;\n }\n}\n","import { inject } from '@angular/core';\nimport {\n hookNavigator,\n hookPreview,\n hookRoute,\n hookTab,\n PreviewService\n} from '@c8y/ngx-components';\nimport { TypeDashboardsListComponent } from '@c8y/ngx-components/dashboard-manager';\nimport { first, Observable } from 'rxjs';\nimport { DashboardManagerNavigationFactory } from './dashboard-manager-navigation.factory';\nimport { DashboardManagerTabsFactory } from './dashboard-manager-tabs.factory';\n\nexport const DM_DASHBOARD_MANAGER_PREVIEW_KEY = 'ui.dm-dashboard-manager';\nexport const DM_DASHBOARD_MANAGER_PATH = 'dashboard-manager';\n\nexport function canActivateDashboardManager(): Observable<boolean> {\n const previewFeatureService = inject(PreviewService);\n return previewFeatureService.getState$(DM_DASHBOARD_MANAGER_PREVIEW_KEY).pipe(first());\n}\n\nexport const dashboardManagerFeatureProvider = [\n hookTab(DashboardManagerTabsFactory),\n hookRoute([\n {\n path: DM_DASHBOARD_MANAGER_PATH,\n redirectTo: `${DM_DASHBOARD_MANAGER_PATH}/type-dashboards`,\n pathMatch: 'full'\n },\n {\n path: `${DM_DASHBOARD_MANAGER_PATH}/type-dashboards`,\n component: TypeDashboardsListComponent,\n canActivate: [canActivateDashboardManager]\n }\n ]),\n hookNavigator(DashboardManagerNavigationFactory),\n hookPreview({\n key: DM_DASHBOARD_MANAGER_PREVIEW_KEY,\n label: 'Dashboard manager',\n description: () =>\n import('@c8y/style/markdown-files/dm-dashboard-manager-preview.md').then(m => m.default),\n settings: { reload: true }\n })\n];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"c8y-ngx-components-dashboard-manager-devicemanagement.mjs","sources":["../../dashboard-manager/devicemanagement/dashboard-manager-navigation.factory.ts","../../dashboard-manager/devicemanagement/dashboard-manager-tabs.factory.ts","../../dashboard-manager/devicemanagement/index.ts","../../dashboard-manager/devicemanagement/c8y-ngx-components-dashboard-manager-devicemanagement.ts"],"sourcesContent":["import { inject, Injectable } from '@angular/core';\nimport { NavigatorNode, NavigatorNodeFactory, PreviewService } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { map, Observable } from 'rxjs';\nimport { DM_DASHBOARD_MANAGER_PATH, DM_DASHBOARD_MANAGER_PREVIEW_KEY } from './index';\n\n@Injectable()\nexport class DashboardManagerNavigationFactory implements NavigatorNodeFactory {\n private readonly previewFeatureService = inject(PreviewService);\n\n get(): Observable<NavigatorNode[]> {\n return this.previewFeatureService.getState$(DM_DASHBOARD_MANAGER_PREVIEW_KEY).pipe(\n map(state => {\n if (state) {\n return [\n new NavigatorNode({\n parent: gettext('Management'),\n path: DM_DASHBOARD_MANAGER_PATH,\n label: gettext('Dashboard manager'),\n icon: 'management1',\n routerLinkExact: false,\n preventDuplicates: true,\n featureId: 'dashboardManager'\n })\n ];\n }\n return [];\n })\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { Tab, TabFactory } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\n@Injectable()\nexport class DashboardManagerTabsFactory implements TabFactory {\n constructor(public router: Router) {}\n\n get() {\n const tabs: Tab[] = [];\n\n if (this.router.url.match(/\\/dashboard-manager/g)) {\n tabs.push({\n path: 'dashboard-manager/type-dashboards',\n priority: 1000,\n label: gettext('Type dashboards')\n } as Tab);\n }\n\n return tabs;\n }\n}\n","import { inject } from '@angular/core';\nimport {\n hookNavigator,\n hookPreview,\n hookRoute,\n hookTab,\n PreviewService\n} from '@c8y/ngx-components';\nimport { TypeDashboardsListComponent } from '@c8y/ngx-components/dashboard-manager';\nimport { first, Observable } from 'rxjs';\nimport { DashboardManagerNavigationFactory } from './dashboard-manager-navigation.factory';\nimport { DashboardManagerTabsFactory } from './dashboard-manager-tabs.factory';\n\nexport const DM_DASHBOARD_MANAGER_PREVIEW_KEY = 'ui.dm-dashboard-manager';\nexport const DM_DASHBOARD_MANAGER_PATH = 'dashboard-manager';\n\nexport function canActivateDashboardManager(): Observable<boolean> {\n const previewFeatureService = inject(PreviewService);\n return previewFeatureService.getState$(DM_DASHBOARD_MANAGER_PREVIEW_KEY).pipe(first());\n}\n\nexport const dashboardManagerFeatureProvider = [\n hookTab(DashboardManagerTabsFactory),\n hookRoute([\n {\n path: DM_DASHBOARD_MANAGER_PATH,\n redirectTo: `${DM_DASHBOARD_MANAGER_PATH}/type-dashboards`,\n pathMatch: 'full'\n },\n {\n path: `${DM_DASHBOARD_MANAGER_PATH}/type-dashboards`,\n component: TypeDashboardsListComponent,\n canActivate: [canActivateDashboardManager],\n data: { strictAppFilter: true }\n }\n ]),\n hookNavigator(DashboardManagerNavigationFactory),\n hookPreview({\n key: DM_DASHBOARD_MANAGER_PREVIEW_KEY,\n label: 'Dashboard manager',\n description: () =>\n import('@c8y/style/markdown-files/dm-dashboard-manager-preview.md').then(m => m.default),\n settings: { reload: true }\n })\n];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,17 +1,26 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, EventEmitter, Output, Input, Component, HostListener, NgModule } from '@angular/core';
3
- import * as i2 from '@c8y/ngx-components';
4
- import { DataGridService, alertOnError, DataGridComponent, EmptyStateComponent, C8yTranslatePipe, ModalComponent, BaseColumn, getBasicInputArrayFormFieldConfig, Status, BuiltInActionType, TitleComponent, ExpandableRowDirective, ColumnDirective, CellRendererDefDirective, IconDirective, CoreModule, ModalModule, hookTab, hookRoute, hookNavigator, NavigatorNode } from '@c8y/ngx-components';
5
- import * as i3 from '@c8y/ngx-components/context-dashboard';
6
- import { TypeDashboardInfoComponent, ContextDashboardModule } from '@c8y/ngx-components/context-dashboard';
2
+ import { Injectable, signal, ChangeDetectionStrategy, Component, computed, EventEmitter, Output, Input, HostListener, inject, NgModule } from '@angular/core';
3
+ import * as i3 from '@c8y/ngx-components';
4
+ import { ModalComponent, FormGroupComponent, IconDirective, C8yTranslatePipe, FilterInputComponent, ListGroupComponent, ListItemComponent, ListItemCheckboxComponent, ListItemIconComponent, AppIconComponent, EmptyStateComponent, HumanizeAppNamePipe, DataGridService, alertOnError, DataGridComponent, BaseColumn, getBasicInputArrayFormFieldConfig, Status, BuiltInActionType, TitleComponent, ExpandableRowDirective, ColumnDirective, CellRendererDefDirective, ActionBarItemComponent, CoreModule, ModalModule, hookTab, hookRoute, hookNavigator, NavigatorNode } from '@c8y/ngx-components';
5
+ import { ApplicationSelectComponent } from '@c8y/ngx-components/application-select';
6
+ import * as i3$1 from '@c8y/ngx-components/context-dashboard';
7
+ import { APPLIED_TO_APPLICATIONS_FRAGMENT, applyEntitySharing, getSharedApplicationKeys, TypeDashboardInfoComponent, ContextDashboardModule } from '@c8y/ngx-components/context-dashboard';
7
8
  import { NameDeviceGridColumn, TypeDeviceGridColumn, GroupDeviceGridColumn, RegistrationDateDeviceGridColumn, DeviceGridModule } from '@c8y/ngx-components/device-grid';
8
9
  import { gettext } from '@c8y/ngx-components/gettext';
10
+ import * as i5 from 'ngx-bootstrap/tooltip';
9
11
  import { TooltipModule } from 'ngx-bootstrap/tooltip';
10
12
  import * as i1 from '@angular/router';
11
- import * as i1$1 from '@c8y/client';
13
+ import { ActivatedRoute } from '@angular/router';
14
+ import * as i4 from '@angular/forms';
15
+ import { FormsModule } from '@angular/forms';
16
+ import * as i2 from '@c8y/client';
12
17
  import { QueriesUtil } from '@c8y/client';
13
- import * as i1$2 from 'ngx-bootstrap/modal';
14
- import * as i3$1 from '@ngx-translate/core';
18
+ import * as i1$1 from 'ngx-bootstrap/modal';
19
+ import { AsyncPipe } from '@angular/common';
20
+ import * as i4$1 from '@c8y/ngx-components/ecosystem/shared';
21
+ import { uniqBy } from 'lodash-es';
22
+ import { firstValueFrom } from 'rxjs';
23
+ import * as i3$2 from '@ngx-translate/core';
15
24
 
16
25
  const DASHBOARD_MANAGER_PRODUCT_EXPERIENCE = {
17
26
  EVENTS: {
@@ -24,7 +33,8 @@ const DASHBOARD_MANAGER_PRODUCT_EXPERIENCE = {
24
33
  ACTIONS: {
25
34
  DELETE_TYPE_DASHBOARD: 'deleteTypeDashboard',
26
35
  EDIT_TYPE_DASHBOARD: 'editTypeDashboard',
27
- OPEN_DASHBOARD_INSTANCE_TO_EDIT: 'openDashboardInstanceToEdit'
36
+ OPEN_DASHBOARD_INSTANCE_TO_EDIT: 'openDashboardInstanceToEdit',
37
+ MANAGE_VISIBILITY: 'manageDashboardVisibility'
28
38
  }
29
39
  };
30
40
 
@@ -50,6 +60,138 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
50
60
  type: Injectable
51
61
  }], ctorParameters: () => [{ type: i1.Router }] });
52
62
 
63
+ class DashboardVisibilityModalComponent {
64
+ get currentAppKey() {
65
+ return this.appStateService.currentApplication.value?.key ?? '';
66
+ }
67
+ constructor(bsModalRef, inventory, appStateService, alertService) {
68
+ this.bsModalRef = bsModalRef;
69
+ this.inventory = inventory;
70
+ this.appStateService = appStateService;
71
+ this.alertService = alertService;
72
+ this.labels = { ok: gettext('Save'), cancel: gettext('Cancel') };
73
+ this.isSaving = signal(false, ...(ngDevMode ? [{ debugName: "isSaving" }] : /* istanbul ignore next */ []));
74
+ this.selectedAppKeys = [];
75
+ }
76
+ ngOnInit() {
77
+ this.selectedAppKeys = this.dashboard?.[APPLIED_TO_APPLICATIONS_FRAGMENT] ?? [];
78
+ }
79
+ async save() {
80
+ this.isSaving.set(true);
81
+ try {
82
+ const appKeys = [...new Set([this.currentAppKey, ...this.selectedAppKeys])].filter(Boolean);
83
+ await this.inventory.update({
84
+ id: this.dashboard.id,
85
+ [APPLIED_TO_APPLICATIONS_FRAGMENT]: appKeys
86
+ });
87
+ this.onSaved?.();
88
+ this.bsModalRef.hide();
89
+ }
90
+ catch {
91
+ this.alertService.danger(gettext('Failed to update dashboard visibility.'));
92
+ }
93
+ finally {
94
+ this.isSaving.set(false);
95
+ }
96
+ }
97
+ dismiss() {
98
+ this.bsModalRef.hide();
99
+ }
100
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DashboardVisibilityModalComponent, deps: [{ token: i1$1.BsModalRef }, { token: i2.InventoryService }, { token: i3.AppStateService }, { token: i3.AlertService }], target: i0.ɵɵFactoryTarget.Component }); }
101
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: DashboardVisibilityModalComponent, isStandalone: true, selector: "c8y-dashboard-visibility-modal", ngImport: i0, template: "<c8y-modal\n title=\"{{ 'Manage dashboard visibility' | translate }}\"\n [headerClasses]=\"'dialog-header'\"\n [labels]=\"labels\"\n [disabled]=\"isSaving()\"\n (onClose)=\"save()\"\n (onDismiss)=\"dismiss()\"\n>\n <ng-container c8y-modal-title>\n <i\n c8yIcon=\"share\"\n aria-hidden=\"true\"\n ></i>\n </ng-container>\n <div class=\"p-24\">\n <c8y-form-group>\n @let description =\n 'Select the applications in which \"{{name}}\" should be visible.'\n | translate: { name: dashboard.name };\n <p class=\"text-muted m-b-8\">{{ description }}</p>\n <c8y-application-select [(ngModel)]=\"selectedAppKeys\"></c8y-application-select>\n </c8y-form-group>\n </div>\n</c8y-modal>\n", dependencies: [{ kind: "component", type: ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: ApplicationSelectComponent, selector: "c8y-application-select" }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
102
+ }
103
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DashboardVisibilityModalComponent, decorators: [{
104
+ type: Component,
105
+ args: [{ selector: 'c8y-dashboard-visibility-modal', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
106
+ ModalComponent,
107
+ ApplicationSelectComponent,
108
+ FormGroupComponent,
109
+ IconDirective,
110
+ FormsModule,
111
+ C8yTranslatePipe
112
+ ], template: "<c8y-modal\n title=\"{{ 'Manage dashboard visibility' | translate }}\"\n [headerClasses]=\"'dialog-header'\"\n [labels]=\"labels\"\n [disabled]=\"isSaving()\"\n (onClose)=\"save()\"\n (onDismiss)=\"dismiss()\"\n>\n <ng-container c8y-modal-title>\n <i\n c8yIcon=\"share\"\n aria-hidden=\"true\"\n ></i>\n </ng-container>\n <div class=\"p-24\">\n <c8y-form-group>\n @let description =\n 'Select the applications in which \"{{name}}\" should be visible.'\n | translate: { name: dashboard.name };\n <p class=\"text-muted m-b-8\">{{ description }}</p>\n <c8y-application-select [(ngModel)]=\"selectedAppKeys\"></c8y-application-select>\n </c8y-form-group>\n </div>\n</c8y-modal>\n" }]
113
+ }], ctorParameters: () => [{ type: i1$1.BsModalRef }, { type: i2.InventoryService }, { type: i3.AppStateService }, { type: i3.AlertService }] });
114
+
115
+ class DataSharingModalComponent {
116
+ constructor(bsModalRef, applicationService, alertService, appStateService, ecosystemService) {
117
+ this.bsModalRef = bsModalRef;
118
+ this.applicationService = applicationService;
119
+ this.alertService = alertService;
120
+ this.appStateService = appStateService;
121
+ this.ecosystemService = ecosystemService;
122
+ this.initialKeys = [];
123
+ this.isSaving = signal(false, ...(ngDevMode ? [{ debugName: "isSaving" }] : /* istanbul ignore next */ []));
124
+ this.availableApps = signal([], ...(ngDevMode ? [{ debugName: "availableApps" }] : /* istanbul ignore next */ []));
125
+ this.selectedKeys = signal([], ...(ngDevMode ? [{ debugName: "selectedKeys" }] : /* istanbul ignore next */ []));
126
+ this.filterTerm = signal('', ...(ngDevMode ? [{ debugName: "filterTerm" }] : /* istanbul ignore next */ []));
127
+ this.filteredApps = computed(() => {
128
+ const term = this.filterTerm().toLowerCase();
129
+ return !term
130
+ ? this.availableApps()
131
+ : this.availableApps().filter(app => app.name?.toLowerCase().includes(term) || app.key?.toLowerCase().includes(term));
132
+ }, ...(ngDevMode ? [{ debugName: "filteredApps" }] : /* istanbul ignore next */ []));
133
+ }
134
+ async ngOnInit() {
135
+ const currentAppKey = this.appStateService.currentApplication.value?.key;
136
+ const apps = await this.ecosystemService.getWebApplications();
137
+ this.availableApps.set(
138
+ // Only show apps that include the Dashboard Manager module. Data sharing
139
+ // currently only affects type dashboards, so sharing with an app that has
140
+ // no Dashboard Manager would have no visible effect. Remove this check if
141
+ // data sharing is extended to cover other cross-app features.
142
+ uniqBy(apps, 'key').filter(app => app.key && app.key !== currentAppKey && this.hasDashboardManager(app)));
143
+ this.selectedKeys.set([...this.initialKeys]);
144
+ }
145
+ toggleSelection(selected, app) {
146
+ this.selectedKeys.update(keys => selected ? [...keys, app.key] : keys.filter(k => k !== app.key));
147
+ }
148
+ async save() {
149
+ this.isSaving.set(true);
150
+ try {
151
+ const currentSharing = this.appStateService.currentApplication.value?.dataSharing;
152
+ const dataSharing = applyEntitySharing(currentSharing, 'dashboard', this.selectedKeys());
153
+ const { data: updatedApp } = await this.applicationService.update({
154
+ id: this.appId,
155
+ dataSharing
156
+ });
157
+ this.appStateService.currentApplication.next(updatedApp);
158
+ this.onSaved?.();
159
+ this.alertService.success(gettext('Data sharing settings saved.'));
160
+ this.bsModalRef.hide();
161
+ }
162
+ catch (ex) {
163
+ this.alertService.addServerFailure(ex);
164
+ }
165
+ finally {
166
+ this.isSaving.set(false);
167
+ }
168
+ }
169
+ dismiss() {
170
+ this.bsModalRef.hide();
171
+ }
172
+ hasDashboardManager(app) {
173
+ return (app.manifest?.exports ?? []).some(exp => exp.module === 'DashboardManagerModule' || exp.module === 'dashboardManagerFeatureProvider');
174
+ }
175
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DataSharingModalComponent, deps: [{ token: i1$1.BsModalRef }, { token: i2.ApplicationService }, { token: i3.AlertService }, { token: i3.AppStateService }, { token: i4$1.EcosystemService }], target: i0.ɵɵFactoryTarget.Component }); }
176
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: DataSharingModalComponent, isStandalone: true, selector: "c8y-data-sharing-modal", ngImport: i0, template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i\n c8yIcon=\"share\"\n aria-hidden=\"true\"\n ></i>\n <div\n class=\"modal-title h4\"\n id=\"modal-title\"\n >\n {{ 'Data sharing' | translate }}\n </div>\n </div>\n\n <div\n class=\"inner-scroll\"\n id=\"modal-body\"\n >\n <div class=\"p-16 separator-bottom sticky-top bg-component\">\n @let description =\n 'Select applications whose dashboards should also be visible in \"{{name}}\".'\n | translate: { name: appName };\n <p class=\"text-muted m-b-8\">{{ description }}</p>\n <c8y-filter (onSearch)=\"filterTerm.set($event)\"></c8y-filter>\n </div>\n\n @if (filteredApps().length) {\n <c8y-list-group>\n @for (app of filteredApps(); track app.id) {\n <c8y-li>\n <c8y-li-checkbox\n [selected]=\"selectedKeys().includes(app.key)\"\n (onSelect)=\"toggleSelection($event, app)\"\n ></c8y-li-checkbox>\n <c8y-li-icon class=\"p-l-0 icon-32\">\n <c8y-app-icon\n class=\"list-group-icon\"\n [app]=\"app\"\n [contextPath]=\"app.contextPath\"\n [name]=\"app.name\"\n ></c8y-app-icon>\n </c8y-li-icon>\n <div>\n <p class=\"text-medium\">{{ app | humanizeAppName | async }}</p>\n @if (app.description) {\n <p class=\"small text-muted\">{{ app.description }}</p>\n }\n </div>\n </c8y-li>\n }\n </c8y-list-group>\n } @else {\n <c8y-ui-empty-state\n [icon]=\"'c8y-modules'\"\n [title]=\"'No applications available.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\n </div>\n\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"dismiss()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n [disabled]=\"isSaving()\"\n (click)=\"save()\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: FilterInputComponent, selector: "c8y-filter", inputs: ["icon", "filterTerm"], outputs: ["onSearch"] }, { kind: "component", type: ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: ListItemCheckboxComponent, selector: "c8y-list-item-checkbox, c8y-li-checkbox", inputs: ["selected", "indeterminate", "disabled", "displayAsSwitch"], outputs: ["onSelect"] }, { kind: "component", type: ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: AppIconComponent, selector: "c8y-app-icon", inputs: ["contextPath", "name", "app"] }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: HumanizeAppNamePipe, name: "humanizeAppName" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
177
+ }
178
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DataSharingModalComponent, decorators: [{
179
+ type: Component,
180
+ args: [{ selector: 'c8y-data-sharing-modal', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
181
+ AsyncPipe,
182
+ C8yTranslatePipe,
183
+ IconDirective,
184
+ FilterInputComponent,
185
+ ListGroupComponent,
186
+ ListItemComponent,
187
+ ListItemCheckboxComponent,
188
+ ListItemIconComponent,
189
+ AppIconComponent,
190
+ HumanizeAppNamePipe,
191
+ EmptyStateComponent
192
+ ], template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i\n c8yIcon=\"share\"\n aria-hidden=\"true\"\n ></i>\n <div\n class=\"modal-title h4\"\n id=\"modal-title\"\n >\n {{ 'Data sharing' | translate }}\n </div>\n </div>\n\n <div\n class=\"inner-scroll\"\n id=\"modal-body\"\n >\n <div class=\"p-16 separator-bottom sticky-top bg-component\">\n @let description =\n 'Select applications whose dashboards should also be visible in \"{{name}}\".'\n | translate: { name: appName };\n <p class=\"text-muted m-b-8\">{{ description }}</p>\n <c8y-filter (onSearch)=\"filterTerm.set($event)\"></c8y-filter>\n </div>\n\n @if (filteredApps().length) {\n <c8y-list-group>\n @for (app of filteredApps(); track app.id) {\n <c8y-li>\n <c8y-li-checkbox\n [selected]=\"selectedKeys().includes(app.key)\"\n (onSelect)=\"toggleSelection($event, app)\"\n ></c8y-li-checkbox>\n <c8y-li-icon class=\"p-l-0 icon-32\">\n <c8y-app-icon\n class=\"list-group-icon\"\n [app]=\"app\"\n [contextPath]=\"app.contextPath\"\n [name]=\"app.name\"\n ></c8y-app-icon>\n </c8y-li-icon>\n <div>\n <p class=\"text-medium\">{{ app | humanizeAppName | async }}</p>\n @if (app.description) {\n <p class=\"small text-muted\">{{ app.description }}</p>\n }\n </div>\n </c8y-li>\n }\n </c8y-list-group>\n } @else {\n <c8y-ui-empty-state\n [icon]=\"'c8y-modules'\"\n [title]=\"'No applications available.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\n </div>\n\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"dismiss()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n [disabled]=\"isSaving()\"\n (click)=\"save()\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</div>\n" }]
193
+ }], ctorParameters: () => [{ type: i1$1.BsModalRef }, { type: i2.ApplicationService }, { type: i3.AlertService }, { type: i3.AppStateService }, { type: i4$1.EcosystemService }] });
194
+
53
195
  class BasicNameDeviceGridColumn extends NameDeviceGridColumn {
54
196
  constructor(initialColumnConfig) {
55
197
  super(initialColumnConfig);
@@ -116,7 +258,7 @@ class TypeDashboardAssetsGridService extends DataGridService {
116
258
  fullQuery = this.queriesUtil.addAndFilter(fullQuery, query);
117
259
  return this.queriesUtil.buildQuery(fullQuery);
118
260
  }
119
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TypeDashboardAssetsGridService, deps: [{ token: i1$1.InventoryService }, { token: i2.UserPreferencesService }], target: i0.ɵɵFactoryTarget.Injectable }); }
261
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TypeDashboardAssetsGridService, deps: [{ token: i2.InventoryService }, { token: i3.UserPreferencesService }], target: i0.ɵɵFactoryTarget.Injectable }); }
120
262
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TypeDashboardAssetsGridService, providedIn: 'root' }); }
121
263
  }
122
264
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TypeDashboardAssetsGridService, decorators: [{
@@ -124,7 +266,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
124
266
  args: [{
125
267
  providedIn: 'root'
126
268
  }]
127
- }], ctorParameters: () => [{ type: i1$1.InventoryService }, { type: i2.UserPreferencesService }] });
269
+ }], ctorParameters: () => [{ type: i2.InventoryService }, { type: i3.UserPreferencesService }] });
128
270
 
129
271
  class TypeDashboardTargetAssetsGridComponent {
130
272
  constructor(router, assetsGridService, contextDashboardService, gainsightService) {
@@ -180,13 +322,13 @@ class TypeDashboardTargetAssetsGridComponent {
180
322
  action: DASHBOARD_MANAGER_PRODUCT_EXPERIENCE.ACTIONS.OPEN_DASHBOARD_INSTANCE_TO_EDIT
181
323
  });
182
324
  }
183
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TypeDashboardTargetAssetsGridComponent, deps: [{ token: i1.Router }, { token: TypeDashboardAssetsGridService }, { token: i3.ContextDashboardService }, { token: i2.GainsightService }], target: i0.ɵɵFactoryTarget.Component }); }
325
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TypeDashboardTargetAssetsGridComponent, deps: [{ token: i1.Router }, { token: TypeDashboardAssetsGridService }, { token: i3$1.ContextDashboardService }, { token: i3.GainsightService }], target: i0.ɵɵFactoryTarget.Component }); }
184
326
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: TypeDashboardTargetAssetsGridComponent, isStandalone: true, selector: "c8y-type-dashboard-target-assets-grid", inputs: { dashboard: "dashboard" }, outputs: { onNavigateToAsset: "onNavigateToAsset" }, ngImport: i0, template: "<c8y-data-grid\n [title]=\"''\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel\"\n [loadingItemsLabel]=\"loadingItemsLabel\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [infiniteScroll]=\"'auto'\"\n [actionControls]=\"actionControls\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [showSearch]=\"true\"\n>\n <c8y-ui-empty-state\n [icon]=\"'search'\"\n [title]=\"'No results to display.' | translate\"\n [subtitle]=\"'Refine your search terms.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n</c8y-data-grid>\n", dependencies: [{ kind: "component", type: DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "loading", "columns", "rows", "pagination", "childNodePagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows", "treeGrid", "hideReload", "childNodesProperty", "parentNodeLabelProperty"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
185
327
  }
186
328
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TypeDashboardTargetAssetsGridComponent, decorators: [{
187
329
  type: Component,
188
330
  args: [{ selector: 'c8y-type-dashboard-target-assets-grid', imports: [DataGridComponent, EmptyStateComponent, C8yTranslatePipe], template: "<c8y-data-grid\n [title]=\"''\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel\"\n [loadingItemsLabel]=\"loadingItemsLabel\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [infiniteScroll]=\"'auto'\"\n [actionControls]=\"actionControls\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [showSearch]=\"true\"\n>\n <c8y-ui-empty-state\n [icon]=\"'search'\"\n [title]=\"'No results to display.' | translate\"\n [subtitle]=\"'Refine your search terms.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n</c8y-data-grid>\n" }]
189
- }], ctorParameters: () => [{ type: i1.Router }, { type: TypeDashboardAssetsGridService }, { type: i3.ContextDashboardService }, { type: i2.GainsightService }], propDecorators: { dashboard: [{
331
+ }], ctorParameters: () => [{ type: i1.Router }, { type: TypeDashboardAssetsGridService }, { type: i3$1.ContextDashboardService }, { type: i3.GainsightService }], propDecorators: { dashboard: [{
190
332
  type: Input
191
333
  }], onNavigateToAsset: [{
192
334
  type: Output
@@ -205,13 +347,13 @@ class TypeDashboardTargetAssetsModalComponent {
205
347
  close() {
206
348
  this.bsModalRef.hide();
207
349
  }
208
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TypeDashboardTargetAssetsModalComponent, deps: [{ token: i1$2.BsModalRef }], target: i0.ɵɵFactoryTarget.Component }); }
350
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TypeDashboardTargetAssetsModalComponent, deps: [{ token: i1$1.BsModalRef }], target: i0.ɵɵFactoryTarget.Component }); }
209
351
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: TypeDashboardTargetAssetsModalComponent, isStandalone: true, selector: "c8y-type-dashboard-target-assets-modal", inputs: { dashboard: "dashboard" }, host: { listeners: { "document:keydown": "handleKeyboardEvent($event)" } }, ngImport: i0, template: "<c8y-modal\n title=\"{{ 'Select dashboard instance to edit' | translate }}\"\n (onClose)=\"close()\"\n (onDismiss)=\"close()\"\n [labels]=\"labels\"\n [disabled]=\"true\"\n [headerClasses]=\"'has-data-grid'\"\n>\n <c8y-type-dashboard-target-assets-grid\n [dashboard]=\"dashboard\"\n (onNavigateToAsset)=\"close()\"\n ></c8y-type-dashboard-target-assets-grid>\n</c8y-modal>\n", dependencies: [{ kind: "component", type: ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: TypeDashboardTargetAssetsGridComponent, selector: "c8y-type-dashboard-target-assets-grid", inputs: ["dashboard"], outputs: ["onNavigateToAsset"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
210
352
  }
211
353
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TypeDashboardTargetAssetsModalComponent, decorators: [{
212
354
  type: Component,
213
355
  args: [{ selector: 'c8y-type-dashboard-target-assets-modal', imports: [ModalComponent, TypeDashboardTargetAssetsGridComponent, C8yTranslatePipe], template: "<c8y-modal\n title=\"{{ 'Select dashboard instance to edit' | translate }}\"\n (onClose)=\"close()\"\n (onDismiss)=\"close()\"\n [labels]=\"labels\"\n [disabled]=\"true\"\n [headerClasses]=\"'has-data-grid'\"\n>\n <c8y-type-dashboard-target-assets-grid\n [dashboard]=\"dashboard\"\n (onNavigateToAsset)=\"close()\"\n ></c8y-type-dashboard-target-assets-grid>\n</c8y-modal>\n" }]
214
- }], ctorParameters: () => [{ type: i1$2.BsModalRef }], propDecorators: { dashboard: [{
356
+ }], ctorParameters: () => [{ type: i1$1.BsModalRef }], propDecorators: { dashboard: [{
215
357
  type: Input
216
358
  }], handleKeyboardEvent: [{
217
359
  type: HostListener,
@@ -309,16 +451,16 @@ class DashboardManagerService extends DataGridService {
309
451
  currentPage: 1
310
452
  };
311
453
  }
312
- async getData(columns, pagination, text) {
313
- const filters = this.getFilters(columns, pagination, text);
454
+ async getData(columns, pagination, text, strictAppFilter = false) {
455
+ const filters = this.getFilters(columns, pagination, text, strictAppFilter);
314
456
  return await this.inventory.list(filters);
315
457
  }
316
- async getTotal() {
458
+ async getTotal(strictAppFilter = false) {
317
459
  const query = this.queriesUtil.buildQuery({
318
460
  __filter: {
319
461
  __and: [
320
462
  this.baseTypeDashboardsFilter.__filter,
321
- this.contextDashboardService.appliedToFilter()
463
+ this.contextDashboardService.appliedToFilter(strictAppFilter)
322
464
  ]
323
465
  }
324
466
  });
@@ -345,13 +487,13 @@ class DashboardManagerService extends DataGridService {
345
487
  await this.inventory.delete(dashboard);
346
488
  onSuccess();
347
489
  }
348
- catch (ex) {
490
+ catch {
349
491
  // intended empty
350
492
  }
351
493
  }
352
- getFilters(columns, pagination, text) {
494
+ getFilters(columns, pagination, text, strictAppFilter = false) {
353
495
  return {
354
- query: this.getQueryString(columns),
496
+ query: this.getQueryString(columns, strictAppFilter),
355
497
  ...(text && { text }),
356
498
  pageSize: pagination.pageSize,
357
499
  currentPage: pagination.currentPage,
@@ -359,15 +501,15 @@ class DashboardManagerService extends DataGridService {
359
501
  withTotalElements: true
360
502
  };
361
503
  }
362
- getQueryString(columns) {
504
+ getQueryString(columns, strictAppFilter = false) {
363
505
  const queryFromColumns = this.getQueryObj(columns);
364
506
  const base = this.queriesUtil.addAndFilter(queryFromColumns, this.baseTypeDashboardsFilter);
365
507
  const withAppliedTo = this.queriesUtil.addAndFilter(base, {
366
- __filter: this.contextDashboardService.appliedToFilter()
508
+ __filter: this.contextDashboardService.appliedToFilter(strictAppFilter)
367
509
  });
368
510
  return this.queriesUtil.buildQuery(withAppliedTo);
369
511
  }
370
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DashboardManagerService, deps: [{ token: i1$1.InventoryService }, { token: i2.UserPreferencesService }, { token: i2.ModalService }, { token: i3$1.TranslateService }, { token: i3.ContextDashboardService }], target: i0.ɵɵFactoryTarget.Injectable }); }
512
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DashboardManagerService, deps: [{ token: i2.InventoryService }, { token: i3.UserPreferencesService }, { token: i3.ModalService }, { token: i3$2.TranslateService }, { token: i3$1.ContextDashboardService }], target: i0.ɵɵFactoryTarget.Injectable }); }
371
513
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DashboardManagerService, providedIn: 'root' }); }
372
514
  }
373
515
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DashboardManagerService, decorators: [{
@@ -375,13 +517,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
375
517
  args: [{
376
518
  providedIn: 'root'
377
519
  }]
378
- }], ctorParameters: () => [{ type: i1$1.InventoryService }, { type: i2.UserPreferencesService }, { type: i2.ModalService }, { type: i3$1.TranslateService }, { type: i3.ContextDashboardService }] });
520
+ }], ctorParameters: () => [{ type: i2.InventoryService }, { type: i3.UserPreferencesService }, { type: i3.ModalService }, { type: i3$2.TranslateService }, { type: i3$1.ContextDashboardService }] });
379
521
 
380
522
  class TypeDashboardsListComponent {
381
- constructor(dashboardManagerService, bsModalService, gainsightService) {
523
+ constructor(dashboardManagerService, bsModalService, gainsightService, appStateService, ecosystemService) {
382
524
  this.dashboardManagerService = dashboardManagerService;
383
525
  this.bsModalService = bsModalService;
384
526
  this.gainsightService = gainsightService;
527
+ this.appStateService = appStateService;
528
+ this.ecosystemService = ecosystemService;
385
529
  this.title = gettext('Type dashboards');
386
530
  this.loadMoreItemsLabel = gettext('Load more dashboards');
387
531
  this.loadingItemsLabel = gettext('Loading dashboards…');
@@ -393,12 +537,33 @@ class TypeDashboardsListComponent {
393
537
  text: gettext('Edit dashboard'),
394
538
  callback: item => this.openTargetAssetsModal(item)
395
539
  },
540
+ {
541
+ type: 'manageVisibility',
542
+ icon: 'share',
543
+ text: gettext('Manage visibility'),
544
+ showIf: (item) => {
545
+ const appliedTo = item[APPLIED_TO_APPLICATIONS_FRAGMENT] || [];
546
+ return appliedTo.includes(this.appStateService.currentApplication.value?.key);
547
+ },
548
+ callback: item => this.openVisibilityModal(item)
549
+ },
396
550
  {
397
551
  type: BuiltInActionType.Delete,
398
552
  text: gettext('Delete dashboard'),
399
553
  callback: item => this.delete(item)
400
554
  }
401
555
  ];
556
+ this.isAppOwner = false;
557
+ this.dataSharingKeys = [];
558
+ this.sharingAppsMap = new Map();
559
+ this.humanizeAppName = inject(HumanizeAppNamePipe);
560
+ this.route = inject(ActivatedRoute);
561
+ /**
562
+ * Set via route `data.strictAppFilter`. When `true`, legacy dashboards with
563
+ * no `c8y_AppliedToApplications` fragment are excluded from the list instead
564
+ * of being shown in every app.
565
+ */
566
+ this.strictAppFilter = !!this.route.snapshot.data.strictAppFilter;
402
567
  this.displayOptions = {
403
568
  striped: true,
404
569
  bordered: false,
@@ -409,6 +574,57 @@ class TypeDashboardsListComponent {
409
574
  this.refresh = new EventEmitter();
410
575
  this.serverSideDataCallback = this.onDataSourceModifier.bind(this);
411
576
  }
577
+ async ngOnInit() {
578
+ await this.loadDataSharing();
579
+ }
580
+ async loadDataSharing() {
581
+ const currentApp = this.appStateService.currentApplication.value;
582
+ if (!currentApp?.id) {
583
+ return;
584
+ }
585
+ this.isAppOwner = this.appStateService.isOwnerOfApplication(currentApp);
586
+ this.dataSharingKeys = getSharedApplicationKeys(currentApp.dataSharing, 'dashboard');
587
+ if (this.dataSharingKeys.length) {
588
+ const apps = await this.ecosystemService.getWebApplications();
589
+ const entries = await Promise.all(apps
590
+ .filter(app => app.key && this.dataSharingKeys.includes(app.key))
591
+ .map(async (app) => [app.key, await firstValueFrom(this.humanizeAppName.transform(app))]));
592
+ this.sharingAppsMap = new Map(entries);
593
+ }
594
+ }
595
+ getSourceAppName(dashboard) {
596
+ const appliedTo = dashboard[APPLIED_TO_APPLICATIONS_FRAGMENT] ?? [];
597
+ const currentKey = this.appStateService.currentApplication.value?.key;
598
+ if (!appliedTo.length || appliedTo.includes(currentKey)) {
599
+ return null;
600
+ }
601
+ for (const key of appliedTo) {
602
+ const name = this.sharingAppsMap.get(key);
603
+ if (name)
604
+ return name;
605
+ }
606
+ return null;
607
+ }
608
+ async openDataSharingModal() {
609
+ const currentApp = this.appStateService.currentApplication.value;
610
+ const appName = await firstValueFrom(this.humanizeAppName.transform(currentApp));
611
+ const initialState = {
612
+ appId: currentApp.id,
613
+ appName,
614
+ initialKeys: this.dataSharingKeys,
615
+ onSaved: async () => {
616
+ await this.loadDataSharing();
617
+ this.refresh.emit();
618
+ }
619
+ };
620
+ this.bsModalService.show(DataSharingModalComponent, {
621
+ class: 'modal-sm',
622
+ ariaDescribedby: 'modal-body',
623
+ ariaLabelledBy: 'modal-title',
624
+ ignoreBackdropClick: true,
625
+ initialState
626
+ });
627
+ }
412
628
  async delete(dashboard) {
413
629
  await this.dashboardManagerService.delete(dashboard, () => this.refresh.emit());
414
630
  }
@@ -426,13 +642,30 @@ class TypeDashboardsListComponent {
426
642
  action: DASHBOARD_MANAGER_PRODUCT_EXPERIENCE.ACTIONS.EDIT_TYPE_DASHBOARD
427
643
  });
428
644
  }
645
+ openVisibilityModal(dashboard) {
646
+ const initialState = {
647
+ dashboard,
648
+ onSaved: () => this.refresh.emit()
649
+ };
650
+ this.bsModalService.show(DashboardVisibilityModalComponent, {
651
+ class: 'modal-sm',
652
+ ariaDescribedby: 'modal-body',
653
+ ariaLabelledBy: 'modal-title',
654
+ ignoreBackdropClick: true,
655
+ initialState
656
+ });
657
+ this.gainsightService.triggerEvent(DASHBOARD_MANAGER_PRODUCT_EXPERIENCE.EVENTS.DASHBOARD_TEMPLATE, {
658
+ component: DASHBOARD_MANAGER_PRODUCT_EXPERIENCE.COMPONENTS.TYPE_DASHBOARDS_LIST,
659
+ action: DASHBOARD_MANAGER_PRODUCT_EXPERIENCE.ACTIONS.MANAGE_VISIBILITY
660
+ });
661
+ }
429
662
  trackByName(_index, column) {
430
663
  return column.name;
431
664
  }
432
665
  async onDataSourceModifier(dataSourceModifier) {
433
- const { res, data, paging } = await alertOnError(this.dashboardManagerService.getData(dataSourceModifier.columns, dataSourceModifier.pagination, dataSourceModifier.searchText));
666
+ const { res, data, paging } = await alertOnError(this.dashboardManagerService.getData(dataSourceModifier.columns, dataSourceModifier.pagination, dataSourceModifier.searchText, this.strictAppFilter));
434
667
  const filteredSize = paging.totalElements;
435
- const size = await alertOnError(this.dashboardManagerService.getTotal());
668
+ const size = await alertOnError(this.dashboardManagerService.getTotal(this.strictAppFilter));
436
669
  return {
437
670
  res,
438
671
  data,
@@ -441,8 +674,8 @@ class TypeDashboardsListComponent {
441
674
  size
442
675
  };
443
676
  }
444
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TypeDashboardsListComponent, deps: [{ token: DashboardManagerService }, { token: i1$2.BsModalService }, { token: i2.GainsightService }], target: i0.ɵɵFactoryTarget.Component }); }
445
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.17", type: TypeDashboardsListComponent, isStandalone: true, selector: "c8y-dashboard-manager", ngImport: i0, template: "<c8y-title>\n {{ 'Dashboard manager' | translate }}\n</c8y-title>\n\n<div class=\"content-fullpage d-flex d-col border-top border-bottom\">\n <c8y-data-grid\n [title]=\"title\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel\"\n [loadingItemsLabel]=\"loadingItemsLabel\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [infiniteScroll]=\"'auto'\"\n [actionControls]=\"actionControls\"\n [showSearch]=\"true\"\n [displayOptions]=\"displayOptions\"\n [refresh]=\"refresh\"\n [expandableRows]=\"'ASYNC'\"\n >\n <div\n *c8yExpandableRow=\"\n let context;\n let asyncRenderSuccess = asyncRenderSuccess;\n let asyncRenderFail = asyncRenderFail\n \"\n >\n <c8y-type-dashboard-info\n [context]=\"context\"\n [asyncRenderSuccess]=\"asyncRenderSuccess\"\n [asyncRenderFail]=\"asyncRenderFail\"\n ></c8y-type-dashboard-info>\n </div>\n\n <c8y-ui-empty-state\n [icon]=\"'search'\"\n [title]=\"'No matching dashboards.' | translate\"\n [subtitle]=\"'Refine your search terms' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n\n <c8y-column name=\"icon\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <i [c8yIcon]=\"context.value\"></i>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"deviceTypeValue\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span class=\"label label-info\">\n {{ context.value }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"name\">\n <ng-container *c8yCellRendererDef=\"let context\">\n @let dashboardItem = context.item.c8y_Dashboard;\n @let dashboardName =\n dashboardItem.translateDashboardTitle\n ? (dashboardItem.name | translate)\n : dashboardItem.name;\n\n {{ dashboardName }}\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n", dependencies: [{ kind: "component", type: TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "component", type: DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "loading", "columns", "rows", "pagination", "childNodePagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows", "treeGrid", "hideReload", "childNodesProperty", "parentNodeLabelProperty"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "directive", type: ExpandableRowDirective, selector: "[c8yExpandableRow]" }, { kind: "component", type: TypeDashboardInfoComponent, selector: "c8y-type-dashboard-info", inputs: ["deviceTypeValue", "displayDeviceTypeValue", "context", "asyncRenderSuccess", "asyncRenderFail"] }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "directive", type: CellRendererDefDirective, selector: "[c8yCellRendererDef]" }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
677
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TypeDashboardsListComponent, deps: [{ token: DashboardManagerService }, { token: i1$1.BsModalService }, { token: i3.GainsightService }, { token: i3.AppStateService }, { token: i4$1.EcosystemService }], target: i0.ɵɵFactoryTarget.Component }); }
678
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: TypeDashboardsListComponent, isStandalone: true, selector: "c8y-dashboard-manager", ngImport: i0, template: "<c8y-title>\n {{ 'Dashboard manager' | translate }}\n</c8y-title>\n\n@if (isAppOwner) {\n <c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Data sharing' | translate }}\"\n type=\"button\"\n (click)=\"openDataSharingModal()\"\n >\n <i\n c8yIcon=\"share\"\n aria-hidden=\"true\"\n ></i>\n {{ 'Data sharing' | translate }}\n </button>\n </c8y-action-bar-item>\n}\n\n<div class=\"content-fullpage d-flex d-col border-top border-bottom\">\n <c8y-data-grid\n [title]=\"title\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel\"\n [loadingItemsLabel]=\"loadingItemsLabel\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [infiniteScroll]=\"'auto'\"\n [actionControls]=\"actionControls\"\n [showSearch]=\"true\"\n [displayOptions]=\"displayOptions\"\n [refresh]=\"refresh\"\n [expandableRows]=\"'ASYNC'\"\n >\n <div\n *c8yExpandableRow=\"\n let context;\n let asyncRenderSuccess = asyncRenderSuccess;\n let asyncRenderFail = asyncRenderFail\n \"\n >\n <c8y-type-dashboard-info\n [context]=\"context\"\n [asyncRenderSuccess]=\"asyncRenderSuccess\"\n [asyncRenderFail]=\"asyncRenderFail\"\n ></c8y-type-dashboard-info>\n </div>\n\n <c8y-ui-empty-state\n [icon]=\"'search'\"\n [title]=\"'No matching dashboards.' | translate\"\n [subtitle]=\"'Refine your search terms' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n\n <c8y-column name=\"icon\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <i [c8yIcon]=\"context.value\"></i>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"deviceTypeValue\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span class=\"label label-info\">\n {{ context.value }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"name\">\n <ng-container *c8yCellRendererDef=\"let context\">\n @let dashboardItem = context.item.c8y_Dashboard;\n @let dashboardName =\n dashboardItem.translateDashboardTitle\n ? (dashboardItem.name | translate)\n : dashboardItem.name;\n @let sourceApp = getSourceAppName(context.item);\n\n <div class=\"d-flex a-i-center gap-8 flex-wrap\">\n {{ dashboardName }}\n @if (sourceApp) {\n @let tooltipText =\n 'This dashboard belongs to \"{{app}}\". Manage its visibility there.'\n | translate: { app: sourceApp };\n <span\n class=\"label label-primary\"\n [tooltip]=\"tooltipText\"\n placement=\"top\"\n container=\"body\"\n >\n {{ sourceApp }}\n </span>\n }\n </div>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n", dependencies: [{ kind: "component", type: TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "component", type: DataGridComponent, selector: "c8y-data-grid", inputs: ["title", "loadMoreItemsLabel", "loadingItemsLabel", "showSearch", "refresh", "loading", "columns", "rows", "pagination", "childNodePagination", "infiniteScroll", "serverSideDataCallback", "selectable", "singleSelection", "selectionPrimaryKey", "displayOptions", "actionControls", "bulkActionControls", "headerActionControls", "searchText", "configureColumnsEnabled", "showCounterWarning", "activeClassName", "expandableRows", "treeGrid", "hideReload", "childNodesProperty", "parentNodeLabelProperty"], outputs: ["rowMouseOver", "rowMouseLeave", "rowClick", "onConfigChange", "onBeforeFilter", "onBeforeSearch", "onFilter", "itemsSelect", "onReload", "onAddCustomColumn", "onRemoveCustomColumn", "onColumnFilterReset", "onSort", "onPageSizeChange", "onColumnReordered", "onColumnVisibilityChange"] }, { kind: "directive", type: ExpandableRowDirective, selector: "[c8yExpandableRow]" }, { kind: "component", type: TypeDashboardInfoComponent, selector: "c8y-type-dashboard-info", inputs: ["deviceTypeValue", "displayDeviceTypeValue", "context", "asyncRenderSuccess", "asyncRenderFail"] }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: ColumnDirective, selector: "c8y-column", inputs: ["name"] }, { kind: "directive", type: CellRendererDefDirective, selector: "[c8yCellRendererDef]" }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
446
679
  }
447
680
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TypeDashboardsListComponent, decorators: [{
448
681
  type: Component,
@@ -455,9 +688,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
455
688
  ColumnDirective,
456
689
  CellRendererDefDirective,
457
690
  IconDirective,
458
- C8yTranslatePipe
459
- ], template: "<c8y-title>\n {{ 'Dashboard manager' | translate }}\n</c8y-title>\n\n<div class=\"content-fullpage d-flex d-col border-top border-bottom\">\n <c8y-data-grid\n [title]=\"title\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel\"\n [loadingItemsLabel]=\"loadingItemsLabel\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [infiniteScroll]=\"'auto'\"\n [actionControls]=\"actionControls\"\n [showSearch]=\"true\"\n [displayOptions]=\"displayOptions\"\n [refresh]=\"refresh\"\n [expandableRows]=\"'ASYNC'\"\n >\n <div\n *c8yExpandableRow=\"\n let context;\n let asyncRenderSuccess = asyncRenderSuccess;\n let asyncRenderFail = asyncRenderFail\n \"\n >\n <c8y-type-dashboard-info\n [context]=\"context\"\n [asyncRenderSuccess]=\"asyncRenderSuccess\"\n [asyncRenderFail]=\"asyncRenderFail\"\n ></c8y-type-dashboard-info>\n </div>\n\n <c8y-ui-empty-state\n [icon]=\"'search'\"\n [title]=\"'No matching dashboards.' | translate\"\n [subtitle]=\"'Refine your search terms' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n\n <c8y-column name=\"icon\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <i [c8yIcon]=\"context.value\"></i>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"deviceTypeValue\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span class=\"label label-info\">\n {{ context.value }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"name\">\n <ng-container *c8yCellRendererDef=\"let context\">\n @let dashboardItem = context.item.c8y_Dashboard;\n @let dashboardName =\n dashboardItem.translateDashboardTitle\n ? (dashboardItem.name | translate)\n : dashboardItem.name;\n\n {{ dashboardName }}\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n" }]
460
- }], ctorParameters: () => [{ type: DashboardManagerService }, { type: i1$2.BsModalService }, { type: i2.GainsightService }] });
691
+ C8yTranslatePipe,
692
+ ActionBarItemComponent,
693
+ TooltipModule
694
+ ], template: "<c8y-title>\n {{ 'Dashboard manager' | translate }}\n</c8y-title>\n\n@if (isAppOwner) {\n <c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Data sharing' | translate }}\"\n type=\"button\"\n (click)=\"openDataSharingModal()\"\n >\n <i\n c8yIcon=\"share\"\n aria-hidden=\"true\"\n ></i>\n {{ 'Data sharing' | translate }}\n </button>\n </c8y-action-bar-item>\n}\n\n<div class=\"content-fullpage d-flex d-col border-top border-bottom\">\n <c8y-data-grid\n [title]=\"title\"\n [loadMoreItemsLabel]=\"loadMoreItemsLabel\"\n [loadingItemsLabel]=\"loadingItemsLabel\"\n [columns]=\"columns\"\n [pagination]=\"pagination\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n [infiniteScroll]=\"'auto'\"\n [actionControls]=\"actionControls\"\n [showSearch]=\"true\"\n [displayOptions]=\"displayOptions\"\n [refresh]=\"refresh\"\n [expandableRows]=\"'ASYNC'\"\n >\n <div\n *c8yExpandableRow=\"\n let context;\n let asyncRenderSuccess = asyncRenderSuccess;\n let asyncRenderFail = asyncRenderFail\n \"\n >\n <c8y-type-dashboard-info\n [context]=\"context\"\n [asyncRenderSuccess]=\"asyncRenderSuccess\"\n [asyncRenderFail]=\"asyncRenderFail\"\n ></c8y-type-dashboard-info>\n </div>\n\n <c8y-ui-empty-state\n [icon]=\"'search'\"\n [title]=\"'No matching dashboards.' | translate\"\n [subtitle]=\"'Refine your search terms' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n\n <c8y-column name=\"icon\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <i [c8yIcon]=\"context.value\"></i>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"deviceTypeValue\">\n <ng-container *c8yCellRendererDef=\"let context\">\n <span class=\"label label-info\">\n {{ context.value }}\n </span>\n </ng-container>\n </c8y-column>\n\n <c8y-column name=\"name\">\n <ng-container *c8yCellRendererDef=\"let context\">\n @let dashboardItem = context.item.c8y_Dashboard;\n @let dashboardName =\n dashboardItem.translateDashboardTitle\n ? (dashboardItem.name | translate)\n : dashboardItem.name;\n @let sourceApp = getSourceAppName(context.item);\n\n <div class=\"d-flex a-i-center gap-8 flex-wrap\">\n {{ dashboardName }}\n @if (sourceApp) {\n @let tooltipText =\n 'This dashboard belongs to \"{{app}}\". Manage its visibility there.'\n | translate: { app: sourceApp };\n <span\n class=\"label label-primary\"\n [tooltip]=\"tooltipText\"\n placement=\"top\"\n container=\"body\"\n >\n {{ sourceApp }}\n </span>\n }\n </div>\n </ng-container>\n </c8y-column>\n </c8y-data-grid>\n</div>\n" }]
695
+ }], ctorParameters: () => [{ type: DashboardManagerService }, { type: i1$1.BsModalService }, { type: i3.GainsightService }, { type: i3.AppStateService }, { type: i4$1.EcosystemService }] });
461
696
 
462
697
  const DASHBOARD_MANAGER_PATH = 'dashboard-manager';
463
698
  class DashboardManagerModule {
@@ -470,7 +705,10 @@ class DashboardManagerModule {
470
705
  TypeDashboardInfoComponent,
471
706
  TypeDashboardsListComponent,
472
707
  TypeDashboardTargetAssetsModalComponent,
473
- TypeDashboardTargetAssetsGridComponent] }); }
708
+ TypeDashboardTargetAssetsGridComponent,
709
+ DashboardVisibilityModalComponent,
710
+ DataSharingModalComponent,
711
+ ApplicationSelectComponent] }); }
474
712
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DashboardManagerModule, providers: [
475
713
  hookTab(DashboardManagerTabsFactory),
476
714
  hookRoute([
@@ -500,7 +738,10 @@ class DashboardManagerModule {
500
738
  TypeDashboardInfoComponent,
501
739
  TypeDashboardsListComponent,
502
740
  TypeDashboardTargetAssetsModalComponent,
503
- TypeDashboardTargetAssetsGridComponent] }); }
741
+ TypeDashboardTargetAssetsGridComponent,
742
+ DashboardVisibilityModalComponent,
743
+ DataSharingModalComponent,
744
+ ApplicationSelectComponent] }); }
504
745
  }
505
746
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DashboardManagerModule, decorators: [{
506
747
  type: NgModule,
@@ -514,7 +755,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
514
755
  TypeDashboardInfoComponent,
515
756
  TypeDashboardsListComponent,
516
757
  TypeDashboardTargetAssetsModalComponent,
517
- TypeDashboardTargetAssetsGridComponent
758
+ TypeDashboardTargetAssetsGridComponent,
759
+ DashboardVisibilityModalComponent,
760
+ DataSharingModalComponent,
761
+ ApplicationSelectComponent
518
762
  ],
519
763
  providers: [
520
764
  hookTab(DashboardManagerTabsFactory),