@c8y/ngx-components 1011.0.24 → 1011.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/binary-file-download/binary-file-download.service.d.ts +3 -3
  2. package/binary-file-download/c8y-ngx-components-binary-file-download.metadata.json +1 -1
  3. package/bundles/c8y-ngx-components-binary-file-download.umd.js +17 -14
  4. package/bundles/c8y-ngx-components-binary-file-download.umd.js.map +1 -1
  5. package/bundles/c8y-ngx-components-binary-file-download.umd.min.js +2 -2
  6. package/bundles/c8y-ngx-components-binary-file-download.umd.min.js.map +1 -1
  7. package/bundles/c8y-ngx-components-protocol-lpwan.umd.js +15 -7
  8. package/bundles/c8y-ngx-components-protocol-lpwan.umd.js.map +1 -1
  9. package/bundles/c8y-ngx-components-protocol-lpwan.umd.min.js +2 -2
  10. package/bundles/c8y-ngx-components-protocol-lpwan.umd.min.js.map +1 -1
  11. package/bundles/c8y-ngx-components-repository.umd.js +36 -14
  12. package/bundles/c8y-ngx-components-repository.umd.js.map +1 -1
  13. package/bundles/c8y-ngx-components-repository.umd.min.js +1 -1
  14. package/bundles/c8y-ngx-components-repository.umd.min.js.map +1 -1
  15. package/bundles/c8y-ngx-components.umd.js +1 -1
  16. package/bundles/c8y-ngx-components.umd.js.map +1 -1
  17. package/bundles/c8y-ngx-components.umd.min.js +1 -1
  18. package/bundles/c8y-ngx-components.umd.min.js.map +1 -1
  19. package/c8y-ngx-components.metadata.json +1 -1
  20. package/esm2015/binary-file-download/binary-file-download.service.js +15 -13
  21. package/esm2015/core/select/typeahead.component.js +2 -2
  22. package/esm2015/protocol-lpwan/lpwan-set-device-protocol.component.js +10 -3
  23. package/esm2015/protocol-lpwan/lpwan-set-device-protocol.service.js +6 -5
  24. package/esm2015/repository/configuration-device-tab/device-configuration.component.js +7 -2
  25. package/esm2015/repository/configuration-device-tab/device-configuration.guard.js +4 -2
  26. package/esm2015/repository/firmware-device-tab/firmware-device-tab.component.js +4 -3
  27. package/esm2015/repository/firmware-device-tab/firmware-device-tab.guard.js +4 -5
  28. package/esm2015/repository/software-device-tab/device-software-list.component.js +10 -3
  29. package/esm2015/repository/software-device-tab/installed-software.component.js +10 -2
  30. package/esm2015/repository/software-device-tab/software-device-tab.component.js +2 -2
  31. package/esm2015/repository/software-device-tab/software-device-tab.guard.js +9 -5
  32. package/fesm2015/c8y-ngx-components-binary-file-download.js +14 -12
  33. package/fesm2015/c8y-ngx-components-binary-file-download.js.map +1 -1
  34. package/fesm2015/c8y-ngx-components-protocol-lpwan.js +14 -6
  35. package/fesm2015/c8y-ngx-components-protocol-lpwan.js.map +1 -1
  36. package/fesm2015/c8y-ngx-components-repository.js +37 -15
  37. package/fesm2015/c8y-ngx-components-repository.js.map +1 -1
  38. package/fesm2015/c8y-ngx-components.js +1 -1
  39. package/fesm2015/c8y-ngx-components.js.map +1 -1
  40. package/locales/locales.pot +6 -3
  41. package/package.json +2 -2
  42. package/protocol-lpwan/c8y-ngx-components-protocol-lpwan.metadata.json +1 -1
  43. package/protocol-lpwan/lpwan-set-device-protocol.component.d.ts +3 -1
  44. package/repository/c8y-ngx-components-repository.metadata.json +1 -1
  45. package/repository/configuration-device-tab/device-configuration.guard.d.ts +1 -1
  46. package/repository/firmware-device-tab/firmware-device-tab.component.d.ts +1 -0
  47. package/repository/firmware-device-tab/firmware-device-tab.guard.d.ts +1 -1
  48. package/repository/software-device-tab/device-software-list.component.d.ts +7 -2
  49. package/repository/software-device-tab/installed-software.component.d.ts +4 -0
  50. package/repository/software-device-tab/software-device-tab.guard.d.ts +2 -2
@@ -1,17 +1,16 @@
1
1
  import { Injectable } from '@angular/core';
2
- import { get, indexOf } from 'lodash-es';
2
+ import { get, has, indexOf } from 'lodash-es';
3
3
  const FIRMWARE_FRAGMENT = 'c8y_Firmware';
4
4
  const SUPPORTED_OPERATIONS_FRAGMENT = 'c8y_SupportedOperations';
5
5
  export class FirmwareDeviceTabGuard {
6
6
  canActivate(route) {
7
7
  const contextData = get(route, 'data.contextData') || get(route, 'parent.data.contextData');
8
8
  const supportedOperations = get(contextData, SUPPORTED_OPERATIONS_FRAGMENT);
9
- return !!supportedOperations
10
- ? indexOf(supportedOperations, FIRMWARE_FRAGMENT) >= 0
11
- : false;
9
+ return ((!!supportedOperations ? indexOf(supportedOperations, FIRMWARE_FRAGMENT) >= 0 : false) ||
10
+ has(contextData, 'c8y_Firmware'));
12
11
  }
13
12
  }
14
13
  FirmwareDeviceTabGuard.decorators = [
15
14
  { type: Injectable }
16
15
  ];
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlybXdhcmUtZGV2aWNlLXRhYi5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3JlcG9zaXRvcnkvZmlybXdhcmUtZGV2aWNlLXRhYi9maXJtd2FyZS1kZXZpY2UtdGFiLmd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFekMsTUFBTSxpQkFBaUIsR0FBRyxjQUFjLENBQUM7QUFDekMsTUFBTSw2QkFBNkIsR0FBRyx5QkFBeUIsQ0FBQztBQUdoRSxNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLFdBQVcsQ0FBQyxLQUFLO1FBQ2YsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUseUJBQXlCLENBQUMsQ0FBQztRQUM1RixNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztRQUM1RSxPQUFPLENBQUMsQ0FBQyxtQkFBbUI7WUFDMUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7WUFDdEQsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNaLENBQUM7OztZQVJGLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDYW5BY3RpdmF0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBnZXQsIGluZGV4T2YgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5jb25zdCBGSVJNV0FSRV9GUkFHTUVOVCA9ICdjOHlfRmlybXdhcmUnO1xuY29uc3QgU1VQUE9SVEVEX09QRVJBVElPTlNfRlJBR01FTlQgPSAnYzh5X1N1cHBvcnRlZE9wZXJhdGlvbnMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRmlybXdhcmVEZXZpY2VUYWJHdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlIHtcbiAgY2FuQWN0aXZhdGUocm91dGUpIHtcbiAgICBjb25zdCBjb250ZXh0RGF0YSA9IGdldChyb3V0ZSwgJ2RhdGEuY29udGV4dERhdGEnKSB8fCBnZXQocm91dGUsICdwYXJlbnQuZGF0YS5jb250ZXh0RGF0YScpO1xuICAgIGNvbnN0IHN1cHBvcnRlZE9wZXJhdGlvbnMgPSBnZXQoY29udGV4dERhdGEsIFNVUFBPUlRFRF9PUEVSQVRJT05TX0ZSQUdNRU5UKTtcbiAgICByZXR1cm4gISFzdXBwb3J0ZWRPcGVyYXRpb25zXG4gICAgICA/IGluZGV4T2Yoc3VwcG9ydGVkT3BlcmF0aW9ucywgRklSTVdBUkVfRlJBR01FTlQpID49IDBcbiAgICAgIDogZmFsc2U7XG4gIH1cbn1cbiJdfQ==
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlybXdhcmUtZGV2aWNlLXRhYi5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3JlcG9zaXRvcnkvZmlybXdhcmUtZGV2aWNlLXRhYi9maXJtd2FyZS1kZXZpY2UtdGFiLmd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTlDLE1BQU0saUJBQWlCLEdBQUcsY0FBYyxDQUFDO0FBQ3pDLE1BQU0sNkJBQTZCLEdBQUcseUJBQXlCLENBQUM7QUFHaEUsTUFBTSxPQUFPLHNCQUFzQjtJQUNqQyxXQUFXLENBQUMsS0FBSztRQUNmLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLHlCQUF5QixDQUFDLENBQUM7UUFDNUYsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLDZCQUE2QixDQUFDLENBQUM7UUFDNUUsT0FBTyxDQUNMLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUN0RixHQUFHLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUNqQyxDQUFDO0lBQ0osQ0FBQzs7O1lBVEYsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENhbkFjdGl2YXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IGdldCwgaGFzLCBpbmRleE9mIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuY29uc3QgRklSTVdBUkVfRlJBR01FTlQgPSAnYzh5X0Zpcm13YXJlJztcbmNvbnN0IFNVUFBPUlRFRF9PUEVSQVRJT05TX0ZSQUdNRU5UID0gJ2M4eV9TdXBwb3J0ZWRPcGVyYXRpb25zJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZpcm13YXJlRGV2aWNlVGFiR3VhcmQgaW1wbGVtZW50cyBDYW5BY3RpdmF0ZSB7XG4gIGNhbkFjdGl2YXRlKHJvdXRlKSB7XG4gICAgY29uc3QgY29udGV4dERhdGEgPSBnZXQocm91dGUsICdkYXRhLmNvbnRleHREYXRhJykgfHwgZ2V0KHJvdXRlLCAncGFyZW50LmRhdGEuY29udGV4dERhdGEnKTtcbiAgICBjb25zdCBzdXBwb3J0ZWRPcGVyYXRpb25zID0gZ2V0KGNvbnRleHREYXRhLCBTVVBQT1JURURfT1BFUkFUSU9OU19GUkFHTUVOVCk7XG4gICAgcmV0dXJuIChcbiAgICAgICghIXN1cHBvcnRlZE9wZXJhdGlvbnMgPyBpbmRleE9mKHN1cHBvcnRlZE9wZXJhdGlvbnMsIEZJUk1XQVJFX0ZSQUdNRU5UKSA+PSAwIDogZmFsc2UpIHx8XG4gICAgICBoYXMoY29udGV4dERhdGEsICdjOHlfRmlybXdhcmUnKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -1,9 +1,15 @@
1
1
  import { Component, Output, Input, EventEmitter } from '@angular/core';
2
- import { filter } from 'lodash-es';
2
+ import { filter, get } from 'lodash-es';
3
3
  export class DeviceSoftwareListComponent {
4
4
  constructor() {
5
5
  this.update = new EventEmitter();
6
6
  this.remove = new EventEmitter();
7
+ this.supportsSoftwareOperations = false;
8
+ this.operationTypes = ['c8y_SoftwareUpdate', 'c8y_SoftwareList', 'c8y_Software'];
9
+ }
10
+ ngOnInit() {
11
+ const supportedOperations = get(this.device, 'c8y_SupportedOperations', []);
12
+ this.supportsSoftwareOperations = this.operationTypes.some(operationType => supportedOperations.indexOf(operationType) > -1);
7
13
  }
8
14
  ngAfterContentInit() {
9
15
  this.showUpdate = this.update.observers.length > 0;
@@ -17,13 +23,14 @@ export class DeviceSoftwareListComponent {
17
23
  DeviceSoftwareListComponent.decorators = [
18
24
  { type: Component, args: [{
19
25
  selector: 'c8y-device-software-list',
20
- template: "<c8y-list-group class=\"no-border-last\">\n <c8y-li\n [ngClass]=\"{ disabled: isSoftwareGoingToBeChanged(software) }\"\n *ngFor=\"let software of softwareList\"\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-8\">\n <!-- SOFTWARE NAME -->\n <p class=\"text-truncate\">{{ software.name }}</p>\n <!-- SOFTWARE VERSION -->\n <p class=\"text-truncate\">\n <span class=\"text-label-small m-r-4\" translate>\n Version\n </span>\n <span title=\"{{ software.version }}\">\n {{ software.version }}\n </span>\n </p>\n </div>\n\n <div *ngIf=\"showUpdate || showRemove\" class=\"col-4 text-right\">\n <!-- UPDATE SOFTWARE -->\n <button\n *ngIf=\"showUpdate && !isSoftwareGoingToBeChanged(software)\"\n class=\"btn btn-default btn-xs showOnHover\"\n (click)=\"update.emit(software)\"\n title=\"{{ 'Update`software,verb`' | translate }}\"\n translate\n >\n Update\n </button>\n\n <!-- REMOVE SOFTWARE -->\n <button\n *ngIf=\"showRemove && !isSoftwareGoingToBeChanged(software)\"\n title=\"{{ 'Remove`software`' | translate }}\"\n class=\"showOnHover btn btn-dot pull-right\"\n (click)=\"remove.emit(software)\"\n >\n <i c8yIcon=\"minus-circle\" class=\"text-danger\"></i>\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n</c8y-list-group>\n"
26
+ template: "<c8y-list-group class=\"no-border-last\">\n <c8y-li\n [ngClass]=\"{ disabled: isSoftwareGoingToBeChanged(software) }\"\n *ngFor=\"let software of softwareList\"\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-8\">\n <!-- SOFTWARE NAME -->\n <p class=\"text-truncate\">{{ software.name }}</p>\n <!-- SOFTWARE VERSION -->\n <p class=\"text-truncate\">\n <span class=\"text-label-small m-r-4\" translate>\n Version\n </span>\n <span title=\"{{ software.version }}\">\n {{ software.version }}\n </span>\n </p>\n </div>\n\n <div\n *ngIf=\"supportsSoftwareOperations && (showUpdate || showRemove)\"\n class=\"col-4 text-right\"\n >\n <!-- UPDATE SOFTWARE -->\n <button\n *ngIf=\"showUpdate && !isSoftwareGoingToBeChanged(software)\"\n class=\"btn btn-default btn-xs showOnHover\"\n (click)=\"update.emit(software)\"\n title=\"{{ 'Update`software,verb`' | translate }}\"\n translate\n >\n Update\n </button>\n\n <!-- REMOVE SOFTWARE -->\n <button\n *ngIf=\"showRemove && !isSoftwareGoingToBeChanged(software)\"\n title=\"{{ 'Remove`software`' | translate }}\"\n class=\"showOnHover btn btn-dot pull-right\"\n (click)=\"remove.emit(software)\"\n >\n <i c8yIcon=\"minus-circle\" class=\"text-danger\"></i>\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n</c8y-list-group>\n"
21
27
  },] }
22
28
  ];
23
29
  DeviceSoftwareListComponent.propDecorators = {
24
30
  softwareList: [{ type: Input }],
31
+ device: [{ type: Input }],
25
32
  deviceSoftwareChanges: [{ type: Input }],
26
33
  update: [{ type: Output }],
27
34
  remove: [{ type: Output }]
28
35
  };
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLXNvZnR3YXJlLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcmVwb3NpdG9yeS9zb2Z0d2FyZS1kZXZpY2UtdGFiL2RldmljZS1zb2Z0d2FyZS1saXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFRbkMsTUFBTSxPQUFPLDJCQUEyQjtJQUp4QztRQU9ZLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQUM1QyxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7SUFheEQsQ0FBQztJQVRDLGtCQUFrQjtRQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxRQUF3QjtRQUNqRCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3JFLE9BQU8sZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDcEMsQ0FBQzs7O1lBcEJGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsMEJBQTBCO2dCQUNwQyw0b0RBQWtEO2FBQ25EOzs7MkJBRUUsS0FBSztvQ0FDTCxLQUFLO3FCQUNMLE1BQU07cUJBQ04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT3V0cHV0LCBJbnB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgT3BlcmF0aW9uU3RhdHVzIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgRGV2aWNlU29mdHdhcmUsIERldmljZVNvZnR3YXJlQ2hhbmdlIH0gZnJvbSAnLi4vcmVwb3NpdG9yeS5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kZXZpY2Utc29mdHdhcmUtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnZGV2aWNlLXNvZnR3YXJlLWxpc3QuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIERldmljZVNvZnR3YXJlTGlzdENvbXBvbmVudCB7XG4gIEBJbnB1dCgpIHNvZnR3YXJlTGlzdDogRGV2aWNlU29mdHdhcmVbXTtcbiAgQElucHV0KCkgZGV2aWNlU29mdHdhcmVDaGFuZ2VzOiBEZXZpY2VTb2Z0d2FyZUNoYW5nZVtdO1xuICBAT3V0cHV0KCkgdXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxEZXZpY2VTb2Z0d2FyZT4oKTtcbiAgQE91dHB1dCgpIHJlbW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGV2aWNlU29mdHdhcmU+KCk7XG4gIHNob3dVcGRhdGU6IGJvb2xlYW47XG4gIHNob3dSZW1vdmU6IGJvb2xlYW47XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIHRoaXMuc2hvd1VwZGF0ZSA9IHRoaXMudXBkYXRlLm9ic2VydmVycy5sZW5ndGggPiAwO1xuICAgIHRoaXMuc2hvd1JlbW92ZSA9IHRoaXMucmVtb3ZlLm9ic2VydmVycy5sZW5ndGggPiAwO1xuICB9XG5cbiAgaXNTb2Z0d2FyZUdvaW5nVG9CZUNoYW5nZWQoc29mdHdhcmU6IERldmljZVNvZnR3YXJlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVsZXZhbnRDaGFuZ2VzID0gZmlsdGVyKHRoaXMuZGV2aWNlU29mdHdhcmVDaGFuZ2VzLCBzb2Z0d2FyZSk7XG4gICAgcmV0dXJuIHJlbGV2YW50Q2hhbmdlcy5sZW5ndGggPiAwO1xuICB9XG59XG4iXX0=
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLXNvZnR3YXJlLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcmVwb3NpdG9yeS9zb2Z0d2FyZS1kZXZpY2UtdGFiL2RldmljZS1zb2Z0d2FyZS1saXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBT3hDLE1BQU0sT0FBTywyQkFBMkI7SUFKeEM7UUFRWSxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFDNUMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFrQixDQUFDO1FBR3RELCtCQUEwQixHQUFZLEtBQUssQ0FBQztRQUUzQixtQkFBYyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFrQi9GLENBQUM7SUFoQkMsUUFBUTtRQUNOLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUseUJBQXlCLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUN4RCxhQUFhLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDakUsQ0FBQztJQUNKLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsMEJBQTBCLENBQUMsUUFBd0I7UUFDakQsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNyRSxPQUFPLGVBQWUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7OztZQS9CRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLDBCQUEwQjtnQkFDcEMsc3NEQUFrRDthQUNuRDs7OzJCQUVFLEtBQUs7cUJBQ0wsS0FBSztvQ0FDTCxLQUFLO3FCQUNMLE1BQU07cUJBQ04sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPdXRwdXQsIElucHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElNYW5hZ2VkT2JqZWN0IH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgZmlsdGVyLCBnZXQgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgRGV2aWNlU29mdHdhcmUsIERldmljZVNvZnR3YXJlQ2hhbmdlIH0gZnJvbSAnLi4vcmVwb3NpdG9yeS5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1kZXZpY2Utc29mdHdhcmUtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnZGV2aWNlLXNvZnR3YXJlLWxpc3QuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIERldmljZVNvZnR3YXJlTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHNvZnR3YXJlTGlzdDogRGV2aWNlU29mdHdhcmVbXTtcbiAgQElucHV0KCkgZGV2aWNlOiBJTWFuYWdlZE9iamVjdDtcbiAgQElucHV0KCkgZGV2aWNlU29mdHdhcmVDaGFuZ2VzOiBEZXZpY2VTb2Z0d2FyZUNoYW5nZVtdO1xuICBAT3V0cHV0KCkgdXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxEZXZpY2VTb2Z0d2FyZT4oKTtcbiAgQE91dHB1dCgpIHJlbW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGV2aWNlU29mdHdhcmU+KCk7XG4gIHNob3dVcGRhdGU6IGJvb2xlYW47XG4gIHNob3dSZW1vdmU6IGJvb2xlYW47XG4gIHN1cHBvcnRzU29mdHdhcmVPcGVyYXRpb25zOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvcGVyYXRpb25UeXBlcyA9IFsnYzh5X1NvZnR3YXJlVXBkYXRlJywgJ2M4eV9Tb2Z0d2FyZUxpc3QnLCAnYzh5X1NvZnR3YXJlJ107XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3Qgc3VwcG9ydGVkT3BlcmF0aW9ucyA9IGdldCh0aGlzLmRldmljZSwgJ2M4eV9TdXBwb3J0ZWRPcGVyYXRpb25zJywgW10pO1xuICAgIHRoaXMuc3VwcG9ydHNTb2Z0d2FyZU9wZXJhdGlvbnMgPSB0aGlzLm9wZXJhdGlvblR5cGVzLnNvbWUoXG4gICAgICBvcGVyYXRpb25UeXBlID0+IHN1cHBvcnRlZE9wZXJhdGlvbnMuaW5kZXhPZihvcGVyYXRpb25UeXBlKSA+IC0xXG4gICAgKTtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLnNob3dVcGRhdGUgPSB0aGlzLnVwZGF0ZS5vYnNlcnZlcnMubGVuZ3RoID4gMDtcbiAgICB0aGlzLnNob3dSZW1vdmUgPSB0aGlzLnJlbW92ZS5vYnNlcnZlcnMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGlzU29mdHdhcmVHb2luZ1RvQmVDaGFuZ2VkKHNvZnR3YXJlOiBEZXZpY2VTb2Z0d2FyZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlbGV2YW50Q2hhbmdlcyA9IGZpbHRlcih0aGlzLmRldmljZVNvZnR3YXJlQ2hhbmdlcywgc29mdHdhcmUpO1xuICAgIHJldHVybiByZWxldmFudENoYW5nZXMubGVuZ3RoID4gMDtcbiAgfVxufVxuIl19
@@ -4,6 +4,7 @@ import { shareReplay, map, switchMap, distinctUntilChanged } from 'rxjs/operator
4
4
  import { BsModalService } from 'ngx-bootstrap/modal';
5
5
  import { InventoryService } from '@c8y/client';
6
6
  import { gettext, ModalSelectionMode } from '@c8y/ngx-components';
7
+ import { get } from 'lodash-es';
7
8
  import { RepositoryService } from '../repository.service';
8
9
  import { RepositoryType } from './../repository.model';
9
10
  import { RepositorySelectModalComponent } from '../select-modal/repository-select-modal.component';
@@ -13,6 +14,12 @@ export class InstalledSoftwareComponent {
13
14
  this.inventory = inventory;
14
15
  this.bsModal = bsModal;
15
16
  this.changes = new EventEmitter();
17
+ this.supportsSoftwareOperations = false;
18
+ this.operationTypes = ['c8y_SoftwareUpdate', 'c8y_SoftwareList', 'c8y_Software'];
19
+ }
20
+ ngOnInit() {
21
+ const supportedOperations = get(this.device, 'c8y_SupportedOperations', []);
22
+ this.supportsSoftwareOperations = this.operationTypes.some(operationType => supportedOperations.indexOf(operationType) > -1);
16
23
  }
17
24
  installSoftware() {
18
25
  this.displaySoftwareSelectModal({
@@ -87,7 +94,7 @@ export class InstalledSoftwareComponent {
87
94
  InstalledSoftwareComponent.decorators = [
88
95
  { type: Component, args: [{
89
96
  selector: 'c8y-installed-software',
90
- template: "<div class=\"inner-scroll d-flex d-col\">\n <div class=\"card-header large-padding separator sticky-top\">\n <h4 class=\"card-title\" translate>Installed software</h4>\n </div>\n <div class=\"flex-grow\">\n <fieldset *ngIf=\"deviceSoftwareChangesOperation\" class=\"card-block large-padding bg-gray-lighter\">\n <c8y-single-operation [operation]=\"deviceSoftwareChangesOperation\"></c8y-single-operation>\n </fieldset>\n\n <fieldset class=\"d-contents\" [disabled]=\"deviceSoftwareChangesInProgress\">\n <!-- EMPTY STATE -->\n <div class=\"card-block\" *ngIf=\"softwareList.length === 0\">\n <div class=\"c8y-empty-state text-center m-t-16\">\n <h1 class=\"c8y-icon c8y-icon-tools c8y-icon-duocolor\"></h1>\n <p>\n <strong translate>No software installed.</strong> <br />\n <small translate>Click below to install software into this device.</small>\n </p>\n </div>\n </div>\n\n <!-- NOT EMPTY STATE -->\n <ng-container *ngIf=\"softwareList.length > 0\">\n <c8y-device-software-list\n [softwareList]=\"softwareList\"\n [deviceSoftwareChanges]=\"deviceSoftwareChanges\"\n (update)=\"updateSoftware($event)\"\n (remove)=\"removeSoftware($event)\"\n class=\"d-block p-l-16 p-r-16\"\n >\n </c8y-device-software-list>\n </ng-container>\n </fieldset>\n </div>\n<!-- INSTALL SOFTWARE-->\n <div class=\"card-footer large-padding separator sticky-bottom\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Install software' | translate }}\"\n (click)=\"installSoftware()\"\n [disabled]=\"deviceSoftwareChangesInProgress\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Install software' | translate }}\n </button>\n </div>\n</div>\n"
97
+ template: "<div class=\"inner-scroll d-flex d-col\">\n <div class=\"card-header large-padding separator sticky-top\">\n <h4 class=\"card-title\" translate>Installed software</h4>\n </div>\n <div class=\"flex-grow\">\n <fieldset *ngIf=\"deviceSoftwareChangesOperation\" class=\"card-block large-padding bg-gray-lighter\">\n <c8y-single-operation [operation]=\"deviceSoftwareChangesOperation\"></c8y-single-operation>\n </fieldset>\n\n <fieldset class=\"d-contents\" [disabled]=\"deviceSoftwareChangesInProgress\">\n <!-- EMPTY STATE -->\n <div class=\"card-block\" *ngIf=\"softwareList.length === 0\">\n <div class=\"c8y-empty-state text-center m-t-16\">\n <h1 class=\"c8y-icon c8y-icon-tools c8y-icon-duocolor\"></h1>\n <p>\n <strong translate>No software installed.</strong> <br />\n <small translate>Click below to install software into this device.</small>\n </p>\n </div>\n </div>\n\n <!-- NOT EMPTY STATE -->\n <ng-container *ngIf=\"softwareList.length > 0\">\n <c8y-device-software-list\n [device]=\"device\"\n [softwareList]=\"softwareList\"\n [deviceSoftwareChanges]=\"deviceSoftwareChanges\"\n (update)=\"updateSoftware($event)\"\n (remove)=\"removeSoftware($event)\"\n class=\"d-block p-l-16 p-r-16\"\n >\n </c8y-device-software-list>\n </ng-container>\n </fieldset>\n </div>\n <!-- INSTALL SOFTWARE-->\n <div *ngIf=\"supportsSoftwareOperations\" class=\"card-footer large-padding separator sticky-bottom\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Install software' | translate }}\"\n (click)=\"installSoftware()\"\n [disabled]=\"deviceSoftwareChangesInProgress\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Install software' | translate }}\n </button>\n </div>\n</div>\n"
91
98
  },] }
92
99
  ];
93
100
  InstalledSoftwareComponent.ctorParameters = () => [
@@ -96,6 +103,7 @@ InstalledSoftwareComponent.ctorParameters = () => [
96
103
  { type: BsModalService }
97
104
  ];
98
105
  InstalledSoftwareComponent.propDecorators = {
106
+ device: [{ type: Input }],
99
107
  softwareList: [{ type: Input }],
100
108
  deviceSoftwareChanges: [{ type: Input }],
101
109
  deviceSoftwareChangesOperation: [{ type: Input }],
@@ -103,4 +111,4 @@ InstalledSoftwareComponent.propDecorators = {
103
111
  deviceTypeQuery: [{ type: Input }],
104
112
  changes: [{ type: Output }]
105
113
  };
106
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbGVkLXNvZnR3YXJlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3JlcG9zaXRvcnkvc29mdHdhcmUtZGV2aWNlLXRhYi9pbnN0YWxsZWQtc29mdHdhcmUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQW1CLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQWtCLGdCQUFnQixFQUFjLE1BQU0sYUFBYSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQXdDLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdGLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBTW5HLE1BQU0sT0FBTywwQkFBMEI7SUFRckMsWUFDVSxVQUE2QixFQUM3QixTQUEyQixFQUMzQixPQUF1QjtRQUZ2QixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUM3QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUx2QixZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQTBCLENBQUM7SUFPL0QsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsMEJBQTBCLENBQUM7WUFDOUIsS0FBSyxFQUFF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LElBQUksS0FBRSxNQUFNLEVBQUUsU0FBUyxJQUFHO1FBQ3hDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQsbUJBQW1CLENBQUMsS0FBdUI7UUFDekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNqQyx1Q0FBWSxJQUFJLEtBQUUsTUFBTSxFQUFFLFFBQVEsSUFBRztRQUN2QyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQzs7O1lBM0hGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsd0JBQXdCO2dCQUNsQyxrMERBQWdEO2FBQ2pEOzs7WUFQUSxpQkFBaUI7WUFGRCxnQkFBZ0I7WUFEaEMsY0FBYzs7OzJCQVlwQixLQUFLO29DQUNMLEtBQUs7NkNBQ0wsS0FBSzs4Q0FDTCxLQUFLOzhCQUNMLEtBQUs7c0JBQ0wsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT3V0cHV0LCBJbnB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmcm9tLCBvZiwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzaGFyZVJlcGxheSwgbWFwLCBzd2l0Y2hNYXAsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IElNYW5hZ2VkT2JqZWN0LCBJbnZlbnRvcnlTZXJ2aWNlLCBJT3BlcmF0aW9uIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgZ2V0dGV4dCwgTW9kYWxTZWxlY3Rpb25Nb2RlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBSZXBvc2l0b3J5U2VydmljZSB9IGZyb20gJy4uL3JlcG9zaXRvcnkuc2VydmljZSc7XG5pbXBvcnQgeyBEZXZpY2VTb2Z0d2FyZSwgRGV2aWNlU29mdHdhcmVDaGFuZ2UsIFJlcG9zaXRvcnlUeXBlIH0gZnJvbSAnLi8uLi9yZXBvc2l0b3J5Lm1vZGVsJztcbmltcG9ydCB7IFJlcG9zaXRvcnlTZWxlY3RNb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL3NlbGVjdC1tb2RhbC9yZXBvc2l0b3J5LXNlbGVjdC1tb2RhbC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktaW5zdGFsbGVkLXNvZnR3YXJlJyxcbiAgdGVtcGxhdGVVcmw6ICdpbnN0YWxsZWQtc29mdHdhcmUuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEluc3RhbGxlZFNvZnR3YXJlQ29tcG9uZW50IHtcbiAgQElucHV0KCkgc29mdHdhcmVMaXN0OiBEZXZpY2VTb2Z0d2FyZVtdO1xuICBASW5wdXQoKSBkZXZpY2VTb2Z0d2FyZUNoYW5nZXM6IERldmljZVNvZnR3YXJlQ2hhbmdlW107XG4gIEBJbnB1dCgpIGRldmljZVNvZnR3YXJlQ2hhbmdlc09wZXJhdGlvbjogSU9wZXJhdGlvbjtcbiAgQElucHV0KCkgZGV2aWNlU29mdHdhcmVDaGFuZ2VzSW5Qcm9ncmVzczogYm9vbGVhbjtcbiAgQElucHV0KCkgZGV2aWNlVHlwZVF1ZXJ5OiBvYmplY3Q7XG4gIEBPdXRwdXQoKSBjaGFuZ2VzID0gbmV3IEV2ZW50RW1pdHRlcjxEZXZpY2VTb2Z0d2FyZUNoYW5nZVtdPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVwb3NpdG9yeTogUmVwb3NpdG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbnZlbnRvcnk6IEludmVudG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBic01vZGFsOiBCc01vZGFsU2VydmljZVxuICApIHtcbiAgfVxuXG4gIGluc3RhbGxTb2Z0d2FyZSgpIHtcbiAgICB0aGlzLmRpc3BsYXlTb2Z0d2FyZVNlbGVjdE1vZGFsKHtcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KCdJbnN0YWxsIHNvZnR3YXJlJyksXG4gICAgICBsYWJlbHM6IHsgb2s6IGdldHRleHQoJ0luc3RhbGwnKSB9LFxuICAgICAgcmVwb3NpdG9yeUVudHJpZXNXaXRoVmVyc2lvbnMkOiBvZihbXSksXG4gICAgICByZXBvc2l0b3J5RW50cmllc1dpdGhWZXJzaW9uc0ZuJDogbW9kYWwgPT5cbiAgICAgICAgdGhpcy5nZXRJbnN0YWxsYWJsZVNvZnR3YXJlTGlzdFdpdGhWZXJzaW9ucyQobW9kYWwuY29udGVudC5zZWFyY2hUZXJtKVxuICAgIH0pLnN1YnNjcmliZShzb2Z0d2FyZVRvSW5zdGFsbCA9PiB7XG4gICAgICB0aGlzLmVtaXRTb2Z0d2FyZUluc3RhbGwoc29mdHdhcmVUb0luc3RhbGwpO1xuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlU29mdHdhcmUoc29mdHdhcmVUb1JlbW92ZSkge1xuICAgIHRoaXMuZGlzcGxheVNvZnR3YXJlU2VsZWN0TW9kYWwoe1xuICAgICAgdGl0bGU6IGdldHRleHQoJ1VwZGF0ZSBzb2Z0d2FyZScpLFxuICAgICAgbGFiZWxzOiB7IG9rOiBnZXR0ZXh0KCdVcGRhdGUnKSB9LFxuICAgICAgc2hvd0ZpbHRlcjogZmFsc2UsXG4gICAgICByZXBvc2l0b3J5RW50cmllc1dpdGhWZXJzaW9ucyQ6IHRoaXMuZ2V0U2luZ2xlU29mdHdhcmVXaXRoVmVyc2lvbnMkKHNvZnR3YXJlVG9SZW1vdmUpXG4gICAgfSkuc3Vic2NyaWJlKHNvZnR3YXJlVG9JbnN0YWxsID0+IHtcbiAgICAgIHRoaXMuZW1pdFNvZnR3YXJlSW5zdGFsbChzb2Z0d2FyZVRvSW5zdGFsbCk7XG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVTb2Z0d2FyZShzb2Z0d2FyZVRvUmVtb3ZlKSB7XG4gICAgdGhpcy5lbWl0U29mdHdhcmVSZW1vdmFsKFtzb2Z0d2FyZVRvUmVtb3ZlXSk7XG4gIH1cblxuICBnZXRJbnN0YWxsYWJsZVNvZnR3YXJlTGlzdFdpdGhWZXJzaW9ucyQoc2VhcmNoVGVybSQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KSB7XG4gICAgY29uc3QgaW5zdGFsbGVkU29mdHdhcmVOYW1lcyA9IHRoaXMuc29mdHdhcmVMaXN0Lm1hcChzID0+IHMubmFtZSk7XG4gICAgcmV0dXJuIHNlYXJjaFRlcm0kLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgc3dpdGNoTWFwKHNlYXJjaFRlcm0gPT5cbiAgICAgICAgdGhpcy5yZXBvc2l0b3J5Lmxpc3RSZXBvc2l0b3J5RW50cmllcyhSZXBvc2l0b3J5VHlwZS5TT0ZUV0FSRSwge1xuICAgICAgICAgIHF1ZXJ5OiB0aGlzLmRldmljZVR5cGVRdWVyeSxcbiAgICAgICAgICBwYXJ0aWFsTmFtZTogc2VhcmNoVGVybSxcbiAgICAgICAgICBwYXJhbXM6IHsgcGFnZVNpemU6IDEwMCB9XG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgbWFwKCh7IGRhdGEgfSkgPT4gZGF0YSksXG4gICAgICBtYXAoc29mdHdhcmVMaXN0ID0+IHtcbiAgICAgICAgcmV0dXJuIHNvZnR3YXJlTGlzdC5maWx0ZXIoc29mdHdhcmUgPT4ge1xuICAgICAgICAgIHJldHVybiAhaW5zdGFsbGVkU29mdHdhcmVOYW1lcy5pbmNsdWRlcyhzb2Z0d2FyZS5uYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIG1hcChzb2Z0d2FyZUxpc3QgPT4gdGhpcy5hdHRhY2hWZXJzaW9ucyhzb2Z0d2FyZUxpc3QpKSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcbiAgfVxuXG4gIGdldFNpbmdsZVNvZnR3YXJlV2l0aFZlcnNpb25zJChzb2Z0d2FyZTogRGV2aWNlU29mdHdhcmUpIHtcbiAgICByZXR1cm4gZnJvbShcbiAgICAgIHRoaXMucmVwb3NpdG9yeS5saXN0UmVwb3NpdG9yeUVudHJpZXMoUmVwb3NpdG9yeVR5cGUuU09GVFdBUkUsIHtcbiAgICAgICAgcXVlcnk6IHsgbmFtZTogc29mdHdhcmUubmFtZSB9XG4gICAgICB9KVxuICAgICkucGlwZShcbiAgICAgIG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpLFxuICAgICAgbWFwKHNvZnR3YXJlTGlzdCA9PiB0aGlzLmF0dGFjaFZlcnNpb25zKHNvZnR3YXJlTGlzdCkpLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuICB9XG5cbiAgYXR0YWNoVmVyc2lvbnMoc29mdHdhcmVMaXN0OiBJTWFuYWdlZE9iamVjdFtdKSB7XG4gICAgc29mdHdhcmVMaXN0LmZvckVhY2goc29mdHdhcmUgPT4ge1xuICAgICAgc29mdHdhcmUudmVyc2lvbnMgPSB0aGlzLnJlcG9zaXRvcnkubGlzdEJhc2VWZXJzaW9ucyhzb2Z0d2FyZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHNvZnR3YXJlTGlzdDtcbiAgfVxuXG4gIGRpc3BsYXlTb2Z0d2FyZVNlbGVjdE1vZGFsKGluaXRpYWxTdGF0ZU92ZXJyaWRlcykge1xuICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgICAgIHJlcG9zaXRvcnlUeXBlOiBSZXBvc2l0b3J5VHlwZS5TT0ZUV0FSRSxcbiAgICAgIHN1YlRpdGxlOiBnZXR0ZXh0KCdBdmFpbGFibGUgc29mdHdhcmVzIG1hdGNoaW5nIHRoZSBkZXZpY2UgdHlwZScpLFxuICAgICAgbW9kZTogTW9kYWxTZWxlY3Rpb25Nb2RlLk1VTFRJLFxuICAgICAgaWNvbjogJ2M4eS10b29scycsXG4gICAgICBkaXNhYmxlU2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgc2VsZWN0ZWQ6IHRoaXMuc29mdHdhcmVMaXN0LFxuICAgICAgLi4uaW5pdGlhbFN0YXRlT3ZlcnJpZGVzXG4gICAgfTtcbiAgICBjb25zdCBtb2RhbCA9IHRoaXMuYnNNb2RhbC5zaG93KFJlcG9zaXRvcnlTZWxlY3RNb2RhbENvbXBvbmVudCwge1xuICAgICAgaWdub3JlQmFja2Ryb3BDbGljazogdHJ1ZSxcbiAgICAgIGNsYXNzOiAnbW9kYWwtc20nLFxuICAgICAgaW5pdGlhbFN0YXRlXG4gICAgfSk7XG5cbiAgICBpZiAoaW5pdGlhbFN0YXRlT3ZlcnJpZGVzLnJlcG9zaXRvcnlFbnRyaWVzV2l0aFZlcnNpb25zRm4kKSB7XG4gICAgICBtb2RhbC5jb250ZW50LnJlcG9zaXRvcnlFbnRyaWVzV2l0aFZlcnNpb25zJCA9IGluaXRpYWxTdGF0ZU92ZXJyaWRlcy5yZXBvc2l0b3J5RW50cmllc1dpdGhWZXJzaW9uc0ZuJChcbiAgICAgICAgbW9kYWxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbW9kYWwuY29udGVudC5sb2FkLm5leHQoKTtcbiAgICByZXR1cm4gbW9kYWwuY29udGVudC5yZXN1bHRFbWl0dGVyO1xuICB9XG5cbiAgZW1pdFNvZnR3YXJlSW5zdGFsbChpdGVtczogRGV2aWNlU29mdHdhcmVbXSkge1xuICAgIHRoaXMuY2hhbmdlcy5lbWl0KGl0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgIHJldHVybiB7IC4uLml0ZW0sIGFjdGlvbjogJ2luc3RhbGwnIH07XG4gICAgfSkpO1xuICB9XG5cbiAgZW1pdFNvZnR3YXJlUmVtb3ZhbChpdGVtczogRGV2aWNlU29mdHdhcmVbXSkge1xuICAgIHRoaXMuY2hhbmdlcy5lbWl0KGl0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgIHJldHVybiB7IC4uLml0ZW0sIGFjdGlvbjogJ2RlbGV0ZScgfTtcbiAgICB9KSk7XG4gIH1cbn1cbiJdfQ==
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbGVkLXNvZnR3YXJlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3JlcG9zaXRvcnkvc29mdHdhcmUtZGV2aWNlLXRhYi9pbnN0YWxsZWQtc29mdHdhcmUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQW1CLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25GLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQWtCLGdCQUFnQixFQUFjLE1BQU0sYUFBYSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBd0MsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0YsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFNbkcsTUFBTSxPQUFPLDBCQUEwQjtJQWFyQyxZQUNVLFVBQTZCLEVBQzdCLFNBQTJCLEVBQzNCLE9BQXVCO1FBRnZCLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBQzdCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBVHZCLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBMEIsQ0FBQztRQUUvRCwrQkFBMEIsR0FBWSxLQUFL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LEtBQUssRUFBRSxVQUFVO1lBQ2pCLFlBQVk7U0FDYixDQUFDLENBQUM7UUFFSCxJQUFJLHFCQUFxQixDQUFDLGdDQUFnQyxFQUFFO1lBQzFELEtBQUssQ0FBQyxPQUFPLENBQUMsOEJBQThCLEdBQUcscUJBQXFCLENBQUMsZ0NBQWdDLENBQ25HLEtBQUssQ0FDTixDQUFDO1NBQ0g7UUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUF1QjtRQUN6QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2pDLHVDQUFZLElBQUksS0FBRSxNQUFNLEVBQUUsU0FBUyxJQUFHO1FBQ3hDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQsbUJBQW1CLENBQUMsS0FBdUI7UUFDekMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNqQyx1Q0FBWSxJQUFJLEtBQUUsTUFBTSxFQUFFLFFBQVEsSUFBRztRQUN2QyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQzs7O1lBdklGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsd0JBQXdCO2dCQUNsQyx3NERBQWdEO2FBQ2pEOzs7WUFQUSxpQkFBaUI7WUFIRCxnQkFBZ0I7WUFEaEMsY0FBYzs7O3FCQWFwQixLQUFLOzJCQUNMLEtBQUs7b0NBQ0wsS0FBSzs2Q0FDTCxLQUFLOzhDQUNMLEtBQUs7OEJBQ0wsS0FBSztzQkFDTCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPdXRwdXQsIElucHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZyb20sIG9mLCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHNoYXJlUmVwbGF5LCBtYXAsIHN3aXRjaE1hcCwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QsIEludmVudG9yeVNlcnZpY2UsIElPcGVyYXRpb24gfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBnZXR0ZXh0LCBNb2RhbFNlbGVjdGlvbk1vZGUgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IGdldCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBSZXBvc2l0b3J5U2VydmljZSB9IGZyb20gJy4uL3JlcG9zaXRvcnkuc2VydmljZSc7XG5pbXBvcnQgeyBEZXZpY2VTb2Z0d2FyZSwgRGV2aWNlU29mdHdhcmVDaGFuZ2UsIFJlcG9zaXRvcnlUeXBlIH0gZnJvbSAnLi8uLi9yZXBvc2l0b3J5Lm1vZGVsJztcbmltcG9ydCB7IFJlcG9zaXRvcnlTZWxlY3RNb2RhbENvbXBvbmVudCB9IGZyb20gJy4uL3NlbGVjdC1tb2RhbC9yZXBvc2l0b3J5LXNlbGVjdC1tb2RhbC5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktaW5zdGFsbGVkLXNvZnR3YXJlJyxcbiAgdGVtcGxhdGVVcmw6ICdpbnN0YWxsZWQtc29mdHdhcmUuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEluc3RhbGxlZFNvZnR3YXJlQ29tcG9uZW50IHtcbiAgQElucHV0KCkgZGV2aWNlOiBJTWFuYWdlZE9iamVjdDtcbiAgQElucHV0KCkgc29mdHdhcmVMaXN0OiBEZXZpY2VTb2Z0d2FyZVtdO1xuICBASW5wdXQoKSBkZXZpY2VTb2Z0d2FyZUNoYW5nZXM6IERldmljZVNvZnR3YXJlQ2hhbmdlW107XG4gIEBJbnB1dCgpIGRldmljZVNvZnR3YXJlQ2hhbmdlc09wZXJhdGlvbjogSU9wZXJhdGlvbjtcbiAgQElucHV0KCkgZGV2aWNlU29mdHdhcmVDaGFuZ2VzSW5Qcm9ncmVzczogYm9vbGVhbjtcbiAgQElucHV0KCkgZGV2aWNlVHlwZVF1ZXJ5OiBvYmplY3Q7XG4gIEBPdXRwdXQoKSBjaGFuZ2VzID0gbmV3IEV2ZW50RW1pdHRlcjxEZXZpY2VTb2Z0d2FyZUNoYW5nZVtdPigpO1xuXG4gIHN1cHBvcnRzU29mdHdhcmVPcGVyYXRpb25zOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvcGVyYXRpb25UeXBlcyA9IFsnYzh5X1NvZnR3YXJlVXBkYXRlJywgJ2M4eV9Tb2Z0d2FyZUxpc3QnLCAnYzh5X1NvZnR3YXJlJ107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZXBvc2l0b3J5OiBSZXBvc2l0b3J5U2VydmljZSxcbiAgICBwcml2YXRlIGludmVudG9yeTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIGJzTW9kYWw6IEJzTW9kYWxTZXJ2aWNlXG4gICkge1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3Qgc3VwcG9ydGVkT3BlcmF0aW9ucyA9IGdldCh0aGlzLmRldmljZSwgJ2M4eV9TdXBwb3J0ZWRPcGVyYXRpb25zJywgW10pO1xuICAgIHRoaXMuc3VwcG9ydHNTb2Z0d2FyZU9wZXJhdGlvbnMgPSB0aGlzLm9wZXJhdGlvblR5cGVzLnNvbWUoXG4gICAgICBvcGVyYXRpb25UeXBlID0+IHN1cHBvcnRlZE9wZXJhdGlvbnMuaW5kZXhPZihvcGVyYXRpb25UeXBlKSA+IC0xXG4gICAgKTtcbiAgfVxuXG4gIGluc3RhbGxTb2Z0d2FyZSgpIHtcbiAgICB0aGlzLmRpc3BsYXlTb2Z0d2FyZVNlbGVjdE1vZGFsKHtcbiAgICAgIHRpdGxlOiBnZXR0ZXh0KCdJbnN0YWxsIHNvZnR3YXJlJyksXG4gICAgICBsYWJlbHM6IHsgb2s6IGdldHRleHQoJ0luc3RhbGwnKSB9LFxuICAgICAgcmVwb3NpdG9yeUVudHJpZXNXaXRoVmVyc2lvbnMkOiBvZihbXSksXG4gICAgICByZXBvc2l0b3J5RW50cmllc1dpdGhWZXJzaW9uc0ZuJDogbW9kYWwgPT5cbiAgICAgICAgdGhpcy5nZXRJbnN0YWxsYWJsZVNvZnR3YXJlTGlzdFdpdGhWZXJzaW9ucyQobW9kYWwuY29udGVudC5zZWFyY2hUZXJtKVxuICAgIH0pLnN1YnNjcmliZShzb2Z0d2FyZVRvSW5zdGFsbCA9PiB7XG4gICAgICB0aGlzLmVtaXRTb2Z0d2FyZUluc3RhbGwoc29mdHdhcmVUb0luc3RhbGwpO1xuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlU29mdHdhcmUoc29mdHdhcmVUb1JlbW92ZSkge1xuICAgIHRoaXMuZGlzcGxheVNvZnR3YXJlU2VsZWN0TW9kYWwoe1xuICAgICAgdGl0bGU6IGdldHRleHQoJ1VwZGF0ZSBzb2Z0d2FyZScpLFxuICAgICAgbGFiZWxzOiB7IG9rOiBnZXR0ZXh0KCdVcGRhdGUnKSB9LFxuICAgICAgc2hvd0ZpbHRlcjogZmFsc2UsXG4gICAgICByZXBvc2l0b3J5RW50cmllc1dpdGhWZXJzaW9ucyQ6IHRoaXMuZ2V0U2luZ2xlU29mdHdhcmVXaXRoVmVyc2lvbnMkKHNvZnR3YXJlVG9SZW1vdmUpXG4gICAgfSkuc3Vic2NyaWJlKHNvZnR3YXJlVG9JbnN0YWxsID0+IHtcbiAgICAgIHRoaXMuZW1pdFNvZnR3YXJlSW5zdGFsbChzb2Z0d2FyZVRvSW5zdGFsbCk7XG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVTb2Z0d2FyZShzb2Z0d2FyZVRvUmVtb3ZlKSB7XG4gICAgdGhpcy5lbWl0U29mdHdhcmVSZW1vdmFsKFtzb2Z0d2FyZVRvUmVtb3ZlXSk7XG4gIH1cblxuICBnZXRJbnN0YWxsYWJsZVNvZnR3YXJlTGlzdFdpdGhWZXJzaW9ucyQoc2VhcmNoVGVybSQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KSB7XG4gICAgY29uc3QgaW5zdGFsbGVkU29mdHdhcmVOYW1lcyA9IHRoaXMuc29mdHdhcmVMaXN0Lm1hcChzID0+IHMubmFtZSk7XG4gICAgcmV0dXJuIHNlYXJjaFRlcm0kLnBpcGUoXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgc3dpdGNoTWFwKHNlYXJjaFRlcm0gPT5cbiAgICAgICAgdGhpcy5yZXBvc2l0b3J5Lmxpc3RSZXBvc2l0b3J5RW50cmllcyhSZXBvc2l0b3J5VHlwZS5TT0ZUV0FSRSwge1xuICAgICAgICAgIHF1ZXJ5OiB0aGlzLmRldmljZVR5cGVRdWVyeSxcbiAgICAgICAgICBwYXJ0aWFsTmFtZTogc2VhcmNoVGVybSxcbiAgICAgICAgICBwYXJhbXM6IHsgcGFnZVNpemU6IDEwMCB9XG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgbWFwKCh7IGRhdGEgfSkgPT4gZGF0YSksXG4gICAgICBtYXAoc29mdHdhcmVMaXN0ID0+IHtcbiAgICAgICAgcmV0dXJuIHNvZnR3YXJlTGlzdC5maWx0ZXIoc29mdHdhcmUgPT4ge1xuICAgICAgICAgIHJldHVybiAhaW5zdGFsbGVkU29mdHdhcmVOYW1lcy5pbmNsdWRlcyhzb2Z0d2FyZS5uYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIG1hcChzb2Z0d2FyZUxpc3QgPT4gdGhpcy5hdHRhY2hWZXJzaW9ucyhzb2Z0d2FyZUxpc3QpKSxcbiAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgKTtcbiAgfVxuXG4gIGdldFNpbmdsZVNvZnR3YXJlV2l0aFZlcnNpb25zJChzb2Z0d2FyZTogRGV2aWNlU29mdHdhcmUpIHtcbiAgICByZXR1cm4gZnJvbShcbiAgICAgIHRoaXMucmVwb3NpdG9yeS5saXN0UmVwb3NpdG9yeUVudHJpZXMoUmVwb3NpdG9yeVR5cGUuU09GVFdBUkUsIHtcbiAgICAgICAgcXVlcnk6IHsgbmFtZTogc29mdHdhcmUubmFtZSB9XG4gICAgICB9KVxuICAgICkucGlwZShcbiAgICAgIG1hcCgoeyBkYXRhIH0pID0+IGRhdGEpLFxuICAgICAgbWFwKHNvZnR3YXJlTGlzdCA9PiB0aGlzLmF0dGFjaFZlcnNpb25zKHNvZnR3YXJlTGlzdCkpLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuICB9XG5cbiAgYXR0YWNoVmVyc2lvbnMoc29mdHdhcmVMaXN0OiBJTWFuYWdlZE9iamVjdFtdKSB7XG4gICAgc29mdHdhcmVMaXN0LmZvckVhY2goc29mdHdhcmUgPT4ge1xuICAgICAgc29mdHdhcmUudmVyc2lvbnMgPSB0aGlzLnJlcG9zaXRvcnkubGlzdEJhc2VWZXJzaW9ucyhzb2Z0d2FyZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHNvZnR3YXJlTGlzdDtcbiAgfVxuXG4gIGRpc3BsYXlTb2Z0d2FyZVNlbGVjdE1vZGFsKGluaXRpYWxTdGF0ZU92ZXJyaWRlcykge1xuICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgICAgIHJlcG9zaXRvcnlUeXBlOiBSZXBvc2l0b3J5VHlwZS5TT0ZUV0FSRSxcbiAgICAgIHN1YlRpdGxlOiBnZXR0ZXh0KCdBdmFpbGFibGUgc29mdHdhcmVzIG1hdGNoaW5nIHRoZSBkZXZpY2UgdHlwZScpLFxuICAgICAgbW9kZTogTW9kYWxTZWxlY3Rpb25Nb2RlLk1VTFRJLFxuICAgICAgaWNvbjogJ2M4eS10b29scycsXG4gICAgICBkaXNhYmxlU2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgc2VsZWN0ZWQ6IHRoaXMuc29mdHdhcmVMaXN0LFxuICAgICAgLi4uaW5pdGlhbFN0YXRlT3ZlcnJpZGVzXG4gICAgfTtcbiAgICBjb25zdCBtb2RhbCA9IHRoaXMuYnNNb2RhbC5zaG93KFJlcG9zaXRvcnlTZWxlY3RNb2RhbENvbXBvbmVudCwge1xuICAgICAgaWdub3JlQmFja2Ryb3BDbGljazogdHJ1ZSxcbiAgICAgIGNsYXNzOiAnbW9kYWwtc20nLFxuICAgICAgaW5pdGlhbFN0YXRlXG4gICAgfSk7XG5cbiAgICBpZiAoaW5pdGlhbFN0YXRlT3ZlcnJpZGVzLnJlcG9zaXRvcnlFbnRyaWVzV2l0aFZlcnNpb25zRm4kKSB7XG4gICAgICBtb2RhbC5jb250ZW50LnJlcG9zaXRvcnlFbnRyaWVzV2l0aFZlcnNpb25zJCA9IGluaXRpYWxTdGF0ZU92ZXJyaWRlcy5yZXBvc2l0b3J5RW50cmllc1dpdGhWZXJzaW9uc0ZuJChcbiAgICAgICAgbW9kYWxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbW9kYWwuY29udGVudC5sb2FkLm5leHQoKTtcbiAgICByZXR1cm4gbW9kYWwuY29udGVudC5yZXN1bHRFbWl0dGVyO1xuICB9XG5cbiAgZW1pdFNvZnR3YXJlSW5zdGFsbChpdGVtczogRGV2aWNlU29mdHdhcmVbXSkge1xuICAgIHRoaXMuY2hhbmdlcy5lbWl0KGl0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgIHJldHVybiB7IC4uLml0ZW0sIGFjdGlvbjogJ2luc3RhbGwnIH07XG4gICAgfSkpO1xuICB9XG5cbiAgZW1pdFNvZnR3YXJlUmVtb3ZhbChpdGVtczogRGV2aWNlU29mdHdhcmVbXSkge1xuICAgIHRoaXMuY2hhbmdlcy5lbWl0KGl0ZW1zLm1hcChpdGVtID0+IHtcbiAgICAgIHJldHVybiB7IC4uLml0ZW0sIGFjdGlvbjogJ2RlbGV0ZScgfTtcbiAgICB9KSk7XG4gIH1cbn1cbiJdfQ==
@@ -95,7 +95,7 @@ export class SoftwareDeviceTabComponent {
95
95
  SoftwareDeviceTabComponent.decorators = [
96
96
  { type: Component, args: [{
97
97
  selector: 'c8y-software-device-tab',
98
- 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 d-grid grid__col--8-4--md m-b-0\">\n <c8y-installed-software\n class=\"card--fullpage bg-white\"\n [deviceTypeQuery]=\"deviceTypeQuery$ | async\"\n [softwareList]=\"list$ | async\"\n [deviceSoftwareChanges]=\"changes$ | async\"\n [deviceSoftwareChangesOperation]=\"changesOperation$ | async\"\n [deviceSoftwareChangesInProgress]=\"changesInProgress$ | async\"\n (changes)=\"addChanges($event)\"\n ></c8y-installed-software>\n <c8y-device-software-changes\n class=\"card--fullpage bg-gray-white\"\n [changes]=\"changes$ | async\"\n [changesInProgress]=\"changesInProgress$ | async\"\n (clear)=\"clearChanges()\"\n (drop)=\"dropChange($event)\"\n (apply)=\"applyChanges()\"\n ></c8y-device-software-changes>\n</div>\n"
98
+ 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 d-grid grid__col--8-4--md m-b-0\">\n <c8y-installed-software\n class=\"card--fullpage bg-white\"\n [device]=\"device$ | async\"\n [deviceTypeQuery]=\"deviceTypeQuery$ | async\"\n [softwareList]=\"list$ | async\"\n [deviceSoftwareChanges]=\"changes$ | async\"\n [deviceSoftwareChangesOperation]=\"changesOperation$ | async\"\n [deviceSoftwareChangesInProgress]=\"changesInProgress$ | async\"\n (changes)=\"addChanges($event)\"\n ></c8y-installed-software>\n <c8y-device-software-changes\n class=\"card--fullpage bg-gray-white\"\n [changes]=\"changes$ | async\"\n [changesInProgress]=\"changesInProgress$ | async\"\n (clear)=\"clearChanges()\"\n (drop)=\"dropChange($event)\"\n (apply)=\"applyChanges()\"\n ></c8y-device-software-changes>\n</div>\n"
99
99
  },] }
100
100
  ];
101
101
  SoftwareDeviceTabComponent.ctorParameters = () => [
@@ -103,4 +103,4 @@ SoftwareDeviceTabComponent.ctorParameters = () => [
103
103
  { type: RepositoryService },
104
104
  { type: InventoryService }
105
105
  ];
106
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdHdhcmUtZGV2aWNlLXRhYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9yZXBvc2l0b3J5L3NvZnR3YXJlLWRldmljZS10YWIvc29mdHdhcmUtZGV2aWNlLXRhYi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBYyxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBa0IsZ0JBQWdCLEVBQUUsZUFBZSxFQUFjLE1BQU0sYUFBYSxDQUFDO0FBQzVGLE9BQU8sRUFBd0MsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0YsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFNMUQsTUFBTSxPQUFPLDBCQUEwQjtJQWdCckMsWUFDVSxLQUFxQixFQUNyQixVQUE2QixFQUM3QixTQUEyQjtRQUYzQixVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUM3QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQWxCckMsYUFBUSxHQUFvQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDM0UsWUFBTyxHQUFHLElBQUksZUFBZSxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNGLHFCQUFnQixHQUF1QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDdEQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFF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SUFBSSxDQUFDLFVBQVUsQ0FBQyxxQ0FBcUMsQ0FDbkUsU0FBUyxFQUNULElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUNuQixDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVPLFlBQVksQ0FBQyxTQUFxQjtRQUN4QyxPQUFPLENBQ0wsU0FBUyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FDN0YsQ0FBQztJQUNKLENBQUM7OztZQS9HRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHlCQUF5QjtnQkFDbkMscWpDQUFpRDthQUNsRDs7O1lBVlEsY0FBYztZQUtkLGlCQUFpQjtZQUZELGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IElNYW5hZ2VkT2JqZWN0LCBJbnZlbnRvcnlTZXJ2aWNlLCBPcGVyYXRpb25TdGF0dXMsIElPcGVyYXRpb24gfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBEZXZpY2VTb2Z0d2FyZSwgRGV2aWNlU29mdHdhcmVDaGFuZ2UsIFJlcG9zaXRvcnlUeXBlIH0gZnJvbSAnLi4vcmVwb3NpdG9yeS5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvc2l0b3J5U2VydmljZSB9IGZyb20gJy4uL3JlcG9zaXRvcnkuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1zb2Z0d2FyZS1kZXZpY2UtdGFiJyxcbiAgdGVtcGxhdGVVcmw6ICdzb2Z0d2FyZS1kZXZpY2UtdGFiLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBTb2Z0d2FyZURldmljZVRhYkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGRldmljZUlkOiBzdHJpbmcgfCBudW1iZXIgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmVudC5kYXRhLmNvbnRleHREYXRhLmlkO1xuICBkZXZpY2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJTWFuYWdlZE9iamVjdD4odGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJlbnQuZGF0YS5jb250ZXh0RGF0YSk7XG4gIGRldmljZVR5cGVRdWVyeSQ6IE9ic2VydmFibGU8b2JqZWN0PiA9IHRoaXMuZGV2aWNlJC5waXBlKFxuICAgIG1hcChkZXZpY2UgPT4gdGhpcy5yZXBvc2l0b3J5LmdldERldmljZVR5cGVRdWVyeShSZXBvc2l0b3J5VHlwZS5TT0ZUV0FSRSwgZGV2aWNlKSlcbiAgKTtcbiAgbGlzdCQ6IE9ic2VydmFibGU8RGV2aWNlU29mdHdhcmVbXT4gPSB0aGlzLmRldmljZSQucGlwZShcbiAgICBtYXAoZGV2aWNlID0+IHRoaXMucmVwb3NpdG9yeS5nZXREZXZpY2VTb2Z0d2FyZUxpc3QoZGV2aWNlKSlcbiAgKTtcbiAgY2hhbmdlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERldmljZVNvZnR3YXJlQ2hhbmdlW10+KFtdKTtcbiAgY2hhbmdlc09wZXJhdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElPcGVyYXRpb24+KG51bGwpO1xuICBjaGFuZ2VzSW5Qcm9ncmVzcyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmNoYW5nZXNPcGVyYXRpb24kLnBpcGUoXG4gICAgbWFwKG9wZXJhdGlvbiA9PiB0aGlzLmlzSW5Qcm9ncmVzcyhvcGVyYXRpb24pKVxuICApO1xuICByZWxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJlcG9zaXRvcnk6IFJlcG9zaXRvcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW52ZW50b3J5OiBJbnZlbnRvcnlTZXJ2aWNlXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBhd2FpdCB0aGlzLmxvYWREZXZpY2UoKTtcbiAgICBhd2FpdCB0aGlzLmxvYWRPcGVyYXRpb24oKTtcbiAgfVxuXG4gIGFkZENoYW5nZXMocmVxdWVzdGVkQ2hhbmdlczogRGV2aWNlU29mdHdhcmVDaGFuZ2VbXSkge1xuICAgIGxldCBzdGFnZWRDaGFuZ2VzID0gWy4uLnRoaXMuY2hhbmdlcyQudmFsdWVdO1xuICAgIHJlcXVlc3RlZENoYW5nZXMuZm9yRWFjaChyZXF1ZXN0ZWRDaGFuZ2UgPT4ge1xuICAgICAgY29uc3QgYWxyZWFkeVN0YWdlZCA9IHN0YWdlZENoYW5nZXMuc29tZShzdGFnZWRDaGFuZ2UgPT5cbiAgICAgICAgdGhpcy5hcmVTYW1lQ2hhbmdlcyhzdGFnZWRDaGFuZ2UsIHJlcXVlc3RlZENoYW5nZSkpO1xuICAgICAgaWYgKCFhbHJlYWR5U3RhZ2VkKSB7XG4gICAgICAgIHN0YWdlZENoYW5nZXMgPSBbLi4uc3RhZ2VkQ2hhbmdlcywgcmVxdWVzdGVkQ2hhbmdlXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNoYW5nZXMkLm5leHQoc3RhZ2VkQ2hhbmdlcyk7XG4gIH1cblxuICBkcm9wQ2hhbmdlKGNoYW5nZVRvQmVEcm9wcGVkOiBEZXZpY2VTb2Z0d2FyZUNoYW5nZSkge1xuICAgIGxldCBzdGFnZWRDaGFuZ2VzID0gWy4uLnRoaXMuY2hhbmdlcyQudmFsdWVdO1xuICAgIHN0YWdlZENoYW5nZXMgPSBzdGFnZWRDaGFuZ2VzLmZpbHRlcihzdGFnZWRDaGFuZ2UgPT4gIXRoaXMuYXJlU2FtZUNoYW5nZXMoc3RhZ2VkQ2hhbmdlLCBjaGFuZ2VUb0JlRHJvcHBlZCkpO1xuICAgIHRoaXMuY2hhbmdlcyQubmV4dChzdGFnZWRDaGFuZ2VzKTtcbiAgfVxuXG4gIGFyZVNhbWVDaGFuZ2VzKGNoYW5nZTE6IERldmljZVNvZnR3YXJlQ2hhbmdlLCBjaGFuZ2UyOiBEZXZpY2VTb2Z0d2FyZUNoYW5nZSkge1xuICAgIHJldHVybiBjaGFuZ2UxLm5hbWUgPT09IGNoYW5nZTIubmFtZSAmJlxuICAgICAgY2hhbmdlMS52ZXJzaW9uID09PSBjaGFuZ2UyLnZlcnNpb24gJiZcbiAgICAgIGNoYW5nZTEuYWN0aW9uID09PSBjaGFuZ2UyLmFjdGlvbjtcbiAgfVxuXG4gIGNsZWFyQ2hhbmdlcygpIHtcbiAgICB0aGlzLmNoYW5nZXMkLm5leHQoW10pO1xuICB9XG5cbiAgYXN5bmMgbG9hZERldmljZSgpIHtcbiAgICB0aGlzLnJlbG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgZGV2aWNlID0gKGF3YWl0IHRoaXMuaW52ZW50b3J5LmRldGFpbCh0aGlzLmRldmljZUlkLCB7IHdpdGhDaGlsZHJlbjogZmFsc2UgfSkpLmRhdGE7XG4gICAgdGhpcy5kZXZpY2UkLm5leHQoZGV2aWNlKTtcbiAgICB0aGlzLnJlbG9hZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgYXBwbHlDaGFuZ2VzKCkge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IGF3YWl0IHRoaXMucmVwb3NpdG9yeS5jcmVhdGVTb2Z0d2FyZVVwZGF0ZU9wZXJhdGlvbihcbiAgICAgIHRoaXMuZGV2aWNlJC52YWx1ZSxcbiAgICAgIHRoaXMuY2hhbmdlcyQudmFsdWVcbiAgICApO1xuICAgIHRoaXMudHJhY2tPcGVyYXRpb24ob3BlcmF0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZE9wZXJhdGlvbigpIHtcbiAgICBjb25zdCBvcGVyYXRpb24gPSBhd2FpdCB0aGlzLnJlcG9zaXRvcnkuZ2V0TGFzdFNvZnR3YXJlVXBkYXRlT3BlcmF0aW9uKHRoaXMuZGV2aWNlSWQpO1xuICAgIHRoaXMudHJhY2tPcGVyYXRpb24ob3BlcmF0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhY2tPcGVyYXRpb24ob3BlcmF0aW9uOiBJT3BlcmF0aW9uKSB7XG4gICAgdGhpcy5jaGFuZ2VzT3BlcmF0aW9uJC5uZXh0KG9wZXJhdGlvbik7XG5cbiAgICBpZiAodGhpcy5pc0luUHJvZ3Jlc3Mob3BlcmF0aW9uKSkge1xuICAgICAgdGhpcy5kaXNwbGF5Q2hhbmdlc0Zyb21PcGVyYXRpb24ob3BlcmF0aW9uKTtcbiAgICAgIHRoaXMucmVwb3NpdG9yeS5vYnNlcnZlT3BlcmF0aW9uKG9wZXJhdGlvbikuc3Vic2NyaWJlKFxuICAgICAgICBvcGVyYXRpb25VcGRhdGUgPT4ge1xuICAgICAgICAgIHRoaXMuY2hhbmdlc09wZXJhdGlvbiQubmV4dChvcGVyYXRpb25VcGRhdGUpO1xuICAgICAgICAgIGlmIChvcGVyYXRpb25VcGRhdGUuc3RhdHVzID09PSBPcGVyYXRpb25TdGF0dXMuU1VDQ0VTU0ZVTCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhckNoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMubG9hZERldmljZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb3BlcmF0aW9uVXBkYXRlID0+IHtcbiAgICAgICAgICB0aGlzLmNoYW5nZXNPcGVyYXRpb24kLm5leHQob3BlcmF0aW9uVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRpc3BsYXlDaGFuZ2VzRnJvbU9wZXJhdGlvbihvcGVyYXRpb246IElPcGVyYXRpb24pIHtcbiAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5yZXBvc2l0b3J5LmdldERldmljZVNvZnR3YXJlQ2hhbmdlc0Zyb21PcGVyYXRpb24oXG4gICAgICBvcGVyYXRpb24sXG4gICAgICB0aGlzLmRldmljZSQudmFsdWVcbiAgICApO1xuICAgIHRoaXMuY2hhbmdlcyQubmV4dChjaGFuZ2VzKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJblByb2dyZXNzKG9wZXJhdGlvbjogSU9wZXJhdGlvbikge1xuICAgIHJldHVybiAoXG4gICAgICBvcGVyYXRpb24gJiYgW09wZXJhdGlvblN0YXR1cy5QRU5ESU5HLCBPcGVyYXRpb25TdGF0dXMuRVhFQ1VUSU5HXS5pbmNsdWRlcyhvcGVyYXRpb24uc3RhdHVzKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdHdhcmUtZGV2aWNlLXRhYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9yZXBvc2l0b3J5L3NvZnR3YXJlLWRldmljZS10YWIvc29mdHdhcmUtZGV2aWNlLXRhYi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBYyxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBa0IsZ0JBQWdCLEVBQUUsZUFBZSxFQUFjLE1BQU0sYUFBYSxDQUFDO0FBQzVGLE9BQU8sRUFBd0MsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0YsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFNMUQsTUFBTSxPQUFPLDBCQUEwQjtJQWdCckMsWUFDVSxLQUFxQixFQUNyQixVQUE2QixFQUM3QixTQUEyQjtRQUYzQixVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUM3QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQWxCckMsYUFBUSxHQUFvQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDM0UsWUFBTyxHQUFHLElBQUksZUFBZSxDQUFpQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzNGLHFCQUFnQixHQUF1QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDdEQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFF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SUFBSSxDQUFDLFVBQVUsQ0FBQyxxQ0FBcUMsQ0FDbkUsU0FBUyxFQUNULElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUNuQixDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVPLFlBQVksQ0FBQyxTQUFxQjtRQUN4QyxPQUFPLENBQ0wsU0FBUyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FDN0YsQ0FBQztJQUNKLENBQUM7OztZQS9HRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHlCQUF5QjtnQkFDbkMsdWxDQUFpRDthQUNsRDs7O1lBVlEsY0FBYztZQUtkLGlCQUFpQjtZQUZELGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IElNYW5hZ2VkT2JqZWN0LCBJbnZlbnRvcnlTZXJ2aWNlLCBPcGVyYXRpb25TdGF0dXMsIElPcGVyYXRpb24gfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBEZXZpY2VTb2Z0d2FyZSwgRGV2aWNlU29mdHdhcmVDaGFuZ2UsIFJlcG9zaXRvcnlUeXBlIH0gZnJvbSAnLi4vcmVwb3NpdG9yeS5tb2RlbCc7XG5pbXBvcnQgeyBSZXBvc2l0b3J5U2VydmljZSB9IGZyb20gJy4uL3JlcG9zaXRvcnkuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1zb2Z0d2FyZS1kZXZpY2UtdGFiJyxcbiAgdGVtcGxhdGVVcmw6ICdzb2Z0d2FyZS1kZXZpY2UtdGFiLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBTb2Z0d2FyZURldmljZVRhYkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGRldmljZUlkOiBzdHJpbmcgfCBudW1iZXIgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmVudC5kYXRhLmNvbnRleHREYXRhLmlkO1xuICBkZXZpY2UkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJTWFuYWdlZE9iamVjdD4odGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJlbnQuZGF0YS5jb250ZXh0RGF0YSk7XG4gIGRldmljZVR5cGVRdWVyeSQ6IE9ic2VydmFibGU8b2JqZWN0PiA9IHRoaXMuZGV2aWNlJC5waXBlKFxuICAgIG1hcChkZXZpY2UgPT4gdGhpcy5yZXBvc2l0b3J5LmdldERldmljZVR5cGVRdWVyeShSZXBvc2l0b3J5VHlwZS5TT0ZUV0FSRSwgZGV2aWNlKSlcbiAgKTtcbiAgbGlzdCQ6IE9ic2VydmFibGU8RGV2aWNlU29mdHdhcmVbXT4gPSB0aGlzLmRldmljZSQucGlwZShcbiAgICBtYXAoZGV2aWNlID0+IHRoaXMucmVwb3NpdG9yeS5nZXREZXZpY2VTb2Z0d2FyZUxpc3QoZGV2aWNlKSlcbiAgKTtcbiAgY2hhbmdlcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERldmljZVNvZnR3YXJlQ2hhbmdlW10+KFtdKTtcbiAgY2hhbmdlc09wZXJhdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElPcGVyYXRpb24+KG51bGwpO1xuICBjaGFuZ2VzSW5Qcm9ncmVzcyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLmNoYW5nZXNPcGVyYXRpb24kLnBpcGUoXG4gICAgbWFwKG9wZXJhdGlvbiA9PiB0aGlzLmlzSW5Qcm9ncmVzcyhvcGVyYXRpb24pKVxuICApO1xuICByZWxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJlcG9zaXRvcnk6IFJlcG9zaXRvcnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgaW52ZW50b3J5OiBJbnZlbnRvcnlTZXJ2aWNlXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBhd2FpdCB0aGlzLmxvYWREZXZpY2UoKTtcbiAgICBhd2FpdCB0aGlzLmxvYWRPcGVyYXRpb24oKTtcbiAgfVxuXG4gIGFkZENoYW5nZXMocmVxdWVzdGVkQ2hhbmdlczogRGV2aWNlU29mdHdhcmVDaGFuZ2VbXSkge1xuICAgIGxldCBzdGFnZWRDaGFuZ2VzID0gWy4uLnRoaXMuY2hhbmdlcyQudmFsdWVdO1xuICAgIHJlcXVlc3RlZENoYW5nZXMuZm9yRWFjaChyZXF1ZXN0ZWRDaGFuZ2UgPT4ge1xuICAgICAgY29uc3QgYWxyZWFkeVN0YWdlZCA9IHN0YWdlZENoYW5nZXMuc29tZShzdGFnZWRDaGFuZ2UgPT5cbiAgICAgICAgdGhpcy5hcmVTYW1lQ2hhbmdlcyhzdGFnZWRDaGFuZ2UsIHJlcXVlc3RlZENoYW5nZSkpO1xuICAgICAgaWYgKCFhbHJlYWR5U3RhZ2VkKSB7XG4gICAgICAgIHN0YWdlZENoYW5nZXMgPSBbLi4uc3RhZ2VkQ2hhbmdlcywgcmVxdWVzdGVkQ2hhbmdlXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNoYW5nZXMkLm5leHQoc3RhZ2VkQ2hhbmdlcyk7XG4gIH1cblxuICBkcm9wQ2hhbmdlKGNoYW5nZVRvQmVEcm9wcGVkOiBEZXZpY2VTb2Z0d2FyZUNoYW5nZSkge1xuICAgIGxldCBzdGFnZWRDaGFuZ2VzID0gWy4uLnRoaXMuY2hhbmdlcyQudmFsdWVdO1xuICAgIHN0YWdlZENoYW5nZXMgPSBzdGFnZWRDaGFuZ2VzLmZpbHRlcihzdGFnZWRDaGFuZ2UgPT4gIXRoaXMuYXJlU2FtZUNoYW5nZXMoc3RhZ2VkQ2hhbmdlLCBjaGFuZ2VUb0JlRHJvcHBlZCkpO1xuICAgIHRoaXMuY2hhbmdlcyQubmV4dChzdGFnZWRDaGFuZ2VzKTtcbiAgfVxuXG4gIGFyZVNhbWVDaGFuZ2VzKGNoYW5nZTE6IERldmljZVNvZnR3YXJlQ2hhbmdlLCBjaGFuZ2UyOiBEZXZpY2VTb2Z0d2FyZUNoYW5nZSkge1xuICAgIHJldHVybiBjaGFuZ2UxLm5hbWUgPT09IGNoYW5nZTIubmFtZSAmJlxuICAgICAgY2hhbmdlMS52ZXJzaW9uID09PSBjaGFuZ2UyLnZlcnNpb24gJiZcbiAgICAgIGNoYW5nZTEuYWN0aW9uID09PSBjaGFuZ2UyLmFjdGlvbjtcbiAgfVxuXG4gIGNsZWFyQ2hhbmdlcygpIHtcbiAgICB0aGlzLmNoYW5nZXMkLm5leHQoW10pO1xuICB9XG5cbiAgYXN5bmMgbG9hZERldmljZSgpIHtcbiAgICB0aGlzLnJlbG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgZGV2aWNlID0gKGF3YWl0IHRoaXMuaW52ZW50b3J5LmRldGFpbCh0aGlzLmRldmljZUlkLCB7IHdpdGhDaGlsZHJlbjogZmFsc2UgfSkpLmRhdGE7XG4gICAgdGhpcy5kZXZpY2UkLm5leHQoZGV2aWNlKTtcbiAgICB0aGlzLnJlbG9hZGluZyA9IGZhbHNlO1xuICB9XG5cbiAgYXN5bmMgYXBwbHlDaGFuZ2VzKCkge1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IGF3YWl0IHRoaXMucmVwb3NpdG9yeS5jcmVhdGVTb2Z0d2FyZVVwZGF0ZU9wZXJhdGlvbihcbiAgICAgIHRoaXMuZGV2aWNlJC52YWx1ZSxcbiAgICAgIHRoaXMuY2hhbmdlcyQudmFsdWVcbiAgICApO1xuICAgIHRoaXMudHJhY2tPcGVyYXRpb24ob3BlcmF0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZE9wZXJhdGlvbigpIHtcbiAgICBjb25zdCBvcGVyYXRpb24gPSBhd2FpdCB0aGlzLnJlcG9zaXRvcnkuZ2V0TGFzdFNvZnR3YXJlVXBkYXRlT3BlcmF0aW9uKHRoaXMuZGV2aWNlSWQpO1xuICAgIHRoaXMudHJhY2tPcGVyYXRpb24ob3BlcmF0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhY2tPcGVyYXRpb24ob3BlcmF0aW9uOiBJT3BlcmF0aW9uKSB7XG4gICAgdGhpcy5jaGFuZ2VzT3BlcmF0aW9uJC5uZXh0KG9wZXJhdGlvbik7XG5cbiAgICBpZiAodGhpcy5pc0luUHJvZ3Jlc3Mob3BlcmF0aW9uKSkge1xuICAgICAgdGhpcy5kaXNwbGF5Q2hhbmdlc0Zyb21PcGVyYXRpb24ob3BlcmF0aW9uKTtcbiAgICAgIHRoaXMucmVwb3NpdG9yeS5vYnNlcnZlT3BlcmF0aW9uKG9wZXJhdGlvbikuc3Vic2NyaWJlKFxuICAgICAgICBvcGVyYXRpb25VcGRhdGUgPT4ge1xuICAgICAgICAgIHRoaXMuY2hhbmdlc09wZXJhdGlvbiQubmV4dChvcGVyYXRpb25VcGRhdGUpO1xuICAgICAgICAgIGlmIChvcGVyYXRpb25VcGRhdGUuc3RhdHVzID09PSBPcGVyYXRpb25TdGF0dXMuU1VDQ0VTU0ZVTCkge1xuICAgICAgICAgICAgdGhpcy5jbGVhckNoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMubG9hZERldmljZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgb3BlcmF0aW9uVXBkYXRlID0+IHtcbiAgICAgICAgICB0aGlzLmNoYW5nZXNPcGVyYXRpb24kLm5leHQob3BlcmF0aW9uVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRpc3BsYXlDaGFuZ2VzRnJvbU9wZXJhdGlvbihvcGVyYXRpb246IElPcGVyYXRpb24pIHtcbiAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5yZXBvc2l0b3J5LmdldERldmljZVNvZnR3YXJlQ2hhbmdlc0Zyb21PcGVyYXRpb24oXG4gICAgICBvcGVyYXRpb24sXG4gICAgICB0aGlzLmRldmljZSQudmFsdWVcbiAgICApO1xuICAgIHRoaXMuY2hhbmdlcyQubmV4dChjaGFuZ2VzKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNJblByb2dyZXNzKG9wZXJhdGlvbjogSU9wZXJhdGlvbikge1xuICAgIHJldHVybiAoXG4gICAgICBvcGVyYXRpb24gJiYgW09wZXJhdGlvblN0YXR1cy5QRU5ESU5HLCBPcGVyYXRpb25TdGF0dXMuRVhFQ1VUSU5HXS5pbmNsdWRlcyhvcGVyYXRpb24uc3RhdHVzKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -1,18 +1,22 @@
1
1
  import { Injectable } from '@angular/core';
2
+ import { get, has } from 'lodash-es';
2
3
  export class SoftwareDeviceTabGuard {
3
4
  constructor() {
4
5
  this.operations = ['c8y_SoftwareUpdate', 'c8y_SoftwareList', 'c8y_Software'];
5
6
  }
6
7
  canActivate(route) {
7
- return this.isAnyOperationSupported(route);
8
+ const device = get(route, 'data.contextData') || get(route, 'parent.data.contextData');
9
+ return (this.isAnyOperationSupported(device) ||
10
+ has(device, 'c8y_Software') ||
11
+ has(device, 'c8y_SoftwareList') ||
12
+ has(device, 'c8y_SupportedSoftwareTypes'));
8
13
  }
9
- isAnyOperationSupported(route) {
10
- const device = route.data.contextData || route.parent.data.contextData;
11
- const supportedOperations = (device && device.c8y_SupportedOperations) || [];
14
+ isAnyOperationSupported(device) {
15
+ const supportedOperations = (device === null || device === void 0 ? void 0 : device.c8y_SupportedOperations) || [];
12
16
  return this.operations.some(operation => supportedOperations.indexOf(operation) >= 0);
13
17
  }
14
18
  }
15
19
  SoftwareDeviceTabGuard.decorators = [
16
20
  { type: Injectable }
17
21
  ];
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdHdhcmUtZGV2aWNlLXRhYi5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3JlcG9zaXRvcnkvc29mdHdhcmUtZGV2aWNlLXRhYi9zb2Z0d2FyZS1kZXZpY2UtdGFiLmd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJM0MsTUFBTSxPQUFPLHNCQUFzQjtJQURuQztRQUVtQixlQUFVLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLENBQUMsQ0FBQztJQVczRixDQUFDO0lBVEMsV0FBVyxDQUFDLEtBQTZCO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxLQUE2QjtRQUMzRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDdkUsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDN0UsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN4RixDQUFDOzs7WUFaRixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2FuQWN0aXZhdGUsIEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU29mdHdhcmVEZXZpY2VUYWJHdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBvcGVyYXRpb25zID0gWydjOHlfU29mdHdhcmVVcGRhdGUnLCAnYzh5X1NvZnR3YXJlTGlzdCcsICdjOHlfU29mdHdhcmUnXTtcblxuICBjYW5BY3RpdmF0ZShyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCkge1xuICAgIHJldHVybiB0aGlzLmlzQW55T3BlcmF0aW9uU3VwcG9ydGVkKHJvdXRlKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNBbnlPcGVyYXRpb25TdXBwb3J0ZWQocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpIHtcbiAgICBjb25zdCBkZXZpY2UgPSByb3V0ZS5kYXRhLmNvbnRleHREYXRhIHx8IHJvdXRlLnBhcmVudC5kYXRhLmNvbnRleHREYXRhO1xuICAgIGNvbnN0IHN1cHBvcnRlZE9wZXJhdGlvbnMgPSAoZGV2aWNlICYmIGRldmljZS5jOHlfU3VwcG9ydGVkT3BlcmF0aW9ucykgfHwgW107XG4gICAgcmV0dXJuIHRoaXMub3BlcmF0aW9ucy5zb21lKG9wZXJhdGlvbiA9PiBzdXBwb3J0ZWRPcGVyYXRpb25zLmluZGV4T2Yob3BlcmF0aW9uKSA+PSAwKTtcbiAgfVxufVxuIl19
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdHdhcmUtZGV2aWNlLXRhYi5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3JlcG9zaXRvcnkvc29mdHdhcmUtZGV2aWNlLXRhYi9zb2Z0d2FyZS1kZXZpY2UtdGFiLmd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0MsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHckMsTUFBTSxPQUFPLHNCQUFzQjtJQURuQztRQUVtQixlQUFVLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLENBQUMsQ0FBQztJQWdCM0YsQ0FBQztJQWRDLFdBQVcsQ0FBQyxLQUE2QjtRQUN2QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3ZGLE9BQU8sQ0FDTCxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDO1lBQ3BDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDO1lBQzNCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUM7WUFDL0IsR0FBRyxDQUFDLE1BQU0sRUFBRSw0QkFBNEIsQ0FBQyxDQUMxQyxDQUFDO0lBQ0osQ0FBQztJQUVPLHVCQUF1QixDQUFDLE1BQXNCO1FBQ3BELE1BQU0sbUJBQW1CLEdBQUcsQ0FBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsdUJBQXVCLEtBQUksRUFBRSxDQUFDO1FBQ2xFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDeEYsQ0FBQzs7O1lBakJGLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBDYW5BY3RpdmF0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBJTWFuYWdlZE9iamVjdCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IGdldCwgaGFzIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNvZnR3YXJlRGV2aWNlVGFiR3VhcmQgaW1wbGVtZW50cyBDYW5BY3RpdmF0ZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgb3BlcmF0aW9ucyA9IFsnYzh5X1NvZnR3YXJlVXBkYXRlJywgJ2M4eV9Tb2Z0d2FyZUxpc3QnLCAnYzh5X1NvZnR3YXJlJ107XG5cbiAgY2FuQWN0aXZhdGUocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpIHtcbiAgICBjb25zdCBkZXZpY2UgPSBnZXQocm91dGUsICdkYXRhLmNvbnRleHREYXRhJykgfHwgZ2V0KHJvdXRlLCAncGFyZW50LmRhdGEuY29udGV4dERhdGEnKTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5pc0FueU9wZXJhdGlvblN1cHBvcnRlZChkZXZpY2UpIHx8XG4gICAgICBoYXMoZGV2aWNlLCAnYzh5X1NvZnR3YXJlJykgfHxcbiAgICAgIGhhcyhkZXZpY2UsICdjOHlfU29mdHdhcmVMaXN0JykgfHxcbiAgICAgIGhhcyhkZXZpY2UsICdjOHlfU3VwcG9ydGVkU29mdHdhcmVUeXBlcycpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNBbnlPcGVyYXRpb25TdXBwb3J0ZWQoZGV2aWNlOiBJTWFuYWdlZE9iamVjdCkge1xuICAgIGNvbnN0IHN1cHBvcnRlZE9wZXJhdGlvbnMgPSBkZXZpY2U/LmM4eV9TdXBwb3J0ZWRPcGVyYXRpb25zIHx8IFtdO1xuICAgIHJldHVybiB0aGlzLm9wZXJhdGlvbnMuc29tZShvcGVyYXRpb24gPT4gc3VwcG9ydGVkT3BlcmF0aW9ucy5pbmRleE9mKG9wZXJhdGlvbikgPj0gMCk7XG4gIH1cbn1cbiJdfQ==
@@ -20,9 +20,8 @@ class BinaryFileDownloadService {
20
20
  }
21
21
  run() {
22
22
  this.router.events
23
- .pipe(filter((event) => {
24
- return event instanceof NavigationEnd
25
- && this.route.snapshot.queryParams.download;
23
+ .pipe(filter(event => {
24
+ return event instanceof NavigationEnd && this.route.snapshot.queryParams.download;
26
25
  }), map(() => this.route.snapshot.queryParams.download))
27
26
  .subscribe((downloadId) => __awaiter(this, void 0, void 0, function* () {
28
27
  try {
@@ -40,32 +39,35 @@ class BinaryFileDownloadService {
40
39
  }
41
40
  }));
42
41
  }
43
- showDownloadModal(data) {
42
+ showDownloadModal(binaryMo) {
44
43
  return __awaiter(this, void 0, void 0, function* () {
45
44
  try {
46
- const modalBody = this.translate.instant(gettext('You are about to download file "{{ fileName }}". Do you want to proceed?'), { fileName: data.name });
47
- yield this.modalService.confirm(gettext('File download'), modalBody, Status.INFO, { ok: gettext('Download') });
48
- const binary = yield this.getBinary(data.id);
49
- const fileBinary = new File([binary], data.name, { type: data.contentType });
45
+ const modalBody = this.translate.instant(gettext('You are about to download file "{{ fileName }}". Do you want to proceed?'), { fileName: binaryMo.name });
46
+ yield this.modalService.confirm(gettext('File download'), modalBody, Status.INFO, {
47
+ ok: gettext('Download')
48
+ });
49
+ const arrayBuffer = yield this.getArrayBuffer(binaryMo.id);
50
+ const fileBinary = new File([arrayBuffer], binaryMo.name, { type: binaryMo.contentType });
50
51
  saveAs(fileBinary);
51
52
  }
52
53
  catch (e) {
53
54
  // empty body :(
55
+ console.log({ e });
54
56
  }
55
57
  });
56
58
  }
57
- getBinary(binaryId) {
59
+ getArrayBuffer(binaryId) {
58
60
  return __awaiter(this, void 0, void 0, function* () {
59
- let binary;
61
+ let arrayBuffer;
60
62
  try {
61
63
  const res = yield this.inventoryBinary.download(binaryId);
62
- binary = yield res.text();
64
+ arrayBuffer = yield res.arrayBuffer();
63
65
  }
64
66
  catch (ex) {
65
67
  const msg = gettext('Could not get the binary.');
66
68
  this.alertService.danger(msg);
67
69
  }
68
- return binary;
70
+ return arrayBuffer;
69
71
  });
70
72
  }
71
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-binary-file-download.js","sources":["../../binary-file-download/binary-file-download.service.ts","../../binary-file-download/binary-file-download.module.ts","../../binary-file-download/c8y-ngx-components-binary-file-download.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { Router, NavigationEnd, ActivatedRoute } from '@angular/router';\nimport { filter, map } from 'rxjs/operators';\nimport { InventoryBinaryService, InventoryService } from '@c8y/client';\nimport { AlertService, gettext, ModalService, Status } from '@c8y/ngx-components';\nimport { saveAs } from 'file-saver';\nimport { isUndefined } from 'lodash-es';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Injectable()\nexport class BinaryFileDownloadService {\n\n constructor(private router: Router,\n private route: ActivatedRoute,\n private inventoryService: InventoryService,\n private alertService: AlertService,\n private modalService: ModalService,\n private translate: TranslateService,\n private inventoryBinary: InventoryBinaryService) {\n }\n\n run() {\n this.router.events\n .pipe(\n filter((event) => { return event instanceof NavigationEnd\n && this.route.snapshot.queryParams.download; }),\n map(() => this.route.snapshot.queryParams.download))\n .subscribe(async (downloadId) => {\n try {\n const { data } = await this.inventoryService.detail(downloadId);\n if ( !isUndefined(data.c8y_IsBinary) ) {\n this.showDownloadModal(data);\n } else {\n const alertMessage = this.translate.instant(\n gettext('Could not download the file: object with ID \"{{ id }}\" is not a valid binary.'),\n { id: data.id }\n );\n this.alertService.danger(alertMessage);\n }\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n });\n }\n\n async showDownloadModal(data) {\n try {\n const modalBody = this.translate.instant(\n gettext('You are about to download file \"{{ fileName }}\". Do you want to proceed?'),\n { fileName: data.name }\n );\n await this.modalService.confirm(\n gettext('File download'),\n modalBody,\n Status.INFO,\n { ok: gettext('Download') }\n );\n const binary = await this.getBinary(data.id);\n const fileBinary = new File([binary], data.name, { type: data.contentType });\n saveAs(fileBinary);\n } catch (e) {\n // empty body :(\n }\n }\n\n private async getBinary(binaryId) {\n let binary;\n try {\n const res = await this.inventoryBinary.download(binaryId);\n binary = await res.text();\n } catch (ex) {\n const msg = gettext('Could not get the binary.');\n this.alertService.danger(msg);\n }\n\n return binary;\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@c8y/ngx-components';\nimport { BinaryFileDownloadService } from './binary-file-download.service';\nimport { RouterModule } from '@angular/router';\n\n@NgModule({\n imports: [CommonModule, RouterModule],\n providers: [BinaryFileDownloadService]\n})\nexport class BinaryFileDownloadModule {\n constructor(binaryFileDownloadService: BinaryFileDownloadService) {\n binaryFileDownloadService.run();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"c8y-ngx-components-binary-file-download.js","sources":["../../binary-file-download/binary-file-download.service.ts","../../binary-file-download/binary-file-download.module.ts","../../binary-file-download/c8y-ngx-components-binary-file-download.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { Router, NavigationEnd, ActivatedRoute } from '@angular/router';\nimport { filter, map } from 'rxjs/operators';\nimport { IManagedObject, InventoryBinaryService, InventoryService } from '@c8y/client';\nimport { AlertService, gettext, ModalService, Status } from '@c8y/ngx-components';\nimport { saveAs } from 'file-saver';\nimport { isUndefined } from 'lodash-es';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Injectable()\nexport class BinaryFileDownloadService {\n constructor(\n private router: Router,\n private route: ActivatedRoute,\n private inventoryService: InventoryService,\n private alertService: AlertService,\n private modalService: ModalService,\n private translate: TranslateService,\n private inventoryBinary: InventoryBinaryService\n ) {}\n\n run() {\n this.router.events\n .pipe(\n filter(event => {\n return event instanceof NavigationEnd && this.route.snapshot.queryParams.download;\n }),\n map(() => this.route.snapshot.queryParams.download)\n )\n .subscribe(async downloadId => {\n try {\n const { data } = await this.inventoryService.detail(downloadId);\n if (!isUndefined(data.c8y_IsBinary)) {\n this.showDownloadModal(data);\n } else {\n const alertMessage = this.translate.instant(\n gettext(\n 'Could not download the file: object with ID \"{{ id }}\" is not a valid binary.'\n ),\n { id: data.id }\n );\n this.alertService.danger(alertMessage);\n }\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n });\n }\n\n async showDownloadModal(binaryMo: IManagedObject) {\n try {\n const modalBody = this.translate.instant(\n gettext('You are about to download file \"{{ fileName }}\". Do you want to proceed?'),\n { fileName: binaryMo.name }\n );\n await this.modalService.confirm(gettext('File download'), modalBody, Status.INFO, {\n ok: gettext('Download')\n });\n const arrayBuffer = await this.getArrayBuffer(binaryMo.id);\n const fileBinary = new File([arrayBuffer], binaryMo.name, { type: binaryMo.contentType });\n saveAs(fileBinary);\n } catch (e) {\n // empty body :(\n console.log({ e });\n }\n }\n\n private async getArrayBuffer(binaryId): Promise<ArrayBuffer> {\n let arrayBuffer: ArrayBuffer;\n try {\n const res = await this.inventoryBinary.download(binaryId);\n arrayBuffer = await res.arrayBuffer();\n } catch (ex) {\n const msg = gettext('Could not get the binary.');\n this.alertService.danger(msg);\n }\n\n return arrayBuffer;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@c8y/ngx-components';\nimport { BinaryFileDownloadService } from './binary-file-download.service';\nimport { RouterModule } from '@angular/router';\n\n@NgModule({\n imports: [CommonModule, RouterModule],\n providers: [BinaryFileDownloadService]\n})\nexport class BinaryFileDownloadModule {\n constructor(binaryFileDownloadService: BinaryFileDownloadService) {\n binaryFileDownloadService.run();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -66,11 +66,12 @@ class LpwanSetDeviceProtocolService {
66
66
  getAvailableProtocols(device) {
67
67
  return __awaiter(this, void 0, void 0, function* () {
68
68
  const query = {
69
- type: {
70
- __in: this.getProtocolTypesMatchingDevice(device)
71
- }
69
+ __filter: {
70
+ type: { __in: this.getProtocolTypesMatchingDevice(device) }
71
+ },
72
+ __orderby: [{ name: 1 }]
72
73
  };
73
- return this.inventoryService.listQuery(query);
74
+ return this.inventoryService.listQuery(query, { withTotalPages: true, pageSize: 5 });
74
75
  });
75
76
  }
76
77
  getProtocolTypesMatchingDevice(device) {
@@ -100,13 +101,20 @@ class LpwanAssignDeviceProtocolComponent {
100
101
  this.alertService = alertService;
101
102
  this.router = router;
102
103
  this.inventoryService = inventoryService;
103
- this.filterCurrentProtocol = pipe(map((protocols) => protocols.filter(protocol => !this.currentProtocol || this.currentProtocol.id !== protocol.id)));
104
+ this.filterProtocols = pipe();
105
+ this.pattern = '';
104
106
  }
105
107
  ngOnInit() {
106
108
  return __awaiter(this, void 0, void 0, function* () {
107
109
  yield this.reload();
110
+ this.setPipe('');
108
111
  });
109
112
  }
113
+ setPipe(filterStr) {
114
+ this.pattern = filterStr;
115
+ this.filterProtocols = pipe(map((protocols) => protocols.filter(protocol => (!this.currentProtocol || this.currentProtocol.id !== protocol.id) &&
116
+ (!filterStr || protocol.name.toLowerCase().indexOf(filterStr.toLowerCase()) > -1))));
117
+ }
110
118
  reload() {
111
119
  return __awaiter(this, void 0, void 0, function* () {
112
120
  this.loading = true;
@@ -161,7 +169,7 @@ class LpwanAssignDeviceProtocolComponent {
161
169
  LpwanAssignDeviceProtocolComponent.decorators = [
162
170
  { type: Component, args: [{
163
171
  selector: 'set-device-protocol',
164
- template: "<form #lpwanSetDeviceProtocolForm=\"ngForm\" class=\"row\">\n <div class=\"col-md-6\">\n <div class=\"card\">\n <div class=\"card-header separator\">\n <h4 class=\"card-title\">\n {{ 'LPWAN device protocol' | translate }}\n </h4>\n </div>\n <div *ngIf=\"loading\" class=\"card-block\">\n <div class=\"p-relative\" style=\"min-height: 40px; min-width: 55px;\">\n <div class=\"spinner\">\n <div class=\"rect1\"></div>\n <div class=\"rect2\"></div>\n <div class=\"rect3\"></div>\n <div class=\"rect4\"></div>\n </div>\n </div>\n <span translate>Loading</span>\n </div>\n <div *ngIf=\"!loading\">\n <div class=\"card-block\">\n <div class=\"form-group\">\n <label translate>Current device protocol</label>\n <p class=\"form-control-static\" *ngIf=\"!currentProtocol\">\n {{ device.type }}\n </p>\n <p class=\"form-control-static\" *ngIf=\"currentProtocol\">\n {{ currentProtocol.name }}\n </p>\n </div>\n <div class=\"form-group\">\n <label translate>New device protocol</label>\n <div class=\"c8y-select-wrapper\">\n <select class=\"form-control\" [(ngModel)]=\"newProtocol\" name=\"newProtocol\" required>\n <option *ngIf=\"!newProtocol\" [ngValue]=\"null\">\n {{ 'Select device protocol' | translate }}\n </option>\n <option\n *c8yFor=\"let protocol of availableProtocols; pipe: filterCurrentProtocol\"\n [ngValue]=\"protocol\"\n >\n {{ protocol.name }}\n </option>\n </select>\n </div>\n </div>\n </div>\n <div class=\"card-footer separator\">\n <button\n title=\"{{ 'Apply' | translate }}\"\n class=\"btn btn-primary\"\n (click)=\"apply(newProtocol)\"\n [disabled]=\"!lpwanSetDeviceProtocolForm.dirty\"\n >\n {{ 'Apply' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n</form>\n\u200C\n"
172
+ template: "<form #lpwanSetDeviceProtocolForm=\"ngForm\">\n <div class=\"row\">\n <div class=\"col-md-6\">\n <div class=\"card card--fullpage\">\n <div class=\"card-header separator\">\n <h4 class=\"card-title\">\n {{ 'LPWAN device protocol' | translate }}\n </h4>\n </div>\n <div class=\"p-16\">\n <div *ngIf=\"loading\">\n <c8y-loading></c8y-loading>\n </div>\n\n <div *ngIf=\"!loading\">\n <div class=\"form-group\">\n <label translate>Current device protocol</label>\n <p class=\"form-control-static\" *ngIf=\"!currentProtocol\">\n {{ device.type }}\n </p>\n <p class=\"form-control-static\" *ngIf=\"currentProtocol\">\n {{ currentProtocol.name }}\n </p>\n </div>\n <c8y-form-group>\n <c8y-typeahead\n [(ngModel)]=\"newProtocol\"\n placeholder=\"{{ 'Select new device protocol' | translate }}\"\n (onSearch)=\"setPipe($event)\"\n name=\"newProtocol\"\n [allowFreeEntries]=\"false\"\n >\n <c8y-li\n *c8yFor=\"\n let protocol of availableProtocols;\n loadMore: 'hidden';\n pipe: filterProtocols\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"newProtocol = protocol; setPipe('')\"\n >\n <c8y-highlight [text]=\"protocol.name\" [pattern]=\"pattern\"></c8y-highlight>\n </c8y-li>\n </c8y-typeahead>\n <c8y-messages\n ><c8y-message\n name=\"notExisting\"\n [text]=\"'Select one of the protocols.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"card-footer separator\">\n <button\n title=\"{{ 'Save' | translate }}\"\n class=\"btn btn-primary\"\n (click)=\"apply(newProtocol)\"\n [disabled]=\"!newProtocol\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </div>\n </div>\n</form>\n"
165
173
  },] }
166
174
  ];
167
175
  LpwanAssignDeviceProtocolComponent.ctorParameters = () => [
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-protocol-lpwan.js","sources":["../../protocol-lpwan/lpwan-set-device-protocol.service.ts","../../protocol-lpwan/lpwan-set-device-protocol.component.ts","../../protocol-lpwan/lpwan-agent.guard.ts","../../protocol-lpwan/lpwan-protocol.module.ts","../../protocol-lpwan/c8y-ngx-components-protocol-lpwan.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { IManagedObject, InventoryService, IResultList, FetchClient, IFetchOptions, IdentityService } from '@c8y/client';\nimport { get } from 'lodash-es';\n\n@Injectable()\nexport class LpwanSetDeviceProtocolService {\n supportedDevicesCfgs = [\n {\n name: 'lora',\n match: device => get(device, 'c8y_LpwanDevice.lpwanDeviceType') === 'Lora',\n protocolTypes: ['c8y_ActilityDeviceType', 'c8y_LoraDeviceType']\n },\n {\n name: 'sigfox',\n match: device => get(device, 'c8y_LpwanDevice.serviceProvider') === 'Sigfox',\n protocolTypes: ['c8y_SigfoxDeviceType']\n },\n ];\n\n private readonly header: any = { 'Content-Type': 'application/json' };\n private readonly microserviceUrl: string = '/service/loriot';\n\n constructor(\n private inventoryService: InventoryService,\n private client: FetchClient,\n private identityService: IdentityService\n ) { }\n\n async refreshCache(device) {\n const externalId = await this.getExternalId(device);\n if (externalId) {\n const url = `${this.microserviceUrl}/refreshCache/${externalId}`;\n const options: IFetchOptions = {\n method: 'POST',\n headers: this.header,\n body: JSON.stringify({})\n };\n return this.client.fetch(url, options);\n }\n }\n\n isSupportedDevice(device: IManagedObject): boolean {\n return this.supportedDevicesCfgs.some(({ match }) => match(device));\n }\n\n async getCurrentProtocol(device: IManagedObject) {\n const protocolId = device.c8y_LpwanDevice.type\n ? device.c8y_LpwanDevice.type.split('/')[2]\n : null;\n if (!protocolId) {\n return null;\n }\n const { data } = await this.inventoryService.detail(protocolId);\n return data;\n }\n\n async applyProtocol(device: IManagedObject, selectedProtocol: IManagedObject) {\n device.c8y_LpwanDevice.type = 'inventory/managedObjects/' + selectedProtocol.id;\n device.type = selectedProtocol.name;\n return this.inventoryService.update(device);\n }\n\n async getAvailableProtocols(device: IManagedObject): Promise<IResultList<IManagedObject>> {\n const query = {\n type: {\n __in: this.getProtocolTypesMatchingDevice(device)\n }\n };\n return this.inventoryService.listQuery(query);\n }\n\n private getProtocolTypesMatchingDevice(device: IManagedObject): string[] {\n const matchingCfg = this.supportedDevicesCfgs.find(({ match }) => match(device));\n return matchingCfg ? matchingCfg.protocolTypes : [];\n }\n\n private async getExternalId(device: IManagedObject): Promise<string> {\n const externalIds = (await this.identityService.list(device.id)).data;\n const loriotEuiExternalId = externalIds.find(externalId => externalId.type === 'c8y_LoriotEUI');\n return loriotEuiExternalId ? loriotEuiExternalId.externalId : null;\n }\n}\n","import { Component, OnInit, ViewChild } from '@angular/core';\nimport { LpwanSetDeviceProtocolService } from './lpwan-set-device-protocol.service';\nimport { AlertService, gettext } from '@c8y/ngx-components';\nimport { IManagedObject, InventoryService, IResultList } from '@c8y/client';\nimport { Router } from '@angular/router';\nimport { pipe } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\n@Component({\n selector: 'set-device-protocol',\n templateUrl: './lpwan-set-device-protocol.component.html'\n})\n\nexport class LpwanAssignDeviceProtocolComponent implements OnInit {\n loading: boolean;\n device: IManagedObject;\n currentProtocol: IManagedObject;\n availableProtocols: IResultList<IManagedObject>;\n newProtocol: IManagedObject;\n\n filterCurrentProtocol = pipe(\n map((protocols: IManagedObject[]) =>\n protocols.filter(protocol => !this.currentProtocol || this.currentProtocol.id !== protocol.id)\n )\n );\n @ViewChild('lpwanSetDeviceProtocolForm', { static: false }) lpwanSetDeviceProtocolForm: any;\n\n constructor(\n private lpwanService: LpwanSetDeviceProtocolService,\n private alertService: AlertService,\n private router: Router,\n private inventoryService: InventoryService\n ) { }\n async ngOnInit() {\n await this.reload();\n }\n\n async reload() {\n this.loading = true;\n this.newProtocol = null;\n try {\n await this.loadDevice();\n this.availableProtocols = await this.lpwanService.getAvailableProtocols(this.device);\n this.currentProtocol = await this.lpwanService.getCurrentProtocol(this.device);\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n } finally {\n this.loading = false;\n }\n }\n\n async loadDevice() {\n const deviceId = this.router.routerState.snapshot.url.match(/\\d+/)[0];\n const { data } = await this.inventoryService.detail(deviceId);\n this.device = data;\n }\n\n async apply(selectedProtocol) {\n try {\n const moUpdated = (await this.lpwanService.applyProtocol(this.device, selectedProtocol)).res.status === 200;\n await this.reload();\n this.alertService.success(gettext('Device protocol set.'));\n this.lpwanSetDeviceProtocolForm.reset('dirty');\n if (moUpdated) {\n this.refreshCache();\n }\n } catch (ex) {\n this.alertService.danger(gettext('Could not set device protocol.'));\n }\n }\n\n async refreshCache() {\n try {\n await this.lpwanService.refreshCache(this.device);\n } catch (ex) {\n // do nothing (refreshing is an optional step)\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate } from '@angular/router';\nimport { LpwanSetDeviceProtocolService } from './lpwan-set-device-protocol.service';\n@Injectable()\nexport class LpwanAgentGuard implements CanActivate {\n constructor(private lpwanService: LpwanSetDeviceProtocolService) {}\n\n canActivate(route: ActivatedRouteSnapshot): boolean {\n const device = route.data.contextData || route.parent.data.contextData;\n return this.lpwanService.isSupportedDevice(device);\n }\n}\n","import { NgModule } from '@angular/core';\nimport {\n CoreModule,\n FormsModule,\n gettext,\n HOOK_ONCE_ROUTE,\n Route,\n ViewContext\n} from '@c8y/ngx-components';\nimport { LpwanAssignDeviceProtocolComponent } from './lpwan-set-device-protocol.component';\nimport { LpwanAgentGuard } from './lpwan-agent.guard';\nimport { LpwanSetDeviceProtocolService } from './lpwan-set-device-protocol.service';\n\nconst routes: Route[] = [\n {\n context: ViewContext.Device,\n path: 'assign-protocol',\n component: LpwanAssignDeviceProtocolComponent,\n label: gettext('LPWAN'),\n icon: 'c8y-device-protocols',\n canActivate: [LpwanAgentGuard]\n }\n];\n\n@NgModule({\n declarations: [\n LpwanAssignDeviceProtocolComponent\n ],\n imports: [\n CoreModule,\n FormsModule\n ],\n entryComponents: [LpwanAssignDeviceProtocolComponent],\n providers: [\n LpwanAgentGuard,\n LpwanSetDeviceProtocolService,\n {\n provide: HOOK_ONCE_ROUTE,\n useValue: routes,\n multi: true\n }\n ]\n})\nexport class LpwanProtocolModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {LpwanAgentGuard as ɵb} from './lpwan-agent.guard';\nexport {LpwanSetDeviceProtocolService as ɵa} from './lpwan-set-device-protocol.service';"],"names":[],"mappings":";;;;;;;;;MAKa,6BAA6B;IAiBxC,YACU,gBAAkC,EAClC,MAAmB,EACnB,eAAgC;QAFhC,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,WAAM,GAAN,MAAM,CAAa;QACnB,oBAAe,GAAf,eAAe,CAAiB;QAnB1C,yBAAoB,GAAG;YACrB;gBACE,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,iCAAiC,CAAC,KAAK,MAAM;gBAC1E,aAAa,EAAE,CAAC,wBAAwB,EAAE,oBAAoB,CAAC;aAChE;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,iCAAiC,CAAC,KAAK,QAAQ;gBAC5E,aAAa,EAAE,CAAC,sBAAsB,CAAC;aACxC;SACF,CAAC;QAEe,WAAM,GAAQ,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;QACrD,oBAAe,GAAW,iBAAiB,CAAC;KAMxD;IAEC,YAAY,CAAC,MAAM;;YACvB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YACpD,IAAI,UAAU,EAAE;gBACd,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,eAAe,iBAAiB,UAAU,EAAE,CAAC;gBACjE,MAAM,OAAO,GAAkB;oBAC7B,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,IAAI,CAAC,MAAM;oBACpB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;iBACzB,CAAC;gBACF,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;aACxC;SACF;KAAA;IAED,iBAAiB,CAAC,MAAsB;QACtC,OAAO,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;KACrE;IAEK,kBAAkB,CAAC,MAAsB;;YAC7C,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI;kBAC1C,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;kBACzC,IAAI,CAAC;YACT,IAAI,CAAC,UAAU,EAAE;gBACf,OAAO,IAAI,CAAC;aACb;YACD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC;SACb;KAAA;IAEK,aAAa,CAAC,MAAsB,EAAE,gBAAgC;;YAC1E,MAAM,CAAC,eAAe,CAAC,IAAI,GAAG,2BAA2B,GAAG,gBAAgB,CAAC,EAAE,CAAC;YAChF,MAAM,CAAC,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC;YACpC,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SAC7C;KAAA;IAEK,qBAAqB,CAAC,MAAsB;;YAChD,MAAM,KAAK,GAAG;gBACZ,IAAI,EAAE;oBACJ,IAAI,EAAE,IAAI,CAAC,8BAA8B,CAAC,MAAM,CAAC;iBAClD;aACF,CAAC;YACF,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;SAC/C;KAAA;IAEO,8BAA8B,CAAC,MAAsB;QAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACjF,OAAO,WAAW,GAAG,WAAW,CAAC,aAAa,GAAG,EAAE,CAAC;KACrD;IAEa,aAAa,CAAC,MAAsB;;YAChD,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;YACtE,MAAM,mBAAmB,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;YAChG,OAAO,mBAAmB,GAAG,mBAAmB,CAAC,UAAU,GAAG,IAAI,CAAC;SACpE;KAAA;;;YA5EF,UAAU;;;YAHc,gBAAgB;YAAe,WAAW;YAAiB,eAAe;;;MCYtF,kCAAkC;IAc7C,YACU,YAA2C,EAC3C,YAA0B,EAC1B,MAAc,EACd,gBAAkC;QAHlC,iBAAY,GAAZ,YAAY,CAA+B;QAC3C,iBAAY,GAAZ,YAAY,CAAc;QAC1B,WAAM,GAAN,MAAM,CAAQ;QACd,qBAAgB,GAAhB,gBAAgB,CAAkB;QAX5C,0BAAqB,GAAG,IAAI,CAC1B,GAAG,CAAC,CAAC,SAA2B,KAC9B,SAAS,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,CAAC,CAC/F,CACF,CAAC;KAQG;IACC,QAAQ;;YACZ,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;SACrB;KAAA;IAEK,MAAM;;YACV,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YACxB,IAAI;gBACF,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBACxB,IAAI,CAAC,kBAAkB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACrF,IAAI,CAAC,eAAe,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aAChF;YAAC,OAAO,EAAE,EAAE;gBACX,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;aACxC;oBAAS;gBACR,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;aACtB;SACF;KAAA;IAEK,UAAU;;YACd,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACtE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC9D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;SACpB;KAAA;IAEK,KAAK,CAAC,gBAAgB;;YAC1B,IAAI;gBACF,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC;gBAC5G,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC;gBAC3D,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC/C,IAAI,SAAS,EAAE;oBACb,IAAI,CAAC,YAAY,EAAE,CAAC;iBACrB;aACF;YAAC,OAAO,EAAE,EAAE;gBACX,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,CAAC;aACrE;SACF;KAAA;IAEK,YAAY;;YAChB,IAAI;gBACF,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACnD;YAAC,OAAO,EAAE,EAAE;;aAEZ;SACF;KAAA;;;YArEF,SAAS,SAAC;gBACT,QAAQ,EAAE,qBAAqB;gBAC/B,+uEAAyD;aAC1D;;;YAVQ,6BAA6B;YAC7B,YAAY;YAEZ,MAAM;YADU,gBAAgB;;;yCAsBtC,SAAS,SAAC,4BAA4B,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;;;MCrB/C,eAAe;IAC1B,YAAoB,YAA2C;QAA3C,iBAAY,GAAZ,YAAY,CAA+B;KAAI;IAEnE,WAAW,CAAC,KAA6B;QACvC,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;QACvE,OAAO,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;KACpD;;;YAPF,UAAU;;;YADF,6BAA6B;;;ACWtC,MAAM,MAAM,GAAY;IACtB;QACE,OAAO,EAAE,WAAW,CAAC,MAAM;QAC3B,IAAI,EAAE,iBAAiB;QACvB,SAAS,EAAE,kCAAkC;QAC7C,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC;QACvB,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,CAAC,eAAe,CAAC;KAC/B;CACF,CAAC;WAgBc;MAKH,mBAAmB;;;YAnB/B,QAAQ,SAAC;gBACR,YAAY,EAAE;oBACZ,kCAAkC;iBACnC;gBACD,OAAO,EAAE;oBACP,UAAU;oBACV,WAAW;iBACZ;gBACD,eAAe,EAAE,CAAC,kCAAkC,CAAC;gBACrD,SAAS,EAAE;oBACT,eAAe;oBACf,6BAA6B;oBAC7B;wBACE,OAAO,EAAE,eAAe;wBACxB,QAAQ,IAAQ;wBAChB,KAAK,EAAE,IAAI;qBACZ;iBACF;aACF;;;AC1CD;;;;;;"}
1
+ {"version":3,"file":"c8y-ngx-components-protocol-lpwan.js","sources":["../../protocol-lpwan/lpwan-set-device-protocol.service.ts","../../protocol-lpwan/lpwan-set-device-protocol.component.ts","../../protocol-lpwan/lpwan-agent.guard.ts","../../protocol-lpwan/lpwan-protocol.module.ts","../../protocol-lpwan/c8y-ngx-components-protocol-lpwan.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { IManagedObject, InventoryService, IResultList, FetchClient, IFetchOptions, IdentityService } from '@c8y/client';\nimport { get } from 'lodash-es';\n\n@Injectable()\nexport class LpwanSetDeviceProtocolService {\n supportedDevicesCfgs = [\n {\n name: 'lora',\n match: device => get(device, 'c8y_LpwanDevice.lpwanDeviceType') === 'Lora',\n protocolTypes: ['c8y_ActilityDeviceType', 'c8y_LoraDeviceType']\n },\n {\n name: 'sigfox',\n match: device => get(device, 'c8y_LpwanDevice.serviceProvider') === 'Sigfox',\n protocolTypes: ['c8y_SigfoxDeviceType']\n },\n ];\n\n private readonly header: any = { 'Content-Type': 'application/json' };\n private readonly microserviceUrl: string = '/service/loriot';\n\n constructor(\n private inventoryService: InventoryService,\n private client: FetchClient,\n private identityService: IdentityService\n ) { }\n\n async refreshCache(device) {\n const externalId = await this.getExternalId(device);\n if (externalId) {\n const url = `${this.microserviceUrl}/refreshCache/${externalId}`;\n const options: IFetchOptions = {\n method: 'POST',\n headers: this.header,\n body: JSON.stringify({})\n };\n return this.client.fetch(url, options);\n }\n }\n\n isSupportedDevice(device: IManagedObject): boolean {\n return this.supportedDevicesCfgs.some(({ match }) => match(device));\n }\n\n async getCurrentProtocol(device: IManagedObject) {\n const protocolId = device.c8y_LpwanDevice.type\n ? device.c8y_LpwanDevice.type.split('/')[2]\n : null;\n if (!protocolId) {\n return null;\n }\n const { data } = await this.inventoryService.detail(protocolId);\n return data;\n }\n\n async applyProtocol(device: IManagedObject, selectedProtocol: IManagedObject) {\n device.c8y_LpwanDevice.type = 'inventory/managedObjects/' + selectedProtocol.id;\n device.type = selectedProtocol.name;\n return this.inventoryService.update(device);\n }\n\n async getAvailableProtocols(device: IManagedObject): Promise<IResultList<IManagedObject>> {\n const query = {\n __filter: {\n type: { __in: this.getProtocolTypesMatchingDevice(device) }\n },\n __orderby: [{ name: 1 }]\n };\n return this.inventoryService.listQuery(query, { withTotalPages: true, pageSize: 5 });\n }\n\n private getProtocolTypesMatchingDevice(device: IManagedObject): string[] {\n const matchingCfg = this.supportedDevicesCfgs.find(({ match }) => match(device));\n return matchingCfg ? matchingCfg.protocolTypes : [];\n }\n\n private async getExternalId(device: IManagedObject): Promise<string> {\n const externalIds = (await this.identityService.list(device.id)).data;\n const loriotEuiExternalId = externalIds.find(externalId => externalId.type === 'c8y_LoriotEUI');\n return loriotEuiExternalId ? loriotEuiExternalId.externalId : null;\n }\n}\n","import { Component, OnInit, ViewChild } from '@angular/core';\nimport { LpwanSetDeviceProtocolService } from './lpwan-set-device-protocol.service';\nimport { AlertService, gettext } from '@c8y/ngx-components';\nimport { IManagedObject, InventoryService, IResultList } from '@c8y/client';\nimport { Router } from '@angular/router';\nimport { pipe } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\n@Component({\n selector: 'set-device-protocol',\n templateUrl: './lpwan-set-device-protocol.component.html'\n})\n\nexport class LpwanAssignDeviceProtocolComponent implements OnInit {\n loading: boolean;\n device: IManagedObject;\n currentProtocol: IManagedObject;\n availableProtocols: IResultList<IManagedObject>;\n newProtocol: IManagedObject;\n\n filterProtocols = pipe();\n pattern = '';\n\n @ViewChild('lpwanSetDeviceProtocolForm', { static: false }) lpwanSetDeviceProtocolForm: any;\n\n constructor(\n private lpwanService: LpwanSetDeviceProtocolService,\n private alertService: AlertService,\n private router: Router,\n private inventoryService: InventoryService\n ) { }\n async ngOnInit() {\n await this.reload();\n this.setPipe('');\n }\n\n setPipe(filterStr: string) {\n this.pattern = filterStr;\n this.filterProtocols = pipe(\n map((protocols: IManagedObject[]) =>\n protocols.filter(\n protocol =>\n (!this.currentProtocol || this.currentProtocol.id !== protocol.id) &&\n (!filterStr || protocol.name.toLowerCase().indexOf(filterStr.toLowerCase()) > -1)\n )\n )\n );\n }\n\n async reload() {\n this.loading = true;\n this.newProtocol = null;\n try {\n await this.loadDevice();\n this.availableProtocols = await this.lpwanService.getAvailableProtocols(this.device);\n this.currentProtocol = await this.lpwanService.getCurrentProtocol(this.device);\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n } finally {\n this.loading = false;\n }\n }\n\n async loadDevice() {\n const deviceId = this.router.routerState.snapshot.url.match(/\\d+/)[0];\n const { data } = await this.inventoryService.detail(deviceId);\n this.device = data;\n }\n\n async apply(selectedProtocol) {\n try {\n const moUpdated = (await this.lpwanService.applyProtocol(this.device, selectedProtocol)).res.status === 200;\n await this.reload();\n this.alertService.success(gettext('Device protocol set.'));\n this.lpwanSetDeviceProtocolForm.reset('dirty');\n if (moUpdated) {\n this.refreshCache();\n }\n } catch (ex) {\n this.alertService.danger(gettext('Could not set device protocol.'));\n }\n }\n\n async refreshCache() {\n try {\n await this.lpwanService.refreshCache(this.device);\n } catch (ex) {\n // do nothing (refreshing is an optional step)\n }\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot, CanActivate } from '@angular/router';\nimport { LpwanSetDeviceProtocolService } from './lpwan-set-device-protocol.service';\n@Injectable()\nexport class LpwanAgentGuard implements CanActivate {\n constructor(private lpwanService: LpwanSetDeviceProtocolService) {}\n\n canActivate(route: ActivatedRouteSnapshot): boolean {\n const device = route.data.contextData || route.parent.data.contextData;\n return this.lpwanService.isSupportedDevice(device);\n }\n}\n","import { NgModule } from '@angular/core';\nimport {\n CoreModule,\n FormsModule,\n gettext,\n HOOK_ONCE_ROUTE,\n Route,\n ViewContext\n} from '@c8y/ngx-components';\nimport { LpwanAssignDeviceProtocolComponent } from './lpwan-set-device-protocol.component';\nimport { LpwanAgentGuard } from './lpwan-agent.guard';\nimport { LpwanSetDeviceProtocolService } from './lpwan-set-device-protocol.service';\n\nconst routes: Route[] = [\n {\n context: ViewContext.Device,\n path: 'assign-protocol',\n component: LpwanAssignDeviceProtocolComponent,\n label: gettext('LPWAN'),\n icon: 'c8y-device-protocols',\n canActivate: [LpwanAgentGuard]\n }\n];\n\n@NgModule({\n declarations: [\n LpwanAssignDeviceProtocolComponent\n ],\n imports: [\n CoreModule,\n FormsModule\n ],\n entryComponents: [LpwanAssignDeviceProtocolComponent],\n providers: [\n LpwanAgentGuard,\n LpwanSetDeviceProtocolService,\n {\n provide: HOOK_ONCE_ROUTE,\n useValue: routes,\n multi: true\n }\n ]\n})\nexport class LpwanProtocolModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n\nexport {LpwanAgentGuard as ɵb} from './lpwan-agent.guard';\nexport {LpwanSetDeviceProtocolService as ɵa} from './lpwan-set-device-protocol.service';"],"names":[],"mappings":"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"}