@c8y/ngx-components 1021.63.2 → 1021.64.0
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/core/bottom-drawer/bottom-drawer-ref.d.ts +4 -0
- package/core/bottom-drawer/bottom-drawer-ref.d.ts.map +1 -1
- package/core/plugins/plugins.model.d.ts +1 -0
- package/core/plugins/plugins.model.d.ts.map +1 -1
- package/core/plugins/plugins.service.d.ts +5 -2
- package/core/plugins/plugins.service.d.ts.map +1 -1
- package/ecosystem/application-plugins/application-plugin-readme.component.d.ts +15 -0
- package/ecosystem/application-plugins/application-plugin-readme.component.d.ts.map +1 -0
- package/ecosystem/application-plugins/application-plugins.component.d.ts +4 -2
- package/ecosystem/application-plugins/application-plugins.component.d.ts.map +1 -1
- package/ecosystem/application-plugins/application-plugins.module.d.ts +4 -3
- package/ecosystem/application-plugins/application-plugins.module.d.ts.map +1 -1
- package/ecosystem/application-plugins/install-plugin.component.d.ts +8 -4
- package/ecosystem/application-plugins/install-plugin.component.d.ts.map +1 -1
- package/ecosystem/application-plugins/plugin-list.component.d.ts +10 -26
- package/ecosystem/application-plugins/plugin-list.component.d.ts.map +1 -1
- package/ecosystem/application-plugins/plugin-list.service.d.ts +27 -0
- package/ecosystem/application-plugins/plugin-list.service.d.ts.map +1 -0
- package/ecosystem/packages/package-details/package-details.component.d.ts +7 -9
- package/ecosystem/packages/package-details/package-details.component.d.ts.map +1 -1
- package/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.d.ts +5 -1
- package/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.d.ts.map +1 -1
- package/ecosystem/packages/package-versions/package-contents/packages-contents.component.d.ts +6 -3
- package/ecosystem/packages/package-versions/package-contents/packages-contents.component.d.ts.map +1 -1
- package/ecosystem/packages/package-versions/packages-versions.component.d.ts +9 -2
- package/ecosystem/packages/package-versions/packages-versions.component.d.ts.map +1 -1
- package/esm2022/core/bottom-drawer/bottom-drawer-ref.mjs +9 -3
- package/esm2022/core/plugins/plugins.model.mjs +1 -1
- package/esm2022/core/plugins/plugins.service.mjs +25 -5
- package/esm2022/ecosystem/application-plugins/application-plugin-readme.component.mjs +26 -0
- package/esm2022/ecosystem/application-plugins/application-plugins.component.mjs +26 -11
- package/esm2022/ecosystem/application-plugins/application-plugins.module.mjs +6 -3
- package/esm2022/ecosystem/application-plugins/install-plugin.component.mjs +21 -15
- package/esm2022/ecosystem/application-plugins/plugin-list-item.component.mjs +3 -3
- package/esm2022/ecosystem/application-plugins/plugin-list.component.mjs +26 -202
- package/esm2022/ecosystem/application-plugins/plugin-list.service.mjs +200 -0
- package/esm2022/ecosystem/application-properties/update-application-modal/update-application-modal.component.mjs +1 -1
- package/esm2022/ecosystem/packages/package-details/package-details.component.mjs +25 -44
- package/esm2022/ecosystem/packages/package-versions/package-contents/contents-plugins/contents-plugins.component.mjs +14 -4
- package/esm2022/ecosystem/packages/package-versions/package-contents/packages-contents.component.mjs +13 -6
- package/esm2022/ecosystem/packages/package-versions/packages-versions.component.mjs +22 -8
- package/esm2022/ecosystem/shared/list-filters/list-filters.component.mjs +3 -3
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs +205 -138
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +2 -2
- package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem.mjs +257 -176
- package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +31 -5
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/de.po +3 -0
- package/locales/es.po +3 -0
- package/locales/fr.po +3 -0
- package/locales/ja_JP.po +3 -0
- package/locales/ko.po +3 -0
- package/locales/locales.pot +33 -6
- package/locales/nl.po +3 -0
- package/locales/pl.po +3 -0
- package/locales/pt_BR.po +3 -0
- package/locales/zh_CN.po +3 -0
- package/locales/zh_TW.po +3 -0
- package/package.json +1 -1
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { inject, Injectable } from '@angular/core';
|
|
2
|
+
import { AlertService, GainsightService, gettext, HumanizeAppNamePipe, PluginsService } from '@c8y/ngx-components';
|
|
3
|
+
import { ApplicationType } from '@c8y/client';
|
|
4
|
+
import { AppsToUpdateRemotesSelectComponent } from './apps-to-update-remotes-select.component';
|
|
5
|
+
import { firstValueFrom } from 'rxjs';
|
|
6
|
+
import { TranslateService } from '@ngx-translate/core';
|
|
7
|
+
import { pick } from 'lodash-es';
|
|
8
|
+
import { BsModalService } from 'ngx-bootstrap/modal';
|
|
9
|
+
import { EcosystemService, PRODUCT_EXPERIENCE_ECOSYSTEM } from '@c8y/ngx-components/ecosystem/shared';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
export class PluginListService {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.CURRENT_LOCATION = location.href;
|
|
14
|
+
this.updatingPluginId = { install: '', uninstall: '' };
|
|
15
|
+
this.appsDisabled = new Set();
|
|
16
|
+
this.gainsightService = inject(GainsightService);
|
|
17
|
+
this.pluginsService = inject(PluginsService);
|
|
18
|
+
this.alertService = inject(AlertService);
|
|
19
|
+
this.ecosystemService = inject(EcosystemService);
|
|
20
|
+
this.humanizeAppNamePipe = inject(HumanizeAppNamePipe);
|
|
21
|
+
this.translateService = inject(TranslateService);
|
|
22
|
+
this.bsModalService = inject(BsModalService);
|
|
23
|
+
}
|
|
24
|
+
async updateAppRemotes(plugin, updateType, pluginPackage) {
|
|
25
|
+
this.updatingPluginId[updateType] = plugin?.id;
|
|
26
|
+
let initialState;
|
|
27
|
+
try {
|
|
28
|
+
const apps = await this.getAppsForUpdate(plugin, updateType);
|
|
29
|
+
initialState = {
|
|
30
|
+
apps,
|
|
31
|
+
updateType,
|
|
32
|
+
pluginName: plugin.name,
|
|
33
|
+
appsDisabled: this.appsDisabled
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
this.alertService.addServerFailure(e);
|
|
38
|
+
this.updatingPluginId[updateType] = '';
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
let selectedApps;
|
|
42
|
+
try {
|
|
43
|
+
selectedApps = await this.selectApps(initialState);
|
|
44
|
+
if (!selectedApps) {
|
|
45
|
+
this.updatingPluginId[updateType] = '';
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// unreached
|
|
51
|
+
}
|
|
52
|
+
if (updateType === 'install') {
|
|
53
|
+
const isArchived = await this.ecosystemService.verifyArchived([plugin]);
|
|
54
|
+
if (!isArchived) {
|
|
55
|
+
this.updatingPluginId[updateType] = '';
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const licensesVerifiedByUser = await this.ecosystemService.verifyLicenses([plugin]);
|
|
59
|
+
if (!licensesVerifiedByUser) {
|
|
60
|
+
this.updatingPluginId[updateType] = '';
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
for (const app of selectedApps) {
|
|
65
|
+
try {
|
|
66
|
+
if (updateType === 'install') {
|
|
67
|
+
const versionIsCompatible = await this.ecosystemService.verifyPluginVersionsCompatibility([plugin], app);
|
|
68
|
+
if (!versionIsCompatible) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
await this.handleRemotesUpdate(app, plugin, updateType, pluginPackage);
|
|
73
|
+
const humanizedAppName = await firstValueFrom(this.humanizeAppNamePipe.transform(app));
|
|
74
|
+
const successText = updateType === 'install'
|
|
75
|
+
? this.translateService.instant(gettext('Plugin installed to application "{{ appName }}".'), {
|
|
76
|
+
appName: humanizedAppName
|
|
77
|
+
})
|
|
78
|
+
: this.translateService.instant(gettext('Plugin uninstalled from application "{{ appName }}".'), { appName: humanizedAppName });
|
|
79
|
+
this.alertService.success(successText);
|
|
80
|
+
this.onUpdateEventHandleGS(plugin, app, updateType);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
this.onUpdateEventHandleGS(plugin, app, updateType, error);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
this.updatingPluginId[updateType] = '';
|
|
87
|
+
}
|
|
88
|
+
async getAppsForUpdate(plugin, updateType) {
|
|
89
|
+
let apps = (await this.ecosystemService.getWebApplications()).filter(app => this.ecosystemService.isOwner(app) && app.type !== ApplicationType.EXTERNAL);
|
|
90
|
+
if (updateType === 'install') {
|
|
91
|
+
this.appsDisabled.clear();
|
|
92
|
+
for (const app of apps) {
|
|
93
|
+
if (this.isPluginInstalledInApp(plugin, app)) {
|
|
94
|
+
this.appsDisabled.add(app.id);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (updateType === 'uninstall') {
|
|
99
|
+
const installedApps = [];
|
|
100
|
+
for (const app of apps) {
|
|
101
|
+
if (this.isPluginInstalledInApp(plugin, app)) {
|
|
102
|
+
installedApps.push(app);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
apps = installedApps;
|
|
106
|
+
}
|
|
107
|
+
return apps;
|
|
108
|
+
}
|
|
109
|
+
onUpdateEventHandleGS(plugin, app, updateType, error) {
|
|
110
|
+
const pluginCustomEventInfo = pick(plugin, [
|
|
111
|
+
'name',
|
|
112
|
+
'contextPath',
|
|
113
|
+
'module',
|
|
114
|
+
'version',
|
|
115
|
+
'type',
|
|
116
|
+
'id'
|
|
117
|
+
]);
|
|
118
|
+
const gsEventResult = updateType === 'install'
|
|
119
|
+
? PRODUCT_EXPERIENCE_ECOSYSTEM.APPLICATIONS.RESULTS.PLUGIN_INSTALLED
|
|
120
|
+
: PRODUCT_EXPERIENCE_ECOSYSTEM.APPLICATIONS.RESULTS.PLUGIN_REMOVED;
|
|
121
|
+
const eventData = {
|
|
122
|
+
component: PRODUCT_EXPERIENCE_ECOSYSTEM.APPLICATIONS.COMPONENTS.PLUGIN_LIST,
|
|
123
|
+
result: error || gsEventResult,
|
|
124
|
+
url: this.CURRENT_LOCATION,
|
|
125
|
+
...pluginCustomEventInfo,
|
|
126
|
+
targetApplicationName: app.name,
|
|
127
|
+
targetApplicationContextPath: app.contextPath,
|
|
128
|
+
...(error && { error })
|
|
129
|
+
};
|
|
130
|
+
this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_ECOSYSTEM.APPLICATIONS.EVENTS.PACKAGE_PLUGINS, eventData);
|
|
131
|
+
}
|
|
132
|
+
isPluginInstalledInApp(plugin, app) {
|
|
133
|
+
const appRemotes = this.pluginsService.getMFRemotes(app) || {};
|
|
134
|
+
for (const [remoteName, modules] of Object.entries(appRemotes)) {
|
|
135
|
+
const pluginFromThisPackageIsInstalled = this.getPluginContextPathWithoutVersion(remoteName) === plugin.contextPath;
|
|
136
|
+
const specificPluginModuleIsInstalled = modules.some(module => module === plugin.module);
|
|
137
|
+
if (pluginFromThisPackageIsInstalled && specificPluginModuleIsInstalled) {
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
getPluginContextPathWithoutVersion(remote) {
|
|
144
|
+
return remote.split('@')[0];
|
|
145
|
+
}
|
|
146
|
+
async handleRemotesUpdate(application, plugin, updateType, pluginPackage) {
|
|
147
|
+
try {
|
|
148
|
+
// When remotes object is not set in the configuration object of an application.
|
|
149
|
+
// Fallback to setInitialRemotes is triggered.
|
|
150
|
+
const { remotes, excludedRemotes } = await (updateType === 'install'
|
|
151
|
+
? this.pluginsService.addRemotes(application, plugin)
|
|
152
|
+
: this.pluginsService.removeRemotes(application, this.getAllPluginsToRemove(plugin, pluginPackage)));
|
|
153
|
+
if (!application.config) {
|
|
154
|
+
application.config = {};
|
|
155
|
+
}
|
|
156
|
+
application.config.remotes = remotes;
|
|
157
|
+
application.config.excludedRemotes = excludedRemotes;
|
|
158
|
+
const actualRemotes = this.pluginsService.getMFRemotes(application);
|
|
159
|
+
return actualRemotes;
|
|
160
|
+
}
|
|
161
|
+
catch (er) {
|
|
162
|
+
if (er) {
|
|
163
|
+
this.alertService.addServerFailure(er);
|
|
164
|
+
}
|
|
165
|
+
throw er;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
getAllPluginsToRemove(plugin, pluginPackage) {
|
|
169
|
+
return pluginPackage.applicationVersions.map(av => ({
|
|
170
|
+
id: `${plugin.contextPath}@${av.version}/${plugin.module}`,
|
|
171
|
+
idLatest: `${plugin.contextPath}/${plugin.module}`,
|
|
172
|
+
module: plugin.module,
|
|
173
|
+
path: plugin.path
|
|
174
|
+
}));
|
|
175
|
+
}
|
|
176
|
+
async selectApps(initialState) {
|
|
177
|
+
try {
|
|
178
|
+
return await this.bsModalService.show(AppsToUpdateRemotesSelectComponent, {
|
|
179
|
+
class: 'modal-sm',
|
|
180
|
+
ariaDescribedby: 'modal-body',
|
|
181
|
+
ariaLabelledBy: 'modal-title',
|
|
182
|
+
initialState,
|
|
183
|
+
ignoreBackdropClick: true,
|
|
184
|
+
keyboard: false
|
|
185
|
+
}).content.result;
|
|
186
|
+
}
|
|
187
|
+
catch (er) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PluginListService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
192
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PluginListService, providedIn: 'root' }); }
|
|
193
|
+
}
|
|
194
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PluginListService, decorators: [{
|
|
195
|
+
type: Injectable,
|
|
196
|
+
args: [{
|
|
197
|
+
providedIn: 'root'
|
|
198
|
+
}]
|
|
199
|
+
}] });
|
|
200
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWxpc3Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2Vjb3N5c3RlbS9hcHBsaWNhdGlvbi1wbHVnaW5zL3BsdWdpbi1saXN0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUNMLFlBQVksRUFFWixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLG1CQUFtQixFQUNuQixjQUFjLEVBQ2YsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBQUUsZUFBZSxFQUFnQixNQUFNLGFBQWEsQ0FBQztBQUM1RCxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMvRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsNEJBQTRCLEVBQzdCLE1BQU0sc0NBQXNDLENBQUM7O0FBSzlDLE1BQU0sT0FBTyxpQkFBaUI7SUFIOUI7UUFJRSxxQkFBZ0IsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ2pDLHFCQUFnQixHQUErQixFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ3RFLGlCQUFZLEdBQTRCLElBQUksR0FBRyxFQUFzQixDQUFDO1FBRXRFLHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzVDLG1CQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3hDLGlCQUFZLEdBQUcsTUFB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LEVBQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUMxRCxRQUFRLEVBQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDbEQsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO1lBQ3JCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtTQUNsQixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTyxLQUFLLENBQUMsVUFBVSxDQUN0QixZQUdDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUNMLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxFQUFFO2dCQUMzRCxLQUFLLEVBQUUsVUFBVTtnQkFDakIsZUFBZSxFQUFFLFlBQVk7Z0JBQzdCLGNBQWMsRUFBRSxhQUFhO2dCQUM3QixZQUFZO2dCQUNaLG1CQUFtQixFQUFFLElBQUk7Z0JBQ3pCLFFBQVEsRUFBRSxLQUFLO2FBQ2hCLENBQUMsQ0FBQyxPQUNKLENBQUMsTUFBTSxDQUFDO1FBQ1gsQ0FBQztRQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDWixPQUFPO1FBQ1QsQ0FBQztJQUNILENBQUM7K0dBalBVLGlCQUFpQjttSEFBakIsaUJBQWlCLGNBRmhCLE1BQU07OzRGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFsZXJ0U2VydmljZSxcbiAgQXBwbGljYXRpb25QbHVnaW4sXG4gIEdhaW5zaWdodFNlcnZpY2UsXG4gIGdldHRleHQsXG4gIEh1bWFuaXplQXBwTmFtZVBpcGUsXG4gIFBsdWdpbnNTZXJ2aWNlXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgVXBkYXRlVHlwZSB9IGZyb20gJy4vYXBwcy10by11cGRhdGUtcmVtb3Rlcy1zZWxlY3QubW9kZWwnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25UeXBlLCBJQXBwbGljYXRpb24gfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBBcHBzVG9VcGRhdGVSZW1vdGVzU2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi9hcHBzLXRvLXVwZGF0ZS1yZW1vdGVzLXNlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IHBpY2sgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7XG4gIEVjb3N5c3RlbVNlcnZpY2UsXG4gIFBST0RVQ1RfRVhQRVJJRU5DRV9FQ09TWVNURU1cbn0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9lY29zeXN0ZW0vc2hhcmVkJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUGx1Z2luTGlzdFNlcnZpY2Uge1xuICBDVVJSRU5UX0xPQ0FUSU9OID0gbG9jYXRpb24uaHJlZjtcbiAgdXBkYXRpbmdQbHVnaW5JZDogUmVjb3JkPFVwZGF0ZVR5cGUsIHN0cmluZz4gPSB7IGluc3RhbGw6ICcnLCB1bmluc3RhbGw6ICcnIH07XG4gIHByaXZhdGUgYXBwc0Rpc2FibGVkOiBTZXQ8SUFwcGxpY2F0aW9uWydpZCddPiA9IG5ldyBTZXQ8SUFwcGxpY2F0aW9uWydpZCddPigpO1xuXG4gIHByaXZhdGUgZ2FpbnNpZ2h0U2VydmljZSA9IGluamVjdChHYWluc2lnaHRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBwbHVnaW5zU2VydmljZSA9IGluamVjdChQbHVnaW5zU2VydmljZSk7XG4gIHByaXZhdGUgYWxlcnRTZXJ2aWNlID0gaW5qZWN0KEFsZXJ0U2VydmljZSk7XG4gIHByaXZhdGUgZWNvc3lzdGVtU2VydmljZSA9IGluamVjdChFY29zeXN0ZW1TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBodW1hbml6ZUFwcE5hbWVQaXBlID0gaW5qZWN0KEh1bWFuaXplQXBwTmFtZVBpcGUpO1xuICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gIHByaXZhdGUgYnNNb2RhbFNlcnZpY2UgPSBpbmplY3QoQnNNb2RhbFNlcnZpY2UpO1xuXG4gIGFzeW5jIHVwZGF0ZUFwcFJlbW90ZXMoXG4gICAgcGx1Z2luOiBBcHBsaWNhdGlvblBsdWdpbixcbiAgICB1cGRhdGVUeXBlOiBVcGRhdGVUeXBlLFxuICAgIHBsdWdpblBhY2thZ2U6IElBcHBsaWNhdGlvblxuICApIHtcbiAgICB0aGlzLnVwZGF0aW5nUGx1Z2luSWRbdXBkYXRlVHlwZV0gPSBwbHVnaW4/LmlkO1xuICAgIGxldCBpbml0aWFsU3RhdGU6IFBpY2s8XG4gICAgICBBcHBzVG9VcGRhdGVSZW1vdGVzU2VsZWN0Q29tcG9uZW50LFxuICAgICAgJ2FwcHMnIHwgJ3VwZGF0ZVR5cGUnIHwgJ3BsdWdpbk5hbWUnIHwgJ2FwcHNEaXNhYmxlZCdcbiAgICA+O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhcHBzID0gYXdhaXQgdGhpcy5nZXRBcHBzRm9yVXBkYXRlKHBsdWdpbiwgdXBkYXRlVHlwZSk7XG5cbiAgICAgIGluaXRpYWxTdGF0ZSA9IHtcbiAgICAgICAgYXBwcyxcbiAgICAgICAgdXBkYXRlVHlwZSxcbiAgICAgICAgcGx1Z2luTmFtZTogcGx1Z2luLm5hbWUsXG4gICAgICAgIGFwcHNEaXNhYmxlZDogdGhpcy5hcHBzRGlzYWJsZWRcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShlKTtcbiAgICAgIHRoaXMudXBkYXRpbmdQbHVnaW5JZFt1cGRhdGVUeXBlXSA9ICcnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzZWxlY3RlZEFwcHM6IElBcHBsaWNhdGlvbltdO1xuICAgIHRyeSB7XG4gICAgICBzZWxlY3RlZEFwcHMgPSBhd2FpdCB0aGlzLnNlbGVjdEFwcHMoaW5pdGlhbFN0YXRlKTtcbiAgICAgIGlmICghc2VsZWN0ZWRBcHBzKSB7XG4gICAgICAgIHRoaXMudXBkYXRpbmdQbHVnaW5JZFt1cGRhdGVUeXBlXSA9ICcnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyB1bnJlYWNoZWRcbiAgICB9XG5cbiAgICBpZiAodXBkYXRlVHlwZSA9PT0gJ2luc3RhbGwnKSB7XG4gICAgICBjb25zdCBpc0FyY2hpdmVkID0gYXdhaXQgdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLnZlcmlmeUFyY2hpdmVkKFtwbHVnaW5dKTtcbiAgICAgIGlmICghaXNBcmNoaXZlZCkge1xuICAgICAgICB0aGlzLnVwZGF0aW5nUGx1Z2luSWRbdXBkYXRlVHlwZV0gPSAnJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsaWNlbnNlc1ZlcmlmaWVkQnlVc2VyID0gYXdhaXQgdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLnZlcmlmeUxpY2Vuc2VzKFtwbHVnaW5dKTtcbiAgICAgIGlmICghbGljZW5zZXNWZXJpZmllZEJ5VXNlcikge1xuICAgICAgICB0aGlzLnVwZGF0aW5nUGx1Z2luSWRbdXBkYXRlVHlwZV0gPSAnJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgYXBwIG9mIHNlbGVjdGVkQXBwcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHVwZGF0ZVR5cGUgPT09ICdpbnN0YWxsJykge1xuICAgICAgICAgIGNvbnN0IHZlcnNpb25Jc0NvbXBhdGlibGUgPSBhd2FpdCB0aGlzLmVjb3N5c3RlbVNlcnZpY2UudmVyaWZ5UGx1Z2luVmVyc2lvbnNDb21wYXRpYmlsaXR5KFxuICAgICAgICAgICAgW3BsdWdpbl0sXG4gICAgICAgICAgICBhcHBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKCF2ZXJzaW9uSXNDb21wYXRpYmxlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZVJlbW90ZXNVcGRhdGUoYXBwLCBwbHVnaW4sIHVwZGF0ZVR5cGUsIHBsdWdpblBhY2thZ2UpO1xuICAgICAgICBjb25zdCBodW1hbml6ZWRBcHBOYW1lID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5odW1hbml6ZUFwcE5hbWVQaXBlLnRyYW5zZm9ybShhcHApKTtcbiAgICAgICAgY29uc3Qgc3VjY2Vzc1RleHQgPVxuICAgICAgICAgIHVwZGF0ZVR5cGUgPT09ICdpbnN0YWxsJ1xuICAgICAgICAgICAgPyB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAgICAgICBnZXR0ZXh0KCdQbHVnaW4gaW5zdGFsbGVkIHRvIGFwcGxpY2F0aW9uIFwie3sgYXBwTmFtZSB9fVwiLicpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGFwcE5hbWU6IGh1bWFuaXplZEFwcE5hbWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICAgICAgICAgZ2V0dGV4dCgnUGx1Z2luIHVuaW5zdGFsbGVkIGZyb20gYXBwbGljYXRpb24gXCJ7eyBhcHBOYW1lIH19XCIuJyksXG4gICAgICAgICAgICAgICAgeyBhcHBOYW1lOiBodW1hbml6ZWRBcHBOYW1lIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhzdWNjZXNzVGV4dCk7XG4gICAgICAgIHRoaXMub25VcGRhdGVFdmVudEhhbmRsZUdTKHBsdWdpbiwgYXBwLCB1cGRhdGVUeXBlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMub25VcGRhdGVFdmVudEhhbmRsZUdTKHBsdWdpbiwgYXBwLCB1cGRhdGVUeXBlLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudXBkYXRpbmdQbHVnaW5JZFt1cGRhdGVUeXBlXSA9ICcnO1xuICB9XG5cbiAgYXN5bmMgZ2V0QXBwc0ZvclVwZGF0ZShwbHVnaW46IEFwcGxpY2F0aW9uUGx1Z2luLCB1cGRhdGVUeXBlOiBVcGRhdGVUeXBlKSB7XG4gICAgbGV0IGFwcHMgPSAoYXdhaXQgdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLmdldFdlYkFwcGxpY2F0aW9ucygpKS5maWx0ZXIoXG4gICAgICBhcHAgPT4gdGhpcy5lY29zeXN0ZW1TZXJ2aWNlLmlzT3duZXIoYXBwKSAmJiBhcHAudHlwZSAhPT0gQXBwbGljYXRpb25UeXBlLkVYVEVSTkFMXG4gICAgKTtcblxuICAgIGlmICh1cGRhdGVUeXBlID09PSAnaW5zdGFsbCcpIHtcbiAgICAgIHRoaXMuYXBwc0Rpc2FibGVkLmNsZWFyKCk7XG4gICAgICBmb3IgKGNvbnN0IGFwcCBvZiBhcHBzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzUGx1Z2luSW5zdGFsbGVkSW5BcHAocGx1Z2luLCBhcHApKSB7XG4gICAgICAgICAgdGhpcy5hcHBzRGlzYWJsZWQuYWRkKGFwcC5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodXBkYXRlVHlwZSA9PT0gJ3VuaW5zdGFsbCcpIHtcbiAgICAgIGNvbnN0IGluc3RhbGxlZEFwcHM6IElBcHBsaWNhdGlvbltdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGFwcCBvZiBhcHBzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzUGx1Z2luSW5zdGFsbGVkSW5BcHAocGx1Z2luLCBhcHApKSB7XG4gICAgICAgICAgaW5zdGFsbGVkQXBwcy5wdXNoKGFwcCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGFwcHMgPSBpbnN0YWxsZWRBcHBzO1xuICAgIH1cbiAgICByZXR1cm4gYXBwcztcbiAgfVxuXG4gIHByaXZhdGUgb25VcGRhdGVFdmVudEhhbmRsZUdTKFxuICAgIHBsdWdpbjogQXBwbGljYXRpb25QbHVnaW4sXG4gICAgYXBwOiBJQXBwbGljYXRpb24sXG4gICAgdXBkYXRlVHlwZTogVXBkYXRlVHlwZSxcbiAgICBlcnJvcj86IHVua25vd25cbiAgKSB7XG4gICAgY29uc3QgcGx1Z2luQ3VzdG9tRXZlbnRJbmZvID0gcGljayhwbHVnaW4sIFtcbiAgICAgICduYW1lJyxcbiAgICAgICdjb250ZXh0UGF0aCcsXG4gICAgICAnbW9kdWxlJyxcbiAgICAgICd2ZXJzaW9uJyxcbiAgICAgICd0eXBlJyxcbiAgICAgICdpZCdcbiAgICBdIHNhdGlzZmllcyAoa2V5b2YgQXBwbGljYXRpb25QbHVnaW4pW10pO1xuXG4gICAgY29uc3QgZ3NFdmVudFJlc3VsdCA9XG4gICAgICB1cGRhdGVUeXBlID09PSAnaW5zdGFsbCdcbiAgICAgICAgPyBQUk9EVUNUX0VYUEVSSUVOQ0VfRUNPU1lTVEVNLkFQUExJQ0FUSU9OUy5SRVNVTFRTLlBMVUdJTl9JTlNUQUxMRURcbiAgICAgICAgOiBQUk9EVUNUX0VYUEVSSUVOQ0VfRUNPU1lTVEVNLkFQUExJQ0FUSU9OUy5SRVNVTFRTLlBMVUdJTl9SRU1PVkVEO1xuXG4gICAgY29uc3QgZXZlbnREYXRhID0ge1xuICAgICAgY29tcG9uZW50OiBQUk9EVUNUX0VYUEVSSUVOQ0VfRUNPU1lTVEVNLkFQUExJQ0FUSU9OUy5DT01QT05FTlRTLlBMVUdJTl9MSVNULFxuICAgICAgcmVzdWx0OiBlcnJvciB8fCBnc0V2ZW50UmVzdWx0LFxuICAgICAgdXJsOiB0aGlzLkNVUlJFTlRfTE9DQVRJT04sXG4gICAgICAuLi5wbHVnaW5DdXN0b21FdmVudEluZm8sXG4gICAgICB0YXJnZXRBcHBsaWNhdGlvbk5hbWU6IGFwcC5uYW1lLFxuICAgICAgdGFyZ2V0QXBwbGljYXRpb25Db250ZXh0UGF0aDogYXBwLmNvbnRleHRQYXRoLFxuICAgICAgLi4uKGVycm9yICYmIHsgZXJyb3IgfSlcbiAgICB9O1xuXG4gICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLnRyaWdnZXJFdmVudChcbiAgICAgIFBST0RVQ1RfRVhQRVJJRU5DRV9FQ09TWVNURU0uQVBQTElDQVRJT05TLkVWRU5UUy5QQUNLQUdFX1BMVUdJTlMsXG4gICAgICBldmVudERhdGFcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BsdWdpbkluc3RhbGxlZEluQXBwKHBsdWdpbjogQXBwbGljYXRpb25QbHVnaW4sIGFwcDogSUFwcGxpY2F0aW9uKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYXBwUmVtb3RlcyA9IHRoaXMucGx1Z2luc1NlcnZpY2UuZ2V0TUZSZW1vdGVzKGFwcCkgfHwge307XG5cbiAgICBmb3IgKGNvbnN0IFtyZW1vdGVOYW1lLCBtb2R1bGVzXSBvZiBPYmplY3QuZW50cmllcyhhcHBSZW1vdGVzKSkge1xuICAgICAgY29uc3QgcGx1Z2luRnJvbVRoaXNQYWNrYWdlSXNJbnN0YWxsZWQgPVxuICAgICAgICB0aGlzLmdldFBsdWdpbkNvbnRleHRQYXRoV2l0aG91dFZlcnNpb24ocmVtb3RlTmFtZSkgPT09IHBsdWdpbi5jb250ZXh0UGF0aDtcbiAgICAgIGNvbnN0IHNwZWNpZmljUGx1Z2luTW9kdWxlSXNJbnN0YWxsZWQgPSBtb2R1bGVzLnNvbWUobW9kdWxlID0+IG1vZHVsZSA9PT0gcGx1Z2luLm1vZHVsZSk7XG4gICAgICBpZiAocGx1Z2luRnJvbVRoaXNQYWNrYWdlSXNJbnN0YWxsZWQgJiYgc3BlY2lmaWNQbHVnaW5Nb2R1bGVJc0luc3RhbGxlZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQbHVnaW5Db250ZXh0UGF0aFdpdGhvdXRWZXJzaW9uKHJlbW90ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHJlbW90ZS5zcGxpdCgnQCcpWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVSZW1vdGVzVXBkYXRlKFxuICAgIGFwcGxpY2F0aW9uOiBJQXBwbGljYXRpb24sXG4gICAgcGx1Z2luOiBBcHBsaWNhdGlvblBsdWdpbixcbiAgICB1cGRhdGVUeXBlOiBVcGRhdGVUeXBlLFxuICAgIHBsdWdpblBhY2thZ2U6IElBcHBsaWNhdGlvblxuICApIHtcbiAgICB0cnkge1xuICAgICAgLy8gV2hlbiByZW1vdGVzIG9iamVjdCBpcyBub3Qgc2V0IGluIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdCBvZiBhbiBhcHBsaWNhdGlvbi5cbiAgICAgIC8vIEZhbGxiYWNrIHRvIHNldEluaXRpYWxSZW1vdGVzIGlzIHRyaWdnZXJlZC5cbiAgICAgIGNvbnN0IHsgcmVtb3RlcywgZXhjbHVkZWRSZW1vdGVzIH0gPSBhd2FpdCAodXBkYXRlVHlwZSA9PT0gJ2luc3RhbGwnXG4gICAgICAgID8gdGhpcy5wbHVnaW5zU2VydmljZS5hZGRSZW1vdGVzKGFwcGxpY2F0aW9uLCBwbHVnaW4pXG4gICAgICAgIDogdGhpcy5wbHVnaW5zU2VydmljZS5yZW1vdmVSZW1vdGVzKFxuICAgICAgICAgICAgYXBwbGljYXRpb24sXG4gICAgICAgICAgICB0aGlzLmdldEFsbFBsdWdpbnNUb1JlbW92ZShwbHVnaW4sIHBsdWdpblBhY2thZ2UpXG4gICAgICAgICAgKSk7XG4gICAgICBpZiAoIWFwcGxpY2F0aW9uLmNvbmZpZykge1xuICAgICAgICBhcHBsaWNhdGlvbi5jb25maWcgPSB7fTtcbiAgICAgIH1cbiAgICAgIGFwcGxpY2F0aW9uLmNvbmZpZy5yZW1vdGVzID0gcmVtb3RlcztcbiAgICAgIGFwcGxpY2F0aW9uLmNvbmZpZy5leGNsdWRlZFJlbW90ZXMgPSBleGNsdWRlZFJlbW90ZXM7XG4gICAgICBjb25zdCBhY3R1YWxSZW1vdGVzID0gdGhpcy5wbHVnaW5zU2VydmljZS5nZXRNRlJlbW90ZXMoYXBwbGljYXRpb24pO1xuICAgICAgcmV0dXJuIGFjdHVhbFJlbW90ZXM7XG4gICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgIGlmIChlcikge1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGVyKTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWxsUGx1Z2luc1RvUmVtb3ZlKFxuICAgIHBsdWdpbjogQXBwbGljYXRpb25QbHVnaW4sXG4gICAgcGx1Z2luUGFja2FnZTogSUFwcGxpY2F0aW9uXG4gICk6IEFwcGxpY2F0aW9uUGx1Z2luW10ge1xuICAgIHJldHVybiBwbHVnaW5QYWNrYWdlLmFwcGxpY2F0aW9uVmVyc2lvbnMubWFwKGF2ID0+ICh7XG4gICAgICBpZDogYCR7cGx1Z2luLmNvbnRleHRQYXRofUAke2F2LnZlcnNpb259LyR7cGx1Z2luLm1vZHVsZX1gLFxuICAgICAgaWRMYXRlc3Q6IGAke3BsdWdpbi5jb250ZXh0UGF0aH0vJHtwbHVnaW4ubW9kdWxlfWAsXG4gICAgICBtb2R1bGU6IHBsdWdpbi5tb2R1bGUsXG4gICAgICBwYXRoOiBwbHVnaW4ucGF0aFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VsZWN0QXBwcyhcbiAgICBpbml0aWFsU3RhdGU6IFBpY2s8XG4gICAgICBBcHBzVG9VcGRhdGVSZW1vdGVzU2VsZWN0Q29tcG9uZW50LFxuICAgICAgJ2FwcHMnIHwgJ3VwZGF0ZVR5cGUnIHwgJ3BsdWdpbk5hbWUnIHwgJ2FwcHNEaXNhYmxlZCdcbiAgICA+XG4gICk6IFByb21pc2U8SUFwcGxpY2F0aW9uW10+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IChcbiAgICAgICAgdGhpcy5ic01vZGFsU2VydmljZS5zaG93KEFwcHNUb1VwZGF0ZVJlbW90ZXNTZWxlY3RDb21wb25lbnQsIHtcbiAgICAgICAgICBjbGFzczogJ21vZGFsLXNtJyxcbiAgICAgICAgICBhcmlhRGVzY3JpYmVkYnk6ICdtb2RhbC1ib2R5JyxcbiAgICAgICAgICBhcmlhTGFiZWxsZWRCeTogJ21vZGFsLXRpdGxlJyxcbiAgICAgICAgICBpbml0aWFsU3RhdGUsXG4gICAgICAgICAgaWdub3JlQmFja2Ryb3BDbGljazogdHJ1ZSxcbiAgICAgICAgICBrZXlib2FyZDogZmFsc2VcbiAgICAgICAgfSkuY29udGVudCBhcyBBcHBzVG9VcGRhdGVSZW1vdGVzU2VsZWN0Q29tcG9uZW50XG4gICAgICApLnJlc3VsdDtcbiAgICB9IGNhdGNoIChlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -131,7 +131,7 @@ export class UpdateApplicationModalComponent {
|
|
|
131
131
|
});
|
|
132
132
|
}
|
|
133
133
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UpdateApplicationModalComponent, deps: [{ token: i1.InventoryService }, { token: i2.EcosystemService }, { token: i3.PluginsService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
134
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UpdateApplicationModalComponent, selector: "c8y-update-application-modal", viewQueries: [{ propertyName: "modal", first: true, predicate: ["modal"], descendants: true }], ngImport: i0, template: "<c8y-modal\n [title]=\"'Update application' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n #modal\n>\n <ng-container c8y-modal-title>\n <span class=\"dlt-c8y-icon-installing-updates\"></span>\n </ng-container>\n\n <ng-container\n *ngIf=\"\n (orphanedPlugins$ | async).length > 0 || (newPlugins$ | async).length > 0;\n else updateProgress\n \"\n >\n <p\n class=\"text-center text-break-word p-24 text-14\"\n translate\n >\n Updating this blueprint will change the default plugins. Review the plugin changes before\n proceeding.\n </p>\n <c8y-list-group *ngIf=\"(orphanedPlugins$ | async).length > 0\">\n <c8y-li [collapsed]=\"true\">\n <c8y-li-icon>\n <span class=\"badge badge-danger\">{{ (orphanedPlugins$ | async).length }}</span>\n </c8y-li-icon>\n <c8y-li-body>\n <div translate>Orphaned plugins</div>\n </c8y-li-body>\n <c8y-li-footer translate>\n Some plugins are not contained in the new version of this blueprint and will therefore get\n removed.\n </c8y-li-footer>\n <c8y-li-collapse>\n <c8y-plugin-list\n class=\"m-t-16\"\n [emptyListText]=\"'No plugins available' | translate\"\n [plugins$]=\"orphanedPlugins$\"\n [selectable]=\"false\"\n [hideSource]=\"true\"\n ></c8y-plugin-list>\n </c8y-li-collapse>\n </c8y-li>\n </c8y-list-group>\n\n <c8y-list-group *ngIf=\"(newPlugins$ | async).length > 0\">\n <c8y-li [collapsed]=\"false\">\n <c8y-li-icon>\n <span class=\"badge badge-success\">{{ (newPlugins$ | async).length }}</span>\n </c8y-li-icon>\n <c8y-li-body>\n <div translate>New plugins added</div>\n </c8y-li-body>\n <c8y-li-footer translate>\n This blueprint will add new plugins. Please choose which you want to install.\n </c8y-li-footer>\n <c8y-li-collapse>\n <c8y-plugin-list\n class=\"m-t-16\"\n [emptyListText]=\"'No plugins available' | translate\"\n [plugins$]=\"newPlugins$\"\n [selectable]=\"true\"\n [hideSource]=\"false\"\n ></c8y-plugin-list>\n </c8y-li-collapse>\n </c8y-li>\n </c8y-list-group>\n </ng-container>\n\n <ng-container c8y-modal-footer-custom>\n <div\n class=\"modal-footer\"\n *ngIf=\"\n (orphanedPlugins$ | async).length > 0 || (newPlugins$ | async).length > 0;\n else updateProgressButtons\n \"\n >\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Close' | translate }}\"\n (click)=\"close()\"\n [disabled]=\"isUpdateOngoing\"\n >\n {{ 'Close' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Continue' | translate }}\"\n (click)=\"updateApplication()\"\n *ngIf=\"(orphanedPlugins$ | async).length > 0 || (newPlugins$ | async).length > 0\"\n [disabled]=\"isUpdateOngoing\"\n >\n {{ 'Continue' | translate }}\n </button>\n </div>\n </ng-container>\n\n <ng-template #updateProgressButtons>\n <ng-container c8y-modal-footer-custom>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Close' | translate }}\"\n (click)=\"done()\"\n [disabled]=\"isUpdateOngoing\"\n >\n {{ 'Close' | translate }}\n </button>\n </div>\n </ng-container>\n </ng-template>\n\n <ng-template #updateProgress>\n <c8y-loading\n class=\"text-center d-block p-t-56 p-b-56 m-t-4 m-b-4\"\n style=\"min-height: 180px\"\n layout=\"application\"\n *ngIf=\"isUpdateOngoing\"\n [message]=\"'Updating\u2026' | translate\"\n ></c8y-loading>\n\n <c8y-operation-result\n type=\"success\"\n *ngIf=\"!isUpdateOngoing && !updateFailure\"\n text=\"{{ 'Update completed' | translate }}\"\n [size]=\"120\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <c8y-operation-result\n type=\"error\"\n *ngIf=\"!isUpdateOngoing && updateFailure\"\n text=\"{{ 'Failed to update application.' | translate }}\"\n [size]=\"120\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n </ng-template>\n</c8y-modal>\n", dependencies: [{ kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i3.OperationResultComponent, selector: "c8y-operation-result", inputs: ["text", "vertical", "size", "type"] }, { kind: "component", type: i3.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: i3.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i3.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i3.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i3.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i3.ListItemFooterComponent, selector: "c8y-list-item-footer, c8y-li-footer", inputs: ["footer"] }, { kind: "component", type: i3.ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "component", type: i5.PluginListComponent, selector: "c8y-plugin-list", inputs: ["plugins$", "emptyListText", "selectable", "hideSource", "installable", "package"], outputs: ["selectedItems"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] }); }
|
|
134
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: UpdateApplicationModalComponent, selector: "c8y-update-application-modal", viewQueries: [{ propertyName: "modal", first: true, predicate: ["modal"], descendants: true }], ngImport: i0, template: "<c8y-modal\n [title]=\"'Update application' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n #modal\n>\n <ng-container c8y-modal-title>\n <span class=\"dlt-c8y-icon-installing-updates\"></span>\n </ng-container>\n\n <ng-container\n *ngIf=\"\n (orphanedPlugins$ | async).length > 0 || (newPlugins$ | async).length > 0;\n else updateProgress\n \"\n >\n <p\n class=\"text-center text-break-word p-24 text-14\"\n translate\n >\n Updating this blueprint will change the default plugins. Review the plugin changes before\n proceeding.\n </p>\n <c8y-list-group *ngIf=\"(orphanedPlugins$ | async).length > 0\">\n <c8y-li [collapsed]=\"true\">\n <c8y-li-icon>\n <span class=\"badge badge-danger\">{{ (orphanedPlugins$ | async).length }}</span>\n </c8y-li-icon>\n <c8y-li-body>\n <div translate>Orphaned plugins</div>\n </c8y-li-body>\n <c8y-li-footer translate>\n Some plugins are not contained in the new version of this blueprint and will therefore get\n removed.\n </c8y-li-footer>\n <c8y-li-collapse>\n <c8y-plugin-list\n class=\"m-t-16\"\n [emptyListText]=\"'No plugins available' | translate\"\n [plugins$]=\"orphanedPlugins$\"\n [selectable]=\"false\"\n [hideSource]=\"true\"\n ></c8y-plugin-list>\n </c8y-li-collapse>\n </c8y-li>\n </c8y-list-group>\n\n <c8y-list-group *ngIf=\"(newPlugins$ | async).length > 0\">\n <c8y-li [collapsed]=\"false\">\n <c8y-li-icon>\n <span class=\"badge badge-success\">{{ (newPlugins$ | async).length }}</span>\n </c8y-li-icon>\n <c8y-li-body>\n <div translate>New plugins added</div>\n </c8y-li-body>\n <c8y-li-footer translate>\n This blueprint will add new plugins. Please choose which you want to install.\n </c8y-li-footer>\n <c8y-li-collapse>\n <c8y-plugin-list\n class=\"m-t-16\"\n [emptyListText]=\"'No plugins available' | translate\"\n [plugins$]=\"newPlugins$\"\n [selectable]=\"true\"\n [hideSource]=\"false\"\n ></c8y-plugin-list>\n </c8y-li-collapse>\n </c8y-li>\n </c8y-list-group>\n </ng-container>\n\n <ng-container c8y-modal-footer-custom>\n <div\n class=\"modal-footer\"\n *ngIf=\"\n (orphanedPlugins$ | async).length > 0 || (newPlugins$ | async).length > 0;\n else updateProgressButtons\n \"\n >\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Close' | translate }}\"\n (click)=\"close()\"\n [disabled]=\"isUpdateOngoing\"\n >\n {{ 'Close' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Continue' | translate }}\"\n (click)=\"updateApplication()\"\n *ngIf=\"(orphanedPlugins$ | async).length > 0 || (newPlugins$ | async).length > 0\"\n [disabled]=\"isUpdateOngoing\"\n >\n {{ 'Continue' | translate }}\n </button>\n </div>\n </ng-container>\n\n <ng-template #updateProgressButtons>\n <ng-container c8y-modal-footer-custom>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Close' | translate }}\"\n (click)=\"done()\"\n [disabled]=\"isUpdateOngoing\"\n >\n {{ 'Close' | translate }}\n </button>\n </div>\n </ng-container>\n </ng-template>\n\n <ng-template #updateProgress>\n <c8y-loading\n class=\"text-center d-block p-t-56 p-b-56 m-t-4 m-b-4\"\n style=\"min-height: 180px\"\n layout=\"application\"\n *ngIf=\"isUpdateOngoing\"\n [message]=\"'Updating\u2026' | translate\"\n ></c8y-loading>\n\n <c8y-operation-result\n type=\"success\"\n *ngIf=\"!isUpdateOngoing && !updateFailure\"\n text=\"{{ 'Update completed' | translate }}\"\n [size]=\"120\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n <c8y-operation-result\n type=\"error\"\n *ngIf=\"!isUpdateOngoing && updateFailure\"\n text=\"{{ 'Failed to update application.' | translate }}\"\n [size]=\"120\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n </ng-template>\n</c8y-modal>\n", dependencies: [{ kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i3.OperationResultComponent, selector: "c8y-operation-result", inputs: ["text", "vertical", "size", "type"] }, { kind: "component", type: i3.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: i3.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i3.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i3.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i3.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i3.ListItemFooterComponent, selector: "c8y-list-item-footer, c8y-li-footer", inputs: ["footer"] }, { kind: "component", type: i3.ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "component", type: i5.PluginListComponent, selector: "c8y-plugin-list", inputs: ["plugins$", "emptyListText", "selectable", "hideSource", "installable", "package", "selectedPlugin"], outputs: ["selectedItems", "showOverview"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] }); }
|
|
135
135
|
}
|
|
136
136
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UpdateApplicationModalComponent, decorators: [{
|
|
137
137
|
type: Component,
|