@c8y/ngx-components 1024.8.3 → 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.
- package/fesm2022/c8y-ngx-components-ai-agents-scada.mjs +5 -12
- package/fesm2022/c8y-ngx-components-ai-agents-scada.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-application-select.mjs +86 -0
- package/fesm2022/c8y-ngx-components-application-select.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +55 -7
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-dashboard-manager-devicemanagement.mjs +2 -1
- package/fesm2022/c8y-ngx-components-dashboard-manager-devicemanagement.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-dashboard-manager.mjs +281 -37
- package/fesm2022/c8y-ngx-components-dashboard-manager.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-platform-configuration.mjs +2 -2
- package/fesm2022/c8y-ngx-components-platform-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-reports.mjs +3 -5
- package/fesm2022/c8y-ngx-components-reports.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-scada.mjs +16 -2
- package/fesm2022/c8y-ngx-components-widgets-implementations-scada.mjs.map +1 -1
- package/locales/de.po +36 -12
- package/locales/es.po +36 -12
- package/locales/fr.po +36 -12
- package/locales/ja_JP.po +34 -12
- package/locales/ko.po +36 -12
- package/locales/locales.pot +61 -7
- package/locales/nl.po +36 -12
- package/locales/pl.po +36 -12
- package/locales/pt_BR.po +36 -12
- package/locales/zh_CN.po +36 -12
- package/locales/zh_TW.po +36 -12
- package/package.json +1 -1
- package/types/c8y-ngx-components-ai-agents-scada.d.ts +3 -7
- package/types/c8y-ngx-components-ai-agents-scada.d.ts.map +1 -1
- package/types/c8y-ngx-components-application-select.d.ts +31 -0
- package/types/c8y-ngx-components-application-select.d.ts.map +1 -0
- package/types/c8y-ngx-components-context-dashboard.d.ts +30 -6
- package/types/c8y-ngx-components-context-dashboard.d.ts.map +1 -1
- package/types/c8y-ngx-components-dashboard-manager.d.ts +76 -9
- package/types/c8y-ngx-components-dashboard-manager.d.ts.map +1 -1
- package/types/c8y-ngx-components-platform-configuration.d.ts +2 -2
- package/types/c8y-ngx-components-reports.d.ts.map +1 -1
- package/types/c8y-ngx-components-widgets-implementations-scada.d.ts +4 -1
- 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,
|
|
3
|
-
import * as
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import
|
|
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
|
|
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$
|
|
14
|
-
import
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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$
|
|
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$
|
|
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
|
|
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:
|
|
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:
|
|
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$
|
|
445
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
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
|
-
|
|
460
|
-
|
|
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),
|