@c8y/ngx-components 1017.0.62 → 1017.0.64

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.
@@ -0,0 +1,93 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { AdvancedSoftwareService } from '@c8y/ngx-components/repository/shared';
3
+ import { set } from 'lodash-es';
4
+ import { BehaviorSubject, Subject } from 'rxjs';
5
+ import { share, switchMap } from 'rxjs/operators';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@c8y/ngx-components/repository/shared";
8
+ export class DeviceSoftwareService {
9
+ constructor(advancedSoftwareService) {
10
+ this.advancedSoftwareService = advancedSoftwareService;
11
+ this.reloadSubject$ = new BehaviorSubject(null);
12
+ this.loadingSubject$ = new Subject();
13
+ }
14
+ /**
15
+ * Indicates whether device software data is currently being loaded.
16
+ */
17
+ get loading$() {
18
+ return this.loadingSubject$.asObservable().pipe(share());
19
+ }
20
+ /**
21
+ * Trigger device software data reload.
22
+ */
23
+ reload() {
24
+ this.reloadSubject$.next();
25
+ }
26
+ /**
27
+ * Retrieves the software list that is installed on a given device.
28
+ *
29
+ * @param deviceId ID of the device to retrieve software data for
30
+ * @param filterCriteria Criteria that software items are filtered by.
31
+ * @param legacySoftwareList If provided no data will be fetched from backend. The provided software list
32
+ * will be filtered by the specified filter criteria.
33
+ *
34
+ * @returns The software items installed on the specified device filtered by the specified criteria.
35
+ */
36
+ getSoftwareList(deviceId, filterCriteria, legacySoftwareList) {
37
+ this.loadingSubject$.next(true);
38
+ return this.reloadSubject$.pipe(switchMap(() => {
39
+ const softwareList$ = !!legacySoftwareList
40
+ ? this.getLegacySoftwareList(legacySoftwareList, filterCriteria)
41
+ : this.getAdvancedSoftwareList(deviceId, filterCriteria);
42
+ return softwareList$.then(resultList => {
43
+ this.loadingSubject$.next(false);
44
+ return resultList;
45
+ });
46
+ }), share());
47
+ }
48
+ getAdvancedSoftwareList(deviceId, filterCriteria) {
49
+ const queryFilter = {
50
+ deviceId,
51
+ currentPage: 1,
52
+ pageSize: 50,
53
+ withTotalPages: true
54
+ };
55
+ if (filterCriteria?.name) {
56
+ set(queryFilter, 'name', `*${filterCriteria.name}*`);
57
+ }
58
+ if (filterCriteria?.softwareType) {
59
+ set(queryFilter, 'type', `${filterCriteria.softwareType}`);
60
+ }
61
+ return this.advancedSoftwareService.list(queryFilter);
62
+ }
63
+ getLegacySoftwareList(legacySoftwareList, filterCriteria) {
64
+ const data = filterCriteria
65
+ ? legacySoftwareList.filter(item => {
66
+ let match = true;
67
+ if (filterCriteria?.name) {
68
+ match = match && item.name?.includes(filterCriteria.name);
69
+ }
70
+ if (filterCriteria?.softwareType) {
71
+ match = match && item.softwareType === filterCriteria.softwareType;
72
+ }
73
+ return match;
74
+ })
75
+ : legacySoftwareList;
76
+ return Promise.resolve({
77
+ data,
78
+ res: null,
79
+ paging: {
80
+ totalPages: data.length
81
+ }
82
+ });
83
+ }
84
+ }
85
+ DeviceSoftwareService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DeviceSoftwareService, deps: [{ token: i1.AdvancedSoftwareService }], target: i0.ɵɵFactoryTarget.Injectable });
86
+ DeviceSoftwareService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DeviceSoftwareService, providedIn: 'root' });
87
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DeviceSoftwareService, decorators: [{
88
+ type: Injectable,
89
+ args: [{
90
+ providedIn: 'root'
91
+ }]
92
+ }], ctorParameters: function () { return [{ type: i1.AdvancedSoftwareService }]; } });
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLXNvZnR3YXJlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9yZXBvc2l0b3J5L3NvZnR3YXJlL2RldmljZS10YWIvZGV2aWNlLXNvZnR3YXJlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQ0wsdUJBQXVCLEVBR3hCLE1BQU0sdUNBQXVDLENBQUM7QUFDL0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNoQyxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFLbEQsTUFBTSxPQUFPLHFCQUFxQjtJQVdoQyxZQUFvQix1QkFBZ0Q7UUFBaEQsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUF5QjtRQUg1RCxtQkFBYyxHQUFHLElBQUksZUFBZSxDQUFPLElBQUksQ0FBQyxDQUFDO1FBQ2pELG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztJQUVzQixDQUFDO0lBVnhFOztPQUVHO0lBQ0gsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFPRDs7T0FFRztJQUNILE1BQU07UUFDSixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxlQUFlLENBQ2IsUUFBUSxFQUNSLGNBQThCLEVBQzlCLGtCQUFxQztRQUVyQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVoQyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUM3QixTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2IsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLGtCQUFrQjtnQkFDeEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLENBQUM7Z0JBQ2hFLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQzNELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDckMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pDLE9BQU8sVUFBVSxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLEVBQ0YsS0FBSyxFQUFFLENBQ1IsQ0FBQztJQUNKLENBQUM7SUFFTyx1QkFBdUIsQ0FDN0IsUUFBUSxFQUNSLGNBQThCO1FBRTlCLE1BQU0sV0FBVyxHQUFHO1lBQ2xCLFFBQVE7WUFDUixXQUFXLEVBQUUsQ0FBQztZQUNkLFFBQVEsRUFBRSxFQUFFO1lBQ1osY0FBYyxFQUFFLElBQUk7U0FDckIsQ0FBQztRQUNGLElBQUksY0FBYyxFQUFFLElBQUksRUFBRTtZQUN4QixHQUFHLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLGNBQWMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1NBQ3REO1FBQ0QsSUFBSSxjQUFjLEVBQUUsWUFBWSxFQUFFO1lBQ2hDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLEdBQUcsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7U0FDNUQ7UUFDRCxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUVuRCxDQUFDO0lBQ0osQ0FBQztJQUVPLHFCQUFxQixDQUMzQixrQkFBb0MsRUFDcEMsY0FBOEI7UUFFOUIsTUFBTSxJQUFJLEdBQUcsY0FBYztZQUN6QixDQUFDLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMvQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7Z0JBQ2pCLElBQUksY0FBYyxFQUFFLElBQUksRUFBRTtvQkFDeEIsS0FBSyxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzNEO2dCQUNELElBQUksY0FBYyxFQUFFLFlBQVksRUFBRTtvQkFDaEMsS0FBSyxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLGNBQWMsQ0FBQyxZQUFZLENBQUM7aUJBQ3BFO2dCQUVELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQyxDQUFDO1lBQ0osQ0FBQyxDQUFDLGtCQUFrQixDQUFDO1FBQ3ZCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUNyQixJQUFJO1lBQ0osR0FBRyxFQUFFLElBQUk7WUFDVCxNQUFNLEVBQUU7Z0JBQ04sVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNO2FBQ0U7U0FDNUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7a0hBaEdVLHFCQUFxQjtzSEFBckIscUJBQXFCLGNBRnBCLE1BQU07MkZBRVAscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElSZXN1bHRMaXN0LCBQYWdpbmcgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQge1xuICBBZHZhbmNlZFNvZnR3YXJlU2VydmljZSxcbiAgRGV2aWNlU29mdHdhcmUsXG4gIEZpbHRlckNyaXRlcmlhXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvcmVwb3NpdG9yeS9zaGFyZWQnO1xuaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgc2hhcmUsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgRGV2aWNlU29mdHdhcmVTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIGRldmljZSBzb2Z0d2FyZSBkYXRhIGlzIGN1cnJlbnRseSBiZWluZyBsb2FkZWQuXG4gICAqL1xuICBnZXQgbG9hZGluZyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZ1N1YmplY3QkLmFzT2JzZXJ2YWJsZSgpLnBpcGUoc2hhcmUoKSk7XG4gIH1cblxuICBwcml2YXRlIHJlbG9hZFN1YmplY3QkID0gbmV3IEJlaGF2aW9yU3ViamVjdDx2b2lkPihudWxsKTtcbiAgcHJpdmF0ZSBsb2FkaW5nU3ViamVjdCQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYWR2YW5jZWRTb2Z0d2FyZVNlcnZpY2U6IEFkdmFuY2VkU29mdHdhcmVTZXJ2aWNlKSB7fVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGRldmljZSBzb2Z0d2FyZSBkYXRhIHJlbG9hZC5cbiAgICovXG4gIHJlbG9hZCgpIHtcbiAgICB0aGlzLnJlbG9hZFN1YmplY3QkLm5leHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHNvZnR3YXJlIGxpc3QgdGhhdCBpcyBpbnN0YWxsZWQgb24gYSBnaXZlbiBkZXZpY2UuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCBJRCBvZiB0aGUgZGV2aWNlIHRvIHJldHJpZXZlIHNvZnR3YXJlIGRhdGEgZm9yXG4gICAqIEBwYXJhbSBmaWx0ZXJDcml0ZXJpYSBDcml0ZXJpYSB0aGF0IHNvZnR3YXJlIGl0ZW1zIGFyZSBmaWx0ZXJlZCBieS5cbiAgICogQHBhcmFtIGxlZ2FjeVNvZnR3YXJlTGlzdCBJZiBwcm92aWRlZCBubyBkYXRhIHdpbGwgYmUgZmV0Y2hlZCBmcm9tIGJhY2tlbmQuIFRoZSBwcm92aWRlZCBzb2Z0d2FyZSBsaXN0XG4gICAqIHdpbGwgYmUgZmlsdGVyZWQgYnkgdGhlIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBzb2Z0d2FyZSBpdGVtcyBpbnN0YWxsZWQgb24gdGhlIHNwZWNpZmllZCBkZXZpY2UgZmlsdGVyZWQgYnkgdGhlIHNwZWNpZmllZCBjcml0ZXJpYS5cbiAgICovXG4gIGdldFNvZnR3YXJlTGlzdChcbiAgICBkZXZpY2VJZCxcbiAgICBmaWx0ZXJDcml0ZXJpYTogRmlsdGVyQ3JpdGVyaWEsXG4gICAgbGVnYWN5U29mdHdhcmVMaXN0PzogRGV2aWNlU29mdHdhcmVbXVxuICApOiBPYnNlcnZhYmxlPElSZXN1bHRMaXN0PERldmljZVNvZnR3YXJlPj4ge1xuICAgIHRoaXMubG9hZGluZ1N1YmplY3QkLm5leHQodHJ1ZSk7XG5cbiAgICByZXR1cm4gdGhpcy5yZWxvYWRTdWJqZWN0JC5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc29mdHdhcmVMaXN0JCA9ICEhbGVnYWN5U29mdHdhcmVMaXN0XG4gICAgICAgICAgPyB0aGlzLmdldExlZ2FjeVNvZnR3YXJlTGlzdChsZWdhY3lTb2Z0d2FyZUxpc3QsIGZpbHRlckNyaXRlcmlhKVxuICAgICAgICAgIDogdGhpcy5nZXRBZHZhbmNlZFNvZnR3YXJlTGlzdChkZXZpY2VJZCwgZmlsdGVyQ3JpdGVyaWEpO1xuICAgICAgICByZXR1cm4gc29mdHdhcmVMaXN0JC50aGVuKHJlc3VsdExpc3QgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZGluZ1N1YmplY3QkLm5leHQoZmFsc2UpO1xuICAgICAgICAgIHJldHVybiByZXN1bHRMaXN0O1xuICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICAgc2hhcmUoKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldEFkdmFuY2VkU29mdHdhcmVMaXN0KFxuICAgIGRldmljZUlkLFxuICAgIGZpbHRlckNyaXRlcmlhOiBGaWx0ZXJDcml0ZXJpYVxuICApOiBQcm9taXNlPElSZXN1bHRMaXN0PERldmljZVNvZnR3YXJlPj4ge1xuICAgIGNvbnN0IHF1ZXJ5RmlsdGVyID0ge1xuICAgICAgZGV2aWNlSWQsXG4gICAgICBjdXJyZW50UGFnZTogMSxcbiAgICAgIHBhZ2VTaXplOiA1MCxcbiAgICAgIHdpdGhUb3RhbFBhZ2VzOiB0cnVlXG4gICAgfTtcbiAgICBpZiAoZmlsdGVyQ3JpdGVyaWE/Lm5hbWUpIHtcbiAgICAgIHNldChxdWVyeUZpbHRlciwgJ25hbWUnLCBgKiR7ZmlsdGVyQ3JpdGVyaWEubmFtZX0qYCk7XG4gICAgfVxuICAgIGlmIChmaWx0ZXJDcml0ZXJpYT8uc29mdHdhcmVUeXBlKSB7XG4gICAgICBzZXQocXVlcnlGaWx0ZXIsICd0eXBlJywgYCR7ZmlsdGVyQ3JpdGVyaWEuc29mdHdhcmVUeXBlfWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hZHZhbmNlZFNvZnR3YXJlU2VydmljZS5saXN0KHF1ZXJ5RmlsdGVyKSBhcyB1bmtub3duIGFzIFByb21pc2U8XG4gICAgICBJUmVzdWx0TGlzdDxEZXZpY2VTb2Z0d2FyZT5cbiAgICA+O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMZWdhY3lTb2Z0d2FyZUxpc3QoXG4gICAgbGVnYWN5U29mdHdhcmVMaXN0OiBEZXZpY2VTb2Z0d2FyZVtdLFxuICAgIGZpbHRlckNyaXRlcmlhOiBGaWx0ZXJDcml0ZXJpYVxuICApOiBQcm9taXNlPElSZXN1bHRMaXN0PERldmljZVNvZnR3YXJlPj4ge1xuICAgIGNvbnN0IGRhdGEgPSBmaWx0ZXJDcml0ZXJpYVxuICAgICAgPyBsZWdhY3lTb2Z0d2FyZUxpc3QuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgIGxldCBtYXRjaCA9IHRydWU7XG4gICAgICAgICAgaWYgKGZpbHRlckNyaXRlcmlhPy5uYW1lKSB7XG4gICAgICAgICAgICBtYXRjaCA9IG1hdGNoICYmIGl0ZW0ubmFtZT8uaW5jbHVkZXMoZmlsdGVyQ3JpdGVyaWEubmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWx0ZXJDcml0ZXJpYT8uc29mdHdhcmVUeXBlKSB7XG4gICAgICAgICAgICBtYXRjaCA9IG1hdGNoICYmIGl0ZW0uc29mdHdhcmVUeXBlID09PSBmaWx0ZXJDcml0ZXJpYS5zb2Z0d2FyZVR5cGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgICB9KVxuICAgICAgOiBsZWdhY3lTb2Z0d2FyZUxpc3Q7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICBkYXRhLFxuICAgICAgcmVzOiBudWxsLFxuICAgICAgcGFnaW5nOiB7XG4gICAgICAgIHRvdGFsUGFnZXM6IGRhdGEubGVuZ3RoXG4gICAgICB9IGFzIFBhZ2luZzxEZXZpY2VTb2Z0d2FyZT5cbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -1,7 +1,8 @@
1
1
  export * from './device-software-changes.component';
2
2
  export * from './device-software-list.component';
3
+ export * from './device-software.service';
3
4
  export * from './installed-software.component';
4
5
  export * from './software-device-tab.component';
5
6
  export * from './software-device-tab.guard';
6
7
  export * from './software-repository-device-tab.module';
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9yZXBvc2l0b3J5L3NvZnR3YXJlL2RldmljZS10YWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxxQ0FBcUMsQ0FBQztBQUNwRCxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMseUNBQXlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2RldmljZS1zb2Z0d2FyZS1jaGFuZ2VzLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2RldmljZS1zb2Z0d2FyZS1saXN0LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2luc3RhbGxlZC1zb2Z0d2FyZS5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9zb2Z0d2FyZS1kZXZpY2UtdGFiLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3NvZnR3YXJlLWRldmljZS10YWIuZ3VhcmQnO1xuZXhwb3J0ICogZnJvbSAnLi9zb2Z0d2FyZS1yZXBvc2l0b3J5LWRldmljZS10YWIubW9kdWxlJztcbiJdfQ==
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9yZXBvc2l0b3J5L3NvZnR3YXJlL2RldmljZS10YWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxxQ0FBcUMsQ0FBQztBQUNwRCxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyx5Q0FBeUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vZGV2aWNlLXNvZnR3YXJlLWNoYW5nZXMuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vZGV2aWNlLXNvZnR3YXJlLWxpc3QuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vZGV2aWNlLXNvZnR3YXJlLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnN0YWxsZWQtc29mdHdhcmUuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vc29mdHdhcmUtZGV2aWNlLXRhYi5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9zb2Z0d2FyZS1kZXZpY2UtdGFiLmd1YXJkJztcbmV4cG9ydCAqIGZyb20gJy4vc29mdHdhcmUtcmVwb3NpdG9yeS1kZXZpY2UtdGFiLm1vZHVsZSc7XG4iXX0=
@@ -3,20 +3,23 @@ import { ActivatedRoute } from '@angular/router';
3
3
  import { InventoryService, OperationStatus } from '@c8y/client';
4
4
  import { AdvancedSoftwareService, RepositoryService, RepositoryType } from '@c8y/ngx-components/repository/shared';
5
5
  import { BehaviorSubject } from 'rxjs';
6
- import { distinctUntilKeyChanged, map, switchMap } from 'rxjs/operators';
6
+ import { filter, map, switchMap, take } from 'rxjs/operators';
7
+ import { DeviceSoftwareService } from './device-software.service';
7
8
  import * as i0 from "@angular/core";
8
9
  import * as i1 from "@angular/router";
9
10
  import * as i2 from "@c8y/ngx-components/repository/shared";
10
11
  import * as i3 from "@c8y/client";
11
- import * as i4 from "@angular/common";
12
- import * as i5 from "@c8y/ngx-components";
13
- import * as i6 from "./installed-software.component";
14
- import * as i7 from "./device-software-changes.component";
12
+ import * as i4 from "./device-software.service";
13
+ import * as i5 from "@angular/common";
14
+ import * as i6 from "@c8y/ngx-components";
15
+ import * as i7 from "./installed-software.component";
16
+ import * as i8 from "./device-software-changes.component";
15
17
  export class SoftwareDeviceTabComponent {
16
- constructor(route, repository, inventory, advancedSoftwareService) {
18
+ constructor(route, repository, inventory, deviceSoftwareService, advancedSoftwareService) {
17
19
  this.route = route;
18
20
  this.repository = repository;
19
21
  this.inventory = inventory;
22
+ this.deviceSoftwareService = deviceSoftwareService;
20
23
  this.advancedSoftwareService = advancedSoftwareService;
21
24
  this.deviceId = this.route.snapshot.parent.data.contextData.id;
22
25
  this.device$ = new BehaviorSubject(this.route.snapshot.parent.data.contextData);
@@ -24,7 +27,7 @@ export class SoftwareDeviceTabComponent {
24
27
  const deviceTypeQuery = this.repository.getDeviceTypeQuery(RepositoryType.SOFTWARE, device);
25
28
  return this.repository.getSoftwareTypeQuery(device, deviceTypeQuery);
26
29
  }));
27
- this.list$ = this.device$.pipe(distinctUntilKeyChanged('id'), switchMap(device => this.advancedSoftwareService
30
+ this.list$ = this.device$.pipe(switchMap(device => this.advancedSoftwareService
28
31
  .isASMAvailable()
29
32
  .then(isASMAvailable => ({ isASMAvailable, device }))), map(({ isASMAvailable, device }) =>
30
33
  // with ASM available software items will be retrieved directly in the
@@ -65,7 +68,13 @@ export class SoftwareDeviceTabComponent {
65
68
  }
66
69
  async loadDevice() {
67
70
  this.reloading = true;
68
- const device = (await this.inventory.detail(this.deviceId, { withChildren: false })).data;
71
+ this.deviceSoftwareService.reload();
72
+ const device = await Promise.all([
73
+ this.deviceSoftwareService.loading$
74
+ .pipe(filter(loading => !loading), take(1))
75
+ .toPromise(),
76
+ this.inventory.detail(this.deviceId, { withChildren: false }).then(result => result.data)
77
+ ]).then(([_, device]) => device);
69
78
  this.device$.next(device);
70
79
  this.reloading = false;
71
80
  }
@@ -100,10 +109,10 @@ export class SoftwareDeviceTabComponent {
100
109
  return (operation && [OperationStatus.PENDING, OperationStatus.EXECUTING].includes(operation.status));
101
110
  }
102
111
  }
103
- SoftwareDeviceTabComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: SoftwareDeviceTabComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.RepositoryService }, { token: i3.InventoryService }, { token: i2.AdvancedSoftwareService }], target: i0.ɵɵFactoryTarget.Component });
104
- SoftwareDeviceTabComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: SoftwareDeviceTabComponent, selector: "c8y-software-device-tab", ngImport: i0, template: "<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" title=\"{{ 'Reload' | translate }}\" (click)=\"loadDevice()\">\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card split-view--7-5 m-b-0\">\n <c8y-installed-software\n class=\"split-view__list\"\n [device]=\"device$ | async\"\n [typesQuery]=\"typesQuery$ | async\"\n [softwareList]=\"list$ | async\"\n [deviceSoftwareChanges]=\"changes$ | async\"\n [deviceSoftwareChangesOperation]=\"changesOperation$ | async\"\n [deviceSoftwareChangesInProgress]=\"changesInProgress$ | async\"\n (changes)=\"addChanges($event)\"\n (showSoftwareChanges)=\"showSoftwareChanges = true\"\n ></c8y-installed-software>\n <c8y-device-software-changes\n class=\"bg-level-1 split-view__detail\"\n [ngClass]=\"{ 'split-view__detail--selected': showSoftwareChanges }\"\n [changes]=\"changes$ | async\"\n [changesInProgress]=\"changesInProgress$ | async\"\n (clear)=\"clearChanges()\"\n (drop)=\"dropChange($event)\"\n (apply)=\"applyChanges()\"\n (hideSoftwareChanges)=\"showSoftwareChanges = false\"\n ></c8y-device-software-changes>\n</div>\n", dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i5.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "directive", type: i5.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: i6.InstalledSoftwareComponent, selector: "c8y-installed-software", inputs: ["device", "softwareList", "deviceSoftwareChanges", "deviceSoftwareChangesOperation", "deviceSoftwareChangesInProgress", "typesQuery"], outputs: ["changes", "showSoftwareChanges"] }, { kind: "component", type: i7.DeviceSoftwareChangesComponent, selector: "c8y-device-software-changes", inputs: ["changes", "changesInProgress"], outputs: ["clear", "drop", "apply", "hideSoftwareChanges"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.C8yTranslatePipe, name: "translate" }] });
112
+ SoftwareDeviceTabComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: SoftwareDeviceTabComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.RepositoryService }, { token: i3.InventoryService }, { token: i4.DeviceSoftwareService }, { token: i2.AdvancedSoftwareService }], target: i0.ɵɵFactoryTarget.Component });
113
+ SoftwareDeviceTabComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: SoftwareDeviceTabComponent, selector: "c8y-software-device-tab", ngImport: i0, template: "<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" title=\"{{ 'Reload' | translate }}\" (click)=\"loadDevice()\">\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card split-view--7-5 m-b-0\">\n <c8y-installed-software\n class=\"split-view__list\"\n [device]=\"device$ | async\"\n [typesQuery]=\"typesQuery$ | async\"\n [softwareList]=\"list$ | async\"\n [deviceSoftwareChanges]=\"changes$ | async\"\n [deviceSoftwareChangesOperation]=\"changesOperation$ | async\"\n [deviceSoftwareChangesInProgress]=\"changesInProgress$ | async\"\n (changes)=\"addChanges($event)\"\n (showSoftwareChanges)=\"showSoftwareChanges = true\"\n ></c8y-installed-software>\n <c8y-device-software-changes\n class=\"bg-level-1 split-view__detail\"\n [ngClass]=\"{ 'split-view__detail--selected': showSoftwareChanges }\"\n [changes]=\"changes$ | async\"\n [changesInProgress]=\"changesInProgress$ | async\"\n (clear)=\"clearChanges()\"\n (drop)=\"dropChange($event)\"\n (apply)=\"applyChanges()\"\n (hideSoftwareChanges)=\"showSoftwareChanges = false\"\n ></c8y-device-software-changes>\n</div>\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i6.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "directive", type: i6.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: i7.InstalledSoftwareComponent, selector: "c8y-installed-software", inputs: ["device", "softwareList", "deviceSoftwareChanges", "deviceSoftwareChangesOperation", "deviceSoftwareChangesInProgress", "typesQuery"], outputs: ["changes", "showSoftwareChanges"] }, { kind: "component", type: i8.DeviceSoftwareChangesComponent, selector: "c8y-device-software-changes", inputs: ["changes", "changesInProgress"], outputs: ["clear", "drop", "apply", "hideSoftwareChanges"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.C8yTranslatePipe, name: "translate" }] });
105
114
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: SoftwareDeviceTabComponent, decorators: [{
106
115
  type: Component,
107
116
  args: [{ selector: 'c8y-software-device-tab', template: "<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" title=\"{{ 'Reload' | translate }}\" (click)=\"loadDevice()\">\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card split-view--7-5 m-b-0\">\n <c8y-installed-software\n class=\"split-view__list\"\n [device]=\"device$ | async\"\n [typesQuery]=\"typesQuery$ | async\"\n [softwareList]=\"list$ | async\"\n [deviceSoftwareChanges]=\"changes$ | async\"\n [deviceSoftwareChangesOperation]=\"changesOperation$ | async\"\n [deviceSoftwareChangesInProgress]=\"changesInProgress$ | async\"\n (changes)=\"addChanges($event)\"\n (showSoftwareChanges)=\"showSoftwareChanges = true\"\n ></c8y-installed-software>\n <c8y-device-software-changes\n class=\"bg-level-1 split-view__detail\"\n [ngClass]=\"{ 'split-view__detail--selected': showSoftwareChanges }\"\n [changes]=\"changes$ | async\"\n [changesInProgress]=\"changesInProgress$ | async\"\n (clear)=\"clearChanges()\"\n (drop)=\"dropChange($event)\"\n (apply)=\"applyChanges()\"\n (hideSoftwareChanges)=\"showSoftwareChanges = false\"\n ></c8y-device-software-changes>\n</div>\n" }]
108
- }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.RepositoryService }, { type: i3.InventoryService }, { type: i2.AdvancedSoftwareService }]; } });
109
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdHdhcmUtZGV2aWNlLXRhYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9yZXBvc2l0b3J5L3NvZnR3YXJlL2RldmljZS10YWIvc29mdHdhcmUtZGV2aWNlLXRhYi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9yZXBvc2l0b3J5L3NvZnR3YXJlL2RldmljZS10YWIvc29mdHdhcmUtZGV2aWNlLXRhYi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQWtCLGdCQUFnQixFQUFjLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1RixPQUFPLEVBQ0wsdUJBQXVCLEVBR3ZCLGlCQUFpQixFQUNqQixjQUFjLEVBQ2YsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7OztBQU16RSxNQUFNLE9BQU8sMEJBQTBCO0lBOEJyQyxZQUNVLEtBQXFCLEVBQ3JCLFVBQTZCLEVBQzdCLFNBQTJCLEVBQzNCLHVCQUFnRDtRQUhoRCxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUM3QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQiw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQXlCO1FBakMxRCxhQUFRLEdBQW9CLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUMzRSxZQUFPLEdBQUcsSUFBSSxlQUFlLENBQWlC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QkFBMEI7MkdBQTFCLDBCQUEwQiwrRENqQnZDLG12Q0E4QkE7MkZEYmEsMEJBQTBCO2tCQUp0QyxTQUFTOytCQUNFLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBJTWFuYWdlZE9iamVjdCwgSW52ZW50b3J5U2VydmljZSwgSU9wZXJhdGlvbiwgT3BlcmF0aW9uU3RhdHVzIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgQWR2YW5jZWRTb2Z0d2FyZVNlcnZpY2UsXG4gIERldmljZVNvZnR3YXJlLFxuICBEZXZpY2VTb2Z0d2FyZUNoYW5nZSxcbiAgUmVwb3NpdG9yeVNlcnZpY2UsXG4gIFJlcG9zaXRvcnlUeXBlXG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvcmVwb3NpdG9yeS9zaGFyZWQnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsS2V5Q2hhbmdlZCwgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1zb2Z0d2FyZS1kZXZpY2UtdGFiJyxcbiAgdGVtcGxhdGVVcmw6ICdzb2Z0d2FyZS1kZXZpY2UtdGFiLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBTb2Z0d2FyZURldmljZVRhYkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGRldmljZUlkOiBzdHJpbmcgfCBudW1iZXIgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmVudC5kYXRhLmNvbnRleHREYXRhLmlkO1xuICBkZXZpY2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJTWFuYWdlZE9iamVjdD4odGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJlbnQuZGF0YS5jb250ZXh0RGF0YSk7XG4gIHR5cGVzUXVlcnkkOiBPYnNlcnZhYmxlPG9iamVjdD4gPSB0aGlzLmRldmljZSQucGlwZShcbiAgICBtYXAoZGV2aWNlID0+IHtcbiAgICAgIGNvbnN0IGRldmljZVR5cGVRdWVyeSA9IHRoaXMucmVwb3NpdG9yeS5nZXREZXZpY2VUeXBlUXVlcnkoUmVwb3NpdG9yeVR5cGUuU09GVFdBUkUsIGRldmljZSk7XG4gICAgICByZXR1cm4gdGhpcy5yZXBvc2l0b3J5LmdldFNvZnR3YXJlVHlwZVF1ZXJ5KGRldmljZSwgZGV2aWNlVHlwZVF1ZXJ5KTtcbiAgICB9KVxuICApO1xuICBsaXN0JDogT2JzZXJ2YWJsZTxEZXZpY2VTb2Z0d2FyZVtdPiA9IHRoaXMuZGV2aWNlJC5waXBlKFxuICAgIGRpc3RpbmN0VW50aWxLZXlDaGFuZ2VkKCdpZCcpLFxuICAgIHN3aXRjaE1hcChkZXZpY2UgPT5cbiAgICAgIHRoaXMuYWR2YW5jZWRTb2Z0d2FyZVNlcnZpY2VcbiAgICAgICAgLmlzQVNNQXZhaWxhYmxlKClcbiAgICAgICAgLnRoZW4oaXNBU01BdmFpbGFibGUgPT4gKHsgaXNBU01BdmFpbGFibGUsIGRldmljZSB9KSlcbiAgICApLFxuICAgIG1hcCgoeyBpc0FTTUF2YWlsYWJsZSwgZGV2aWNlIH0pID0+XG4gICAgICAvLyB3aXRoIEFTTSBhdmFpbGFibGUgc29mdHdhcmUgaXRlbXMgd2lsbCBiZSByZXRyaWV2ZWQgZGlyZWN0bHkgaW4gdGhlXG4gICAgICAvLyBkZXZpY2Utc29mdHdhcmUtbGlzdCBjb21wb25lbnRcbiAgICAgIGlzQVNNQXZhaWxhYmxlID8gdW5kZWZpbmVkIDogdGhpcy5yZXBvc2l0b3J5LmdldERldmljZVNvZnR3YXJlTGlzdChkZXZpY2UpXG4gICAgKVxuICApO1xuICBjaGFuZ2VzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGV2aWNlU29mdHdhcmVDaGFuZ2VbXT4oW10pO1xuICBjaGFuZ2VzT3BlcmF0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SU9wZXJhdGlvbj4obnVsbCk7XG4gIGNoYW5nZXNJblByb2dyZXNzJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuY2hhbmdlc09wZXJhdGlvbiQucGlwZShcbiAgICBtYXAob3BlcmF0aW9uID0+IHRoaXMuaXNJblByb2dyZXNzKG9wZXJhdGlvbikpXG4gICk7XG4gIHJlbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBzaG93U29mdHdhcmVDaGFuZ2VzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByZXBvc2l0b3J5OiBSZXBvc2l0b3J5U2VydmljZSxcbiAgICBwcml2YXRlIGludmVudG9yeTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIGFkdmFuY2VkU29mdHdhcmVTZXJ2aWNlOiBBZHZhbmNlZFNvZnR3YXJlU2VydmljZVxuICApIHt9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgYXdhaXQgdGhpcy5sb2FkRGV2aWNlKCk7XG4gICAgYXdhaXQgdGhpcy5sb2FkT3BlcmF0aW9uKCk7XG4gIH1cblxuICBhZGRDaGFuZ2VzKHJlcXVlc3RlZENoYW5nZXM6IERldmljZVNvZnR3YXJlQ2hhbmdlW10pIHtcbiAgICBsZXQgc3RhZ2VkQ2hhbmdlcyA9IFsuLi50aGlzLmNoYW5nZXMkLnZhbHVlXTtcbiAgICByZXF1ZXN0ZWRDaGFuZ2VzLmZvckVhY2gocmVxdWVzdGVkQ2hhbmdlID0+IHtcbiAgICAgIGNvbnN0IGFscmVhZHlTdGFnZWQgPSBzdGFnZWRDaGFuZ2VzLnNvbWUoc3RhZ2VkQ2hhbmdlID0+XG4gICAgICAgIHRoaXMuYXJlU2FtZUNoYW5nZXMoc3RhZ2VkQ2hhbmdlLCByZXF1ZXN0ZWRDaGFuZ2UpXG4gICAgICApO1xuICAgICAgaWYgKCFhbHJlYWR5U3RhZ2VkKSB7XG4gICAgICAgIHN0YWdlZENoYW5nZXMgPSBbLi4uc3RhZ2VkQ2hhbmdlcywgcmVxdWVzdGVkQ2hhbmdlXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNoYW5nZXMkLm5leHQoc3RhZ2VkQ2hhbmdlcyk7XG4gIH1cblxuICBkcm9wQ2hhbmdlKGNoYW5nZVRvQmVEcm9wcGVkOiBEZXZpY2VTb2Z0d2FyZUNoYW5nZSkge1xuICAgIGxldCBzdGFnZWRDaGFuZ2VzID0gWy4uLnRoaXMuY2hhbmdlcyQudmFsdWVdO1xuICAgIHN0YWdlZENoYW5nZXMgPSBzdGFnZWRDaGFuZ2VzLmZpbHRlcihcbiAgICAgIHN0YWdlZENoYW5nZSA9PiAhdGhpcy5hcmVTYW1lQ2hhbmdlcyhzdGFnZWRDaGFuZ2UsIGNoYW5nZVRvQmVEcm9wcGVkKVxuICAgICk7XG4gICAgdGhpcy5jaGFuZ2VzJC5uZXh0KHN0YWdlZENoYW5nZXMpO1xuICB9XG5cbiAgYXJlU2FtZUNoYW5nZXMoY2hhbmdlMTogRGV2aWNlU29mdHdhcmVDaGFuZ2UsIGNoYW5nZTI6IERldmljZVNvZnR3YXJlQ2hhbmdlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoYW5nZTEubmFtZSA9PT0gY2hhbmdlMi5uYW1lICYmXG4gICAgICBjaGFuZ2UxLnZlcnNpb24gPT09IGNoYW5nZTIudmVyc2lvbiAmJlxuICAgICAgY2hhbmdlMS5hY3Rpb24gPT09IGNoYW5nZTIuYWN0aW9uXG4gICAgKTtcbiAgfVxuXG4gIGNsZWFyQ2hhbmdlcygpIHtcbiAgICB0aGlzLmNoYW5nZXMkLm5leHQoW10pO1xuICB9XG5cbiAgYXN5bmMgbG9hZERldmljZSgpIHtcbiAgICB0aGlzLnJlbG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgZGV2aWNlID0gKGF3YWl0IHRoaXMuaW52ZW50b3J5LmRldGFpbCh0aGlzLmRldmljZUlkLCB7IHdpdGhDaGlsZHJlbjogZmFsc2UgfSkpLmRhdGE7XG4gICAgdGhpcy5kZXZpY2UkLm5leHQoZGV2aWNlKTtcbiAgICB0aGlzLnJlbG9hZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgYXBwbHlDaGFuZ2VzKCkge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IGF3YWl0IHRoaXMucmVwb3NpdG9yeS5jcmVhdGVTb2Z0d2FyZVVwZGF0ZU9wZXJhdGlvbihcbiAgICAgIHRoaXMuZGV2aWNlJC52YWx1ZSxcbiAgICAgIHRoaXMuY2hhbmdlcyQudmFsdWVcbiAgICApO1xuICAgIGF3YWl0IHRoaXMudHJhY2tPcGVyYXRpb24ob3BlcmF0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZE9wZXJhdGlvbigpIHtcbiAgICBjb25zdCBvcGVyYXRpb24gPSBhd2FpdCB0aGlzLnJlcG9zaXRvcnkuZ2V0TGFzdFNvZnR3YXJlVXBkYXRlT3BlcmF0aW9uKHRoaXMuZGV2aWNlSWQpO1xuICAgIGF3YWl0IHRoaXMudHJhY2tPcGVyYXRpb24ob3BlcmF0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdHJhY2tPcGVyYXRpb24ob3BlcmF0aW9uOiBJT3BlcmF0aW9uKSB7XG4gICAgdGhpcy5jaGFuZ2VzT3BlcmF0aW9uJC5uZXh0KG9wZXJhdGlvbik7XG5cbiAgICBpZiAodGhpcy5pc0luUHJvZ3Jlc3Mob3BlcmF0aW9uKSkge1xuICAgICAgYXdhaXQgdGhpcy5kaXNwbGF5Q2hhbmdlc0Zyb21PcGVyYXRpb24ob3BlcmF0aW9uKTtcbiAgICAgIHRoaXMucmVwb3NpdG9yeS5vYnNlcnZlT3BlcmF0aW9uKG9wZXJhdGlvbikuc3Vic2NyaWJlKFxuICAgICAgICBvcGVyYXRpb25VcGRhdGUgPT4ge1xuICAgICAgICAgIHRoaXMuY2hhbmdlc09wZXJhdGlvbiQubmV4dChvcGVyYXRpb25VcGRhdGUpO1xuICAgICAgICAgIGlmIChvcGVyYXRpb25VcGRhdGUuc3RhdHVzID09PSBPcGVyYXRpb25TdGF0dXMuU1VDQ0VTU0ZVTCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhckNoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMubG9hZERldmljZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb3BlcmF0aW9uVXBkYXRlID0+IHtcbiAgICAgICAgICB0aGlzLmNoYW5nZXNPcGVyYXRpb24kLm5leHQob3BlcmF0aW9uVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGRpc3BsYXlDaGFuZ2VzRnJvbU9wZXJhdGlvbihvcGVyYXRpb246IElPcGVyYXRpb24pIHtcbiAgICBjb25zdCBjaGFuZ2VzID0gYXdhaXQgdGhpcy5yZXBvc2l0b3J5LmdldERldmljZVNvZnR3YXJlQ2hhbmdlc0Zyb21PcGVyYXRpb24oXG4gICAgICBvcGVyYXRpb24sXG4gICAgICB0aGlzLmRldmljZSQudmFsdWVcbiAgICApO1xuICAgIHRoaXMuY2hhbmdlcyQubmV4dChjaGFuZ2VzKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJblByb2dyZXNzKG9wZXJhdGlvbjogSU9wZXJhdGlvbikge1xuICAgIHJldHVybiAoXG4gICAgICBvcGVyYXRpb24gJiYgW09wZXJhdGlvblN0YXR1cy5QRU5ESU5HLCBPcGVyYXRpb25TdGF0dXMuRVhFQ1VUSU5HXS5pbmNsdWRlcyhvcGVyYXRpb24uc3RhdHVzKVxuICAgICk7XG4gIH1cbn1cbiIsIjxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiPlxuICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCIgdGl0bGU9XCJ7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVwiIChjbGljayk9XCJsb2FkRGV2aWNlKClcIj5cbiAgICA8aSBjOHlJY29uPVwicmVmcmVzaFwiIFtuZ0NsYXNzXT1cInsgJ2ljb24tc3Bpbic6IHJlbG9hZGluZyB9XCI+PC9pPlxuICAgIHt7ICdSZWxvYWQnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48ZGl2IGNsYXNzPVwiY2FyZCBzcGxpdC12aWV3LS03LTUgbS1iLTBcIj5cbiAgPGM4eS1pbnN0YWxsZWQtc29mdHdhcmVcbiAgICBjbGFzcz1cInNwbGl0LXZpZXdfX2xpc3RcIlxuICAgIFtkZXZpY2VdPVwiZGV2aWNlJCB8IGFzeW5jXCJcbiAgICBbdHlwZXNRdWVyeV09XCJ0eXBlc1F1ZXJ5JCB8IGFzeW5jXCJcbiAgICBbc29mdHdhcmVMaXN0XT1cImxpc3QkIHwgYXN5bmNcIlxuICAgIFtkZXZpY2VTb2Z0d2FyZUNoYW5nZXNdPVwiY2hhbmdlcyQgfCBhc3luY1wiXG4gICAgW2RldmljZVNvZnR3YXJlQ2hhbmdlc09wZXJhdGlvbl09XCJjaGFuZ2VzT3BlcmF0aW9uJCB8IGFzeW5jXCJcbiAgICBbZGV2aWNlU29mdHdhcmVDaGFuZ2VzSW5Qcm9ncmVzc109XCJjaGFuZ2VzSW5Qcm9ncmVzcyQgfCBhc3luY1wiXG4gICAgKGNoYW5nZXMpPVwiYWRkQ2hhbmdlcygkZXZlbnQpXCJcbiAgICAoc2hvd1NvZnR3YXJlQ2hhbmdlcyk9XCJzaG93U29mdHdhcmVDaGFuZ2VzID0gdHJ1ZVwiXG4gID48L2M4eS1pbnN0YWxsZWQtc29mdHdhcmU+XG4gIDxjOHktZGV2aWNlLXNvZnR3YXJlLWNoYW5nZXNcbiAgICBjbGFzcz1cImJnLWxldmVsLTEgc3BsaXQtdmlld19fZGV0YWlsXCJcbiAgICBbbmdDbGFzc109XCJ7ICdzcGxpdC12aWV3X19kZXRhaWwtLXNlbGVjdGVkJzogc2hvd1NvZnR3YXJlQ2hhbmdlcyB9XCJcbiAgICBbY2hhbmdlc109XCJjaGFuZ2VzJCB8IGFzeW5jXCJcbiAgICBbY2hhbmdlc0luUHJvZ3Jlc3NdPVwiY2hhbmdlc0luUHJvZ3Jlc3MkIHwgYXN5bmNcIlxuICAgIChjbGVhcik9XCJjbGVhckNoYW5nZXMoKVwiXG4gICAgKGRyb3ApPVwiZHJvcENoYW5nZSgkZXZlbnQpXCJcbiAgICAoYXBwbHkpPVwiYXBwbHlDaGFuZ2VzKClcIlxuICAgIChoaWRlU29mdHdhcmVDaGFuZ2VzKT1cInNob3dTb2Z0d2FyZUNoYW5nZXMgPSBmYWxzZVwiXG4gID48L2M4eS1kZXZpY2Utc29mdHdhcmUtY2hhbmdlcz5cbjwvZGl2PlxuIl19
117
+ }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.RepositoryService }, { type: i3.InventoryService }, { type: i4.DeviceSoftwareService }, { type: i2.AdvancedSoftwareService }]; } });
118
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdHdhcmUtZGV2aWNlLXRhYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9yZXBvc2l0b3J5L3NvZnR3YXJlL2RldmljZS10YWIvc29mdHdhcmUtZGV2aWNlLXRhYi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9yZXBvc2l0b3J5L3NvZnR3YXJlL2RldmljZS10YWIvc29mdHdhcmUtZGV2aWNlLXRhYi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQWtCLGdCQUFnQixFQUFjLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1RixPQUFPLEVBQ0wsdUJBQXVCLEVBR3ZCLGlCQUFpQixFQUNqQixjQUFjLEVBQ2YsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7Ozs7OztBQU1sRSxNQUFNLE9BQU8sMEJBQTBCO0lBNkJyQyxZQUNVLEtBQXFCLEVBQ3JCLFVBQTZCLEVBQzdCLFNBQTJCLEVBQzNCLHFCQUE0QyxFQUM1Qyx1QkFBZ0Q7UUFKaEQsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDckIsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFDN0IsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDM0IsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1Qyw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQXlCO1FBakMxRCxhQUFRLEdBQW9CLElB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Q0FBQztZQUMvQyxDQUFDLENBQ0YsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxTQUFxQjtRQUM3RCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMscUNBQXFDLENBQ3pFLFNBQVMsRUFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FDbkIsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTyxZQUFZLENBQUMsU0FBcUI7UUFDeEMsT0FBTyxDQUNMLFNBQVMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQzdGLENBQUM7SUFDSixDQUFDOzt1SEF4SVUsMEJBQTBCOzJHQUExQiwwQkFBMEIsK0RDbEJ2QyxtdkNBOEJBOzJGRFphLDBCQUEwQjtrQkFKdEMsU0FBUzsrQkFDRSx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QsIEludmVudG9yeVNlcnZpY2UsIElPcGVyYXRpb24sIE9wZXJhdGlvblN0YXR1cyB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7XG4gIEFkdmFuY2VkU29mdHdhcmVTZXJ2aWNlLFxuICBEZXZpY2VTb2Z0d2FyZSxcbiAgRGV2aWNlU29mdHdhcmVDaGFuZ2UsXG4gIFJlcG9zaXRvcnlTZXJ2aWNlLFxuICBSZXBvc2l0b3J5VHlwZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL3JlcG9zaXRvcnkvc2hhcmVkJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHN3aXRjaE1hcCwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERldmljZVNvZnR3YXJlU2VydmljZSB9IGZyb20gJy4vZGV2aWNlLXNvZnR3YXJlLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktc29mdHdhcmUtZGV2aWNlLXRhYicsXG4gIHRlbXBsYXRlVXJsOiAnc29mdHdhcmUtZGV2aWNlLXRhYi5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgU29mdHdhcmVEZXZpY2VUYWJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBkZXZpY2VJZDogc3RyaW5nIHwgbnVtYmVyID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJlbnQuZGF0YS5jb250ZXh0RGF0YS5pZDtcbiAgZGV2aWNlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SU1hbmFnZWRPYmplY3Q+KHRoaXMucm91dGUuc25hcHNob3QucGFyZW50LmRhdGEuY29udGV4dERhdGEpO1xuICB0eXBlc1F1ZXJ5JDogT2JzZXJ2YWJsZTxvYmplY3Q+ID0gdGhpcy5kZXZpY2UkLnBpcGUoXG4gICAgbWFwKGRldmljZSA9PiB7XG4gICAgICBjb25zdCBkZXZpY2VUeXBlUXVlcnkgPSB0aGlzLnJlcG9zaXRvcnkuZ2V0RGV2aWNlVHlwZVF1ZXJ5KFJlcG9zaXRvcnlUeXBlLlNPRlRXQVJFLCBkZXZpY2UpO1xuICAgICAgcmV0dXJuIHRoaXMucmVwb3NpdG9yeS5nZXRTb2Z0d2FyZVR5cGVRdWVyeShkZXZpY2UsIGRldmljZVR5cGVRdWVyeSk7XG4gICAgfSlcbiAgKTtcbiAgbGlzdCQ6IE9ic2VydmFibGU8RGV2aWNlU29mdHdhcmVbXT4gPSB0aGlzLmRldmljZSQucGlwZShcbiAgICBzd2l0Y2hNYXAoZGV2aWNlID0+XG4gICAgICB0aGlzLmFkdmFuY2VkU29mdHdhcmVTZXJ2aWNlXG4gICAgICAgIC5pc0FTTUF2YWlsYWJsZSgpXG4gICAgICAgIC50aGVuKGlzQVNNQXZhaWxhYmxlID0+ICh7IGlzQVNNQXZhaWxhYmxlLCBkZXZpY2UgfSkpXG4gICAgKSxcbiAgICBtYXAoKHsgaXNBU01BdmFpbGFibGUsIGRldmljZSB9KSA9PlxuICAgICAgLy8gd2l0aCBBU00gYXZhaWxhYmxlIHNvZnR3YXJlIGl0ZW1zIHdpbGwgYmUgcmV0cmlldmVkIGRpcmVjdGx5IGluIHRoZVxuICAgICAgLy8gZGV2aWNlLXNvZnR3YXJlLWxpc3QgY29tcG9uZW50XG4gICAgICBpc0FTTUF2YWlsYWJsZSA/IHVuZGVmaW5lZCA6IHRoaXMucmVwb3NpdG9yeS5nZXREZXZpY2VTb2Z0d2FyZUxpc3QoZGV2aWNlKVxuICAgIClcbiAgKTtcbiAgY2hhbmdlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERldmljZVNvZnR3YXJlQ2hhbmdlW10+KFtdKTtcbiAgY2hhbmdlc09wZXJhdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElPcGVyYXRpb24+KG51bGwpO1xuICBjaGFuZ2VzSW5Qcm9ncmVzcyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmNoYW5nZXNPcGVyYXRpb24kLnBpcGUoXG4gICAgbWFwKG9wZXJhdGlvbiA9PiB0aGlzLmlzSW5Qcm9ncmVzcyhvcGVyYXRpb24pKVxuICApO1xuICByZWxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd1NvZnR3YXJlQ2hhbmdlczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgcmVwb3NpdG9yeTogUmVwb3NpdG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbnZlbnRvcnk6IEludmVudG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkZXZpY2VTb2Z0d2FyZVNlcnZpY2U6IERldmljZVNvZnR3YXJlU2VydmljZSxcbiAgICBwcml2YXRlIGFkdmFuY2VkU29mdHdhcmVTZXJ2aWNlOiBBZHZhbmNlZFNvZnR3YXJlU2VydmljZVxuICApIHt9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgYXdhaXQgdGhpcy5sb2FkRGV2aWNlKCk7XG4gICAgYXdhaXQgdGhpcy5sb2FkT3BlcmF0aW9uKCk7XG4gIH1cblxuICBhZGRDaGFuZ2VzKHJlcXVlc3RlZENoYW5nZXM6IERldmljZVNvZnR3YXJlQ2hhbmdlW10pIHtcbiAgICBsZXQgc3RhZ2VkQ2hhbmdlcyA9IFsuLi50aGlzLmNoYW5nZXMkLnZhbHVlXTtcbiAgICByZXF1ZXN0ZWRDaGFuZ2VzLmZvckVhY2gocmVxdWVzdGVkQ2hhbmdlID0+IHtcbiAgICAgIGNvbnN0IGFscmVhZHlTdGFnZWQgPSBzdGFnZWRDaGFuZ2VzLnNvbWUoc3RhZ2VkQ2hhbmdlID0+XG4gICAgICAgIHRoaXMuYXJlU2FtZUNoYW5nZXMoc3RhZ2VkQ2hhbmdlLCByZXF1ZXN0ZWRDaGFuZ2UpXG4gICAgICApO1xuICAgICAgaWYgKCFhbHJlYWR5U3RhZ2VkKSB7XG4gICAgICAgIHN0YWdlZENoYW5nZXMgPSBbLi4uc3RhZ2VkQ2hhbmdlcywgcmVxdWVzdGVkQ2hhbmdlXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNoYW5nZXMkLm5leHQoc3RhZ2VkQ2hhbmdlcyk7XG4gIH1cblxuICBkcm9wQ2hhbmdlKGNoYW5nZVRvQmVEcm9wcGVkOiBEZXZpY2VTb2Z0d2FyZUNoYW5nZSkge1xuICAgIGxldCBzdGFnZWRDaGFuZ2VzID0gWy4uLnRoaXMuY2hhbmdlcyQudmFsdWVdO1xuICAgIHN0YWdlZENoYW5nZXMgPSBzdGFnZWRDaGFuZ2VzLmZpbHRlcihcbiAgICAgIHN0YWdlZENoYW5nZSA9PiAhdGhpcy5hcmVTYW1lQ2hhbmdlcyhzdGFnZWRDaGFuZ2UsIGNoYW5nZVRvQmVEcm9wcGVkKVxuICAgICk7XG4gICAgdGhpcy5jaGFuZ2VzJC5uZXh0KHN0YWdlZENoYW5nZXMpO1xuICB9XG5cbiAgYXJlU2FtZUNoYW5nZXMoY2hhbmdlMTogRGV2aWNlU29mdHdhcmVDaGFuZ2UsIGNoYW5nZTI6IERldmljZVNvZnR3YXJlQ2hhbmdlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoYW5nZTEubmFtZSA9PT0gY2hhbmdlMi5uYW1lICYmXG4gICAgICBjaGFuZ2UxLnZlcnNpb24gPT09IGNoYW5nZTIudmVyc2lvbiAmJlxuICAgICAgY2hhbmdlMS5hY3Rpb24gPT09IGNoYW5nZTIuYWN0aW9uXG4gICAgKTtcbiAgfVxuXG4gIGNsZWFyQ2hhbmdlcygpIHtcbiAgICB0aGlzLmNoYW5nZXMkLm5leHQoW10pO1xuICB9XG5cbiAgYXN5bmMgbG9hZERldmljZSgpIHtcbiAgICB0aGlzLnJlbG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5kZXZpY2VTb2Z0d2FyZVNlcnZpY2UucmVsb2FkKCk7XG4gICAgY29uc3QgZGV2aWNlID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdGhpcy5kZXZpY2VTb2Z0d2FyZVNlcnZpY2UubG9hZGluZyRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKGxvYWRpbmcgPT4gIWxvYWRpbmcpLFxuICAgICAgICAgIHRha2UoMSlcbiAgICAgICAgKVxuICAgICAgICAudG9Qcm9taXNlKCksXG4gICAgICB0aGlzLmludmVudG9yeS5kZXRhaWwodGhpcy5kZXZpY2VJZCwgeyB3aXRoQ2hpbGRyZW46IGZhbHNlIH0pLnRoZW4ocmVzdWx0ID0+IHJlc3VsdC5kYXRhKVxuICAgIF0pLnRoZW4oKFtfLCBkZXZpY2VdKSA9PiBkZXZpY2UpO1xuICAgIHRoaXMuZGV2aWNlJC5uZXh0KGRldmljZSk7XG4gICAgdGhpcy5yZWxvYWRpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIGFwcGx5Q2hhbmdlcygpIHtcbiAgICBjb25zdCBvcGVyYXRpb24gPSBhd2FpdCB0aGlzLnJlcG9zaXRvcnkuY3JlYXRlU29mdHdhcmVVcGRhdGVPcGVyYXRpb24oXG4gICAgICB0aGlzLmRldmljZSQudmFsdWUsXG4gICAgICB0aGlzLmNoYW5nZXMkLnZhbHVlXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLnRyYWNrT3BlcmF0aW9uKG9wZXJhdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRPcGVyYXRpb24oKSB7XG4gICAgY29uc3Qgb3BlcmF0aW9uID0gYXdhaXQgdGhpcy5yZXBvc2l0b3J5LmdldExhc3RTb2Z0d2FyZVVwZGF0ZU9wZXJhdGlvbih0aGlzLmRldmljZUlkKTtcbiAgICBhd2FpdCB0aGlzLnRyYWNrT3BlcmF0aW9uKG9wZXJhdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHRyYWNrT3BlcmF0aW9uKG9wZXJhdGlvbjogSU9wZXJhdGlvbikge1xuICAgIHRoaXMuY2hhbmdlc09wZXJhdGlvbiQubmV4dChvcGVyYXRpb24pO1xuXG4gICAgaWYgKHRoaXMuaXNJblByb2dyZXNzKG9wZXJhdGlvbikpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGlzcGxheUNoYW5nZXNGcm9tT3BlcmF0aW9uKG9wZXJhdGlvbik7XG4gICAgICB0aGlzLnJlcG9zaXRvcnkub2JzZXJ2ZU9wZXJhdGlvbihvcGVyYXRpb24pLnN1YnNjcmliZShcbiAgICAgICAgb3BlcmF0aW9uVXBkYXRlID0+IHtcbiAgICAgICAgICB0aGlzLmNoYW5nZXNPcGVyYXRpb24kLm5leHQob3BlcmF0aW9uVXBkYXRlKTtcbiAgICAgICAgICBpZiAob3BlcmF0aW9uVXBkYXRlLnN0YXR1cyA9PT0gT3BlcmF0aW9uU3RhdHVzLlNVQ0NFU1NGVUwpIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJDaGFuZ2VzKCk7XG4gICAgICAgICAgICB0aGlzLmxvYWREZXZpY2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9wZXJhdGlvblVwZGF0ZSA9PiB7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VzT3BlcmF0aW9uJC5uZXh0KG9wZXJhdGlvblVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBkaXNwbGF5Q2hhbmdlc0Zyb21PcGVyYXRpb24ob3BlcmF0aW9uOiBJT3BlcmF0aW9uKSB7XG4gICAgY29uc3QgY2hhbmdlcyA9IGF3YWl0IHRoaXMucmVwb3NpdG9yeS5nZXREZXZpY2VTb2Z0d2FyZUNoYW5nZXNGcm9tT3BlcmF0aW9uKFxuICAgICAgb3BlcmF0aW9uLFxuICAgICAgdGhpcy5kZXZpY2UkLnZhbHVlXG4gICAgKTtcbiAgICB0aGlzLmNoYW5nZXMkLm5leHQoY2hhbmdlcyk7XG4gIH1cblxuICBwcml2YXRlIGlzSW5Qcm9ncmVzcyhvcGVyYXRpb246IElPcGVyYXRpb24pIHtcbiAgICByZXR1cm4gKFxuICAgICAgb3BlcmF0aW9uICYmIFtPcGVyYXRpb25TdGF0dXMuUEVORElORywgT3BlcmF0aW9uU3RhdHVzLkVYRUNVVElOR10uaW5jbHVkZXMob3BlcmF0aW9uLnN0YXR1cylcbiAgICApO1xuICB9XG59XG4iLCI8Yzh5LWFjdGlvbi1iYXItaXRlbSBbcGxhY2VtZW50XT1cIidyaWdodCdcIj5cbiAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGlua1wiIHRpdGxlPVwie3sgJ1JlbG9hZCcgfCB0cmFuc2xhdGUgfX1cIiAoY2xpY2spPVwibG9hZERldmljZSgpXCI+XG4gICAgPGkgYzh5SWNvbj1cInJlZnJlc2hcIiBbbmdDbGFzc109XCJ7ICdpY29uLXNwaW4nOiByZWxvYWRpbmcgfVwiPjwvaT5cbiAgICB7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGRpdiBjbGFzcz1cImNhcmQgc3BsaXQtdmlldy0tNy01IG0tYi0wXCI+XG4gIDxjOHktaW5zdGFsbGVkLXNvZnR3YXJlXG4gICAgY2xhc3M9XCJzcGxpdC12aWV3X19saXN0XCJcbiAgICBbZGV2aWNlXT1cImRldmljZSQgfCBhc3luY1wiXG4gICAgW3R5cGVzUXVlcnldPVwidHlwZXNRdWVyeSQgfCBhc3luY1wiXG4gICAgW3NvZnR3YXJlTGlzdF09XCJsaXN0JCB8IGFzeW5jXCJcbiAgICBbZGV2aWNlU29mdHdhcmVDaGFuZ2VzXT1cImNoYW5nZXMkIHwgYXN5bmNcIlxuICAgIFtkZXZpY2VTb2Z0d2FyZUNoYW5nZXNPcGVyYXRpb25dPVwiY2hhbmdlc09wZXJhdGlvbiQgfCBhc3luY1wiXG4gICAgW2RldmljZVNvZnR3YXJlQ2hhbmdlc0luUHJvZ3Jlc3NdPVwiY2hhbmdlc0luUHJvZ3Jlc3MkIHwgYXN5bmNcIlxuICAgIChjaGFuZ2VzKT1cImFkZENoYW5nZXMoJGV2ZW50KVwiXG4gICAgKHNob3dTb2Z0d2FyZUNoYW5nZXMpPVwic2hvd1NvZnR3YXJlQ2hhbmdlcyA9IHRydWVcIlxuICA+PC9jOHktaW5zdGFsbGVkLXNvZnR3YXJlPlxuICA8Yzh5LWRldmljZS1zb2Z0d2FyZS1jaGFuZ2VzXG4gICAgY2xhc3M9XCJiZy1sZXZlbC0xIHNwbGl0LXZpZXdfX2RldGFpbFwiXG4gICAgW25nQ2xhc3NdPVwieyAnc3BsaXQtdmlld19fZGV0YWlsLS1zZWxlY3RlZCc6IHNob3dTb2Z0d2FyZUNoYW5nZXMgfVwiXG4gICAgW2NoYW5nZXNdPVwiY2hhbmdlcyQgfCBhc3luY1wiXG4gICAgW2NoYW5nZXNJblByb2dyZXNzXT1cImNoYW5nZXNJblByb2dyZXNzJCB8IGFzeW5jXCJcbiAgICAoY2xlYXIpPVwiY2xlYXJDaGFuZ2VzKClcIlxuICAgIChkcm9wKT1cImRyb3BDaGFuZ2UoJGV2ZW50KVwiXG4gICAgKGFwcGx5KT1cImFwcGx5Q2hhbmdlcygpXCJcbiAgICAoaGlkZVNvZnR3YXJlQ2hhbmdlcyk9XCJzaG93U29mdHdhcmVDaGFuZ2VzID0gZmFsc2VcIlxuICA+PC9jOHktZGV2aWNlLXNvZnR3YXJlLWNoYW5nZXM+XG48L2Rpdj5cbiJdfQ==
@@ -5,7 +5,7 @@ import * as i4 from '@c8y/ngx-components';
5
5
  import { gettext, BaseColumn, getBasicInputArrayFormFieldConfig, TypeaheadComponent, memoize, Status, NavigatorNode, hookNavigator, hookRoute, CoreModule, FormsModule, ModalSelectionMode, ViewContext } from '@c8y/ngx-components';
6
6
  import * as i2 from '@c8y/ngx-components/repository/shared';
7
7
  import { PRODUCT_EXPERIENCE, RepositoryType, SoftwareTypeComponent, SharedRepositoryModule, RepositorySelectModalComponent } from '@c8y/ngx-components/repository/shared';
8
- import { isUndefined, assign, get, cloneDeep, uniqBy, property, filter, set, has } from 'lodash-es';
8
+ import { isUndefined, assign, get, cloneDeep, uniqBy, property, set, filter, has } from 'lodash-es';
9
9
  import { BehaviorSubject, from, NEVER, pipe, Observable, Subject, merge, of, combineLatest } from 'rxjs';
10
10
  import { tap, debounceTime, distinctUntilChanged, switchMap, map, shareReplay, distinctUntilKeyChanged, withLatestFrom, takeUntil, take, share, mergeMap, filter as filter$1 } from 'rxjs/operators';
11
11
  import * as i1 from 'ngx-bootstrap/modal';
@@ -775,9 +775,96 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
775
775
  }]
776
776
  }] });
777
777
 
778
- class DeviceSoftwareListComponent {
778
+ class DeviceSoftwareService {
779
779
  constructor(advancedSoftwareService) {
780
780
  this.advancedSoftwareService = advancedSoftwareService;
781
+ this.reloadSubject$ = new BehaviorSubject(null);
782
+ this.loadingSubject$ = new Subject();
783
+ }
784
+ /**
785
+ * Indicates whether device software data is currently being loaded.
786
+ */
787
+ get loading$() {
788
+ return this.loadingSubject$.asObservable().pipe(share());
789
+ }
790
+ /**
791
+ * Trigger device software data reload.
792
+ */
793
+ reload() {
794
+ this.reloadSubject$.next();
795
+ }
796
+ /**
797
+ * Retrieves the software list that is installed on a given device.
798
+ *
799
+ * @param deviceId ID of the device to retrieve software data for
800
+ * @param filterCriteria Criteria that software items are filtered by.
801
+ * @param legacySoftwareList If provided no data will be fetched from backend. The provided software list
802
+ * will be filtered by the specified filter criteria.
803
+ *
804
+ * @returns The software items installed on the specified device filtered by the specified criteria.
805
+ */
806
+ getSoftwareList(deviceId, filterCriteria, legacySoftwareList) {
807
+ this.loadingSubject$.next(true);
808
+ return this.reloadSubject$.pipe(switchMap(() => {
809
+ const softwareList$ = !!legacySoftwareList
810
+ ? this.getLegacySoftwareList(legacySoftwareList, filterCriteria)
811
+ : this.getAdvancedSoftwareList(deviceId, filterCriteria);
812
+ return softwareList$.then(resultList => {
813
+ this.loadingSubject$.next(false);
814
+ return resultList;
815
+ });
816
+ }), share());
817
+ }
818
+ getAdvancedSoftwareList(deviceId, filterCriteria) {
819
+ const queryFilter = {
820
+ deviceId,
821
+ currentPage: 1,
822
+ pageSize: 50,
823
+ withTotalPages: true
824
+ };
825
+ if (filterCriteria === null || filterCriteria === void 0 ? void 0 : filterCriteria.name) {
826
+ set(queryFilter, 'name', `*${filterCriteria.name}*`);
827
+ }
828
+ if (filterCriteria === null || filterCriteria === void 0 ? void 0 : filterCriteria.softwareType) {
829
+ set(queryFilter, 'type', `${filterCriteria.softwareType}`);
830
+ }
831
+ return this.advancedSoftwareService.list(queryFilter);
832
+ }
833
+ getLegacySoftwareList(legacySoftwareList, filterCriteria) {
834
+ const data = filterCriteria
835
+ ? legacySoftwareList.filter(item => {
836
+ var _a;
837
+ let match = true;
838
+ if (filterCriteria === null || filterCriteria === void 0 ? void 0 : filterCriteria.name) {
839
+ match = match && ((_a = item.name) === null || _a === void 0 ? void 0 : _a.includes(filterCriteria.name));
840
+ }
841
+ if (filterCriteria === null || filterCriteria === void 0 ? void 0 : filterCriteria.softwareType) {
842
+ match = match && item.softwareType === filterCriteria.softwareType;
843
+ }
844
+ return match;
845
+ })
846
+ : legacySoftwareList;
847
+ return Promise.resolve({
848
+ data,
849
+ res: null,
850
+ paging: {
851
+ totalPages: data.length
852
+ }
853
+ });
854
+ }
855
+ }
856
+ DeviceSoftwareService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DeviceSoftwareService, deps: [{ token: i2.AdvancedSoftwareService }], target: i0.ɵɵFactoryTarget.Injectable });
857
+ DeviceSoftwareService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DeviceSoftwareService, providedIn: 'root' });
858
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DeviceSoftwareService, decorators: [{
859
+ type: Injectable,
860
+ args: [{
861
+ providedIn: 'root'
862
+ }]
863
+ }], ctorParameters: function () { return [{ type: i2.AdvancedSoftwareService }]; } });
864
+
865
+ class DeviceSoftwareListComponent {
866
+ constructor(deviceSoftwareService) {
867
+ this.deviceSoftwareService = deviceSoftwareService;
781
868
  this.PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE;
782
869
  this.filterCriteria$ = of(null);
783
870
  this.update = new EventEmitter();
@@ -787,6 +874,7 @@ class DeviceSoftwareListComponent {
787
874
  this.supportsSoftwareOperations = false;
788
875
  this.operationTypes = ['c8y_SoftwareUpdate', 'c8y_SoftwareList', 'c8y_Software'];
789
876
  this.legacySoftwareList$ = new BehaviorSubject([]);
877
+ this.destroyed$ = new Subject();
790
878
  }
791
879
  set softwareList(softwareList) {
792
880
  if (softwareList !== null) {
@@ -798,20 +886,15 @@ class DeviceSoftwareListComponent {
798
886
  this.filterCriteria$.pipe(debounceTime(300), distinctUntilChanged()),
799
887
  this.legacySoftwareList$
800
888
  ]).pipe(switchMap(([filterCriteria, legacySoftwareList]) => {
801
- if (legacySoftwareList) {
802
- return of(this.getLegacySoftwareList(filterCriteria)).pipe(map(resultList => ({ resultList, filterCriteria })));
803
- }
804
- else {
805
- return this.getAdvancedSoftwareList(filterCriteria).then(resultList => ({
806
- resultList,
807
- filterCriteria
808
- }));
809
- }
889
+ var _a;
890
+ return this.deviceSoftwareService
891
+ .getSoftwareList((_a = this.device) === null || _a === void 0 ? void 0 : _a.id, filterCriteria, legacySoftwareList)
892
+ .pipe(map(resultList => ({ resultList, filterCriteria })));
810
893
  }), tap(({ resultList, filterCriteria }) => {
811
894
  var _a, _b;
812
895
  this.notifyListEmpty(!((_a = resultList === null || resultList === void 0 ? void 0 : resultList.paging) === null || _a === void 0 ? void 0 : _a.totalPages) && !filterCriteria);
813
896
  this.noSearchResults = !((_b = resultList === null || resultList === void 0 ? void 0 : resultList.paging) === null || _b === void 0 ? void 0 : _b.totalPages) && !!filterCriteria;
814
- }), map(({ resultList }) => resultList), share());
897
+ }), map(({ resultList }) => resultList), share(), takeUntil(this.destroyed$));
815
898
  const supportedOperations = get(this.device, 'c8y_SupportedOperations', []);
816
899
  this.supportsSoftwareOperations = this.operationTypes.some(operationType => supportedOperations.indexOf(operationType) > -1);
817
900
  }
@@ -823,54 +906,21 @@ class DeviceSoftwareListComponent {
823
906
  const relevantChanges = filter(this.deviceSoftwareChanges, software);
824
907
  return relevantChanges.length > 0;
825
908
  }
826
- getAdvancedSoftwareList(filterCriteria) {
827
- const queryFilter = {
828
- deviceId: this.device.id,
829
- currentPage: 1,
830
- pageSize: 50,
831
- withTotalPages: true
832
- };
833
- if (filterCriteria === null || filterCriteria === void 0 ? void 0 : filterCriteria.name) {
834
- set(queryFilter, 'name', `*${filterCriteria.name}*`);
835
- }
836
- if (filterCriteria === null || filterCriteria === void 0 ? void 0 : filterCriteria.softwareType) {
837
- set(queryFilter, 'type', `${filterCriteria.softwareType}`);
838
- }
839
- return this.advancedSoftwareService.list(queryFilter);
840
- }
841
- getLegacySoftwareList(filterCriteria) {
842
- const data = filterCriteria
843
- ? this.legacySoftwareList$.value.filter(item => {
844
- var _a;
845
- let match = true;
846
- if (filterCriteria === null || filterCriteria === void 0 ? void 0 : filterCriteria.name) {
847
- match = match && ((_a = item.name) === null || _a === void 0 ? void 0 : _a.includes(filterCriteria.name));
848
- }
849
- if (filterCriteria === null || filterCriteria === void 0 ? void 0 : filterCriteria.softwareType) {
850
- match = match && item.softwareType === filterCriteria.softwareType;
851
- }
852
- return match;
853
- })
854
- : this.legacySoftwareList$.value;
855
- return {
856
- data,
857
- res: null,
858
- paging: {
859
- totalPages: data.length
860
- }
861
- };
909
+ ngOnDestroy() {
910
+ this.destroyed$.next();
911
+ this.destroyed$.complete();
862
912
  }
863
913
  notifyListEmpty(isEmpty) {
864
914
  this.emptyList = isEmpty;
865
915
  this.onListEmpty.emit(isEmpty);
866
916
  }
867
917
  }
868
- DeviceSoftwareListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DeviceSoftwareListComponent, deps: [{ token: i2.AdvancedSoftwareService }], target: i0.ɵɵFactoryTarget.Component });
918
+ DeviceSoftwareListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DeviceSoftwareListComponent, deps: [{ token: DeviceSoftwareService }], target: i0.ɵɵFactoryTarget.Component });
869
919
  DeviceSoftwareListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: DeviceSoftwareListComponent, selector: "c8y-device-software-list", inputs: { softwareList: "softwareList", device: "device", deviceSoftwareChanges: "deviceSoftwareChanges", filterCriteria$: "filterCriteria$" }, outputs: { update: "update", remove: "remove", onListEmpty: "onListEmpty" }, ngImport: i0, template: "<c8y-list-group class=\"no-border-2nd-last\">\n <c8y-li\n [ngClass]=\"{ disabled: isSoftwareGoingToBeChanged(software) }\"\n *c8yFor=\"let software of softwareItems$\"\n >\n <!-- SOFTWARE ICON -->\n <c8y-li-icon>\n <i c8yIcon=\"c8y-tools\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-20\">\n <div title=\"{{ software.name }}\" class=\"col-9\">\n <p class=\"d-flex\">\n <!-- SOFTWARE NAME -->\n <span class=\"text-truncate\">\n {{ software.name }}\n </span>\n <!-- SOFTWARE TYPE-->\n <span class=\"text-truncate\">\n <span class=\"label label-primary m-l-8\">{{ software.softwareType }}</span>\n </span>\n </p>\n <!-- SOFTWARE VERSION -->\n <p class=\"d-flex a-i-center\">\n <span class=\"text-truncate text-label-small m-r-4\" translate>Version</span>\n <span class=\"text-truncate m-r-4\" title=\"{{ software.version }}\">\n {{ software.version }}\n </span>\n <i\n *ngIf=\"software.installed\"\n c8yIcon=\"warning\"\n class=\"text-warning a-s-center\"\n [tooltip]=\"\n alreadyInstalledMessage\n | translate: { name: software.name, version: software.version }\n \"\n container=\"body\"\n placement=\"top\"\n [delay]=\"500\"\n ></i>\n </p>\n </div>\n\n <div\n *ngIf=\"supportsSoftwareOperations && (showUpdate || showRemove)\"\n class=\"col-3 text-right m-0 flex-grow d-flex a-i-center\"\n >\n <!-- UPDATE SOFTWARE -->\n <button\n *ngIf=\"showUpdate && !isSoftwareGoingToBeChanged(software)\"\n class=\"btn btn-default btn-xs m-l-auto m-r-4\"\n (click)=\"update.emit(software)\"\n title=\"{{ 'Update`software,verb`' | translate }}\"\n type=\"button\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.DEVICE_TAB\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.DEVICE_SOFTWARE_LIST,\n action: PRODUCT_EXPERIENCE.SOFTWARE.ACTIONS.OPEN_UPDATE_SOFTWARE\n }\"\n >\n {{ 'Update`software,verb`' | translate }}\n </button>\n\n <!-- REMOVE SOFTWARE -->\n <button\n *ngIf=\"showRemove && !isSoftwareGoingToBeChanged(software)\"\n class=\"btn btn-dot btn-dot--danger m-l-4\"\n (click)=\"remove.emit(software)\"\n tooltip=\"{{ 'Remove`software,verb`' | translate }}\"\n [attr.aria-label]=\"'Remove`software,verb`' | translate\"\n placement=\"bottom\"\n container=\"body\"\n [delay]=\"500\"\n type=\"button\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.DEVICE_TAB\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.DEVICE_SOFTWARE_LIST,\n action: PRODUCT_EXPERIENCE.SOFTWARE.ACTIONS.DELETE_SOFTWARE\n }\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n</c8y-list-group>\n<!-- NO SEARCH RESULTS STATE -->\n<div class=\"card-block\" *ngIf=\"noSearchResults || emptyList\">\n <ng-content *ngIf=\"emptyList\" select=\".c8y-empty-state:not(.c8y-no-results-state)\"></ng-content>\n <ng-content *ngIf=\"noSearchResults\" select=\".c8y-no-results-state\"></ng-content>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i4.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount"] }, { kind: "component", type: i4.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i4.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "emptyActions", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i4.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i4.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "directive", type: i4.ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit"] }, { kind: "directive", type: i10.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: i4.C8yTranslatePipe, name: "translate" }] });
870
920
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DeviceSoftwareListComponent, decorators: [{
871
921
  type: Component,
872
922
  args: [{ selector: 'c8y-device-software-list', template: "<c8y-list-group class=\"no-border-2nd-last\">\n <c8y-li\n [ngClass]=\"{ disabled: isSoftwareGoingToBeChanged(software) }\"\n *c8yFor=\"let software of softwareItems$\"\n >\n <!-- SOFTWARE ICON -->\n <c8y-li-icon>\n <i c8yIcon=\"c8y-tools\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-20\">\n <div title=\"{{ software.name }}\" class=\"col-9\">\n <p class=\"d-flex\">\n <!-- SOFTWARE NAME -->\n <span class=\"text-truncate\">\n {{ software.name }}\n </span>\n <!-- SOFTWARE TYPE-->\n <span class=\"text-truncate\">\n <span class=\"label label-primary m-l-8\">{{ software.softwareType }}</span>\n </span>\n </p>\n <!-- SOFTWARE VERSION -->\n <p class=\"d-flex a-i-center\">\n <span class=\"text-truncate text-label-small m-r-4\" translate>Version</span>\n <span class=\"text-truncate m-r-4\" title=\"{{ software.version }}\">\n {{ software.version }}\n </span>\n <i\n *ngIf=\"software.installed\"\n c8yIcon=\"warning\"\n class=\"text-warning a-s-center\"\n [tooltip]=\"\n alreadyInstalledMessage\n | translate: { name: software.name, version: software.version }\n \"\n container=\"body\"\n placement=\"top\"\n [delay]=\"500\"\n ></i>\n </p>\n </div>\n\n <div\n *ngIf=\"supportsSoftwareOperations && (showUpdate || showRemove)\"\n class=\"col-3 text-right m-0 flex-grow d-flex a-i-center\"\n >\n <!-- UPDATE SOFTWARE -->\n <button\n *ngIf=\"showUpdate && !isSoftwareGoingToBeChanged(software)\"\n class=\"btn btn-default btn-xs m-l-auto m-r-4\"\n (click)=\"update.emit(software)\"\n title=\"{{ 'Update`software,verb`' | translate }}\"\n type=\"button\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.DEVICE_TAB\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.DEVICE_SOFTWARE_LIST,\n action: PRODUCT_EXPERIENCE.SOFTWARE.ACTIONS.OPEN_UPDATE_SOFTWARE\n }\"\n >\n {{ 'Update`software,verb`' | translate }}\n </button>\n\n <!-- REMOVE SOFTWARE -->\n <button\n *ngIf=\"showRemove && !isSoftwareGoingToBeChanged(software)\"\n class=\"btn btn-dot btn-dot--danger m-l-4\"\n (click)=\"remove.emit(software)\"\n tooltip=\"{{ 'Remove`software,verb`' | translate }}\"\n [attr.aria-label]=\"'Remove`software,verb`' | translate\"\n placement=\"bottom\"\n container=\"body\"\n [delay]=\"500\"\n type=\"button\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.DEVICE_TAB\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.DEVICE_SOFTWARE_LIST,\n action: PRODUCT_EXPERIENCE.SOFTWARE.ACTIONS.DELETE_SOFTWARE\n }\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n</c8y-list-group>\n<!-- NO SEARCH RESULTS STATE -->\n<div class=\"card-block\" *ngIf=\"noSearchResults || emptyList\">\n <ng-content *ngIf=\"emptyList\" select=\".c8y-empty-state:not(.c8y-no-results-state)\"></ng-content>\n <ng-content *ngIf=\"noSearchResults\" select=\".c8y-no-results-state\"></ng-content>\n</div>\n" }]
873
- }], ctorParameters: function () { return [{ type: i2.AdvancedSoftwareService }]; }, propDecorators: { softwareList: [{
923
+ }], ctorParameters: function () { return [{ type: DeviceSoftwareService }]; }, propDecorators: { softwareList: [{
874
924
  type: Input
875
925
  }], device: [{
876
926
  type: Input
@@ -1108,10 +1158,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
1108
1158
  }] } });
1109
1159
 
1110
1160
  class SoftwareDeviceTabComponent {
1111
- constructor(route, repository, inventory, advancedSoftwareService) {
1161
+ constructor(route, repository, inventory, deviceSoftwareService, advancedSoftwareService) {
1112
1162
  this.route = route;
1113
1163
  this.repository = repository;
1114
1164
  this.inventory = inventory;
1165
+ this.deviceSoftwareService = deviceSoftwareService;
1115
1166
  this.advancedSoftwareService = advancedSoftwareService;
1116
1167
  this.deviceId = this.route.snapshot.parent.data.contextData.id;
1117
1168
  this.device$ = new BehaviorSubject(this.route.snapshot.parent.data.contextData);
@@ -1119,7 +1170,7 @@ class SoftwareDeviceTabComponent {
1119
1170
  const deviceTypeQuery = this.repository.getDeviceTypeQuery(RepositoryType.SOFTWARE, device);
1120
1171
  return this.repository.getSoftwareTypeQuery(device, deviceTypeQuery);
1121
1172
  }));
1122
- this.list$ = this.device$.pipe(distinctUntilKeyChanged('id'), switchMap(device => this.advancedSoftwareService
1173
+ this.list$ = this.device$.pipe(switchMap(device => this.advancedSoftwareService
1123
1174
  .isASMAvailable()
1124
1175
  .then(isASMAvailable => ({ isASMAvailable, device }))), map(({ isASMAvailable, device }) =>
1125
1176
  // with ASM available software items will be retrieved directly in the
@@ -1163,7 +1214,13 @@ class SoftwareDeviceTabComponent {
1163
1214
  loadDevice() {
1164
1215
  return __awaiter(this, void 0, void 0, function* () {
1165
1216
  this.reloading = true;
1166
- const device = (yield this.inventory.detail(this.deviceId, { withChildren: false })).data;
1217
+ this.deviceSoftwareService.reload();
1218
+ const device = yield Promise.all([
1219
+ this.deviceSoftwareService.loading$
1220
+ .pipe(filter$1(loading => !loading), take(1))
1221
+ .toPromise(),
1222
+ this.inventory.detail(this.deviceId, { withChildren: false }).then(result => result.data)
1223
+ ]).then(([_, device]) => device);
1167
1224
  this.device$.next(device);
1168
1225
  this.reloading = false;
1169
1226
  });
@@ -1207,12 +1264,12 @@ class SoftwareDeviceTabComponent {
1207
1264
  return (operation && [OperationStatus.PENDING, OperationStatus.EXECUTING].includes(operation.status));
1208
1265
  }
1209
1266
  }
1210
- SoftwareDeviceTabComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: SoftwareDeviceTabComponent, deps: [{ token: i5$1.ActivatedRoute }, { token: i2.RepositoryService }, { token: i2$1.InventoryService }, { token: i2.AdvancedSoftwareService }], target: i0.ɵɵFactoryTarget.Component });
1267
+ SoftwareDeviceTabComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: SoftwareDeviceTabComponent, deps: [{ token: i5$1.ActivatedRoute }, { token: i2.RepositoryService }, { token: i2$1.InventoryService }, { token: DeviceSoftwareService }, { token: i2.AdvancedSoftwareService }], target: i0.ɵɵFactoryTarget.Component });
1211
1268
  SoftwareDeviceTabComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: SoftwareDeviceTabComponent, selector: "c8y-software-device-tab", ngImport: i0, template: "<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" title=\"{{ 'Reload' | translate }}\" (click)=\"loadDevice()\">\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card split-view--7-5 m-b-0\">\n <c8y-installed-software\n class=\"split-view__list\"\n [device]=\"device$ | async\"\n [typesQuery]=\"typesQuery$ | async\"\n [softwareList]=\"list$ | async\"\n [deviceSoftwareChanges]=\"changes$ | async\"\n [deviceSoftwareChangesOperation]=\"changesOperation$ | async\"\n [deviceSoftwareChangesInProgress]=\"changesInProgress$ | async\"\n (changes)=\"addChanges($event)\"\n (showSoftwareChanges)=\"showSoftwareChanges = true\"\n ></c8y-installed-software>\n <c8y-device-software-changes\n class=\"bg-level-1 split-view__detail\"\n [ngClass]=\"{ 'split-view__detail--selected': showSoftwareChanges }\"\n [changes]=\"changes$ | async\"\n [changesInProgress]=\"changesInProgress$ | async\"\n (clear)=\"clearChanges()\"\n (drop)=\"dropChange($event)\"\n (apply)=\"applyChanges()\"\n (hideSoftwareChanges)=\"showSoftwareChanges = false\"\n ></c8y-device-software-changes>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i4.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "directive", type: i4.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: InstalledSoftwareComponent, selector: "c8y-installed-software", inputs: ["device", "softwareList", "deviceSoftwareChanges", "deviceSoftwareChangesOperation", "deviceSoftwareChangesInProgress", "typesQuery"], outputs: ["changes", "showSoftwareChanges"] }, { kind: "component", type: DeviceSoftwareChangesComponent, selector: "c8y-device-software-changes", inputs: ["changes", "changesInProgress"], outputs: ["clear", "drop", "apply", "hideSoftwareChanges"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }] });
1212
1269
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: SoftwareDeviceTabComponent, decorators: [{
1213
1270
  type: Component,
1214
1271
  args: [{ selector: 'c8y-software-device-tab', template: "<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" title=\"{{ 'Reload' | translate }}\" (click)=\"loadDevice()\">\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card split-view--7-5 m-b-0\">\n <c8y-installed-software\n class=\"split-view__list\"\n [device]=\"device$ | async\"\n [typesQuery]=\"typesQuery$ | async\"\n [softwareList]=\"list$ | async\"\n [deviceSoftwareChanges]=\"changes$ | async\"\n [deviceSoftwareChangesOperation]=\"changesOperation$ | async\"\n [deviceSoftwareChangesInProgress]=\"changesInProgress$ | async\"\n (changes)=\"addChanges($event)\"\n (showSoftwareChanges)=\"showSoftwareChanges = true\"\n ></c8y-installed-software>\n <c8y-device-software-changes\n class=\"bg-level-1 split-view__detail\"\n [ngClass]=\"{ 'split-view__detail--selected': showSoftwareChanges }\"\n [changes]=\"changes$ | async\"\n [changesInProgress]=\"changesInProgress$ | async\"\n (clear)=\"clearChanges()\"\n (drop)=\"dropChange($event)\"\n (apply)=\"applyChanges()\"\n (hideSoftwareChanges)=\"showSoftwareChanges = false\"\n ></c8y-device-software-changes>\n</div>\n" }]
1215
- }], ctorParameters: function () { return [{ type: i5$1.ActivatedRoute }, { type: i2.RepositoryService }, { type: i2$1.InventoryService }, { type: i2.AdvancedSoftwareService }]; } });
1272
+ }], ctorParameters: function () { return [{ type: i5$1.ActivatedRoute }, { type: i2.RepositoryService }, { type: i2$1.InventoryService }, { type: DeviceSoftwareService }, { type: i2.AdvancedSoftwareService }]; } });
1216
1273
 
1217
1274
  class SoftwareDeviceTabGuard {
1218
1275
  constructor() {
@@ -1312,5 +1369,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
1312
1369
  * Generated bundle index. Do not edit.
1313
1370
  */
1314
1371
 
1315
- export { AddSoftwareModalComponent, DeviceSoftwareChangesComponent, DeviceSoftwareListComponent, InstalledSoftwareComponent, SoftwareDetailsComponent, SoftwareDeviceTabComponent, SoftwareDeviceTabGuard, SoftwareListComponent, SoftwareRepositoryDeviceTabModule, SoftwareRepositoryListModule, SoftwareRepositoryModule };
1372
+ export { AddSoftwareModalComponent, DeviceSoftwareChangesComponent, DeviceSoftwareListComponent, DeviceSoftwareService, InstalledSoftwareComponent, SoftwareDetailsComponent, SoftwareDeviceTabComponent, SoftwareDeviceTabGuard, SoftwareListComponent, SoftwareRepositoryDeviceTabModule, SoftwareRepositoryListModule, SoftwareRepositoryModule };
1316
1373
  //# sourceMappingURL=c8y-ngx-components-repository-software.mjs.map