@c8y/ngx-components 1010.0.31 → 1010.0.32

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 (48) hide show
  1. package/bundles/c8y-ngx-components-repository.umd.js +8 -4
  2. package/bundles/c8y-ngx-components-repository.umd.js.map +1 -1
  3. package/bundles/c8y-ngx-components-repository.umd.min.js +1 -1
  4. package/bundles/c8y-ngx-components-repository.umd.min.js.map +1 -1
  5. package/bundles/c8y-ngx-components-sensor-phone.umd.js +1 -1
  6. package/bundles/c8y-ngx-components-sensor-phone.umd.js.map +1 -1
  7. package/bundles/c8y-ngx-components-sensor-phone.umd.min.js +1 -1
  8. package/bundles/c8y-ngx-components-sensor-phone.umd.min.js.map +1 -1
  9. package/bundles/c8y-ngx-components.umd.js +14 -8
  10. package/bundles/c8y-ngx-components.umd.js.map +1 -1
  11. package/bundles/c8y-ngx-components.umd.min.js +1 -1
  12. package/bundles/c8y-ngx-components.umd.min.js.map +1 -1
  13. package/c8y-ngx-components.metadata.json +1 -1
  14. package/core/file-picker/file-picker.component.d.ts +8 -0
  15. package/esm2015/core/file-picker/file-picker.component.js +12 -2
  16. package/esm2015/core/file-picker/file-picker.module.js +6 -8
  17. package/esm2015/repository/configuration/configuration-detail.component.js +7 -2
  18. package/esm2015/repository/firmware/add-firmware-modal.component.js +7 -2
  19. package/esm2015/repository/firmware/add-firmware-patch-modal.component.js +7 -2
  20. package/esm2015/repository/software/add-software-modal.component.js +7 -2
  21. package/esm2015/sensor-phone/sensor-phone-modal.component.js +2 -2
  22. package/esm5/core/file-picker/file-picker.component.js +12 -2
  23. package/esm5/core/file-picker/file-picker.module.js +6 -8
  24. package/esm5/repository/configuration/configuration-detail.component.js +3 -2
  25. package/esm5/repository/firmware/add-firmware-modal.component.js +3 -2
  26. package/esm5/repository/firmware/add-firmware-patch-modal.component.js +3 -2
  27. package/esm5/repository/software/add-software-modal.component.js +3 -2
  28. package/esm5/sensor-phone/sensor-phone-modal.component.js +2 -2
  29. package/fesm2015/c8y-ngx-components-repository.js +24 -4
  30. package/fesm2015/c8y-ngx-components-repository.js.map +1 -1
  31. package/fesm2015/c8y-ngx-components-sensor-phone.js +1 -1
  32. package/fesm2015/c8y-ngx-components-sensor-phone.js.map +1 -1
  33. package/fesm2015/c8y-ngx-components.js +14 -8
  34. package/fesm2015/c8y-ngx-components.js.map +1 -1
  35. package/fesm5/c8y-ngx-components-repository.js +8 -4
  36. package/fesm5/c8y-ngx-components-repository.js.map +1 -1
  37. package/fesm5/c8y-ngx-components-sensor-phone.js +1 -1
  38. package/fesm5/c8y-ngx-components-sensor-phone.js.map +1 -1
  39. package/fesm5/c8y-ngx-components.js +14 -8
  40. package/fesm5/c8y-ngx-components.js.map +1 -1
  41. package/locales/locales.pot +30 -9
  42. package/package.json +2 -2
  43. package/repository/c8y-ngx-components-repository.metadata.json +1 -1
  44. package/repository/configuration/configuration-detail.component.d.ts +1 -0
  45. package/repository/firmware/add-firmware-modal.component.d.ts +1 -0
  46. package/repository/firmware/add-firmware-patch-modal.component.d.ts +1 -0
  47. package/repository/software/add-software-modal.component.d.ts +1 -0
  48. package/sensor-phone/c8y-ngx-components-sensor-phone.metadata.json +1 -1
@@ -1 +1 @@
1
- {"__symbolic":"module","version":4,"metadata":{"RepositoryModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":45,"character":1},"arguments":[{"imports":[{"__symbolic":"reference","module":"@c8y/ngx-components","name":"CoreModule","line":47,"character":4},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"FormsModule","line":48,"character":4},{"__symbolic":"reference","module":"@c8y/ngx-components/operations/single-operation-details","name":"SingleOperationDetailsModule","line":49,"character":4},{"__symbolic":"call","expression":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"ngx-bootstrap/dropdown","name":"BsDropdownModule","line":50,"character":4},"member":"forRoot"}},{"__symbolic":"reference","module":"ngx-bootstrap/tooltip","name":"TooltipModule","line":51,"character":4},{"__symbolic":"reference","module":"ngx-bootstrap/popover","name":"PopoverModule","line":52,"character":4},{"__symbolic":"call","expression":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"ngx-bootstrap/tabs","name":"TabsModule","line":53,"character":4},"member":"forRoot"}}],"exports":[],"declarations":[{"__symbolic":"reference","name":"FirmwareListComponent"},{"__symbolic":"reference","name":"FirmwareDetailsComponent"},{"__symbolic":"reference","name":"AddFirmwareModalComponent"},{"__symbolic":"reference","name":"AddFirmwarePatchModalComponent"},{"__symbolic":"reference","name":"SoftwareListComponent"},{"__symbolic":"reference","name":"SoftwareDetailsComponent"},{"__symbolic":"reference","name":"AddSoftwareModalComponent"},{"__symbolic":"reference","name":"FirmwareDeviceTabComponent"},{"__symbolic":"reference","name":"SoftwareDeviceTabComponent"},{"__symbolic":"reference","name":"InstalledSoftwareComponent"},{"__symbolic":"reference","name":"RepositorySelectModalComponent"},{"__symbolic":"reference","name":"DeviceSoftwareListComponent"},{"__symbolic":"reference","name":"DeviceSoftwareChangesComponent"},{"__symbolic":"reference","name":"ConfigurationListComponent"},{"__symbolic":"reference","name":"ConfigurationDetailComponent"},{"__symbolic":"reference","name":"DeviceConfigurationComponent"},{"__symbolic":"reference","name":"DeviceConfigurationListComponent"},{"__symbolic":"reference","name":"SourceCodePreviewComponent"},{"__symbolic":"reference","name":"ConfigurationPreviewComponent"},{"__symbolic":"reference","name":"ConfigurationFilterPipe"},{"__symbolic":"reference","name":"SaveToRepositoryComponent"},{"__symbolic":"reference","name":"TextBasedConfigurationComponent"},{"__symbolic":"reference","name":"ɵa"}],"entryComponents":[{"__symbolic":"reference","name":"FirmwareListComponent"},{"__symbolic":"reference","name":"FirmwareDetailsComponent"},{"__symbolic":"reference","name":"AddFirmwareModalComponent"},{"__symbolic":"reference","name":"AddFirmwarePatchModalComponent"},{"__symbolic":"reference","name":"SoftwareListComponent"},{"__symbolic":"reference","name":"SoftwareDetailsComponent"},{"__symbolic":"reference","name":"AddSoftwareModalComponent"},{"__symbolic":"reference","name":"FirmwareDeviceTabComponent"},{"__symbolic":"reference","name":"SoftwareDeviceTabComponent"},{"__symbolic":"reference","name":"DeviceSoftwareListComponent"},{"__symbolic":"reference","name":"RepositorySelectModalComponent"},{"__symbolic":"reference","name":"DeviceSoftwareChangesComponent"},{"__symbolic":"reference","name":"ConfigurationListComponent"},{"__symbolic":"reference","name":"ConfigurationDetailComponent"},{"__symbolic":"reference","name":"DeviceConfigurationComponent"},{"__symbolic":"reference","name":"SaveToRepositoryComponent"},{"__symbolic":"reference","name":"TextBasedConfigurationComponent"}],"providers":[{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","name":"DeviceConfigurationService"},{"__symbolic":"reference","name":"FirmwareDeviceTabGuard"},{"__symbolic":"reference","name":"SoftwareDeviceTabGuard"},{"__symbolic":"reference","name":"DeviceConfigurationGuard"},{"provide":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"HOOK_NAVIGATOR_NODES","line":107,"character":15},"useClass":{"__symbolic":"reference","name":"RepositoryNavigationFactory"},"multi":true},{"provide":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"HOOK_ONCE_ROUTE","line":112,"character":15},"useValue":[{"path":"firmware","component":{"__symbolic":"reference","name":"FirmwareListComponent"}},{"path":"firmware/:id","component":{"__symbolic":"reference","name":"FirmwareDetailsComponent"}},{"context":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"ViewContext","line":123,"character":19},"member":"Device"},"path":"firmware","component":{"__symbolic":"reference","name":"FirmwareDeviceTabComponent"},"label":{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"gettext","line":126,"character":17},"arguments":["Firmware"]},"icon":"c8y-firmware","priority":500,"canActivate":[{"__symbolic":"reference","name":"FirmwareDeviceTabGuard"}]},{"path":"software","component":{"__symbolic":"reference","name":"SoftwareListComponent"}},{"path":"software/:id","component":{"__symbolic":"reference","name":"SoftwareDetailsComponent"}},{"context":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"ViewContext","line":140,"character":19},"member":"Device"},"path":"software","component":{"__symbolic":"reference","name":"SoftwareDeviceTabComponent"},"label":{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"gettext","line":143,"character":17},"arguments":["Software"]},"icon":"c8y-tools","priority":499,"canActivate":[{"__symbolic":"reference","name":"SoftwareDeviceTabGuard"}]},{"path":"configuration","component":{"__symbolic":"reference","name":"ConfigurationListComponent"}},{"context":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"ViewContext","line":153,"character":19},"member":"Device"},"path":"device-configuration","component":{"__symbolic":"reference","name":"DeviceConfigurationComponent"},"label":{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"gettext","line":156,"character":17},"arguments":["Configuration"]},"icon":"gears","priority":600,"canActivate":[{"__symbolic":"reference","name":"DeviceConfigurationGuard"}]}],"multi":true}]}]}],"members":{}},"RepositoryService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":54,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":61,"character":23},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryBinaryService","line":62,"character":29},{"__symbolic":"reference","module":"@c8y/client","name":"OperationService","line":63,"character":23},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":64,"character":19},{"__symbolic":"reference","module":"@c8y/client","name":"EventService","line":65,"character":19},{"__symbolic":"reference","module":"@c8y/client","name":"Realtime","line":66,"character":22},{"__symbolic":"reference","module":"@c8y/client","name":"EventBinaryService","line":67,"character":25}]}],"listRepositoryEntries":[{"__symbolic":"method"}],"save":[{"__symbolic":"method"}],"create":[{"__symbolic":"method"}],"createFirmwareOrSoftware":[{"__symbolic":"method"}],"saveBinary":[{"__symbolic":"method"}],"createOrUpdateRepositoryEntry":[{"__symbolic":"method"}],"createRepositoryBinary":[{"__symbolic":"method"}],"prepareRepositoryBinaryMO":[{"__symbolic":"method"}],"linkBinary":[{"__symbolic":"method"}],"cleanUp":[{"__symbolic":"method"}],"delete":[{"__symbolic":"method"}],"errorMsg":[{"__symbolic":"method"}],"getBaseVersionsCount$":[{"__symbolic":"method"}],"getBaseVersionFromMO":[{"__symbolic":"method"}],"isPatch":[{"__symbolic":"method"}],"getPatchVersionsCount$":[{"__symbolic":"method"}],"isLegacyEntry":[{"__symbolic":"method"}],"listAllVersions":[{"__symbolic":"method"}],"listBaseVersions":[{"__symbolic":"method"}],"listPatchVersions":[{"__symbolic":"method"}],"listBaseVersionAndPatches":[{"__symbolic":"method"}],"listChildren":[{"__symbolic":"method"}],"fetchAllItemsFromList":[{"__symbolic":"method"}],"getRepositoryEntryMO$":[{"__symbolic":"method"}],"getRepositoryBinaryMoByVersion":[{"__symbolic":"method"}],"getBinaryName$":[{"__symbolic":"method"}],"getDeviceTypeQuery":[{"__symbolic":"method"}],"getConfigurationTypeQuery":[{"__symbolic":"method"}],"getDeviceSoftwareList":[{"__symbolic":"method"}],"createSoftwareUpdateOperation":[{"__symbolic":"method"}],"getSoftwareUpdateOperation":[{"__symbolic":"method"}],"getDeviceSoftwareChangesFromOperation":[{"__symbolic":"method"}],"createFirmwareUpdateOperation":[{"__symbolic":"method"}],"getFirmwareUpdateOperation":[{"__symbolic":"method"}],"getUploadConfigurationFileOperation":[{"__symbolic":"method"}],"getDownloadConfigurationFileOperation":[{"__symbolic":"method"}],"getLastFirmwareUpdateOperation":[{"__symbolic":"method"}],"getLastSoftwareUpdateOperation":[{"__symbolic":"method"}],"getFirstMatchingOperation":[{"__symbolic":"method"}],"createObservedOperation":[{"__symbolic":"method"}],"observeOperation":[{"__symbolic":"method"}],"getLatestConfigurationEvent":[{"__symbolic":"method"}],"getConfigFileOperationList":[{"__symbolic":"method"}],"getConfigSnapshot":[{"__symbolic":"method"}],"getLegacyConfigSnapshot":[{"__symbolic":"method"}],"getBinaryText":[{"__symbolic":"method"}],"getBinaryFile":[{"__symbolic":"method"}],"getLastConfigUpdateOperation":[{"__symbolic":"method"}],"createTextBasedConfigurationReloadOperation":[{"__symbolic":"method"}],"createTextBasedConfigurationUpdateOperation":[{"__symbolic":"method"}],"getBinary":[{"__symbolic":"method"}],"getSnapshotsFromRepository":[{"__symbolic":"method"}],"getInternalBinaryResponse":[{"__symbolic":"method"}],"getExternalBinaryResponse":[{"__symbolic":"method"}],"createEntry":[{"__symbolic":"method"}],"updateEntry":[{"__symbolic":"method"}],"getBaseVersionResultListForLegacyEntry":[{"__symbolic":"method"}],"getDeviceSoftwareChangesFromSoftwareListOperation":[{"__symbolic":"method"}],"getDeviceSoftwareChangesFromSoftwareOperation":[{"__symbolic":"method"}]}},"RepositoryType":{"FIRMWARE":"c8y_Firmware","SOFTWARE":"c8y_Software","CONFIGURATION":"c8y_ConfigurationDump"},"REPOSITORY_BINARY_TYPES":{"__symbolic":"error","message":"Expression form not supported","line":9,"character":2,"module":"./repository.model"},"ModalModel":{"__symbolic":"interface"},"RepositoryCategory":{"__symbolic":"interface"},"FirmwareBinary":{"__symbolic":"interface"},"FirmwarePatchBinary":{"__symbolic":"interface"},"SoftwareBinary":{"__symbolic":"interface"},"RepositoryBinary":{"__symbolic":"interface"},"SelectedRepositoryBinary":{"__symbolic":"interface"},"DeviceFirmware":{"__symbolic":"interface"},"DeviceSoftware":{"__symbolic":"interface"},"DeviceSoftwareChange":{"__symbolic":"interface"},"ConfigurationSnapshot":{"__symbolic":"interface"},"SupportedConfigurationItem":{"__symbolic":"interface"},"DeviceConfigurationListEmptyState":{"__symbolic":"interface"},"DeviceConfigurationOperation":{"UPLOAD_CONFIG":"c8y_UploadConfigFile","DOWNLOAD_CONFIG":"c8y_DownloadConfigFile","CONFIG":"c8y_Configuration","SEND_CONFIG":"c8y_SendConfiguration"},"RepositoryNavigationFactory":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":3,"character":1}}],"members":{"get":[{"__symbolic":"method"}]}},"SoftwareListComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":19,"character":1},"arguments":[{"selector":"c8y-software-list","template":"<c8y-title>\n {{ 'Software repository' | translate }}\n</c8y-title>\n\n<c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form\">\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n type=\"search\"\n title=\"{{ 'Filter software…' | translate }}\"\n placeholder=\"{{ 'Filter software…' | translate }}\"\n [ngModel]=\"textFilter$ | async\"\n (ngModelChange)=\"textFilter$.next($event)\"\n />\n <span class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"(textFilter$ | async).length === 0\"></i>\n <i\n class=\"text-muted\"\n c8yIcon=\"times\"\n *ngIf=\"(textFilter$ | async).length > 0\"\n (click)=\"textFilter$.next('')\"\n ></i>\n </span>\n </div>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" title=\"{{ 'Add software' | translate }}\" (click)=\"addSoftware()\">\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add software' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" title=\"{{ 'Reload' | translate }}\" (click)=\"reload$.next()\">\n <i [ngClass]=\"{ 'icon-spin': reloading }\" c8yIcon=\"refresh\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<!-- empty state-->\n<div\n class=\"c8y-empty-state text-center\"\n *ngIf=\"(softwares$ | async)?.data.length === 0 && (textFilter$ | async)?.length === 0\"\n>\n <h1 class=\"c8y-icon-duocolor\" c8yIcon=\"c8y-tools\"></h1>\n <h3 translate>\n No software to display.\n </h3>\n <p translate>\n Add a new software by clicking below.\n </p>\n <p>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add software' | translate }}\"\n (click)=\"addSoftware()\"\n translate\n >\n Add software\n </button>\n </p>\n</div>\n\n<!-- no results empty state -->\n<div\n class=\"c8y-empty-state\"\n *ngIf=\"(softwares$ | async)?.data.length === 0 && (textFilter$ | async)?.length > 0\"\n>\n <h1 class=\"c8y-icon-duocolor\" c8yIcon=\"search\"></h1>\n <h3 translate>\n No results to display.\n </h3>\n <p translate>\n Refine your search terms or check your spelling.\n </p>\n</div>\n\n<!-- apply the class 'dd-low' when the list contains less than 10 records-->\n<c8y-list-group\n class=\"m-b-24\"\n *ngIf=\"(softwares$ | async)?.data.length > 0\"\n [ngClass]=\"{ 'dd-low': (softwares$ | async)?.data.length < 10 }\"\n>\n <c8y-li class=\"page-sticky-header c8y-list__item--empty-actions hidden-xs\">\n <c8y-li-icon><i class=\"fa\"></i></c8y-li-icon>\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-3\">\n {{ 'Software' | translate }}\n </div>\n <div class=\"col-4\">\n {{ 'Description' | translate }}\n </div>\n <div class=\"col-3\">\n {{ 'Device type' | translate }}\n </div>\n <div class=\"col-2\">\n {{ 'Versions' | translate }}\n </div>\n </c8y-li-body>\n </c8y-li>\n <c8y-li *c8yFor=\"let software of softwares$ | async; let i = index; loadMore: 'auto'\">\n <c8y-li-icon>\n <i c8yIcon=\"c8y-tools\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-60\">\n <button class=\"btn-clean col-3\" (click)=\"editSoftware(software)\">\n <span class=\"text-truncate\" title=\"{{ software.name }}\">\n {{ software.name }}\n </span>\n </button>\n\n <div class=\"col-4\">\n <p class=\"text-truncate\" title=\"{{ software.description }}\">\n <span class=\"text-label-small m-r-4 visible-xs-inline\">\n {{ 'Description' | translate }}\n </span>\n <span *ngIf=\"software.description; else emptyDescription\">\n {{ software.description }}\n </span>\n </p>\n <ng-template #emptyDescription>\n <small class=\"text-muted\">\n <em>{{ 'No description' | translate }}</em>\n </small>\n </ng-template>\n </div>\n\n <div class=\"col-3\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Device type' | translate }}: {{ software.c8y_Filter?.type || '-' }}\"\n >\n <span class=\"text-label-small m-r-8 visible-xs-inline\" translate>\n Device type\n </span>\n <span *ngIf=\"software.c8y_Filter?.type; else emptyText\">\n {{ software.c8y_Filter?.type }}\n </span>\n <ng-template #emptyText>\n <small class=\"text-muted\">\n <em>{{ 'Undefined' | translate }}</em>\n </small>\n </ng-template>\n </div>\n </div>\n\n <div class=\"col-2\">\n <span class=\"label label-warning flex-item-right-sm\" *ngIf=\"isLegacy(software)\">\n <span translate>\n Legacy\n </span>\n </span>\n <span *ngIf=\"!isLegacy(software)\">\n <span *ngIf=\"(getBaseVersionsCount$(software) | async) === null\">\n <span class=\"label label-info flex-item-right-sm\">\n <i class=\"icon-spin\" c8yIcon=\"circle-o-notch\"></i>\n </span>\n </span>\n <span *ngIf=\"(getBaseVersionsCount$(software) | async) !== null\">\n <span [ngPlural]=\"getBaseVersionsCount$(software) | async\">\n <ng-template ngPluralCase=\"=0\">\n <span class=\"label label-default flex-item-right-sm\">\n <span translate>\n No versions\n </span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"=1\">\n <span class=\"label label-info flex-item-right-sm\">\n <span translate>\n 1 version\n </span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span class=\"label label-info flex-item-right-sm\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: getBaseVersionsCount$(software) | async }\"\n >\n {{ count }} versions\n </span>\n </span>\n </ng-template>\n </span>\n </span>\n </span>\n </div>\n </c8y-li-body>\n\n <c8y-li-action (click)=\"editSoftware(software)\" icon=\"pencil\">\n {{ 'Edit' | translate }}\n </c8y-li-action>\n <c8y-li-action (click)=\"deleteSoftware(software)\" icon=\"trash\">\n {{ 'Delete' | translate }}\n </c8y-li-action>\n </c8y-li>\n</c8y-list-group>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"ModalService","line":48,"character":26},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":49,"character":28},{"__symbolic":"reference","module":"@ngx-translate/core","name":"TranslateService","line":50,"character":30},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":51,"character":26},{"__symbolic":"reference","module":"@angular/router","name":"Router","line":52,"character":20},{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":53,"character":28}]}],"getSoftwares":[{"__symbolic":"method"}],"addSoftware":[{"__symbolic":"method"}],"editSoftware":[{"__symbolic":"method"}],"deleteSoftware":[{"__symbolic":"method"}],"getBaseVersionsCount$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":98,"character":3},"arguments":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"lodash-es","name":"property","line":98,"character":11},"arguments":["id"]}]}]}],"getDeviceTypeTitle":[{"__symbolic":"method"}]}},"AddSoftwareModalComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":12,"character":1},"arguments":[{"selector":"c8y-add-software-software-modal","template":"<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-tools'\"></i>\n <h4 translate>\n Add software\n </h4>\n </div>\n <div class=\"p-16 text-center separator-bottom\" *ngIf=\"!softwarePreselected\">\n <p class=\"lead m-0\" translate>\n Select or create new software\n </p>\n </div>\n <form\n class=\"d-contents\"\n autocomplete=\"off\"\n #softwareForm=\"ngForm\"\n (ngSubmit)=\"softwareForm.form.valid && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\">\n <div [hidden]=\"softwarePreselected\">\n <c8y-form-group>\n <label for=\"softwareName\" translate>Software</label>\n <c8y-typeahead\n [(ngModel)]=\"model.selected\"\n name=\"softwareName\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n (onSearch)=\"onInput.next($event)\"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"\n let software of softwaresResult;\n loadMore: 'auto';\n notFound: notFoundTemplate\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"onSoftwareSelect(software)\"\n [active]=\"model.selected === software\"\n >\n <c8y-highlight\n [text]=\"software.name || '--'\"\n [pattern]=\"onInput | async\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li class=\"bg-gray-lighter p-8\" *ngIf=\"(onInput | async)?.length > 0\">\n <span translate>No match found, add new`software`? </span>\n <button\n title=\"{{ 'Create new`software`' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary btn-xs m-l-16\"\n translate\n >\n Create new`software`\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"softwareDescription\" translate>Description</label>\n <input\n id=\"softwareDescription\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"model.description\"\n placeholder=\"{{ 'e.g. Cloud connectivity software' | translate }}\"\n [disabled]=\"model.selected?.id\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"softwareDeviceTypeFilter\" translate>Device type filter</label>\n <input\n id=\"softwareDeviceTypeFilter\"\n class=\"form-control\"\n name=\"softwareDeviceTypeFilter\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n [(ngModel)]=\"model.deviceType\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n [disabled]=\"model.selected?.id\"\n />\n </c8y-form-group>\n </div>\n\n <c8y-form-group>\n <label for=\"softwareVersion\" translate>Version</label>\n <input\n id=\"softwareVersion\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"version\"\n [(ngModel)]=\"model.version\"\n placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Software file</div>\n <c8y-file-picker [maxAllowedFiles]=\"1\" (onFilesPicked)=\"onFile($event)\">\n </c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n translate\n >\n Cancel\n </button>\n\n <button\n title=\"{{ 'Add software' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !softwareForm.form.valid ||\n softwareForm.form.pristine ||\n saving ||\n (!model.binary?.url && !model.binary?.file)\n \"\n translate\n >\n Add software\n </button>\n </div>\n </form>\n</div>\n"}]}],"members":{"form":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":17,"character":3},"arguments":["softwareForm",{"static":false}]}]}],"saved":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":18,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalRef","line":36,"character":19},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":38,"character":19}]}],"ngOnInit":[{"__symbolic":"method"}],"setInitialState":[{"__symbolic":"method"}],"loadSoftwares":[{"__symbolic":"method"}],"getSoftwareResult":[{"__symbolic":"method"}],"save":[{"__symbolic":"method"}],"successMsg":[{"__symbolic":"method"}],"cancel":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"onFile":[{"__symbolic":"method"}],"onSoftwareSelect":[{"__symbolic":"method"}]}},"SoftwareDetailsComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":21,"character":1},"arguments":[{"selector":"c8y-software-details","template":"<c8y-title>\n {{ (software$ | async)?.name }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n path=\"#/software\"\n label=\"{{ 'Software repository' | translate }}\"\n icon=\"c8y-tools\"\n >\n </c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n *ngIf=\"!(isLegacy$ | async)\"\n class=\"btn btn-link\"\n title=\"{{ 'Add software' | translate }}\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add software' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" title=\"{{ 'Reload' | translate }}\" (click)=\"reload$.next()\">\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading$ | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card m-b-4\">\n <div class=\"card-header separator\">\n <h4 class=\"card-title\" translate>\n Name, description and device type filter\n </h4>\n </div>\n <div class=\"card-block\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #nameInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(software$ | async)?.name\"\n #nameModel=\"ngModel\"\n placeholder=\"{{ 'e.g. My software' | translate }}\"\n required\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n (click)=\"updateSoftware$.next({ name: nameInput.value }); nameModel.reset()\"\n [disabled]=\"nameInput.value.length == 0\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Description' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #descriptionInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(software$ | async)?.description\"\n #descriptionModel=\"ngModel\"\n placeholder=\"{{ 'e.g. Cloud connectivity software' | translate }}\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n (click)=\"\n updateSoftware$.next({ description: descriptionInput.value });\n descriptionModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Device type filter' | translate }}\n\n <a\n class=\"pointer\"\n popover=\"{{\n 'If the filter is set, the software will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n [outsideClick]=\"true\"\n container=\"body\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </a>\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #deviceTypeInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(software$ | async)?.c8y_Filter?.type\"\n #deviceTypeModel=\"ngModel\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n (click)=\"\n updateSoftware$.next({ c8y_Filter: { type: deviceTypeInput.value } });\n deviceTypeModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"card\">\n <div class=\"card-header separator\">\n <h4 class=\"card-title\" translate>\n Versions\n </h4>\n </div>\n\n <div class=\"card-block p-t-0 p-b-24\">\n <div *ngIf=\"(baseVersions$ | async)?.data.length === 0\">\n <div class=\"c8y-empty-state text-center\">\n <h1 c8yIcon=\"c8y-tools\" class=\"c8y-icon-duocolor\"></h1>\n <h3 translate>No versions to display.</h3>\n <p translate>Add a new version by clicking below.</p>\n <p>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add software' | translate }}\"\n (click)=\"addBaseVersion()\"\n translate\n >\n Add software\n </button>\n </p>\n </div>\n </div>\n\n <c8y-list-group \n [ngClass]=\"{'dd-low': (baseVersions$ | async)?.data.length < 10}\"\n *ngIf=\"(baseVersions$ | async)?.data.length > 0\"\n >\n <c8y-li *c8yFor=\"let baseVersion of baseVersions$ | async; let i = index; loadMore: 'auto'\">\n <c8y-li-icon>\n <i c8yIcon=\"c8y-tools\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n <p>{{ baseVersion.c8y_Software.version }}</p>\n </div>\n <div class=\"col-5 \">\n <p class=\"text-truncate\">\n <span class=\"text-label-small m-r-8\" translate>\n File\n </span>\n <span title=\" {{ getBinaryName$(baseVersion.c8y_Software.url) | async }}\">\n <c8y-file-download url=\"{{baseVersion.c8y_Software.url}}\"></c8y-file-download>\n </span>\n </p>\n </div>\n <div class=\"col-2 flex-row\">\n <span *ngIf=\"isLegacy$ | async\" class=\"label label-warning flex-item-right-sm\">\n {{ 'Legacy' | translate }}\n </span>\n\n <div class=\"fit-h-20\" *ngIf=\"!(isLegacy$ | async)\">\n <button\n class=\"btn btn-danger btn-xs visible-xs flex-item-right m-r-8 m-t-8\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n title=\"{{ 'Delete' | translate }}\"\n >\n <i c8yIcon=\"minus-circle\"></i> {{ 'Delete' | translate }}\n </button>\n </div>\n </div>\n <div *ngIf=\"!(isLegacy$ | async)\" class=\"flex-item-right fit-h-20 p-r-8 hidden-xs\">\n <button\n class=\"btn btn-dot text-danger showOnHover\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n title=\"{{ 'Delete' | translate }}\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </div>\n</div>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":66,"character":28},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":67,"character":30},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":69,"character":26},{"__symbolic":"reference","module":"@ngx-translate/core","name":"TranslateService","line":70,"character":30},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"ModalService","line":71,"character":26},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":72,"character":28}]}],"ngOnInit":[{"__symbolic":"method"}],"getBinaryName$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":93,"character":3}}]}],"addBaseVersion":[{"__symbolic":"method"}],"deleteBaseVersion":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}]}},"TextBasedConfigurationComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":9,"character":1},"arguments":[{"selector":"c8y-text-based-configuration","template":"<div class=\"d-flex d-col fit-h\">\n <fieldset *ngIf=\"latestOperation !== undefined\" class=\"card-block bg-gray-white fit-w\">\n <div class=\"content-flex-50\">\n <c8y-single-operation [operation]=\"latestOperation\" class=\"flex-grow\"></c8y-single-operation>\n <div class=\"flex-item-right d-flex\">\n <button\n title=\"{{ 'Get snapshot from device' | translate }}\"\n type=\"button\"\n class=\"btn btn-default btn-sm flex-item-v-center m-t-8 m-b-8\"\n *ngIf=\"showTextBasedConfigReload\"\n (click)=\"reloadConfiguration()\"\n [disabled]=\"reloadingConfig || savingConfig\"\n >\n <i\n c8yIcon=\"refresh\"\n *ngIf=\"reloadingConfig\"\n class=\"m-r-4\"\n [ngClass]=\"{ 'icon-spin': reloadingConfig }\"\n ></i>\n <i c8yIcon=\"download\" *ngIf=\"!reloadingConfig\" class=\"m-r-4\"></i>\n\n {{ 'Get snapshot from device' | translate }}\n </button>\n </div>\n </div>\n </fieldset>\n <div class=\"card-block flex-grow\">\n <textarea\n [(ngModel)]=\"config\"\n class=\"form-control fit-h\"\n [disabled]=\"reloadingConfig || savingConfig\"\n c8y-spellcheck=\"false\"\n ></textarea>\n </div>\n <div class=\"card-footer fit-w separator\" *ngIf=\"showTextBasedConfigSave\">\n <button\n type=\"button\"\n (click)=\"updateConfiguration(config)\"\n [disabled]=\"reloadingConfig || savingConfig\"\n class=\"btn btn-primary\"\n [ngClass]=\"{ 'btn-pending': savingConfig }\"\n >\n <span title=\"{{ 'Send' | translate }}\" *ngIf=\"!savingConfig\">\n {{ 'Send configuration to device' | translate }}\n </span>\n <span title=\"{{ 'Sending…' | translate }}\" *ngIf=\"savingConfig\">\n {{ 'Sending…' | translate }}\n </span>\n </button>\n </div>\n</div>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":23,"character":19},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":24,"character":26},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","name":"DeviceConfigurationService"},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":27,"character":30}]}],"ngOnInit":[{"__symbolic":"method"}],"loadOperation":[{"__symbolic":"method"}],"reloadConfiguration":[{"__symbolic":"method"}],"updateConfiguration":[{"__symbolic":"method"}],"onOperationReloadSuccess":[{"__symbolic":"method"}],"onOperationReloadError":[{"__symbolic":"method"}],"onOperationReloadComplete":[{"__symbolic":"method"}],"onOperationUpdateSuccess":[{"__symbolic":"method"}],"onOperationUpdateError":[{"__symbolic":"method"}],"onOperationUpdateComplete":[{"__symbolic":"method"}],"loadDevice":[{"__symbolic":"method"}]}},"DeviceConfigurationGuard":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":5,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"DeviceConfigurationService"}]}],"canActivate":[{"__symbolic":"method"}]}},"ConfigurationFilterPipe":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Pipe","line":3,"character":1},"arguments":[{"name":"configurationFilterPipe"}]}],"members":{"transform":[{"__symbolic":"method"}],"filterContainString":[{"__symbolic":"method"}]}},"ConfigurationPreviewComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":19,"character":1},"arguments":[{"selector":"c8y-device-configuration-preview","template":"<div class=\"content-flex-55 p-b-16\">\n <div class=\"col-7 p-t-4\">\n <p>\n <span class=\"text-label-small text-uppercase m-r-4\" translate>Configuration</span>\n <span *ngIf=\"configSnapshot?.name; else emptyText\">\n <strong>{{ configSnapshot.name }}</strong>\n </span>\n <ng-template #emptyText> --- </ng-template>\n </p>\n <p>\n <span class=\"text-label-small text-uppercase m-r-4\" translate>Last updated</span>\n <small *ngIf=\"configSnapshot?.time; else emptyDate\">\n {{ configSnapshot.time | c8yDate }}\n </small>\n <ng-template #emptyDate> --- </ng-template>\n </p>\n </div>\n <div class=\"col-5\">\n <button\n class=\"btn btn-default btn-sm pull-right\"\n type=\"button\"\n title=\"{{ actionButtonText | translate }}\"\n (click)=\"createDeviceOperation()\"\n [disabled]=\"isCreateOperationDisabled()\"\n *ngIf=\"canCallAction\"\n >\n <i [c8yIcon]=\"actionButtonIcon\"></i> {{ actionButtonText | translate }}\n </button>\n </div>\n</div>\n<div class=\"c8y-empty-state text-left\" *ngIf=\"!configSnapshot?.binary && showBinary()\">\n <h1 [c8yIcon]=\"'file-image-o'\"></h1>\n <p>\n <strong translate>No preview available.</strong><br />\n <small *ngIf=\"configSnapshot?.binary !== ''; else emptyFile\" translate\n >The file is not available.</small\n >\n <ng-template #emptyFile>\n <small translate>The file is empty.</small>\n </ng-template>\n </p>\n</div>\n<div *ngIf=\"configSnapshot?.binary && showBinary()\" class=\"flex-grow d-flex d-col\">\n <c8y-source-code-preview\n [text]=\"configSnapshot.binary\"\n [isDisabled]=\"true\"\n class=\"d-contents\"\n ></c8y-source-code-preview>\n <div *ngIf=\"canSaveSnapshot\" class=\"p-t-16\">\n <button\n type=\"button\"\n class=\"btn btn-primary btn-sm pull-right m-l-8\"\n (click)=\"download()\"\n translate\n >\n Download\n </button>\n <button\n *ngIf=\"hasPermission()\"\n type=\"button\"\n class=\"btn btn-default btn-sm pull-right\"\n (click)=\"saveToRepository()\"\n translate\n >\n Save to repository\n </button>\n </div>\n</div>\n<div *ngIf=\"showOperation()\">\n <c8y-single-operation [operation]=\"operation\"></c8y-single-operation>\n</div>\n"}]}],"members":{"device":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":24,"character":3}}]}],"configurationType":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":25,"character":3}}]}],"configSnapshot":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":32,"character":3}}]}],"canSaveSnapshot":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":33,"character":3}}]}],"actionButtonText":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":34,"character":3}}]}],"actionButtonIcon":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":35,"character":3}}]}],"isLegacy":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":36,"character":3}}]}],"operationToTrigger":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":37,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"DeviceConfigurationService"},{"__symbolic":"reference","module":"@c8y/client","name":"Realtime","line":49,"character":22},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":50,"character":21},{"__symbolic":"reference","module":"@c8y/client","name":"UserService","line":51,"character":18},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AppStateService","line":52,"character":22},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/client","name":"OperationService","line":54,"character":30},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":55,"character":26}]}],"ngOnInit":[{"__symbolic":"method"}],"setOperation":[{"__symbolic":"method"}],"createDeviceOperation":[{"__symbolic":"method"}],"showOperation":[{"__symbolic":"method"}],"showBinary":[{"__symbolic":"method"}],"isCreateOperationDisabled":[{"__symbolic":"method"}],"updatePreview":[{"__symbolic":"method"}],"download":[{"__symbolic":"method"}],"saveToRepository":[{"__symbolic":"method"}],"hasPermission":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"updateSnapshotsOnConfigUpload":[{"__symbolic":"method"}]}},"DeviceConfigurationComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":13,"character":1},"arguments":[{"selector":"c8y-device-configuration","template":"<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" title=\"{{ 'Reload' | translate }}\" (click)=\"updateSnapshots()\">\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage card-has-tabs\">\n <tabset>\n <div class=\"card-header separator\" *ngIf=\"showBinaryBasedConfig && !showTextBasedConfig\">\n <h4 class=\"card-title\">{{ 'Configurations' | translate }}</h4>\n </div>\n <div class=\"card-header separator\" *ngIf=\"!showBinaryBasedConfig && showTextBasedConfig\">\n <h4 class=\"card-title\">{{ 'Text-based configuration' | translate }}</h4>\n </div>\n <tab heading=\"{{ 'Configurations' | translate }}\" *ngIf=\"showBinaryBasedConfig\">\n <div class=\"card--grid card grid__col--4-8--md grid__row--6-6--md m-b-0\">\n <!-- DEVICE SUPPORTED CONFIGURATIONS -->\n <div class=\"card--grid__inner-scroll\">\n <div class=\"card-block\">\n <h5 class=\"legend form-block\">\n <span translate>Device-supported configurations</span>\n </h5>\n </div>\n <div class=\"p-r-16\">\n <c8y-device-configuration-list\n [items]=\"supportedConfigurations\"\n [itemIcon]=\"'gears'\"\n (configSelected)=\"onConfigTypeSelected($event)\"\n ></c8y-device-configuration-list>\n </div>\n </div>\n\n <!-- CONFIGURATION PREVIEW -->\n <div class=\"card--grid__inner-scroll d-flex d-col flex-grow bg-gray-lighter\">\n <div class=\"card-block d-flex d-col flex-grow\">\n <h5 class=\"legend form-block\"><span translate>Preview</span></h5>\n\n <!-- EMPTY STATE -->\n <div class=\"c8y-empty-state text-left\" *ngIf=\"!configurationType\">\n <h1 [c8yIcon]=\"'file-text'\"></h1>\n <p>\n <strong translate>No configuration selected.</strong><br />\n <small translate>Select a configuration to preview</small>\n </p>\n </div>\n\n <!-- PREVIEW AVAILABLE STATE -->\n <c8y-device-configuration-preview\n *ngIf=\"configurationType\"\n [device]=\"device\"\n [configurationType]=\"configurationType\"\n [configSnapshot]=\"configSnapshot\"\n [canSaveSnapshot]=\"true\"\n [operationToTrigger]=\"'c8y_UploadConfigFile'\"\n [actionButtonText]=\"'Get snapshot from device' | translate\"\n [actionButtonIcon]=\"'download'\"\n [isLegacy]=\"isLegacy\"\n class=\"d-flex d-col flex-grow\"\n ></c8y-device-configuration-preview>\n </div>\n </div>\n\n <!-- AVAILABLE SUPPORTED CONFIGURATIONS -->\n <div class=\"card--grid__inner-scroll\">\n <div class=\"card-block\">\n <h5 class=\"legend form-block\" translate>Available supported configurations</h5>\n </div>\n\n <!-- EMPTY STATE -->\n <div class=\"c8y-empty-state text-left\" *ngIf=\"!configurationType\">\n <h1 [c8yIcon]=\"'gears'\"></h1>\n <p>\n <strong translate>No selection</strong><br />\n <small translate\n >Select a configuration from the device-supported configuration list</small\n >\n </p>\n </div>\n <div class=\"p-r-16\" *ngIf=\"configurationType\">\n <c8y-device-configuration-list\n [items]=\"repositorySnapshots\"\n [itemIcon]=\"'file-text'\"\n [emptyState]=\"repositorySnapshotsEmptyState\"\n [isFilterEnabled]=\"true\"\n (configSelected)=\"onRepositoryConfigSelected($event)\"\n ></c8y-device-configuration-list>\n </div>\n </div>\n\n <!-- CONFIGURATION PREVIEW -->\n <div class=\"card--grid__inner-scroll bg-gray-lighter d-flex d-col flex-grow\">\n <div class=\"card-block flex-grow d-flex d-col\">\n <h5 class=\"legend form-block\" translate>Preview</h5>\n\n <!-- EMPTY STATE -->\n\n <div class=\"c8y-empty-state text-left\" *ngIf=\"!repositorySnapshot\">\n <h1 [c8yIcon]=\"'file-text'\"></h1>\n <p>\n <strong translate>No configuration selected.</strong><br />\n <small *ngIf=\"!configurationType; else noSnapshot\" translate\n >Select a configuration to preview</small\n >\n <ng-template #noSnapshot>\n <small translate>Select the configuration you want to preview</small>\n </ng-template>\n </p>\n </div>\n\n <!-- CONFIGURATION SELECTED STATE -->\n <c8y-device-configuration-preview\n *ngIf=\"repositorySnapshot\"\n [device]=\"device\"\n [configurationType]=\"configurationType\"\n [configSnapshot]=\"repositorySnapshot\"\n [operationToTrigger]=\"'c8y_DownloadConfigFile'\"\n [actionButtonText]=\"'Send configuration to device' | translate\"\n [actionButtonIcon]=\"'upload'\"\n [isLegacy]=\"isLegacy\"\n class=\"d-flex d-col flex-grow\"\n ></c8y-device-configuration-preview>\n </div>\n </div>\n </div>\n </tab>\n <tab heading=\"{{ 'Text-based configuration' | translate }}\" *ngIf=\"showTextBasedConfig\">\n <c8y-text-based-configuration *ngIf=\"showTextBasedConfig\"></c8y-text-based-configuration>\n </tab>\n </tabset>\n</div>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":31,"character":19},{"__symbolic":"reference","name":"DeviceConfigurationService"},{"__symbolic":"reference","module":"@c8y/client","name":"Realtime","line":33,"character":22},{"__symbolic":"reference","name":"RepositoryService"}]}],"ngOnInit":[{"__symbolic":"method"}],"onConfigTypeSelected":[{"__symbolic":"method"}],"onRepositoryConfigSelected":[{"__symbolic":"method"}],"updateSnapshots":[{"__symbolic":"method"}]}},"SaveToRepositoryComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":6,"character":1},"arguments":[{"selector":"c8y-save-config-to-configuration-repository","template":"<div class=\"modal-header bg-primary text-center text-white\">\n <div style=\"font-size: 62px;\">\n <span c8yIcon=\"gears\"></span>\n </div>\n <h4 class=\"text-uppercase\" translate>\n Save configuration\n </h4>\n</div>\n<div class=\"modal-body\">\n <form #saveConfigurationSnapshot=\"ngForm\" class=\"p-t-24\">\n <c8y-form-group>\n <label translate for=\"name\">Name</label>\n <input\n id=\"name\"\n type=\"text\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"name\"\n [(ngModel)]=\"configSnapshot.name\"\n required\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"deviceType\">Device type</label>\n <input\n id=\"deviceType\"\n class=\"form-control\"\n rows=\"6\"\n name=\"deviceType\"\n [(ngModel)]=\"configSnapshot.deviceType\"\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"description\">Description</label>\n <input\n type=\"text\"\n id=\"description\"\n class=\"form-control\"\n maxlength=\"254\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"configSnapshot.description\"\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"configurationType\">Configuration type</label>\n <input\n id=\"configurationType\"\n class=\"form-control\"\n rows=\"6\"\n name=\"configurationType\"\n [(ngModel)]=\"configSnapshot.configurationType\"\n />\n </c8y-form-group>\n </form>\n</div>\n<div class=\"modal-footer\">\n <button title=\"{{ 'Cancel' | translate }}\" class=\"btn btn-default\" (click)=\"close()\" translate>\n Cancel\n </button>\n\n <button\n title=\"{{ 'Save configuration to repository' | translate }}\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"saveConfigurationSnapshot.form.invalid\"\n translate\n >\n Save\n </button>\n</div>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalRef","line":20,"character":19},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":21,"character":26},{"__symbolic":"reference","name":"RepositoryService"}]}],"save":[{"__symbolic":"method"}],"close":[{"__symbolic":"method"}]}},"AddFirmwarePatchModalComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":20,"character":1},"arguments":[{"selector":"c8y-add-firmware-patch-modal.component","template":"<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-firmware'\"></i>\n <h4 translate>\n Add firmware patch\n </h4>\n </div>\n <div class=\"p-16 text-center separator-bottom\">\n <p class=\"lead m-0\" translate>\n Select a firmware version\n </p>\n </div>\n\n <form class=\"d-contents\" autocomplete=\"off\" #firmwarePatchForm=\"ngForm\" (ngSubmit)=\"save()\">\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\">\n <div [hidden]=\"firmwarePreselected\">\n <c8y-form-group>\n <label for=\"firmwareName\" translate>Firmware</label>\n <c8y-typeahead\n [ngModel]=\"model.selected\"\n name=\"firmwareName\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n (onSearch)=\"firmwareInput$.next($event)\"\n [allowFreeEntries]=\"false\"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"let firmware of firmwares$ | async; loadMore: 'auto'\"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"model.selected = firmware; firmwareSelected$.next(firmware)\"\n [active]=\"model.selected === firmware\"\n >\n <c8y-highlight\n [text]=\"firmware.name || '--'\"\n [pattern]=\"firmwareInput$ | async\"\n ></c8y-highlight>\n </c8y-li>\n </c8y-typeahead>\n <c8y-messages\n ><c8y-message\n name=\"notExisting\"\n [text]=\"'Select one of the existing firmwares.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <c8y-form-group>\n <label for=\"patchDependency\" class=\"m-r-8\" translate>Version</label>\n <c8y-typeahead\n [ngModel]=\"model.dependency\"\n name=\"patchDependency\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n (onSearch)=\"patchDependencyInput$.next($event)\"\n [displayProperty]=\"'c8y_Firmware.version'\"\n [allowFreeEntries]=\"false\"\n [disabled]=\"\n (baseVersions$ | async) === null || (baseVersions$ | async)?.data.length === 0\n \"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"\n let baseVersion of baseVersions$;\n loadMore: 'auto';\n pipe: baseVersionsFilterPipe\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"model.dependency = baseVersion\"\n [active]=\"model.dependency === baseVersion\"\n >\n <c8y-highlight\n [text]=\"baseVersion.c8y_Firmware.version || '--'\"\n [pattern]=\"patchDependencyInput$ | async\"\n ></c8y-highlight>\n </c8y-li>\n </c8y-typeahead>\n <c8y-messages\n ><c8y-message\n name=\"notExisting\"\n [text]=\"'Select one of the existing versions.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"patchVersion\" translate>Patch</label>\n <input\n id=\"patchVersion\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"patchVersion\"\n [(ngModel)]=\"model.patchVersion\"\n placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n required\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Patch file</div>\n <c8y-file-picker [maxAllowedFiles]=\"1\" (onFilesPicked)=\"onFile($event)\">\n </c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n translate\n >\n Cancel\n </button>\n <button\n title=\"{{ 'Add firmware patch' | translate }}\"\n class=\"btn btn-primary\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n type=\"submit\"\n [disabled]=\"\n !firmwarePatchForm.form.valid ||\n firmwarePatchForm.form.pristine ||\n (!model.binary?.url && !model.binary?.file) ||\n saving\n \"\n translate\n >\n Add firmware patch\n </button>\n </div>\n </form>\n</div>\n"}]}],"members":{"saved":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":25,"character":3}}]}],"dropdown":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":27,"character":3},"arguments":["dropdown",{"static":false}]}]}],"form":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":28,"character":3},"arguments":["firmwarePatchForm",{"static":false}]}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalRef","line":92,"character":19},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":94,"character":19}]}],"ngOnInit":[{"__symbolic":"method"}],"setInitialState":[{"__symbolic":"method"}],"save":[{"__symbolic":"method"}],"successMsg":[{"__symbolic":"method"}],"cancel":[{"__symbolic":"method"}],"onFile":[{"__symbolic":"method"}]}},"AddFirmwareModalComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":12,"character":1},"arguments":[{"selector":"c8y-add-firmware-software-modal","template":"<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-firmware'\"></i>\n <h4 translate>\n Add firmware\n </h4>\n </div>\n <div class=\"p-16 text-center separator-bottom\" *ngIf=\"!firmwarePreselected\">\n <p class=\"lead m-0\" translate>\n Select or create new firmware\n </p>\n </div>\n <form\n class=\"d-contents\"\n autocomplete=\"off\"\n #firmwareForm=\"ngForm\"\n (ngSubmit)=\"firmwareForm.form.valid && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\">\n <div [hidden]=\"firmwarePreselected\">\n <c8y-form-group>\n <label for=\"firmwareName\" translate>Firmware</label>\n <c8y-typeahead\n [(ngModel)]=\"model.selected\"\n name=\"firmwareName\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n (onSearch)=\"onInput.next($event)\"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"\n let firmware of firmwaresResult;\n loadMore: 'auto';\n notFound: notFoundTemplate\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"onFirmwareSelect(firmware)\"\n [active]=\"model.selected === firmware\"\n >\n <c8y-highlight\n [text]=\"firmware.name || '--'\"\n [pattern]=\"onInput | async\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li class=\"bg-gray-lighter p-8\" *ngIf=\"(onInput | async)?.length > 0\">\n <span translate>No match found, add new`firmware`? </span>\n <button\n title=\"{{ 'Create new`firmware`' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary btn-xs m-l-16\"\n translate\n >\n Create new`firmware`\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"firmwareDescription\" translate>Description</label>\n <input\n id=\"firmwareDescription\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"model.description\"\n placeholder=\"{{ 'e.g. Firmware for hardware revision b' | translate }}\"\n [disabled]=\"model.selected?.id\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"firmwareDeviceTypeFilter\" translate>Device type filter</label>\n <input\n id=\"firmwareDeviceTypeFilter\"\n class=\"form-control\"\n name=\"firmwareDeviceTypeFilter\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n [(ngModel)]=\"model.deviceType\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n [disabled]=\"model.selected?.id\"\n />\n </c8y-form-group>\n </div>\n\n <c8y-form-group>\n <label for=\"firmwareVersion\" translate>Version</label>\n <input\n id=\"firmwareVersion\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"version\"\n [(ngModel)]=\"model.version\"\n placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Firmware file</div>\n <c8y-file-picker [maxAllowedFiles]=\"1\" (onFilesPicked)=\"onFile($event)\">\n </c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n translate\n >\n Cancel\n </button>\n\n <button\n title=\"{{ 'Add firmware' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !firmwareForm.form.valid ||\n firmwareForm.form.pristine ||\n saving ||\n (!model.binary?.url && !model.binary?.file)\n \"\n translate\n >\n Add firmware\n </button>\n </div>\n </form>\n</div>\n"}]}],"members":{"form":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":17,"character":3},"arguments":["firmwareForm",{"static":false}]}]}],"saved":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":18,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalRef","line":36,"character":19},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":38,"character":19}]}],"ngOnInit":[{"__symbolic":"method"}],"setInitialState":[{"__symbolic":"method"}],"loadFirmwares":[{"__symbolic":"method"}],"getFirmwareResult":[{"__symbolic":"method"}],"save":[{"__symbolic":"method"}],"successMsg":[{"__symbolic":"method"}],"cancel":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"onFile":[{"__symbolic":"method"}],"onFirmwareSelect":[{"__symbolic":"method"}]}},"SourceCodePreviewComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":2,"character":1},"arguments":[{"selector":"c8y-source-code-preview","template":"<textarea [disabled]=\"isDisabled\" class=\"text-monospace form-control no-resize flex-grow\" rows=\"8\">{{ text }}</textarea>\n"}]}],"members":{"isDisabled":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":7,"character":3}}]}],"text":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":8,"character":3}}]}]}},"FirmwareListComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":22,"character":1},"arguments":[{"selector":"c8y-firmware-list","template":"<c8y-title>\n {{ 'Firmware repository' | translate }}\n</c8y-title>\n\n<c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form\">\n <div class=\"input-group input-group-search\">\n <input class=\"form-control\"\n type=\"search\"\n title=\"{{ 'Filter firmware…' | translate }}\"\n placeholder=\"{{ 'Filter firmware…' | translate }}\"\n [ngModel]=\"textFilter$ | async\"\n (ngModelChange)=\"textFilter$.next($event)\"\n />\n <span class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"(textFilter$ | async).length === 0\"\n ></i>\n <i class=\"text-muted\"\n c8yIcon=\"times\"\n *ngIf=\"(textFilter$ | async).length > 0\"\n (click)=\"textFilter$.next('')\"\n ></i>\n </span>\n </div>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" \n title=\"{{ 'Add firmware' | translate }}\"\n (click)=\"addFirmware()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\"\n *ngIf=\"canAddFirmwarePatch$ | async\"\n title=\"{{ 'Add firmware patch' | translate }}\"\n (click)=\"addFirmwarePatch()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware patch' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"reload$.next()\"\n >\n <i c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reloading }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<!-- empty state-->\n<div class=\"c8y-empty-state text-center\"\n *ngIf=\"(firmwares$ | async)?.data.length === 0 && (textFilter$ | async)?.length === 0\"\n>\n <h1 class=\"c8y-icon-duocolor\"\n c8yIcon=\"c8y-firmware\"\n ></h1>\n <h3 translate>\n No firmwares to display.\n </h3>\n <p translate>\n Add a new firmware by clicking below.\n </p>\n <p>\n <button class=\"btn btn-primary\"\n title=\"{{ 'Add firmware' | translate }}\"\n (click)=\"addFirmware()\"\n translate\n >\n Add firmware\n </button>\n </p>\n</div>\n\n<!-- no results empty state -->\n<div class=\"c8y-empty-state\"\n *ngIf=\"(firmwares$ | async)?.data.length === 0 && (textFilter$ | async)?.length > 0\"\n >\n <h1 class=\"c8y-icon-duocolor\"\n c8yIcon=\"search\"></h1>\n <h3 translate>\n No results to display.\n </h3>\n <p translate>\n Refine your search terms or check your spelling.\n </p>\n</div>\n\n<c8y-list-group class=\"m-b-24\"\n *ngIf=\"(firmwares$ | async)?.data.length > 0\"\n [ngClass]=\"{ 'dd-low': (firmwares$ | async)?.data.length < 10 }\"\n \n>\n <c8y-li class=\"page-sticky-header c8y-list__item--empty-actions hidden-xs\">\n <c8y-li-icon>\n <i class=\"fa\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-3\">\n {{'Firmware' | translate}}\n </div>\n <div class=\"col-4\">\n {{'Description' | translate}}\n </div>\n <div class=\"col-3\">\n {{'Device type' | translate}}\n </div>\n <div class=\"col-2\">\n {{'Versions' | translate}}\n </div>\n </c8y-li-body>\n </c8y-li>\n\n <c8y-li *c8yFor=\"let firmware of firmwares$ | async; let i = index; loadMore: 'auto'\">\n <c8y-li-icon icon=\"c8y-firmware\"></c8y-li-icon>\n <c8y-li-body class=\"content-flex-60\">\n <button class=\"btn-clean col-3\"\n (click)=\"editFirmware(firmware)\"\n >\n <span class=\"text-truncate\"\n title=\"{{ firmware.name }}\"\n >\n {{ firmware.name }}\n </span>\n </button>\n <div class=\"col-4\">\n <p class=\"text-truncate\"\n title=\"{{ firmware.description }}\"\n >\n <span class=\"text-label-small m-r-4 visible-xs-inline\">\n {{'Description' | translate }}\n </span>\n <span *ngIf=\"firmware.description; else emptyDescription\">\n {{ firmware.description }}\n </span>\n </p>\n <ng-template #emptyDescription>\n <small class=\"text-muted\">\n <em>{{ 'No description' | translate }}</em>\n </small>\n </ng-template>\n </div>\n <div class=\"col-3\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-r-4 visible-xs-inline\" translate>\n Device type\n </span>\n <span\n *ngIf=\"firmware.c8y_Filter?.type; else emptyText\"\n title=\"{{ firmware.c8y_Filter?.type }}\"\n >\n {{ firmware.c8y_Filter?.type }}\n </span>\n <ng-template #emptyText>\n <small class=\"text-muted\">\n <em>{{ 'Undefined' | translate }}</em>\n </small>\n </ng-template>\n </div>\n </div>\n <div class=\"col-2\">\n <span class=\"label label-warning flex-item-right-sm\"\n *ngIf=\"isLegacy(firmware)\"\n >\n <span translate>\n Legacy\n </span>\n </span>\n\n <span *ngIf=\"!isLegacy(firmware)\">\n <span *ngIf=\"(getBaseVersionsCount$(firmware) | async) === null\">\n <span class=\"label label-info flex-item-right-sm\">\n <i c8yIcon=\"circle-o-notch\" class=\"icon-spin\"></i>\n </span>\n </span>\n <span *ngIf=\"(getBaseVersionsCount$(firmware) | async) !== null\">\n <span [ngPlural]=\"getBaseVersionsCount$(firmware) | async\">\n <ng-template ngPluralCase=\"=0\">\n <span class=\"label label-default flex-item-right-sm\">\n <span translate>\n No versions\n </span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"=1\">\n <span class=\"label label-info flex-item-right-sm\">\n <span translate>\n 1 version\n </span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span class=\"label label-info flex-item-right-sm\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: getBaseVersionsCount$(firmware) | async }\"\n >\n {{ count }} versions\n </span>\n </span>\n </ng-template>\n </span>\n </span>\n </span>\n </div>\n </c8y-li-body>\n\n <c8y-li-action\n (click)=\"editFirmware(firmware)\"\n icon=\"pencil\"\n >\n {{ 'Edit' | translate }}\n </c8y-li-action>\n\n <c8y-li-action\n (click)=\"deleteFirmware(firmware)\"\n icon=\"trash\"\n >\n {{ 'Delete' | translate }}\n </c8y-li-action>\n </c8y-li>\n</c8y-list-group>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"ModalService","line":54,"character":26},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":55,"character":28},{"__symbolic":"reference","module":"@ngx-translate/core","name":"TranslateService","line":56,"character":30},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":57,"character":26},{"__symbolic":"reference","module":"@angular/router","name":"Router","line":58,"character":20},{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":59,"character":28}]}],"getFirmwares":[{"__symbolic":"method"}],"addFirmware":[{"__symbolic":"method"}],"addFirmwarePatch":[{"__symbolic":"method"}],"editFirmware":[{"__symbolic":"method"}],"deleteFirmware":[{"__symbolic":"method"}],"getBaseVersionsCount$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":112,"character":3},"arguments":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"lodash-es","name":"property","line":112,"character":11},"arguments":["id"]}]}]}],"getDeviceTypeTitle":[{"__symbolic":"method"}]}},"FirmwareDetailsComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":24,"character":1},"arguments":[{"selector":"c8y-firmware-details","template":"<c8y-title>\n {{ (firmware$ | async)?.name }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n path=\"#/firmware\"\n label=\"{{ 'Firmware repository' | translate }}\"\n icon=\"c8y-firmware\"\n >\n </c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n *ngIf=\"!(isLegacy$ | async)\"\n class=\"btn btn-link\"\n title=\"{{ 'Add firmware' | translate }}\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n *ngIf=\"canAddPatchVersions$ | async\"\n class=\"btn btn-link\"\n title=\"{{ 'Add firmware patch' | translate }}\"\n (click)=\"addPatchVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware patch' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" title=\"{{ 'Reload' | translate }}\" (click)=\"reload$.next()\">\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading$ | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card m-b-4\">\n <div class=\"card-header separator\">\n <h4 class=\"card-title\" translate>\n Name, description and device type filter\n </h4>\n </div>\n <div class=\"card-block\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #nameInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(firmware$ | async)?.name\"\n #nameModel=\"ngModel\"\n placeholder=\"{{ 'e.g. My firmware' | translate }}\"\n required\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n (click)=\"updateFirmware$.next({ name: nameInput.value }); nameModel.reset()\"\n [disabled]=\"nameInput.value.length == 0\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Description' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #descriptionInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(firmware$ | async)?.description\"\n #descriptionModel=\"ngModel\"\n placeholder=\"{{ 'e.g. Firmware for hardware revision b' | translate }}\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n (click)=\"\n updateFirmware$.next({ description: descriptionInput.value });\n descriptionModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Device type filter' | translate }}\n\n <a\n class=\"pointer\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n [outsideClick]=\"true\"\n container=\"body\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </a>\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #deviceTypeInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(firmware$ | async)?.c8y_Filter?.type\"\n #deviceTypeModel=\"ngModel\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n (click)=\"\n updateFirmware$.next({ c8y_Filter: { type: deviceTypeInput.value } });\n deviceTypeModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"card\">\n <div class=\"card-header separator\">\n <h4 class=\"card-title\" translate>\n Versions and patches\n </h4>\n </div>\n\n <div class=\"card-block p-t-0 p-b-24\">\n <div *ngIf=\"(baseVersions$ | async)?.data.length === 0\">\n <div class=\"c8y-empty-state text-center\">\n <h1 c8yIcon=\"c8y-firmware\" class=\"c8y-icon-duocolor\"></h1>\n <h3 translate>No versions to display.</h3>\n <p translate>Add a new version by clicking below.</p>\n <p>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add firmware' | translate }}\"\n (click)=\"addBaseVersion()\"\n translate\n >\n Add firmware\n </button>\n </p>\n </div>\n </div>\n\n <c8y-list-group\n [ngClass]=\"{ 'dd-low': (baseVersions$ | async)?.data.length < 10 }\"\n *ngIf=\"(baseVersions$ | async)?.data.length > 0\"\n >\n <c8y-li\n *c8yFor=\"let baseVersion of baseVersions$ | async; let i = index; loadMore: 'auto'\"\n [ngClass]=\"{\n 'c8y-list__item--empty-actions': !(getPatchVersions$(baseVersion) | async)?.data.length\n }\"\n [collapsed]=\"!expanded[baseVersion.id]\"\n (collapsedChange)=\"expanded[baseVersion.id] = !$event\"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n <p>{{ baseVersion.c8y_Firmware.version }}</p>\n </div>\n <div class=\"col-5 \">\n <p class=\"text-truncate\">\n <span class=\"text-label-small m-r-8\" translate>\n File\n </span>\n <span title=\" {{ getBinaryName$(baseVersion.c8y_Firmware.url) | async }}\">\n <c8y-file-download url=\"{{ baseVersion.c8y_Firmware.url }}\"></c8y-file-download>\n </span>\n </p>\n </div>\n <div class=\"col-2 flex-row\">\n <span *ngIf=\"isLegacy$ | async\" class=\"label label-warning flex-item-right-sm\">\n {{ 'Legacy' | translate }}\n </span>\n\n <span *ngIf=\"!(isLegacy$ | async)\">\n <span *ngIf=\"(getPatchVersionsCount$(baseVersion) | async) === null\">\n <span class=\"label label-info\">\n <i c8yIcon=\"circle-o-notch\" class=\"icon-spin\"></i>\n </span>\n </span>\n <span *ngIf=\"(getPatchVersionsCount$(baseVersion) | async) !== null\">\n <span [ngPlural]=\"getPatchVersionsCount$(baseVersion) | async\">\n <ng-template ngPluralCase=\"=0\">\n <span class=\"label label-default flex-item-right-sm\">\n <span translate>No patches</span></span\n >\n </ng-template>\n <ng-template ngPluralCase=\"=1\">\n <span class=\"label label-info\">\n <span translate>1 patch</span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span class=\"label label-info\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: getPatchVersionsCount$(baseVersion) | async }\"\n >{{ count }} patches</span\n ></span\n >\n </ng-template>\n </span>\n </span>\n </span>\n </div>\n <div class=\"fit-h-20 visible-xs\" *ngIf=\"!(isLegacy$ | async)\">\n <button\n class=\"btn btn-danger btn-xs m-t-8 \"\n (click)=\"deleteBaseVersion(baseVersion)\"\n title=\"{{ 'Delete' | translate }}\"\n >\n <i c8yIcon=\"minus-circle\"></i> {{ 'Delete' | translate }}\n </button>\n </div>\n <div *ngIf=\"!(isLegacy$ | async)\" class=\"flex-item-right fit-h-20 p-r-8 hidden-xs\">\n <button\n class=\"btn btn-dot text-danger showOnHover\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n title=\"{{ 'Delete' | translate }}\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n </c8y-li-body>\n <c8y-li-collapse *ngIf=\"(getPatchVersions$(baseVersion) | async)?.data.length\">\n <c8y-list-group class=\"separator-top\">\n <c8y-li\n *c8yFor=\"\n let patchVersion of getPatchVersions$(baseVersion) | async;\n let i = index;\n loadMore: 'auto'\n \"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n {{ patchVersion.c8y_Firmware.version }}\n </div>\n <div class=\"col-5\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-r-8\" translate>\n File\n </span>\n <c8y-file-download\n url=\"{{ patchVersion.c8y_Firmware.url }}\"\n ></c8y-file-download>\n </div>\n </div>\n <div class=\"visible-xs m-t-8\">\n <button\n class=\"btn btn-danger btn-xs\"\n (click)=\"deletePatchVersion(patchVersion)\"\n title=\"{{ 'Delete' | translate }}\"\n >\n <i c8yIcon=\"minus-circle\"></i> {{ 'Delete' | translate }}\n </button>\n </div>\n <div class=\"flex-item-right p-r-8 hidden-xs fit-h-20\">\n <button\n class=\"btn btn-dot text-danger showOnHover\"\n (click)=\"deletePatchVersion(patchVersion)\"\n title=\"{{ 'Delete' | translate }}\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </c8y-li-collapse>\n </c8y-li>\n </c8y-list-group>\n </div>\n</div>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":78,"character":28},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":79,"character":30},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":81,"character":26},{"__symbolic":"reference","module":"@ngx-translate/core","name":"TranslateService","line":82,"character":30},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"ModalService","line":83,"character":26},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":84,"character":28}]}],"ngOnInit":[{"__symbolic":"method"}],"getPatchVersionsCount$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":105,"character":3},"arguments":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"lodash-es","name":"property","line":105,"character":11},"arguments":["id"]}]}]}],"getBinaryName$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":119,"character":3}}]}],"getPatchVersions$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":124,"character":3},"arguments":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"lodash-es","name":"property","line":124,"character":11},"arguments":["id"]}]}]}],"addBaseVersion":[{"__symbolic":"method"}],"addPatchVersion":[{"__symbolic":"method"}],"deleteBaseVersion":[{"__symbolic":"method"}],"deletePatchVersion":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}]}},"DeviceConfigurationService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":4,"character":1}}],"members":{"updateConfigurations":[{"__symbolic":"method"}],"hasAnySupportedOperation":[{"__symbolic":"method"}]}},"DeviceConfigurationListComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":3,"character":1},"arguments":[{"selector":"c8y-device-configuration-list","template":"<div class=\"p-l-16 m-b-8\" style=\"margin-top: -16px;\" *ngIf=\"isFilterEnabled\">\n <c8y-filter [icon]=\"'search'\" (onSearch)=\"updatePipe($event)\"></c8y-filter>\n</div>\n\n<!-- EMPTY STATE -->\n<div class=\"c8y-empty-state text-left\" *ngIf=\"items?.length === 0\">\n <h1 [c8yIcon]=\"emptyState.icon\"></h1>\n <p>\n <strong>{{ emptyState.title | translate }}</strong\n ><br />\n <small>{{ emptyState.text | translate }}</small>\n </p>\n</div>\n\n<!-- CONFIGURATIONS AVAILABLE -->\n<div class=\"c8y-nav-stacked\">\n <div\n class=\"c8y-stacked-item flex-row\"\n [class.active]=\"config === selectedConfig\"\n *ngFor=\"let config of items | configurationFilterPipe: filterTerm\"\n (click)=\"showConfigurationTypePreview(config)\"\n >\n <div class=\"list-item-icon\">\n <i [c8yIcon]=\"itemIcon\"></i>\n </div>\n <div class=\"list-item-body text-truncate\">\n <div class=\"d-flex\">\n <span class=\"text-truncate\" title=\"{{ config.name }}\">{{ config.name }}</span>\n <span class=\"text-label-small flex-item-right flex-item-middle\">{{ config.deviceType }}</span>\n </div>\n </div>\n </div>\n</div>\n\n<!-- for Carlos: config.configurationType to differentiate whether a config matches configuration type. -->\n"}]}],"members":{"items":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":8,"character":3}}]}],"itemIcon":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":9,"character":3}}]}],"emptyState":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":10,"character":3}}]}],"isFilterEnabled":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":11,"character":3}}]}],"configSelected":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":12,"character":3}}]}],"showConfigurationTypePreview":[{"__symbolic":"method"}],"updatePipe":[{"__symbolic":"method"}]}},"RepositorySelectModalComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":57,"character":1},"arguments":[{"selector":"c8y-repository-select-modal","template":"<c8y-select-modal\n [icon]=\"icon\"\n [title]=\"title\"\n [subTitle]=\"subTitle\"\n [items]=\"modalEntries | async\"\n [mode]=\"mode\"\n [disableSelected]=\"disableSelected\"\n [labels]=\"labels\"\n [showFilter]=\"showFilter\"\n [areMoreEntries]=\"areMoreEntries\"\n (search)=\"search($event)\"\n (result)=\"result($event)\"\n>\n</c8y-select-modal>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@ngx-translate/core","name":"TranslateService","line":184,"character":30}]}],"ngOnInit":[{"__symbolic":"method"}],"getAndAssignRepositoryBinaries":[{"__symbolic":"method"}],"search":[{"__symbolic":"method"}],"result":[{"__symbolic":"method"}],"aggregate":[{"__symbolic":"method"}],"getSelectModalOptions":[{"__symbolic":"method"}],"isBinaryRepositorySelected":[{"__symbolic":"method"}],"getSelectModalObject":[{"__symbolic":"method"}]}},"DeviceSoftwareChangesComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":5,"character":1},"arguments":[{"selector":"c8y-device-software-changes","template":"<div class=\"inner-scroll d-flex d-col\">\n <div class=\"card-header separator large-padding sticky-top\">\n <h4 class=\"card-title\" translate>Software changes</h4>\n </div>\n <div class=\"flex-grow\">\n <div class=\"card-block large-padding\"\n *ngIf=\"(changes$ | async).length === 0; else changesList\"\n >\n <div class=\"c8y-empty-state text-center\">\n <h1 class=\"c8y-icon c8y-icon-device-control c8y-icon-duocolor\"></h1>\n <p>\n <strong translate>No software changes.</strong> <br />\n <small translate>Selected actions will be displayed here.</small>\n </p>\n </div>\n </div>\n\n <ng-template #changesList>\n <fieldset class=\"card-block p-t-0 p-b-0\"\n *ngIf=\"(installations$ | async).length > 0\"\n [disabled]=\"changesInProgress\"\n >\n <div class=\"form-block legend\" translate>Installations`software`</div>\n <c8y-device-software-list\n [softwareList]=\"installations$ | async\"\n (remove)=\"drop.emit($event)\"\n ></c8y-device-software-list>\n </fieldset>\n\n <fieldset class=\"card-block p-t-0 p-b-0\"\n *ngIf=\"(removals$ | async).length > 0\"\n [disabled]=\"changesInProgress\"\n >\n <div class=\"form-block legend\" translate>Removals`software`</div>\n <c8y-device-software-list\n [softwareList]=\"removals$ | async\"\n (remove)=\"drop.emit($event)\"\n ></c8y-device-software-list>\n </fieldset>\n </ng-template>\n </div>\n <div\n class=\"card-footer separator large-padding sticky-bottom\"\n *ngIf=\"(changes$ | async).length > 0\"\n >\n <button\n class=\"btn btn-default\"\n (click)=\"clear.emit()\"\n title=\"{{ 'Clear changes' | translate }}\"\n [disabled]=\"changesInProgress\"\n translate\n >\n Clear`changes`\n </button>\n <button\n class=\"btn btn-primary\"\n [ngClass]=\"{ 'btn-pending': changesInProgress }\"\n [disabled]=\"changesInProgress\"\n (click)=\"apply.emit()\"\n title=\"{{ 'Apply changes' | translate }}\"\n translate\n >\n Apply changes\n </button>\n </div>\n</div>\n"}]}],"members":{"changes":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":10,"character":3}}]}],"changesInProgress":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":11,"character":3}}]}],"clear":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":12,"character":3}}]}],"drop":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":13,"character":3}}]}],"apply":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":14,"character":3}}]}],"ngOnChanges":[{"__symbolic":"method"}]}},"DeviceSoftwareListComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":5,"character":1},"arguments":[{"selector":"c8y-device-software-list","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"}]}],"members":{"softwareList":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":10,"character":3}}]}],"deviceSoftwareChanges":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":11,"character":3}}]}],"update":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":12,"character":3}}]}],"remove":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":13,"character":3}}]}],"ngAfterContentInit":[{"__symbolic":"method"}],"isSoftwareGoingToBeChanged":[{"__symbolic":"method"}]}},"FirmwareDeviceTabComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":14,"character":1},"arguments":[{"selector":"c8y-firmware-device-tab","template":"<div class=\"row\">\n <div class=\"col-lg-10\">\n <div class=\"card card--fullpage\">\n <div class=\"card-header separator\">\n <h4 class=\"card-title\" translate>Current firmware</h4>\n </div>\n <div class=\"inner-scroll\">\n <fieldset *ngIf=\"changesOperation$ | async\" class=\"card-block bg-gray-white\">\n <c8y-single-operation [operation]=\"changesOperation$ | async\"></c8y-single-operation>\n </fieldset>\n <div class=\"card-block p-t-0 p-b-0\">\n <!-- EMPTY STATE -->\n <ng-container *ngIf=\"isEmpty(deviceFirmwareFragment$ | async); else firmwareBlock\">\n <div class=\"c8y-empty-state text-center\">\n <h1 c8yIcon=\"c8y-firmware\" class=\"c8y-icon-duocolor\"></h1>\n <p>\n <strong translate>No firmware installed.</strong> <br />\n <small translate>Click below to install firmware into this device.</small>\n </p>\n </div>\n </ng-container>\n\n <!-- FIRMWARE -->\n <ng-template #firmwareBlock>\n <c8y-list-group class=\"no-border-last \">\n <c8y-li>\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n\n <c8y-li-body *ngIf=\"deviceFirmwareFragment$ | async as deviceFirmwareFragment\">\n <!-- Firmware title -->\n <p class=\"m-b-16 text-medium\">\n {{ deviceFirmwareFragment.name }}\n </p>\n <!-- Firmware description -->\n <div *ngIf=\"repositoryEntry$ | async as repositoryEntry\">\n <p class=\"text-label-small\" translate>\n Description\n </p>\n <p>\n {{ repositoryEntry.description }}\n </p>\n </div>\n <!-- BASE/PATCH VERSION -->\n <div class=\"m-b-16\">\n <p class=\"text-label-small\" translate>\n Version\n </p>\n <p *ngIf=\"deviceFirmwareFragment.version; else versionNotSpecified\">\n {{ deviceFirmwareFragment.version }}\n </p>\n <ng-template #versionNotSpecified>\n <p>\n <em class=\"text-muted\"> ({{ 'not specified`version`' | translate }}) </em>\n </p>\n </ng-template>\n </div>\n \n <!-- ADD PATCH -->\n <button\n *ngIf=\"(this.patches$ | async)?.length > 0\"\n (click)=\"addPatch()\"\n class=\"btn btn-xs btn-primary\"\n [disabled]=\"changesInProgress$ | async\"\n translate\n >\n Patches available\n </button>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </ng-template>\n </div>\n </div>\n <div class=\"card-footer separator-top\">\n <!-- INSTALL FIRMWARE -->\n <button\n *ngIf=\"isEmpty(deviceFirmwareFragment$ | async)\"\n class=\"btn btn-primary\"\n (click)=\"installFirmware()\"\n translate\n >\n Install firmware\n </button>\n\n <!-- REPLACE FIRMWARE -->\n <button\n *ngIf=\"!isEmpty(deviceFirmwareFragment$ | async)\"\n class=\"btn btn-primary\"\n (click)=\"installFirmware()\"\n [disabled]=\"changesInProgress$ | async\"\n translate\n >\n Replace firmware\n </button>\n </div>\n </div>\n </div>\n</div>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":68,"character":19},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":70,"character":23},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":71,"character":21}]}],"ngOnInit":[{"__symbolic":"method"}],"installFirmware":[{"__symbolic":"method"}],"getRepositoryEntriesWithVersions$":[{"__symbolic":"method"}],"getAndAssignRepositoryBinaries":[{"__symbolic":"method"}],"addPatch":[{"__symbolic":"method"}],"getRepositoryEntryWithPatches$":[{"__symbolic":"method"}],"loadDevice":[{"__symbolic":"method"}],"handleOperation":[{"__symbolic":"method"}],"loadOperation":[{"__symbolic":"method"}],"trackOperation":[{"__symbolic":"method"}],"isInProgress":[{"__symbolic":"method"}]}},"InstalledSoftwareComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":10,"character":1},"arguments":[{"selector":"c8y-installed-software","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"}]}],"members":{"softwareList":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":15,"character":3}}]}],"deviceSoftwareChanges":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":16,"character":3}}]}],"deviceSoftwareChangesOperation":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":17,"character":3}}]}],"deviceSoftwareChangesInProgress":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":18,"character":3}}]}],"deviceTypeQuery":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":19,"character":3}}]}],"changes":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":20,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":24,"character":23},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":25,"character":21}]}],"installSoftware":[{"__symbolic":"method"}],"updateSoftware":[{"__symbolic":"method"}],"removeSoftware":[{"__symbolic":"method"}],"getInstallableSoftwareListWithVersions$":[{"__symbolic":"method"}],"getSingleSoftwareWithVersions$":[{"__symbolic":"method"}],"attachVersions":[{"__symbolic":"method"}],"displaySoftwareSelectModal":[{"__symbolic":"method"}],"emitSoftwareInstall":[{"__symbolic":"method"}],"emitSoftwareRemoval":[{"__symbolic":"method"}]}},"FirmwareDeviceTabGuard":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":7,"character":1}}],"members":{"canActivate":[{"__symbolic":"method"}]}},"SoftwareDeviceTabGuard":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":3,"character":1}}],"members":{"canActivate":[{"__symbolic":"method"}],"isAnyOperationSupported":[{"__symbolic":"method"}]}},"SoftwareDeviceTabComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":8,"character":1},"arguments":[{"selector":"c8y-software-device-tab","template":"<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" title=\"{{ 'Reload' | translate }}\" (click)=\"loadDevice()\">\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card 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"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":29,"character":19},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":31,"character":23}]}],"ngOnInit":[{"__symbolic":"method"}],"addChanges":[{"__symbolic":"method"}],"dropChange":[{"__symbolic":"method"}],"areSameChanges":[{"__symbolic":"method"}],"clearChanges":[{"__symbolic":"method"}],"loadDevice":[{"__symbolic":"method"}],"applyChanges":[{"__symbolic":"method"}],"loadOperation":[{"__symbolic":"method"}],"trackOperation":[{"__symbolic":"method"}],"displayChangesFromOperation":[{"__symbolic":"method"}],"isInProgress":[{"__symbolic":"method"}]}},"ConfigurationListComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":19,"character":1},"arguments":[{"selector":"c8y-configuration-list","template":"<c8y-title>\n <span translate>\n Configuration snapshots repository\n </span>&nbsp;\n <small\n *ngIf=\"(configurations$ | async)?.paging.totalPages === 1 && !filterTerm\"\n >\n {{ (configurations$ | async).data.length }}\n <span translate>\n snapshots\n </span>\n </small>\n <small\n *ngIf=\"(configurations$ | async)?.paging.totalPages > 1 && !filterTerm\"\n [tooltip]=\"'More data available. Scroll to the bottom of the list to load it.' | translate\"\n container=\"body\"\n >\n {{ (configurations$ | async).paging.pageSize }}+\n <span translate>snapshots</span>\n </small>\n <small *ngIf=\"filterTerm\">\n <span translate>\n Search results for\n </span>&nbsp;\"\n {{ this.filterTerm }}\"\n </small>\n</c8y-title>\n\n<c8y-action-bar-item itemClass=\"navbar-form\">\n <c8y-filter\n [icon]=\"'search'\"\n (onSearch)=\"setPipe($event)\"\n ></c8y-filter>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\"\n (click)=\"add()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add configuration snapshot' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"loadConfigurations()\"\n >\n <i [ngClass]=\"{ 'icon-spin': reloading }\"\n c8yIcon=\"refresh\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<!-- empty state -->\n<div class=\"c8y-empty-state text-center\"\n *ngIf=\"!filterTerm && (configurations$ | async)?.data.length === 0\"\n>\n <h1 c8yIcon=\"gears\"></h1>\n <h3 translate>There are no configuration snapshots defined</h3>\n <p translate>Add a configuration snapshot first.</p>\n <div>\n <button (click)=\"add()\" class=\"btn btn-primary\" translate>\n Add configuration snapshot\n </button>\n </div>\n <p c8y-guide-docs>\n <small translate ngNonBindable>\n Find out more in the\n <a c8y-guide-href=\"users-guide/device-management/#configuration-repository\">\n User guide`KEEP_ORIGINAL`\n </a>.\n </small>\n </p>\n</div>\n\n<!-- no results empty state -->\n<div class=\"c8y-empty-state\"\n *ngIf=\"shouldShowEmptyState() && (configurations$ | async)?.data.length > 0\"\n>\n <h1 class=\"c8y-icon-duocolor\"\n c8yIcon=\"search\"\n ></h1>\n <h3 translate>\n No results to display.\n </h3>\n <p translate>\n Refine your search terms or check your spelling.\n </p>\n</div>\n\n<c8y-list-group class=\"m-b-24\"\n *ngIf=\"(configurations$ | async)?.data.length > 0\"\n [ngClass]=\"{ 'dd-low': data && data.length ? data.length < 10 : (configurations$ | async)?.data.length < 10 }\"\n\n>\n <c8y-li class=\"page-sticky-header c8y-list__item--empty-actions hidden-xs\"\n *ngIf=\"!shouldShowEmptyState()\"\n >\n <c8y-li-icon>\n <i class=\"fa\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-2\">\n {{ 'Configuration' | translate }}\n </div>\n <div class=\"col-3\">\n {{ 'Description' | translate }}\n </div>\n <div class=\"col-3\">\n {{ 'File' | translate }}\n </div>\n <div class=\"col-2\">\n {{ 'Device type' | translate }}\n </div>\n <div class=\"col-2\">\n {{ 'Configuration type' | translate }}\n </div>\n </c8y-li-body>\n </c8y-li>\n\n <c8y-li *c8yFor=\"let configuration of configurations$; pipe: filterPipe\">\n <c8y-li-icon icon=\"gears\"></c8y-li-icon>\n <div class=\"content-flex-60\">\n <button class=\"btn-clean col-2\"\n (click)=\"edit(configuration)\"\n >\n <span class=\"text-truncate\"\n title=\"{{ configuration.name || '-' }}\"\n >\n <c8y-highlight\n [text]=\"configuration.name || '-'\"\n elementClass=\"text-info\"\n [pattern]=\"filterTerm\"\n ></c8y-highlight>\n </span>\n </button>\n <div class=\"col-3\">\n <div class=\"text-label-small visible-xs-inline m-r-4\">\n {{ 'Description' | translate }}\n </div>\n <small class=\"text-truncate\"\n *ngIf=\"configuration.description; else emptyDescription\"\n [title]=\"configuration.description\"\n >\n {{ configuration.description }}\n </small>\n </div>\n <div class=\"col-3\">\n <span class=\"text-truncate\">\n <span class=\"text-label-small m-r-4 visible-xs-inline\" translate>\n File\n </span>\n <small\n *ngIf=\"isBinaryFile(configuration); else noFile\"\n title=\"{{ getBinaryName(configuration) | async }}\"\n >\n {{ getBinaryName(configuration) | async }}\n </small>\n <ng-template #noFile>\n <small title=\"{{ configuration.url }}\">\n {{ configuration.url }}\n </small>\n </ng-template>\n </span>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\"\n title=\"{{ 'Device type' | translate }}: {{ configuration.deviceType || '-' }}\"\n >\n <span class=\"text-label-small visible-xs-inline m-r-4\" translate>\n Device type\n </span>\n <span *ngIf=\"configuration.deviceType; else emptyText\">\n <c8y-highlight\n [text]=\"configuration.deviceType || '-'\"\n elementClass=\"text-info\"\n [pattern]=\"filterTerm\"\n >\n </c8y-highlight>\n </span>\n </div>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\"\n title=\"{{ configuration.configurationType }}\"\n >\n <span class=\"label label-primary\"\n *ngIf=\"configuration.configurationType; else emptyText\"\n >\n <c8y-highlight\n [text]=\"configuration.configurationType\"\n elementClass=\"text-info\"\n [pattern]=\"filterTerm\"\n >\n </c8y-highlight>\n </span>\n </div>\n </div>\n </div>\n <c8y-li-action\n (click)=\"edit(configuration)\"\n icon=\"pencil\"\n label=\"{{ 'Edit' | translate }}\"\n >\n </c8y-li-action>\n <c8y-li-action\n (click)=\"delete(configuration)\"\n icon=\"trash-o\"\n label=\"{{ 'Delete' | translate }}\"\n >\n </c8y-li-action>\n <c8y-li-action\n *ngIf=\"isBinaryFile(configuration)\"\n (click)=\"download(configuration)\"\n icon=\"download\"\n label=\"{{ 'Download' | translate }}\"\n >\n </c8y-li-action>\n <ng-template #emptyText>\n <small class=\"text-muted\">\n <em>{{ 'Undefined' | translate }}</em>\n </small>\n </ng-template>\n <ng-template #emptyDescription>\n <small class=\"text-muted\">\n <em>{{ 'No description' | translate }}</em>\n </small>\n </ng-template>\n </c8y-li>\n</c8y-list-group>\n"}]}],"members":{"filter":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":24,"character":3},"arguments":[{"__symbolic":"reference","module":"@c8y/ngx-components","name":"FilterInputComponent","line":24,"character":13},{"static":false}]}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":33,"character":19},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":35,"character":28},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"ModalService","line":36,"character":26},{"__symbolic":"reference","module":"@ngx-translate/core","name":"TranslateService","line":37,"character":30},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryBinaryService","line":38,"character":36},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":39,"character":30}]}],"ngOnInit":[{"__symbolic":"method"}],"loadConfigurations":[{"__symbolic":"method"}],"add":[{"__symbolic":"method"}],"edit":[{"__symbolic":"method"}],"isBinaryFile":[{"__symbolic":"method"}],"getBinaryName":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":96,"character":3},"arguments":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"lodash-es","name":"property","line":96,"character":11},"arguments":["id"]}]}]}],"download":[{"__symbolic":"method"}],"delete":[{"__symbolic":"method"}],"setPipe":[{"__symbolic":"method"}],"shouldShowEmptyState":[{"__symbolic":"method"}],"reset":[{"__symbolic":"method"}],"filterContainString":[{"__symbolic":"method"}]}},"ConfigurationDetailComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":12,"character":1},"arguments":[{"selector":"c8y-configuration-detail","template":"<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'cogs'\"></i>\n <h4 translate *ngIf=\"mo.id\">Update configuration</h4>\n <h4 translate *ngIf=\"!mo.id\">Add configuration</h4>\n </div>\n\n <form class=\"d-contents\" #configurationForm=\"ngForm\" (ngSubmit)=\"configurationForm.form.valid && save()\">\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\">\n <c8y-form-group>\n <label translate>Name</label>\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} hosts\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n [(ngModel)]=\"version\"\n name=\"version\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Device type</label>\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n maxlength=\"254\"\n autocomplete=\"off\"\n [(ngModel)]=\"deviceType\"\n name=\"deviceType\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Description</label>\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g. Host configuration' | translate }} c8y_Linux\"\n maxlength=\"254\"\n autocomplete=\"off\"\n [(ngModel)]=\"description\"\n name=\"description\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Configuration type</label>\n <c8y-typeahead\n [(ngModel)]=\"selected\"\n name=\"confType\"\n placeholder=\"{{ 'e.g.' | translate }} ssh\"\n (onSearch)=\"setPipe($event)\"\n displayProperty=\"configurationType\"\n >\n <c8y-li\n *c8yFor=\"let config of configs; pipe: filterPipe; notFound: notFoundTemplate\"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"selected = config; setPipe('')\"\n [active]=\"selected === config\"\n >\n <c8y-highlight\n [text]=\"config.configurationType || '--'\"\n [pattern]=\"pattern\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li class=\"bg-gray-lighter p-8\" *ngIf=\"pattern.length > 0\">\n <span translate>No match found, add new`configuration`?</span>\n <button title=\"Create new`configuration`\" type=\"button\" class=\"btn btn-primary btn-xs m-l-16\" translate>\n Create new`configuration`\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Configuration file</div>\n <c8y-file-picker\n [maxAllowedFiles]=\"1\"\n (onFilesPicked)=\"onFile($event)\"\n [uploadChoice]=\"uploadChoice\"\n [fileUrl]=\"binary.url\"\n [fileBinary]=\"binary.file\"\n >\n </c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button\n (click)=\"cancel()\"\n type=\"button\"\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n [disabled]=\"saving\"\n >\n <span translate>Cancel</span>\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"submit\"\n title=\"{{ submitButtonTitle | translate }}\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !configurationForm.valid ||\n configurationForm.pristine ||\n (!binary?.url && !binary?.file) ||\n saving\n \"\n >\n {{ submitButtonTitle | translate }}\n </button>\n </div>\n </form>\n</div>\n"}]}],"members":{"configurationForm":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":17,"character":3},"arguments":["configurationForm",{"static":true}]}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalRef","line":46,"character":24},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":47,"character":19}]}],"ngOnInit":[{"__symbolic":"method"}],"cancel":[{"__symbolic":"method"}],"setPipe":[{"__symbolic":"method"}],"onFile":[{"__symbolic":"method"}],"save":[{"__symbolic":"method"}]}},"ɵa":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":7,"character":1},"arguments":[{"selector":"c8y-file-download","template":"<a\n *ngIf=\"determineBehavior() === linkRenderType.LINK\"\n href=\"{{ url }}\"\n class=\"pointer\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n>\n {{ getBinaryName$(url) | async }}\n</a>\n\n<span *ngIf=\"determineBehavior() === linkRenderType.TEXTONLY\">{{ getBinaryName$(url) | async }}</span>\n\n<a *ngIf=\"determineBehavior() === linkRenderType.DOWNLOAD\" class=\"pointer\" (click)=\"downloadFile()\">\n {{getBinaryName$(url) | async}}\n</a>\n"}]}],"members":{"url":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":12,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryBinaryService","line":16,"character":36}]}],"getBinaryName$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":19,"character":3}}]}],"determineBehavior":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":24,"character":3}}]}],"downloadFile":[{"__symbolic":"method"}]}}},"origins":{"RepositoryModule":"./repository.module","RepositoryService":"./repository.service","RepositoryType":"./repository.model","REPOSITORY_BINARY_TYPES":"./repository.model","ModalModel":"./repository.model","RepositoryCategory":"./repository.model","FirmwareBinary":"./repository.model","FirmwarePatchBinary":"./repository.model","SoftwareBinary":"./repository.model","RepositoryBinary":"./repository.model","SelectedRepositoryBinary":"./repository.model","DeviceFirmware":"./repository.model","DeviceSoftware":"./repository.model","DeviceSoftwareChange":"./repository.model","ConfigurationSnapshot":"./repository.model","SupportedConfigurationItem":"./repository.model","DeviceConfigurationListEmptyState":"./repository.model","DeviceConfigurationOperation":"./repository.model","RepositoryNavigationFactory":"./repository-navigation-factory","SoftwareListComponent":"./software/software-list.component","AddSoftwareModalComponent":"./software/add-software-modal.component","SoftwareDetailsComponent":"./software/software-details.component","TextBasedConfigurationComponent":"./configuration-device-tab/text-based-configuration.component","DeviceConfigurationGuard":"./configuration-device-tab/device-configuration.guard","ConfigurationFilterPipe":"./configuration-device-tab/configuration-filter.pipe","ConfigurationPreviewComponent":"./configuration-device-tab/configuration-preview.component","DeviceConfigurationComponent":"./configuration-device-tab/device-configuration.component","SaveToRepositoryComponent":"./configuration-device-tab/save-to-repository.component","AddFirmwarePatchModalComponent":"./firmware/add-firmware-patch-modal.component","AddFirmwareModalComponent":"./firmware/add-firmware-modal.component","SourceCodePreviewComponent":"./configuration-device-tab/source-code-preview.component","FirmwareListComponent":"./firmware/firmware-list.component","FirmwareDetailsComponent":"./firmware/firmware-details.component","DeviceConfigurationService":"./configuration-device-tab/device-configuration.service","DeviceConfigurationListComponent":"./configuration-device-tab/device-configuration-list.component","RepositorySelectModalComponent":"./select-modal/repository-select-modal.component","DeviceSoftwareChangesComponent":"./software-device-tab/device-software-changes.component","DeviceSoftwareListComponent":"./software-device-tab/device-software-list.component","FirmwareDeviceTabComponent":"./firmware-device-tab/firmware-device-tab.component","InstalledSoftwareComponent":"./software-device-tab/installed-software.component","FirmwareDeviceTabGuard":"./firmware-device-tab/firmware-device-tab.guard","SoftwareDeviceTabGuard":"./software-device-tab/software-device-tab.guard","SoftwareDeviceTabComponent":"./software-device-tab/software-device-tab.component","ConfigurationListComponent":"./configuration/configuration-list.component","ConfigurationDetailComponent":"./configuration/configuration-detail.component","ɵa":"./file-download/file-download.component"},"importAs":"@c8y/ngx-components/repository"}
1
+ {"__symbolic":"module","version":4,"metadata":{"RepositoryModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":45,"character":1},"arguments":[{"imports":[{"__symbolic":"reference","module":"@c8y/ngx-components","name":"CoreModule","line":47,"character":4},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"FormsModule","line":48,"character":4},{"__symbolic":"reference","module":"@c8y/ngx-components/operations/single-operation-details","name":"SingleOperationDetailsModule","line":49,"character":4},{"__symbolic":"call","expression":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"ngx-bootstrap/dropdown","name":"BsDropdownModule","line":50,"character":4},"member":"forRoot"}},{"__symbolic":"reference","module":"ngx-bootstrap/tooltip","name":"TooltipModule","line":51,"character":4},{"__symbolic":"reference","module":"ngx-bootstrap/popover","name":"PopoverModule","line":52,"character":4},{"__symbolic":"call","expression":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"ngx-bootstrap/tabs","name":"TabsModule","line":53,"character":4},"member":"forRoot"}}],"exports":[],"declarations":[{"__symbolic":"reference","name":"FirmwareListComponent"},{"__symbolic":"reference","name":"FirmwareDetailsComponent"},{"__symbolic":"reference","name":"AddFirmwareModalComponent"},{"__symbolic":"reference","name":"AddFirmwarePatchModalComponent"},{"__symbolic":"reference","name":"SoftwareListComponent"},{"__symbolic":"reference","name":"SoftwareDetailsComponent"},{"__symbolic":"reference","name":"AddSoftwareModalComponent"},{"__symbolic":"reference","name":"FirmwareDeviceTabComponent"},{"__symbolic":"reference","name":"SoftwareDeviceTabComponent"},{"__symbolic":"reference","name":"InstalledSoftwareComponent"},{"__symbolic":"reference","name":"RepositorySelectModalComponent"},{"__symbolic":"reference","name":"DeviceSoftwareListComponent"},{"__symbolic":"reference","name":"DeviceSoftwareChangesComponent"},{"__symbolic":"reference","name":"ConfigurationListComponent"},{"__symbolic":"reference","name":"ConfigurationDetailComponent"},{"__symbolic":"reference","name":"DeviceConfigurationComponent"},{"__symbolic":"reference","name":"DeviceConfigurationListComponent"},{"__symbolic":"reference","name":"SourceCodePreviewComponent"},{"__symbolic":"reference","name":"ConfigurationPreviewComponent"},{"__symbolic":"reference","name":"ConfigurationFilterPipe"},{"__symbolic":"reference","name":"SaveToRepositoryComponent"},{"__symbolic":"reference","name":"TextBasedConfigurationComponent"},{"__symbolic":"reference","name":"ɵa"}],"entryComponents":[{"__symbolic":"reference","name":"FirmwareListComponent"},{"__symbolic":"reference","name":"FirmwareDetailsComponent"},{"__symbolic":"reference","name":"AddFirmwareModalComponent"},{"__symbolic":"reference","name":"AddFirmwarePatchModalComponent"},{"__symbolic":"reference","name":"SoftwareListComponent"},{"__symbolic":"reference","name":"SoftwareDetailsComponent"},{"__symbolic":"reference","name":"AddSoftwareModalComponent"},{"__symbolic":"reference","name":"FirmwareDeviceTabComponent"},{"__symbolic":"reference","name":"SoftwareDeviceTabComponent"},{"__symbolic":"reference","name":"DeviceSoftwareListComponent"},{"__symbolic":"reference","name":"RepositorySelectModalComponent"},{"__symbolic":"reference","name":"DeviceSoftwareChangesComponent"},{"__symbolic":"reference","name":"ConfigurationListComponent"},{"__symbolic":"reference","name":"ConfigurationDetailComponent"},{"__symbolic":"reference","name":"DeviceConfigurationComponent"},{"__symbolic":"reference","name":"SaveToRepositoryComponent"},{"__symbolic":"reference","name":"TextBasedConfigurationComponent"}],"providers":[{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","name":"DeviceConfigurationService"},{"__symbolic":"reference","name":"FirmwareDeviceTabGuard"},{"__symbolic":"reference","name":"SoftwareDeviceTabGuard"},{"__symbolic":"reference","name":"DeviceConfigurationGuard"},{"provide":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"HOOK_NAVIGATOR_NODES","line":107,"character":15},"useClass":{"__symbolic":"reference","name":"RepositoryNavigationFactory"},"multi":true},{"provide":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"HOOK_ONCE_ROUTE","line":112,"character":15},"useValue":[{"path":"firmware","component":{"__symbolic":"reference","name":"FirmwareListComponent"}},{"path":"firmware/:id","component":{"__symbolic":"reference","name":"FirmwareDetailsComponent"}},{"context":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"ViewContext","line":123,"character":19},"member":"Device"},"path":"firmware","component":{"__symbolic":"reference","name":"FirmwareDeviceTabComponent"},"label":{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"gettext","line":126,"character":17},"arguments":["Firmware"]},"icon":"c8y-firmware","priority":500,"canActivate":[{"__symbolic":"reference","name":"FirmwareDeviceTabGuard"}]},{"path":"software","component":{"__symbolic":"reference","name":"SoftwareListComponent"}},{"path":"software/:id","component":{"__symbolic":"reference","name":"SoftwareDetailsComponent"}},{"context":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"ViewContext","line":140,"character":19},"member":"Device"},"path":"software","component":{"__symbolic":"reference","name":"SoftwareDeviceTabComponent"},"label":{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"gettext","line":143,"character":17},"arguments":["Software"]},"icon":"c8y-tools","priority":499,"canActivate":[{"__symbolic":"reference","name":"SoftwareDeviceTabGuard"}]},{"path":"configuration","component":{"__symbolic":"reference","name":"ConfigurationListComponent"}},{"context":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"ViewContext","line":153,"character":19},"member":"Device"},"path":"device-configuration","component":{"__symbolic":"reference","name":"DeviceConfigurationComponent"},"label":{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"gettext","line":156,"character":17},"arguments":["Configuration"]},"icon":"gears","priority":600,"canActivate":[{"__symbolic":"reference","name":"DeviceConfigurationGuard"}]}],"multi":true}]}]}],"members":{}},"RepositoryService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":54,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":61,"character":23},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryBinaryService","line":62,"character":29},{"__symbolic":"reference","module":"@c8y/client","name":"OperationService","line":63,"character":23},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":64,"character":19},{"__symbolic":"reference","module":"@c8y/client","name":"EventService","line":65,"character":19},{"__symbolic":"reference","module":"@c8y/client","name":"Realtime","line":66,"character":22},{"__symbolic":"reference","module":"@c8y/client","name":"EventBinaryService","line":67,"character":25}]}],"listRepositoryEntries":[{"__symbolic":"method"}],"save":[{"__symbolic":"method"}],"create":[{"__symbolic":"method"}],"createFirmwareOrSoftware":[{"__symbolic":"method"}],"saveBinary":[{"__symbolic":"method"}],"createOrUpdateRepositoryEntry":[{"__symbolic":"method"}],"createRepositoryBinary":[{"__symbolic":"method"}],"prepareRepositoryBinaryMO":[{"__symbolic":"method"}],"linkBinary":[{"__symbolic":"method"}],"cleanUp":[{"__symbolic":"method"}],"delete":[{"__symbolic":"method"}],"errorMsg":[{"__symbolic":"method"}],"getBaseVersionsCount$":[{"__symbolic":"method"}],"getBaseVersionFromMO":[{"__symbolic":"method"}],"isPatch":[{"__symbolic":"method"}],"getPatchVersionsCount$":[{"__symbolic":"method"}],"isLegacyEntry":[{"__symbolic":"method"}],"listAllVersions":[{"__symbolic":"method"}],"listBaseVersions":[{"__symbolic":"method"}],"listPatchVersions":[{"__symbolic":"method"}],"listBaseVersionAndPatches":[{"__symbolic":"method"}],"listChildren":[{"__symbolic":"method"}],"fetchAllItemsFromList":[{"__symbolic":"method"}],"getRepositoryEntryMO$":[{"__symbolic":"method"}],"getRepositoryBinaryMoByVersion":[{"__symbolic":"method"}],"getBinaryName$":[{"__symbolic":"method"}],"getDeviceTypeQuery":[{"__symbolic":"method"}],"getConfigurationTypeQuery":[{"__symbolic":"method"}],"getDeviceSoftwareList":[{"__symbolic":"method"}],"createSoftwareUpdateOperation":[{"__symbolic":"method"}],"getSoftwareUpdateOperation":[{"__symbolic":"method"}],"getDeviceSoftwareChangesFromOperation":[{"__symbolic":"method"}],"createFirmwareUpdateOperation":[{"__symbolic":"method"}],"getFirmwareUpdateOperation":[{"__symbolic":"method"}],"getUploadConfigurationFileOperation":[{"__symbolic":"method"}],"getDownloadConfigurationFileOperation":[{"__symbolic":"method"}],"getLastFirmwareUpdateOperation":[{"__symbolic":"method"}],"getLastSoftwareUpdateOperation":[{"__symbolic":"method"}],"getFirstMatchingOperation":[{"__symbolic":"method"}],"createObservedOperation":[{"__symbolic":"method"}],"observeOperation":[{"__symbolic":"method"}],"getLatestConfigurationEvent":[{"__symbolic":"method"}],"getConfigFileOperationList":[{"__symbolic":"method"}],"getConfigSnapshot":[{"__symbolic":"method"}],"getLegacyConfigSnapshot":[{"__symbolic":"method"}],"getBinaryText":[{"__symbolic":"method"}],"getBinaryFile":[{"__symbolic":"method"}],"getLastConfigUpdateOperation":[{"__symbolic":"method"}],"createTextBasedConfigurationReloadOperation":[{"__symbolic":"method"}],"createTextBasedConfigurationUpdateOperation":[{"__symbolic":"method"}],"getBinary":[{"__symbolic":"method"}],"getSnapshotsFromRepository":[{"__symbolic":"method"}],"getInternalBinaryResponse":[{"__symbolic":"method"}],"getExternalBinaryResponse":[{"__symbolic":"method"}],"createEntry":[{"__symbolic":"method"}],"updateEntry":[{"__symbolic":"method"}],"getBaseVersionResultListForLegacyEntry":[{"__symbolic":"method"}],"getDeviceSoftwareChangesFromSoftwareListOperation":[{"__symbolic":"method"}],"getDeviceSoftwareChangesFromSoftwareOperation":[{"__symbolic":"method"}]}},"RepositoryType":{"FIRMWARE":"c8y_Firmware","SOFTWARE":"c8y_Software","CONFIGURATION":"c8y_ConfigurationDump"},"REPOSITORY_BINARY_TYPES":{"__symbolic":"error","message":"Expression form not supported","line":9,"character":2,"module":"./repository.model"},"ModalModel":{"__symbolic":"interface"},"RepositoryCategory":{"__symbolic":"interface"},"FirmwareBinary":{"__symbolic":"interface"},"FirmwarePatchBinary":{"__symbolic":"interface"},"SoftwareBinary":{"__symbolic":"interface"},"RepositoryBinary":{"__symbolic":"interface"},"SelectedRepositoryBinary":{"__symbolic":"interface"},"DeviceFirmware":{"__symbolic":"interface"},"DeviceSoftware":{"__symbolic":"interface"},"DeviceSoftwareChange":{"__symbolic":"interface"},"ConfigurationSnapshot":{"__symbolic":"interface"},"SupportedConfigurationItem":{"__symbolic":"interface"},"DeviceConfigurationListEmptyState":{"__symbolic":"interface"},"DeviceConfigurationOperation":{"UPLOAD_CONFIG":"c8y_UploadConfigFile","DOWNLOAD_CONFIG":"c8y_DownloadConfigFile","CONFIG":"c8y_Configuration","SEND_CONFIG":"c8y_SendConfiguration"},"RepositoryNavigationFactory":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":3,"character":1}}],"members":{"get":[{"__symbolic":"method"}]}},"SoftwareListComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":19,"character":1},"arguments":[{"selector":"c8y-software-list","template":"<c8y-title>\n {{ 'Software repository' | translate }}\n</c8y-title>\n\n<c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form\">\n <div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n type=\"search\"\n title=\"{{ 'Filter software…' | translate }}\"\n placeholder=\"{{ 'Filter software…' | translate }}\"\n [ngModel]=\"textFilter$ | async\"\n (ngModelChange)=\"textFilter$.next($event)\"\n />\n <span class=\"input-group-addon\">\n <i c8yIcon=\"search\" *ngIf=\"(textFilter$ | async).length === 0\"></i>\n <i\n class=\"text-muted\"\n c8yIcon=\"times\"\n *ngIf=\"(textFilter$ | async).length > 0\"\n (click)=\"textFilter$.next('')\"\n ></i>\n </span>\n </div>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" title=\"{{ 'Add software' | translate }}\" (click)=\"addSoftware()\">\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add software' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" title=\"{{ 'Reload' | translate }}\" (click)=\"reload$.next()\">\n <i [ngClass]=\"{ 'icon-spin': reloading }\" c8yIcon=\"refresh\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<!-- empty state-->\n<div\n class=\"c8y-empty-state text-center\"\n *ngIf=\"(softwares$ | async)?.data.length === 0 && (textFilter$ | async)?.length === 0\"\n>\n <h1 class=\"c8y-icon-duocolor\" c8yIcon=\"c8y-tools\"></h1>\n <h3 translate>\n No software to display.\n </h3>\n <p translate>\n Add a new software by clicking below.\n </p>\n <p>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add software' | translate }}\"\n (click)=\"addSoftware()\"\n translate\n >\n Add software\n </button>\n </p>\n</div>\n\n<!-- no results empty state -->\n<div\n class=\"c8y-empty-state\"\n *ngIf=\"(softwares$ | async)?.data.length === 0 && (textFilter$ | async)?.length > 0\"\n>\n <h1 class=\"c8y-icon-duocolor\" c8yIcon=\"search\"></h1>\n <h3 translate>\n No results to display.\n </h3>\n <p translate>\n Refine your search terms or check your spelling.\n </p>\n</div>\n\n<!-- apply the class 'dd-low' when the list contains less than 10 records-->\n<c8y-list-group\n class=\"m-b-24\"\n *ngIf=\"(softwares$ | async)?.data.length > 0\"\n [ngClass]=\"{ 'dd-low': (softwares$ | async)?.data.length < 10 }\"\n>\n <c8y-li class=\"page-sticky-header c8y-list__item--empty-actions hidden-xs\">\n <c8y-li-icon><i class=\"fa\"></i></c8y-li-icon>\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-3\">\n {{ 'Software' | translate }}\n </div>\n <div class=\"col-4\">\n {{ 'Description' | translate }}\n </div>\n <div class=\"col-3\">\n {{ 'Device type' | translate }}\n </div>\n <div class=\"col-2\">\n {{ 'Versions' | translate }}\n </div>\n </c8y-li-body>\n </c8y-li>\n <c8y-li *c8yFor=\"let software of softwares$ | async; let i = index; loadMore: 'auto'\">\n <c8y-li-icon>\n <i c8yIcon=\"c8y-tools\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-60\">\n <button class=\"btn-clean col-3\" (click)=\"editSoftware(software)\">\n <span class=\"text-truncate\" title=\"{{ software.name }}\">\n {{ software.name }}\n </span>\n </button>\n\n <div class=\"col-4\">\n <p class=\"text-truncate\" title=\"{{ software.description }}\">\n <span class=\"text-label-small m-r-4 visible-xs-inline\">\n {{ 'Description' | translate }}\n </span>\n <span *ngIf=\"software.description; else emptyDescription\">\n {{ software.description }}\n </span>\n </p>\n <ng-template #emptyDescription>\n <small class=\"text-muted\">\n <em>{{ 'No description' | translate }}</em>\n </small>\n </ng-template>\n </div>\n\n <div class=\"col-3\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Device type' | translate }}: {{ software.c8y_Filter?.type || '-' }}\"\n >\n <span class=\"text-label-small m-r-8 visible-xs-inline\" translate>\n Device type\n </span>\n <span *ngIf=\"software.c8y_Filter?.type; else emptyText\">\n {{ software.c8y_Filter?.type }}\n </span>\n <ng-template #emptyText>\n <small class=\"text-muted\">\n <em>{{ 'Undefined' | translate }}</em>\n </small>\n </ng-template>\n </div>\n </div>\n\n <div class=\"col-2\">\n <span class=\"label label-warning flex-item-right-sm\" *ngIf=\"isLegacy(software)\">\n <span translate>\n Legacy\n </span>\n </span>\n <span *ngIf=\"!isLegacy(software)\">\n <span *ngIf=\"(getBaseVersionsCount$(software) | async) === null\">\n <span class=\"label label-info flex-item-right-sm\">\n <i class=\"icon-spin\" c8yIcon=\"circle-o-notch\"></i>\n </span>\n </span>\n <span *ngIf=\"(getBaseVersionsCount$(software) | async) !== null\">\n <span [ngPlural]=\"getBaseVersionsCount$(software) | async\">\n <ng-template ngPluralCase=\"=0\">\n <span class=\"label label-default flex-item-right-sm\">\n <span translate>\n No versions\n </span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"=1\">\n <span class=\"label label-info flex-item-right-sm\">\n <span translate>\n 1 version\n </span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span class=\"label label-info flex-item-right-sm\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: getBaseVersionsCount$(software) | async }\"\n >\n {{ count }} versions\n </span>\n </span>\n </ng-template>\n </span>\n </span>\n </span>\n </div>\n </c8y-li-body>\n\n <c8y-li-action (click)=\"editSoftware(software)\" icon=\"pencil\">\n {{ 'Edit' | translate }}\n </c8y-li-action>\n <c8y-li-action (click)=\"deleteSoftware(software)\" icon=\"trash\">\n {{ 'Delete' | translate }}\n </c8y-li-action>\n </c8y-li>\n</c8y-list-group>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"ModalService","line":48,"character":26},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":49,"character":28},{"__symbolic":"reference","module":"@ngx-translate/core","name":"TranslateService","line":50,"character":30},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":51,"character":26},{"__symbolic":"reference","module":"@angular/router","name":"Router","line":52,"character":20},{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":53,"character":28}]}],"getSoftwares":[{"__symbolic":"method"}],"addSoftware":[{"__symbolic":"method"}],"editSoftware":[{"__symbolic":"method"}],"deleteSoftware":[{"__symbolic":"method"}],"getBaseVersionsCount$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":98,"character":3},"arguments":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"lodash-es","name":"property","line":98,"character":11},"arguments":["id"]}]}]}],"getDeviceTypeTitle":[{"__symbolic":"method"}]}},"AddSoftwareModalComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":12,"character":1},"arguments":[{"selector":"c8y-add-software-software-modal","template":"<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-tools'\"></i>\n <h4 translate>\n Add software\n </h4>\n </div>\n <div class=\"p-16 text-center separator-bottom\" *ngIf=\"!softwarePreselected\">\n <p class=\"lead m-0\" translate>\n Select or create new software\n </p>\n </div>\n <form\n class=\"d-contents\"\n autocomplete=\"off\"\n #softwareForm=\"ngForm\"\n (ngSubmit)=\"softwareForm.form.valid && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\">\n <div [hidden]=\"softwarePreselected\">\n <c8y-form-group>\n <label for=\"softwareName\" translate>Software</label>\n <c8y-typeahead\n [(ngModel)]=\"model.selected\"\n name=\"softwareName\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n (onSearch)=\"onInput.next($event)\"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"\n let software of softwaresResult;\n loadMore: 'auto';\n notFound: notFoundTemplate\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"onSoftwareSelect(software)\"\n [active]=\"model.selected === software\"\n >\n <c8y-highlight\n [text]=\"software.name || '--'\"\n [pattern]=\"onInput | async\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li class=\"bg-gray-lighter p-8\" *ngIf=\"(onInput | async)?.length > 0\">\n <span translate>No match found, add new`software`? </span>\n <button\n title=\"{{ 'Create new`software`' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary btn-xs m-l-16\"\n translate\n >\n Create new`software`\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"softwareDescription\" translate>Description</label>\n <input\n id=\"softwareDescription\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"model.description\"\n placeholder=\"{{ 'e.g. Cloud connectivity software' | translate }}\"\n [disabled]=\"model.selected?.id\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"softwareDeviceTypeFilter\" translate>Device type filter</label>\n <input\n id=\"softwareDeviceTypeFilter\"\n class=\"form-control\"\n name=\"softwareDeviceTypeFilter\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n [(ngModel)]=\"model.deviceType\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n [disabled]=\"model.selected?.id\"\n />\n </c8y-form-group>\n </div>\n\n <c8y-form-group>\n <label for=\"softwareVersion\" translate>Version</label>\n <input\n id=\"softwareVersion\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"version\"\n [(ngModel)]=\"model.version\"\n placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Software file</div>\n <c8y-file-picker [maxAllowedFiles]=\"1\" (onFilesPicked)=\"onFile($event)\" [fileUrlPopover]=\"textForSoftwareUrlPopover\">\n </c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n translate\n >\n Cancel\n </button>\n\n <button\n title=\"{{ 'Add software' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !softwareForm.form.valid ||\n softwareForm.form.pristine ||\n saving ||\n (!model.binary?.url && !model.binary?.file)\n \"\n translate\n >\n Add software\n </button>\n </div>\n </form>\n</div>\n"}]}],"members":{"form":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":17,"character":3},"arguments":["softwareForm",{"static":false}]}]}],"saved":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":18,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalRef","line":41,"character":19},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":43,"character":19}]}],"ngOnInit":[{"__symbolic":"method"}],"setInitialState":[{"__symbolic":"method"}],"loadSoftwares":[{"__symbolic":"method"}],"getSoftwareResult":[{"__symbolic":"method"}],"save":[{"__symbolic":"method"}],"successMsg":[{"__symbolic":"method"}],"cancel":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"onFile":[{"__symbolic":"method"}],"onSoftwareSelect":[{"__symbolic":"method"}]}},"SoftwareDetailsComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":21,"character":1},"arguments":[{"selector":"c8y-software-details","template":"<c8y-title>\n {{ (software$ | async)?.name }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n path=\"#/software\"\n label=\"{{ 'Software repository' | translate }}\"\n icon=\"c8y-tools\"\n >\n </c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n *ngIf=\"!(isLegacy$ | async)\"\n class=\"btn btn-link\"\n title=\"{{ 'Add software' | translate }}\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add software' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" title=\"{{ 'Reload' | translate }}\" (click)=\"reload$.next()\">\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading$ | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card m-b-4\">\n <div class=\"card-header separator\">\n <h4 class=\"card-title\" translate>\n Name, description and device type filter\n </h4>\n </div>\n <div class=\"card-block\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #nameInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(software$ | async)?.name\"\n #nameModel=\"ngModel\"\n placeholder=\"{{ 'e.g. My software' | translate }}\"\n required\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n (click)=\"updateSoftware$.next({ name: nameInput.value }); nameModel.reset()\"\n [disabled]=\"nameInput.value.length == 0\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Description' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #descriptionInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(software$ | async)?.description\"\n #descriptionModel=\"ngModel\"\n placeholder=\"{{ 'e.g. Cloud connectivity software' | translate }}\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n (click)=\"\n updateSoftware$.next({ description: descriptionInput.value });\n descriptionModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Device type filter' | translate }}\n\n <a\n class=\"pointer\"\n popover=\"{{\n 'If the filter is set, the software will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n [outsideClick]=\"true\"\n container=\"body\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </a>\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #deviceTypeInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(software$ | async)?.c8y_Filter?.type\"\n #deviceTypeModel=\"ngModel\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n (click)=\"\n updateSoftware$.next({ c8y_Filter: { type: deviceTypeInput.value } });\n deviceTypeModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"card\">\n <div class=\"card-header separator\">\n <h4 class=\"card-title\" translate>\n Versions\n </h4>\n </div>\n\n <div class=\"card-block p-t-0 p-b-24\">\n <div *ngIf=\"(baseVersions$ | async)?.data.length === 0\">\n <div class=\"c8y-empty-state text-center\">\n <h1 c8yIcon=\"c8y-tools\" class=\"c8y-icon-duocolor\"></h1>\n <h3 translate>No versions to display.</h3>\n <p translate>Add a new version by clicking below.</p>\n <p>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add software' | translate }}\"\n (click)=\"addBaseVersion()\"\n translate\n >\n Add software\n </button>\n </p>\n </div>\n </div>\n\n <c8y-list-group \n [ngClass]=\"{'dd-low': (baseVersions$ | async)?.data.length < 10}\"\n *ngIf=\"(baseVersions$ | async)?.data.length > 0\"\n >\n <c8y-li *c8yFor=\"let baseVersion of baseVersions$ | async; let i = index; loadMore: 'auto'\">\n <c8y-li-icon>\n <i c8yIcon=\"c8y-tools\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n <p>{{ baseVersion.c8y_Software.version }}</p>\n </div>\n <div class=\"col-5 \">\n <p class=\"text-truncate\">\n <span class=\"text-label-small m-r-8\" translate>\n File\n </span>\n <span title=\" {{ getBinaryName$(baseVersion.c8y_Software.url) | async }}\">\n <c8y-file-download url=\"{{baseVersion.c8y_Software.url}}\"></c8y-file-download>\n </span>\n </p>\n </div>\n <div class=\"col-2 flex-row\">\n <span *ngIf=\"isLegacy$ | async\" class=\"label label-warning flex-item-right-sm\">\n {{ 'Legacy' | translate }}\n </span>\n\n <div class=\"fit-h-20\" *ngIf=\"!(isLegacy$ | async)\">\n <button\n class=\"btn btn-danger btn-xs visible-xs flex-item-right m-r-8 m-t-8\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n title=\"{{ 'Delete' | translate }}\"\n >\n <i c8yIcon=\"minus-circle\"></i> {{ 'Delete' | translate }}\n </button>\n </div>\n </div>\n <div *ngIf=\"!(isLegacy$ | async)\" class=\"flex-item-right fit-h-20 p-r-8 hidden-xs\">\n <button\n class=\"btn btn-dot text-danger showOnHover\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n title=\"{{ 'Delete' | translate }}\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </div>\n</div>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":66,"character":28},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":67,"character":30},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":69,"character":26},{"__symbolic":"reference","module":"@ngx-translate/core","name":"TranslateService","line":70,"character":30},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"ModalService","line":71,"character":26},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":72,"character":28}]}],"ngOnInit":[{"__symbolic":"method"}],"getBinaryName$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":93,"character":3}}]}],"addBaseVersion":[{"__symbolic":"method"}],"deleteBaseVersion":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}]}},"TextBasedConfigurationComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":9,"character":1},"arguments":[{"selector":"c8y-text-based-configuration","template":"<div class=\"d-flex d-col fit-h\">\n <fieldset *ngIf=\"latestOperation !== undefined\" class=\"card-block bg-gray-white fit-w\">\n <div class=\"content-flex-50\">\n <c8y-single-operation [operation]=\"latestOperation\" class=\"flex-grow\"></c8y-single-operation>\n <div class=\"flex-item-right d-flex\">\n <button\n title=\"{{ 'Get snapshot from device' | translate }}\"\n type=\"button\"\n class=\"btn btn-default btn-sm flex-item-v-center m-t-8 m-b-8\"\n *ngIf=\"showTextBasedConfigReload\"\n (click)=\"reloadConfiguration()\"\n [disabled]=\"reloadingConfig || savingConfig\"\n >\n <i\n c8yIcon=\"refresh\"\n *ngIf=\"reloadingConfig\"\n class=\"m-r-4\"\n [ngClass]=\"{ 'icon-spin': reloadingConfig }\"\n ></i>\n <i c8yIcon=\"download\" *ngIf=\"!reloadingConfig\" class=\"m-r-4\"></i>\n\n {{ 'Get snapshot from device' | translate }}\n </button>\n </div>\n </div>\n </fieldset>\n <div class=\"card-block flex-grow\">\n <textarea\n [(ngModel)]=\"config\"\n class=\"form-control fit-h\"\n [disabled]=\"reloadingConfig || savingConfig\"\n c8y-spellcheck=\"false\"\n ></textarea>\n </div>\n <div class=\"card-footer fit-w separator\" *ngIf=\"showTextBasedConfigSave\">\n <button\n type=\"button\"\n (click)=\"updateConfiguration(config)\"\n [disabled]=\"reloadingConfig || savingConfig\"\n class=\"btn btn-primary\"\n [ngClass]=\"{ 'btn-pending': savingConfig }\"\n >\n <span title=\"{{ 'Send' | translate }}\" *ngIf=\"!savingConfig\">\n {{ 'Send configuration to device' | translate }}\n </span>\n <span title=\"{{ 'Sending…' | translate }}\" *ngIf=\"savingConfig\">\n {{ 'Sending…' | translate }}\n </span>\n </button>\n </div>\n</div>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":23,"character":19},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":24,"character":26},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","name":"DeviceConfigurationService"},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":27,"character":30}]}],"ngOnInit":[{"__symbolic":"method"}],"loadOperation":[{"__symbolic":"method"}],"reloadConfiguration":[{"__symbolic":"method"}],"updateConfiguration":[{"__symbolic":"method"}],"onOperationReloadSuccess":[{"__symbolic":"method"}],"onOperationReloadError":[{"__symbolic":"method"}],"onOperationReloadComplete":[{"__symbolic":"method"}],"onOperationUpdateSuccess":[{"__symbolic":"method"}],"onOperationUpdateError":[{"__symbolic":"method"}],"onOperationUpdateComplete":[{"__symbolic":"method"}],"loadDevice":[{"__symbolic":"method"}]}},"DeviceConfigurationGuard":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":5,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"DeviceConfigurationService"}]}],"canActivate":[{"__symbolic":"method"}]}},"ConfigurationFilterPipe":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Pipe","line":3,"character":1},"arguments":[{"name":"configurationFilterPipe"}]}],"members":{"transform":[{"__symbolic":"method"}],"filterContainString":[{"__symbolic":"method"}]}},"ConfigurationPreviewComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":19,"character":1},"arguments":[{"selector":"c8y-device-configuration-preview","template":"<div class=\"content-flex-55 p-b-16\">\n <div class=\"col-7 p-t-4\">\n <p>\n <span class=\"text-label-small text-uppercase m-r-4\" translate>Configuration</span>\n <span *ngIf=\"configSnapshot?.name; else emptyText\">\n <strong>{{ configSnapshot.name }}</strong>\n </span>\n <ng-template #emptyText> --- </ng-template>\n </p>\n <p>\n <span class=\"text-label-small text-uppercase m-r-4\" translate>Last updated</span>\n <small *ngIf=\"configSnapshot?.time; else emptyDate\">\n {{ configSnapshot.time | c8yDate }}\n </small>\n <ng-template #emptyDate> --- </ng-template>\n </p>\n </div>\n <div class=\"col-5\">\n <button\n class=\"btn btn-default btn-sm pull-right\"\n type=\"button\"\n title=\"{{ actionButtonText | translate }}\"\n (click)=\"createDeviceOperation()\"\n [disabled]=\"isCreateOperationDisabled()\"\n *ngIf=\"canCallAction\"\n >\n <i [c8yIcon]=\"actionButtonIcon\"></i> {{ actionButtonText | translate }}\n </button>\n </div>\n</div>\n<div class=\"c8y-empty-state text-left\" *ngIf=\"!configSnapshot?.binary && showBinary()\">\n <h1 [c8yIcon]=\"'file-image-o'\"></h1>\n <p>\n <strong translate>No preview available.</strong><br />\n <small *ngIf=\"configSnapshot?.binary !== ''; else emptyFile\" translate\n >The file is not available.</small\n >\n <ng-template #emptyFile>\n <small translate>The file is empty.</small>\n </ng-template>\n </p>\n</div>\n<div *ngIf=\"configSnapshot?.binary && showBinary()\" class=\"flex-grow d-flex d-col\">\n <c8y-source-code-preview\n [text]=\"configSnapshot.binary\"\n [isDisabled]=\"true\"\n class=\"d-contents\"\n ></c8y-source-code-preview>\n <div *ngIf=\"canSaveSnapshot\" class=\"p-t-16\">\n <button\n type=\"button\"\n class=\"btn btn-primary btn-sm pull-right m-l-8\"\n (click)=\"download()\"\n translate\n >\n Download\n </button>\n <button\n *ngIf=\"hasPermission()\"\n type=\"button\"\n class=\"btn btn-default btn-sm pull-right\"\n (click)=\"saveToRepository()\"\n translate\n >\n Save to repository\n </button>\n </div>\n</div>\n<div *ngIf=\"showOperation()\">\n <c8y-single-operation [operation]=\"operation\"></c8y-single-operation>\n</div>\n"}]}],"members":{"device":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":24,"character":3}}]}],"configurationType":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":25,"character":3}}]}],"configSnapshot":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":32,"character":3}}]}],"canSaveSnapshot":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":33,"character":3}}]}],"actionButtonText":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":34,"character":3}}]}],"actionButtonIcon":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":35,"character":3}}]}],"isLegacy":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":36,"character":3}}]}],"operationToTrigger":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":37,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"DeviceConfigurationService"},{"__symbolic":"reference","module":"@c8y/client","name":"Realtime","line":49,"character":22},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":50,"character":21},{"__symbolic":"reference","module":"@c8y/client","name":"UserService","line":51,"character":18},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AppStateService","line":52,"character":22},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/client","name":"OperationService","line":54,"character":30},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":55,"character":26}]}],"ngOnInit":[{"__symbolic":"method"}],"setOperation":[{"__symbolic":"method"}],"createDeviceOperation":[{"__symbolic":"method"}],"showOperation":[{"__symbolic":"method"}],"showBinary":[{"__symbolic":"method"}],"isCreateOperationDisabled":[{"__symbolic":"method"}],"updatePreview":[{"__symbolic":"method"}],"download":[{"__symbolic":"method"}],"saveToRepository":[{"__symbolic":"method"}],"hasPermission":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"updateSnapshotsOnConfigUpload":[{"__symbolic":"method"}]}},"DeviceConfigurationComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":13,"character":1},"arguments":[{"selector":"c8y-device-configuration","template":"<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" title=\"{{ 'Reload' | translate }}\" (click)=\"updateSnapshots()\">\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage card-has-tabs\">\n <tabset>\n <div class=\"card-header separator\" *ngIf=\"showBinaryBasedConfig && !showTextBasedConfig\">\n <h4 class=\"card-title\">{{ 'Configurations' | translate }}</h4>\n </div>\n <div class=\"card-header separator\" *ngIf=\"!showBinaryBasedConfig && showTextBasedConfig\">\n <h4 class=\"card-title\">{{ 'Text-based configuration' | translate }}</h4>\n </div>\n <tab heading=\"{{ 'Configurations' | translate }}\" *ngIf=\"showBinaryBasedConfig\">\n <div class=\"card--grid card grid__col--4-8--md grid__row--6-6--md m-b-0\">\n <!-- DEVICE SUPPORTED CONFIGURATIONS -->\n <div class=\"card--grid__inner-scroll\">\n <div class=\"card-block\">\n <h5 class=\"legend form-block\">\n <span translate>Device-supported configurations</span>\n </h5>\n </div>\n <div class=\"p-r-16\">\n <c8y-device-configuration-list\n [items]=\"supportedConfigurations\"\n [itemIcon]=\"'gears'\"\n (configSelected)=\"onConfigTypeSelected($event)\"\n ></c8y-device-configuration-list>\n </div>\n </div>\n\n <!-- CONFIGURATION PREVIEW -->\n <div class=\"card--grid__inner-scroll d-flex d-col flex-grow bg-gray-lighter\">\n <div class=\"card-block d-flex d-col flex-grow\">\n <h5 class=\"legend form-block\"><span translate>Preview</span></h5>\n\n <!-- EMPTY STATE -->\n <div class=\"c8y-empty-state text-left\" *ngIf=\"!configurationType\">\n <h1 [c8yIcon]=\"'file-text'\"></h1>\n <p>\n <strong translate>No configuration selected.</strong><br />\n <small translate>Select a configuration to preview</small>\n </p>\n </div>\n\n <!-- PREVIEW AVAILABLE STATE -->\n <c8y-device-configuration-preview\n *ngIf=\"configurationType\"\n [device]=\"device\"\n [configurationType]=\"configurationType\"\n [configSnapshot]=\"configSnapshot\"\n [canSaveSnapshot]=\"true\"\n [operationToTrigger]=\"'c8y_UploadConfigFile'\"\n [actionButtonText]=\"'Get snapshot from device' | translate\"\n [actionButtonIcon]=\"'download'\"\n [isLegacy]=\"isLegacy\"\n class=\"d-flex d-col flex-grow\"\n ></c8y-device-configuration-preview>\n </div>\n </div>\n\n <!-- AVAILABLE SUPPORTED CONFIGURATIONS -->\n <div class=\"card--grid__inner-scroll\">\n <div class=\"card-block\">\n <h5 class=\"legend form-block\" translate>Available supported configurations</h5>\n </div>\n\n <!-- EMPTY STATE -->\n <div class=\"c8y-empty-state text-left\" *ngIf=\"!configurationType\">\n <h1 [c8yIcon]=\"'gears'\"></h1>\n <p>\n <strong translate>No selection</strong><br />\n <small translate\n >Select a configuration from the device-supported configuration list</small\n >\n </p>\n </div>\n <div class=\"p-r-16\" *ngIf=\"configurationType\">\n <c8y-device-configuration-list\n [items]=\"repositorySnapshots\"\n [itemIcon]=\"'file-text'\"\n [emptyState]=\"repositorySnapshotsEmptyState\"\n [isFilterEnabled]=\"true\"\n (configSelected)=\"onRepositoryConfigSelected($event)\"\n ></c8y-device-configuration-list>\n </div>\n </div>\n\n <!-- CONFIGURATION PREVIEW -->\n <div class=\"card--grid__inner-scroll bg-gray-lighter d-flex d-col flex-grow\">\n <div class=\"card-block flex-grow d-flex d-col\">\n <h5 class=\"legend form-block\" translate>Preview</h5>\n\n <!-- EMPTY STATE -->\n\n <div class=\"c8y-empty-state text-left\" *ngIf=\"!repositorySnapshot\">\n <h1 [c8yIcon]=\"'file-text'\"></h1>\n <p>\n <strong translate>No configuration selected.</strong><br />\n <small *ngIf=\"!configurationType; else noSnapshot\" translate\n >Select a configuration to preview</small\n >\n <ng-template #noSnapshot>\n <small translate>Select the configuration you want to preview</small>\n </ng-template>\n </p>\n </div>\n\n <!-- CONFIGURATION SELECTED STATE -->\n <c8y-device-configuration-preview\n *ngIf=\"repositorySnapshot\"\n [device]=\"device\"\n [configurationType]=\"configurationType\"\n [configSnapshot]=\"repositorySnapshot\"\n [operationToTrigger]=\"'c8y_DownloadConfigFile'\"\n [actionButtonText]=\"'Send configuration to device' | translate\"\n [actionButtonIcon]=\"'upload'\"\n [isLegacy]=\"isLegacy\"\n class=\"d-flex d-col flex-grow\"\n ></c8y-device-configuration-preview>\n </div>\n </div>\n </div>\n </tab>\n <tab heading=\"{{ 'Text-based configuration' | translate }}\" *ngIf=\"showTextBasedConfig\">\n <c8y-text-based-configuration *ngIf=\"showTextBasedConfig\"></c8y-text-based-configuration>\n </tab>\n </tabset>\n</div>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":31,"character":19},{"__symbolic":"reference","name":"DeviceConfigurationService"},{"__symbolic":"reference","module":"@c8y/client","name":"Realtime","line":33,"character":22},{"__symbolic":"reference","name":"RepositoryService"}]}],"ngOnInit":[{"__symbolic":"method"}],"onConfigTypeSelected":[{"__symbolic":"method"}],"onRepositoryConfigSelected":[{"__symbolic":"method"}],"updateSnapshots":[{"__symbolic":"method"}]}},"SaveToRepositoryComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":6,"character":1},"arguments":[{"selector":"c8y-save-config-to-configuration-repository","template":"<div class=\"modal-header bg-primary text-center text-white\">\n <div style=\"font-size: 62px;\">\n <span c8yIcon=\"gears\"></span>\n </div>\n <h4 class=\"text-uppercase\" translate>\n Save configuration\n </h4>\n</div>\n<div class=\"modal-body\">\n <form #saveConfigurationSnapshot=\"ngForm\" class=\"p-t-24\">\n <c8y-form-group>\n <label translate for=\"name\">Name</label>\n <input\n id=\"name\"\n type=\"text\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"name\"\n [(ngModel)]=\"configSnapshot.name\"\n required\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"deviceType\">Device type</label>\n <input\n id=\"deviceType\"\n class=\"form-control\"\n rows=\"6\"\n name=\"deviceType\"\n [(ngModel)]=\"configSnapshot.deviceType\"\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"description\">Description</label>\n <input\n type=\"text\"\n id=\"description\"\n class=\"form-control\"\n maxlength=\"254\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"configSnapshot.description\"\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"configurationType\">Configuration type</label>\n <input\n id=\"configurationType\"\n class=\"form-control\"\n rows=\"6\"\n name=\"configurationType\"\n [(ngModel)]=\"configSnapshot.configurationType\"\n />\n </c8y-form-group>\n </form>\n</div>\n<div class=\"modal-footer\">\n <button title=\"{{ 'Cancel' | translate }}\" class=\"btn btn-default\" (click)=\"close()\" translate>\n Cancel\n </button>\n\n <button\n title=\"{{ 'Save configuration to repository' | translate }}\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"saveConfigurationSnapshot.form.invalid\"\n translate\n >\n Save\n </button>\n</div>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalRef","line":20,"character":19},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":21,"character":26},{"__symbolic":"reference","name":"RepositoryService"}]}],"save":[{"__symbolic":"method"}],"close":[{"__symbolic":"method"}]}},"AddFirmwarePatchModalComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":20,"character":1},"arguments":[{"selector":"c8y-add-firmware-patch-modal.component","template":"<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-firmware'\"></i>\n <h4 translate>\n Add firmware patch\n </h4>\n </div>\n <div class=\"p-16 text-center separator-bottom\">\n <p class=\"lead m-0\" translate>\n Select a firmware version\n </p>\n </div>\n\n <form\n class=\"d-contents\"\n autocomplete=\"off\"\n #firmwarePatchForm=\"ngForm\"\n (ngSubmit)=\"firmwarePatchForm.form.valid && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\">\n <div [hidden]=\"firmwarePreselected\">\n <c8y-form-group>\n <label for=\"firmwareName\" translate>Firmware</label>\n <c8y-typeahead\n [ngModel]=\"model.selected\"\n name=\"firmwareName\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n (onSearch)=\"firmwareInput$.next($event)\"\n [allowFreeEntries]=\"false\"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"let firmware of firmwares$ | async; loadMore: 'auto'\"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"model.selected = firmware; firmwareSelected$.next(firmware)\"\n [active]=\"model.selected === firmware\"\n >\n <c8y-highlight\n [text]=\"firmware.name || '--'\"\n [pattern]=\"firmwareInput$ | async\"\n ></c8y-highlight>\n </c8y-li>\n </c8y-typeahead>\n <c8y-messages\n ><c8y-message\n name=\"notExisting\"\n [text]=\"'Select one of the existing firmwares.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <c8y-form-group>\n <label for=\"patchDependency\" class=\"m-r-8\" translate>Version</label>\n <c8y-typeahead\n [ngModel]=\"model.dependency\"\n name=\"patchDependency\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n (onSearch)=\"patchDependencyInput$.next($event)\"\n [displayProperty]=\"'c8y_Firmware.version'\"\n [allowFreeEntries]=\"false\"\n [disabled]=\"\n (baseVersions$ | async) === null || (baseVersions$ | async)?.data.length === 0\n \"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"\n let baseVersion of baseVersions$;\n loadMore: 'auto';\n pipe: baseVersionsFilterPipe\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"model.dependency = baseVersion\"\n [active]=\"model.dependency === baseVersion\"\n >\n <c8y-highlight\n [text]=\"baseVersion.c8y_Firmware.version || '--'\"\n [pattern]=\"patchDependencyInput$ | async\"\n ></c8y-highlight>\n </c8y-li>\n </c8y-typeahead>\n <c8y-messages\n ><c8y-message\n name=\"notExisting\"\n [text]=\"'Select one of the existing versions.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"patchVersion\" translate>Patch</label>\n <input\n id=\"patchVersion\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"patchVersion\"\n [(ngModel)]=\"model.patchVersion\"\n placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n required\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Patch file</div>\n <c8y-file-picker [maxAllowedFiles]=\"1\" (onFilesPicked)=\"onFile($event)\" [fileUrlPopover]=\"textForFirmwareUrlPopover\">\n </c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n translate\n >\n Cancel\n </button>\n <button\n title=\"{{ 'Add firmware patch' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !firmwarePatchForm.form.valid ||\n firmwarePatchForm.form.pristine ||\n (!model.binary?.url && !model.binary?.file) ||\n saving\n \"\n translate\n >\n Add firmware patch\n </button>\n </div>\n </form>\n</div>\n"}]}],"members":{"saved":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":25,"character":3}}]}],"dropdown":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":27,"character":3},"arguments":["dropdown",{"static":false}]}]}],"form":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":28,"character":3},"arguments":["firmwarePatchForm",{"static":false}]}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalRef","line":97,"character":19},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":99,"character":19}]}],"ngOnInit":[{"__symbolic":"method"}],"setInitialState":[{"__symbolic":"method"}],"save":[{"__symbolic":"method"}],"successMsg":[{"__symbolic":"method"}],"cancel":[{"__symbolic":"method"}],"onFile":[{"__symbolic":"method"}]}},"AddFirmwareModalComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":12,"character":1},"arguments":[{"selector":"c8y-add-firmware-software-modal","template":"<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-firmware'\"></i>\n <h4 translate>\n Add firmware\n </h4>\n </div>\n <div class=\"p-16 text-center separator-bottom\" *ngIf=\"!firmwarePreselected\">\n <p class=\"lead m-0\" translate>\n Select or create new firmware\n </p>\n </div>\n <form\n class=\"d-contents\"\n autocomplete=\"off\"\n #firmwareForm=\"ngForm\"\n (ngSubmit)=\"firmwareForm.form.valid && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\">\n <div [hidden]=\"firmwarePreselected\">\n <c8y-form-group>\n <label for=\"firmwareName\" translate>Firmware</label>\n <c8y-typeahead\n [(ngModel)]=\"model.selected\"\n name=\"firmwareName\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n (onSearch)=\"onInput.next($event)\"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"\n let firmware of firmwaresResult;\n loadMore: 'auto';\n notFound: notFoundTemplate\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"onFirmwareSelect(firmware)\"\n [active]=\"model.selected === firmware\"\n >\n <c8y-highlight\n [text]=\"firmware.name || '--'\"\n [pattern]=\"onInput | async\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li class=\"bg-gray-lighter p-8\" *ngIf=\"(onInput | async)?.length > 0\">\n <span translate>No match found, add new`firmware`? </span>\n <button\n title=\"{{ 'Create new`firmware`' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary btn-xs m-l-16\"\n translate\n >\n Create new`firmware`\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"firmwareDescription\" translate>Description</label>\n <input\n id=\"firmwareDescription\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"model.description\"\n placeholder=\"{{ 'e.g. Firmware for hardware revision b' | translate }}\"\n [disabled]=\"model.selected?.id\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"firmwareDeviceTypeFilter\" translate>Device type filter</label>\n <input\n id=\"firmwareDeviceTypeFilter\"\n class=\"form-control\"\n name=\"firmwareDeviceTypeFilter\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n [(ngModel)]=\"model.deviceType\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n [disabled]=\"model.selected?.id\"\n />\n </c8y-form-group>\n </div>\n\n <c8y-form-group>\n <label for=\"firmwareVersion\" translate>Version</label>\n <input\n id=\"firmwareVersion\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"version\"\n [(ngModel)]=\"model.version\"\n placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Firmware file</div>\n <c8y-file-picker [maxAllowedFiles]=\"1\" (onFilesPicked)=\"onFile($event)\" [fileUrlPopover]=\"textForFirmwareUrlPopover\">\n </c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n translate\n >\n Cancel\n </button>\n\n <button\n title=\"{{ 'Add firmware' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !firmwareForm.form.valid ||\n firmwareForm.form.pristine ||\n saving ||\n (!model.binary?.url && !model.binary?.file)\n \"\n translate\n >\n Add firmware\n </button>\n </div>\n </form>\n</div>\n"}]}],"members":{"form":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":17,"character":3},"arguments":["firmwareForm",{"static":false}]}]}],"saved":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":18,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalRef","line":41,"character":19},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":43,"character":19}]}],"ngOnInit":[{"__symbolic":"method"}],"setInitialState":[{"__symbolic":"method"}],"loadFirmwares":[{"__symbolic":"method"}],"getFirmwareResult":[{"__symbolic":"method"}],"save":[{"__symbolic":"method"}],"successMsg":[{"__symbolic":"method"}],"cancel":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"onFile":[{"__symbolic":"method"}],"onFirmwareSelect":[{"__symbolic":"method"}]}},"SourceCodePreviewComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":2,"character":1},"arguments":[{"selector":"c8y-source-code-preview","template":"<textarea [disabled]=\"isDisabled\" class=\"text-monospace form-control no-resize flex-grow\" rows=\"8\">{{ text }}</textarea>\n"}]}],"members":{"isDisabled":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":7,"character":3}}]}],"text":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":8,"character":3}}]}]}},"FirmwareListComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":22,"character":1},"arguments":[{"selector":"c8y-firmware-list","template":"<c8y-title>\n {{ 'Firmware repository' | translate }}\n</c8y-title>\n\n<c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form\">\n <div class=\"input-group input-group-search\">\n <input class=\"form-control\"\n type=\"search\"\n title=\"{{ 'Filter firmware…' | translate }}\"\n placeholder=\"{{ 'Filter firmware…' | translate }}\"\n [ngModel]=\"textFilter$ | async\"\n (ngModelChange)=\"textFilter$.next($event)\"\n />\n <span class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"(textFilter$ | async).length === 0\"\n ></i>\n <i class=\"text-muted\"\n c8yIcon=\"times\"\n *ngIf=\"(textFilter$ | async).length > 0\"\n (click)=\"textFilter$.next('')\"\n ></i>\n </span>\n </div>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" \n title=\"{{ 'Add firmware' | translate }}\"\n (click)=\"addFirmware()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\"\n *ngIf=\"canAddFirmwarePatch$ | async\"\n title=\"{{ 'Add firmware patch' | translate }}\"\n (click)=\"addFirmwarePatch()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware patch' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"reload$.next()\"\n >\n <i c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reloading }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<!-- empty state-->\n<div class=\"c8y-empty-state text-center\"\n *ngIf=\"(firmwares$ | async)?.data.length === 0 && (textFilter$ | async)?.length === 0\"\n>\n <h1 class=\"c8y-icon-duocolor\"\n c8yIcon=\"c8y-firmware\"\n ></h1>\n <h3 translate>\n No firmwares to display.\n </h3>\n <p translate>\n Add a new firmware by clicking below.\n </p>\n <p>\n <button class=\"btn btn-primary\"\n title=\"{{ 'Add firmware' | translate }}\"\n (click)=\"addFirmware()\"\n translate\n >\n Add firmware\n </button>\n </p>\n</div>\n\n<!-- no results empty state -->\n<div class=\"c8y-empty-state\"\n *ngIf=\"(firmwares$ | async)?.data.length === 0 && (textFilter$ | async)?.length > 0\"\n >\n <h1 class=\"c8y-icon-duocolor\"\n c8yIcon=\"search\"></h1>\n <h3 translate>\n No results to display.\n </h3>\n <p translate>\n Refine your search terms or check your spelling.\n </p>\n</div>\n\n<c8y-list-group class=\"m-b-24\"\n *ngIf=\"(firmwares$ | async)?.data.length > 0\"\n [ngClass]=\"{ 'dd-low': (firmwares$ | async)?.data.length < 10 }\"\n \n>\n <c8y-li class=\"page-sticky-header c8y-list__item--empty-actions hidden-xs\">\n <c8y-li-icon>\n <i class=\"fa\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-3\">\n {{'Firmware' | translate}}\n </div>\n <div class=\"col-4\">\n {{'Description' | translate}}\n </div>\n <div class=\"col-3\">\n {{'Device type' | translate}}\n </div>\n <div class=\"col-2\">\n {{'Versions' | translate}}\n </div>\n </c8y-li-body>\n </c8y-li>\n\n <c8y-li *c8yFor=\"let firmware of firmwares$ | async; let i = index; loadMore: 'auto'\">\n <c8y-li-icon icon=\"c8y-firmware\"></c8y-li-icon>\n <c8y-li-body class=\"content-flex-60\">\n <button class=\"btn-clean col-3\"\n (click)=\"editFirmware(firmware)\"\n >\n <span class=\"text-truncate\"\n title=\"{{ firmware.name }}\"\n >\n {{ firmware.name }}\n </span>\n </button>\n <div class=\"col-4\">\n <p class=\"text-truncate\"\n title=\"{{ firmware.description }}\"\n >\n <span class=\"text-label-small m-r-4 visible-xs-inline\">\n {{'Description' | translate }}\n </span>\n <span *ngIf=\"firmware.description; else emptyDescription\">\n {{ firmware.description }}\n </span>\n </p>\n <ng-template #emptyDescription>\n <small class=\"text-muted\">\n <em>{{ 'No description' | translate }}</em>\n </small>\n </ng-template>\n </div>\n <div class=\"col-3\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-r-4 visible-xs-inline\" translate>\n Device type\n </span>\n <span\n *ngIf=\"firmware.c8y_Filter?.type; else emptyText\"\n title=\"{{ firmware.c8y_Filter?.type }}\"\n >\n {{ firmware.c8y_Filter?.type }}\n </span>\n <ng-template #emptyText>\n <small class=\"text-muted\">\n <em>{{ 'Undefined' | translate }}</em>\n </small>\n </ng-template>\n </div>\n </div>\n <div class=\"col-2\">\n <span class=\"label label-warning flex-item-right-sm\"\n *ngIf=\"isLegacy(firmware)\"\n >\n <span translate>\n Legacy\n </span>\n </span>\n\n <span *ngIf=\"!isLegacy(firmware)\">\n <span *ngIf=\"(getBaseVersionsCount$(firmware) | async) === null\">\n <span class=\"label label-info flex-item-right-sm\">\n <i c8yIcon=\"circle-o-notch\" class=\"icon-spin\"></i>\n </span>\n </span>\n <span *ngIf=\"(getBaseVersionsCount$(firmware) | async) !== null\">\n <span [ngPlural]=\"getBaseVersionsCount$(firmware) | async\">\n <ng-template ngPluralCase=\"=0\">\n <span class=\"label label-default flex-item-right-sm\">\n <span translate>\n No versions\n </span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"=1\">\n <span class=\"label label-info flex-item-right-sm\">\n <span translate>\n 1 version\n </span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span class=\"label label-info flex-item-right-sm\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: getBaseVersionsCount$(firmware) | async }\"\n >\n {{ count }} versions\n </span>\n </span>\n </ng-template>\n </span>\n </span>\n </span>\n </div>\n </c8y-li-body>\n\n <c8y-li-action\n (click)=\"editFirmware(firmware)\"\n icon=\"pencil\"\n >\n {{ 'Edit' | translate }}\n </c8y-li-action>\n\n <c8y-li-action\n (click)=\"deleteFirmware(firmware)\"\n icon=\"trash\"\n >\n {{ 'Delete' | translate }}\n </c8y-li-action>\n </c8y-li>\n</c8y-list-group>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"ModalService","line":54,"character":26},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":55,"character":28},{"__symbolic":"reference","module":"@ngx-translate/core","name":"TranslateService","line":56,"character":30},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":57,"character":26},{"__symbolic":"reference","module":"@angular/router","name":"Router","line":58,"character":20},{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":59,"character":28}]}],"getFirmwares":[{"__symbolic":"method"}],"addFirmware":[{"__symbolic":"method"}],"addFirmwarePatch":[{"__symbolic":"method"}],"editFirmware":[{"__symbolic":"method"}],"deleteFirmware":[{"__symbolic":"method"}],"getBaseVersionsCount$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":112,"character":3},"arguments":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"lodash-es","name":"property","line":112,"character":11},"arguments":["id"]}]}]}],"getDeviceTypeTitle":[{"__symbolic":"method"}]}},"FirmwareDetailsComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":24,"character":1},"arguments":[{"selector":"c8y-firmware-details","template":"<c8y-title>\n {{ (firmware$ | async)?.name }}\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n path=\"#/firmware\"\n label=\"{{ 'Firmware repository' | translate }}\"\n icon=\"c8y-firmware\"\n >\n </c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n *ngIf=\"!(isLegacy$ | async)\"\n class=\"btn btn-link\"\n title=\"{{ 'Add firmware' | translate }}\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n *ngIf=\"canAddPatchVersions$ | async\"\n class=\"btn btn-link\"\n title=\"{{ 'Add firmware patch' | translate }}\"\n (click)=\"addPatchVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware patch' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" title=\"{{ 'Reload' | translate }}\" (click)=\"reload$.next()\">\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading$ | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card m-b-4\">\n <div class=\"card-header separator\">\n <h4 class=\"card-title\" translate>\n Name, description and device type filter\n </h4>\n </div>\n <div class=\"card-block\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #nameInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(firmware$ | async)?.name\"\n #nameModel=\"ngModel\"\n placeholder=\"{{ 'e.g. My firmware' | translate }}\"\n required\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n (click)=\"updateFirmware$.next({ name: nameInput.value }); nameModel.reset()\"\n [disabled]=\"nameInput.value.length == 0\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Description' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #descriptionInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(firmware$ | async)?.description\"\n #descriptionModel=\"ngModel\"\n placeholder=\"{{ 'e.g. Firmware for hardware revision b' | translate }}\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n (click)=\"\n updateFirmware$.next({ description: descriptionInput.value });\n descriptionModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Device type filter' | translate }}\n\n <a\n class=\"pointer\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n [outsideClick]=\"true\"\n container=\"body\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </a>\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n #deviceTypeInput\n type=\"text\"\n class=\"form-control\"\n [ngModel]=\"(firmware$ | async)?.c8y_Filter?.type\"\n #deviceTypeModel=\"ngModel\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n (click)=\"\n updateFirmware$.next({ c8y_Filter: { type: deviceTypeInput.value } });\n deviceTypeModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"card\">\n <div class=\"card-header separator\">\n <h4 class=\"card-title\" translate>\n Versions and patches\n </h4>\n </div>\n\n <div class=\"card-block p-t-0 p-b-24\">\n <div *ngIf=\"(baseVersions$ | async)?.data.length === 0\">\n <div class=\"c8y-empty-state text-center\">\n <h1 c8yIcon=\"c8y-firmware\" class=\"c8y-icon-duocolor\"></h1>\n <h3 translate>No versions to display.</h3>\n <p translate>Add a new version by clicking below.</p>\n <p>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add firmware' | translate }}\"\n (click)=\"addBaseVersion()\"\n translate\n >\n Add firmware\n </button>\n </p>\n </div>\n </div>\n\n <c8y-list-group\n [ngClass]=\"{ 'dd-low': (baseVersions$ | async)?.data.length < 10 }\"\n *ngIf=\"(baseVersions$ | async)?.data.length > 0\"\n >\n <c8y-li\n *c8yFor=\"let baseVersion of baseVersions$ | async; let i = index; loadMore: 'auto'\"\n [ngClass]=\"{\n 'c8y-list__item--empty-actions': !(getPatchVersions$(baseVersion) | async)?.data.length\n }\"\n [collapsed]=\"!expanded[baseVersion.id]\"\n (collapsedChange)=\"expanded[baseVersion.id] = !$event\"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n <p>{{ baseVersion.c8y_Firmware.version }}</p>\n </div>\n <div class=\"col-5 \">\n <p class=\"text-truncate\">\n <span class=\"text-label-small m-r-8\" translate>\n File\n </span>\n <span title=\" {{ getBinaryName$(baseVersion.c8y_Firmware.url) | async }}\">\n <c8y-file-download url=\"{{ baseVersion.c8y_Firmware.url }}\"></c8y-file-download>\n </span>\n </p>\n </div>\n <div class=\"col-2 flex-row\">\n <span *ngIf=\"isLegacy$ | async\" class=\"label label-warning flex-item-right-sm\">\n {{ 'Legacy' | translate }}\n </span>\n\n <span *ngIf=\"!(isLegacy$ | async)\">\n <span *ngIf=\"(getPatchVersionsCount$(baseVersion) | async) === null\">\n <span class=\"label label-info\">\n <i c8yIcon=\"circle-o-notch\" class=\"icon-spin\"></i>\n </span>\n </span>\n <span *ngIf=\"(getPatchVersionsCount$(baseVersion) | async) !== null\">\n <span [ngPlural]=\"getPatchVersionsCount$(baseVersion) | async\">\n <ng-template ngPluralCase=\"=0\">\n <span class=\"label label-default flex-item-right-sm\">\n <span translate>No patches</span></span\n >\n </ng-template>\n <ng-template ngPluralCase=\"=1\">\n <span class=\"label label-info\">\n <span translate>1 patch</span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span class=\"label label-info\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: getPatchVersionsCount$(baseVersion) | async }\"\n >{{ count }} patches</span\n ></span\n >\n </ng-template>\n </span>\n </span>\n </span>\n </div>\n <div class=\"fit-h-20 visible-xs\" *ngIf=\"!(isLegacy$ | async)\">\n <button\n class=\"btn btn-danger btn-xs m-t-8 \"\n (click)=\"deleteBaseVersion(baseVersion)\"\n title=\"{{ 'Delete' | translate }}\"\n >\n <i c8yIcon=\"minus-circle\"></i> {{ 'Delete' | translate }}\n </button>\n </div>\n <div *ngIf=\"!(isLegacy$ | async)\" class=\"flex-item-right fit-h-20 p-r-8 hidden-xs\">\n <button\n class=\"btn btn-dot text-danger showOnHover\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n title=\"{{ 'Delete' | translate }}\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n </c8y-li-body>\n <c8y-li-collapse *ngIf=\"(getPatchVersions$(baseVersion) | async)?.data.length\">\n <c8y-list-group class=\"separator-top\">\n <c8y-li\n *c8yFor=\"\n let patchVersion of getPatchVersions$(baseVersion) | async;\n let i = index;\n loadMore: 'auto'\n \"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n {{ patchVersion.c8y_Firmware.version }}\n </div>\n <div class=\"col-5\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-r-8\" translate>\n File\n </span>\n <c8y-file-download\n url=\"{{ patchVersion.c8y_Firmware.url }}\"\n ></c8y-file-download>\n </div>\n </div>\n <div class=\"visible-xs m-t-8\">\n <button\n class=\"btn btn-danger btn-xs\"\n (click)=\"deletePatchVersion(patchVersion)\"\n title=\"{{ 'Delete' | translate }}\"\n >\n <i c8yIcon=\"minus-circle\"></i> {{ 'Delete' | translate }}\n </button>\n </div>\n <div class=\"flex-item-right p-r-8 hidden-xs fit-h-20\">\n <button\n class=\"btn btn-dot text-danger showOnHover\"\n (click)=\"deletePatchVersion(patchVersion)\"\n title=\"{{ 'Delete' | translate }}\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </c8y-li-collapse>\n </c8y-li>\n </c8y-list-group>\n </div>\n</div>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":78,"character":28},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":79,"character":30},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":81,"character":26},{"__symbolic":"reference","module":"@ngx-translate/core","name":"TranslateService","line":82,"character":30},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"ModalService","line":83,"character":26},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":84,"character":28}]}],"ngOnInit":[{"__symbolic":"method"}],"getPatchVersionsCount$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":105,"character":3},"arguments":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"lodash-es","name":"property","line":105,"character":11},"arguments":["id"]}]}]}],"getBinaryName$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":119,"character":3}}]}],"getPatchVersions$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":124,"character":3},"arguments":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"lodash-es","name":"property","line":124,"character":11},"arguments":["id"]}]}]}],"addBaseVersion":[{"__symbolic":"method"}],"addPatchVersion":[{"__symbolic":"method"}],"deleteBaseVersion":[{"__symbolic":"method"}],"deletePatchVersion":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}]}},"DeviceConfigurationService":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":4,"character":1}}],"members":{"updateConfigurations":[{"__symbolic":"method"}],"hasAnySupportedOperation":[{"__symbolic":"method"}]}},"DeviceConfigurationListComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":3,"character":1},"arguments":[{"selector":"c8y-device-configuration-list","template":"<div class=\"p-l-16 m-b-8\" style=\"margin-top: -16px;\" *ngIf=\"isFilterEnabled\">\n <c8y-filter [icon]=\"'search'\" (onSearch)=\"updatePipe($event)\"></c8y-filter>\n</div>\n\n<!-- EMPTY STATE -->\n<div class=\"c8y-empty-state text-left\" *ngIf=\"items?.length === 0\">\n <h1 [c8yIcon]=\"emptyState.icon\"></h1>\n <p>\n <strong>{{ emptyState.title | translate }}</strong\n ><br />\n <small>{{ emptyState.text | translate }}</small>\n </p>\n</div>\n\n<!-- CONFIGURATIONS AVAILABLE -->\n<div class=\"c8y-nav-stacked\">\n <div\n class=\"c8y-stacked-item flex-row\"\n [class.active]=\"config === selectedConfig\"\n *ngFor=\"let config of items | configurationFilterPipe: filterTerm\"\n (click)=\"showConfigurationTypePreview(config)\"\n >\n <div class=\"list-item-icon\">\n <i [c8yIcon]=\"itemIcon\"></i>\n </div>\n <div class=\"list-item-body text-truncate\">\n <div class=\"d-flex\">\n <span class=\"text-truncate\" title=\"{{ config.name }}\">{{ config.name }}</span>\n <span class=\"text-label-small flex-item-right flex-item-middle\">{{ config.deviceType }}</span>\n </div>\n </div>\n </div>\n</div>\n\n<!-- for Carlos: config.configurationType to differentiate whether a config matches configuration type. -->\n"}]}],"members":{"items":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":8,"character":3}}]}],"itemIcon":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":9,"character":3}}]}],"emptyState":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":10,"character":3}}]}],"isFilterEnabled":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":11,"character":3}}]}],"configSelected":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":12,"character":3}}]}],"showConfigurationTypePreview":[{"__symbolic":"method"}],"updatePipe":[{"__symbolic":"method"}]}},"RepositorySelectModalComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":57,"character":1},"arguments":[{"selector":"c8y-repository-select-modal","template":"<c8y-select-modal\n [icon]=\"icon\"\n [title]=\"title\"\n [subTitle]=\"subTitle\"\n [items]=\"modalEntries | async\"\n [mode]=\"mode\"\n [disableSelected]=\"disableSelected\"\n [labels]=\"labels\"\n [showFilter]=\"showFilter\"\n [areMoreEntries]=\"areMoreEntries\"\n (search)=\"search($event)\"\n (result)=\"result($event)\"\n>\n</c8y-select-modal>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@ngx-translate/core","name":"TranslateService","line":184,"character":30}]}],"ngOnInit":[{"__symbolic":"method"}],"getAndAssignRepositoryBinaries":[{"__symbolic":"method"}],"search":[{"__symbolic":"method"}],"result":[{"__symbolic":"method"}],"aggregate":[{"__symbolic":"method"}],"getSelectModalOptions":[{"__symbolic":"method"}],"isBinaryRepositorySelected":[{"__symbolic":"method"}],"getSelectModalObject":[{"__symbolic":"method"}]}},"DeviceSoftwareChangesComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":5,"character":1},"arguments":[{"selector":"c8y-device-software-changes","template":"<div class=\"inner-scroll d-flex d-col\">\n <div class=\"card-header separator large-padding sticky-top\">\n <h4 class=\"card-title\" translate>Software changes</h4>\n </div>\n <div class=\"flex-grow\">\n <div class=\"card-block large-padding\"\n *ngIf=\"(changes$ | async).length === 0; else changesList\"\n >\n <div class=\"c8y-empty-state text-center\">\n <h1 class=\"c8y-icon c8y-icon-device-control c8y-icon-duocolor\"></h1>\n <p>\n <strong translate>No software changes.</strong> <br />\n <small translate>Selected actions will be displayed here.</small>\n </p>\n </div>\n </div>\n\n <ng-template #changesList>\n <fieldset class=\"card-block p-t-0 p-b-0\"\n *ngIf=\"(installations$ | async).length > 0\"\n [disabled]=\"changesInProgress\"\n >\n <div class=\"form-block legend\" translate>Installations`software`</div>\n <c8y-device-software-list\n [softwareList]=\"installations$ | async\"\n (remove)=\"drop.emit($event)\"\n ></c8y-device-software-list>\n </fieldset>\n\n <fieldset class=\"card-block p-t-0 p-b-0\"\n *ngIf=\"(removals$ | async).length > 0\"\n [disabled]=\"changesInProgress\"\n >\n <div class=\"form-block legend\" translate>Removals`software`</div>\n <c8y-device-software-list\n [softwareList]=\"removals$ | async\"\n (remove)=\"drop.emit($event)\"\n ></c8y-device-software-list>\n </fieldset>\n </ng-template>\n </div>\n <div\n class=\"card-footer separator large-padding sticky-bottom\"\n *ngIf=\"(changes$ | async).length > 0\"\n >\n <button\n class=\"btn btn-default\"\n (click)=\"clear.emit()\"\n title=\"{{ 'Clear changes' | translate }}\"\n [disabled]=\"changesInProgress\"\n translate\n >\n Clear`changes`\n </button>\n <button\n class=\"btn btn-primary\"\n [ngClass]=\"{ 'btn-pending': changesInProgress }\"\n [disabled]=\"changesInProgress\"\n (click)=\"apply.emit()\"\n title=\"{{ 'Apply changes' | translate }}\"\n translate\n >\n Apply changes\n </button>\n </div>\n</div>\n"}]}],"members":{"changes":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":10,"character":3}}]}],"changesInProgress":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":11,"character":3}}]}],"clear":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":12,"character":3}}]}],"drop":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":13,"character":3}}]}],"apply":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":14,"character":3}}]}],"ngOnChanges":[{"__symbolic":"method"}]}},"DeviceSoftwareListComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":5,"character":1},"arguments":[{"selector":"c8y-device-software-list","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"}]}],"members":{"softwareList":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":10,"character":3}}]}],"deviceSoftwareChanges":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":11,"character":3}}]}],"update":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":12,"character":3}}]}],"remove":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":13,"character":3}}]}],"ngAfterContentInit":[{"__symbolic":"method"}],"isSoftwareGoingToBeChanged":[{"__symbolic":"method"}]}},"FirmwareDeviceTabComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":14,"character":1},"arguments":[{"selector":"c8y-firmware-device-tab","template":"<div class=\"row\">\n <div class=\"col-lg-10\">\n <div class=\"card card--fullpage\">\n <div class=\"card-header separator\">\n <h4 class=\"card-title\" translate>Current firmware</h4>\n </div>\n <div class=\"inner-scroll\">\n <fieldset *ngIf=\"changesOperation$ | async\" class=\"card-block bg-gray-white\">\n <c8y-single-operation [operation]=\"changesOperation$ | async\"></c8y-single-operation>\n </fieldset>\n <div class=\"card-block p-t-0 p-b-0\">\n <!-- EMPTY STATE -->\n <ng-container *ngIf=\"isEmpty(deviceFirmwareFragment$ | async); else firmwareBlock\">\n <div class=\"c8y-empty-state text-center\">\n <h1 c8yIcon=\"c8y-firmware\" class=\"c8y-icon-duocolor\"></h1>\n <p>\n <strong translate>No firmware installed.</strong> <br />\n <small translate>Click below to install firmware into this device.</small>\n </p>\n </div>\n </ng-container>\n\n <!-- FIRMWARE -->\n <ng-template #firmwareBlock>\n <c8y-list-group class=\"no-border-last \">\n <c8y-li>\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n\n <c8y-li-body *ngIf=\"deviceFirmwareFragment$ | async as deviceFirmwareFragment\">\n <!-- Firmware title -->\n <p class=\"m-b-16 text-medium\">\n {{ deviceFirmwareFragment.name }}\n </p>\n <!-- Firmware description -->\n <div *ngIf=\"repositoryEntry$ | async as repositoryEntry\">\n <p class=\"text-label-small\" translate>\n Description\n </p>\n <p>\n {{ repositoryEntry.description }}\n </p>\n </div>\n <!-- BASE/PATCH VERSION -->\n <div class=\"m-b-16\">\n <p class=\"text-label-small\" translate>\n Version\n </p>\n <p *ngIf=\"deviceFirmwareFragment.version; else versionNotSpecified\">\n {{ deviceFirmwareFragment.version }}\n </p>\n <ng-template #versionNotSpecified>\n <p>\n <em class=\"text-muted\"> ({{ 'not specified`version`' | translate }}) </em>\n </p>\n </ng-template>\n </div>\n \n <!-- ADD PATCH -->\n <button\n *ngIf=\"(this.patches$ | async)?.length > 0\"\n (click)=\"addPatch()\"\n class=\"btn btn-xs btn-primary\"\n [disabled]=\"changesInProgress$ | async\"\n translate\n >\n Patches available\n </button>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </ng-template>\n </div>\n </div>\n <div class=\"card-footer separator-top\">\n <!-- INSTALL FIRMWARE -->\n <button\n *ngIf=\"isEmpty(deviceFirmwareFragment$ | async)\"\n class=\"btn btn-primary\"\n (click)=\"installFirmware()\"\n translate\n >\n Install firmware\n </button>\n\n <!-- REPLACE FIRMWARE -->\n <button\n *ngIf=\"!isEmpty(deviceFirmwareFragment$ | async)\"\n class=\"btn btn-primary\"\n (click)=\"installFirmware()\"\n [disabled]=\"changesInProgress$ | async\"\n translate\n >\n Replace firmware\n </button>\n </div>\n </div>\n </div>\n</div>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":68,"character":19},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":70,"character":23},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":71,"character":21}]}],"ngOnInit":[{"__symbolic":"method"}],"installFirmware":[{"__symbolic":"method"}],"getRepositoryEntriesWithVersions$":[{"__symbolic":"method"}],"getAndAssignRepositoryBinaries":[{"__symbolic":"method"}],"addPatch":[{"__symbolic":"method"}],"getRepositoryEntryWithPatches$":[{"__symbolic":"method"}],"loadDevice":[{"__symbolic":"method"}],"handleOperation":[{"__symbolic":"method"}],"loadOperation":[{"__symbolic":"method"}],"trackOperation":[{"__symbolic":"method"}],"isInProgress":[{"__symbolic":"method"}]}},"InstalledSoftwareComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":10,"character":1},"arguments":[{"selector":"c8y-installed-software","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"}]}],"members":{"softwareList":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":15,"character":3}}]}],"deviceSoftwareChanges":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":16,"character":3}}]}],"deviceSoftwareChangesOperation":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":17,"character":3}}]}],"deviceSoftwareChangesInProgress":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":18,"character":3}}]}],"deviceTypeQuery":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":19,"character":3}}]}],"changes":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":20,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":24,"character":23},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":25,"character":21}]}],"installSoftware":[{"__symbolic":"method"}],"updateSoftware":[{"__symbolic":"method"}],"removeSoftware":[{"__symbolic":"method"}],"getInstallableSoftwareListWithVersions$":[{"__symbolic":"method"}],"getSingleSoftwareWithVersions$":[{"__symbolic":"method"}],"attachVersions":[{"__symbolic":"method"}],"displaySoftwareSelectModal":[{"__symbolic":"method"}],"emitSoftwareInstall":[{"__symbolic":"method"}],"emitSoftwareRemoval":[{"__symbolic":"method"}]}},"FirmwareDeviceTabGuard":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":7,"character":1}}],"members":{"canActivate":[{"__symbolic":"method"}]}},"SoftwareDeviceTabGuard":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Injectable","line":3,"character":1}}],"members":{"canActivate":[{"__symbolic":"method"}],"isAnyOperationSupported":[{"__symbolic":"method"}]}},"SoftwareDeviceTabComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":8,"character":1},"arguments":[{"selector":"c8y-software-device-tab","template":"<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\" title=\"{{ 'Reload' | translate }}\" (click)=\"loadDevice()\">\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card 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"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":29,"character":19},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":31,"character":23}]}],"ngOnInit":[{"__symbolic":"method"}],"addChanges":[{"__symbolic":"method"}],"dropChange":[{"__symbolic":"method"}],"areSameChanges":[{"__symbolic":"method"}],"clearChanges":[{"__symbolic":"method"}],"loadDevice":[{"__symbolic":"method"}],"applyChanges":[{"__symbolic":"method"}],"loadOperation":[{"__symbolic":"method"}],"trackOperation":[{"__symbolic":"method"}],"displayChangesFromOperation":[{"__symbolic":"method"}],"isInProgress":[{"__symbolic":"method"}]}},"ConfigurationListComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":19,"character":1},"arguments":[{"selector":"c8y-configuration-list","template":"<c8y-title>\n <span translate>\n Configuration snapshots repository\n </span>&nbsp;\n <small\n *ngIf=\"(configurations$ | async)?.paging.totalPages === 1 && !filterTerm\"\n >\n {{ (configurations$ | async).data.length }}\n <span translate>\n snapshots\n </span>\n </small>\n <small\n *ngIf=\"(configurations$ | async)?.paging.totalPages > 1 && !filterTerm\"\n [tooltip]=\"'More data available. Scroll to the bottom of the list to load it.' | translate\"\n container=\"body\"\n >\n {{ (configurations$ | async).paging.pageSize }}+\n <span translate>snapshots</span>\n </small>\n <small *ngIf=\"filterTerm\">\n <span translate>\n Search results for\n </span>&nbsp;\"\n {{ this.filterTerm }}\"\n </small>\n</c8y-title>\n\n<c8y-action-bar-item itemClass=\"navbar-form\">\n <c8y-filter\n [icon]=\"'search'\"\n (onSearch)=\"setPipe($event)\"\n ></c8y-filter>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\"\n (click)=\"add()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add configuration snapshot' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"loadConfigurations()\"\n >\n <i [ngClass]=\"{ 'icon-spin': reloading }\"\n c8yIcon=\"refresh\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<!-- empty state -->\n<div class=\"c8y-empty-state text-center\"\n *ngIf=\"!filterTerm && (configurations$ | async)?.data.length === 0\"\n>\n <h1 c8yIcon=\"gears\"></h1>\n <h3 translate>There are no configuration snapshots defined</h3>\n <p translate>Add a configuration snapshot first.</p>\n <div>\n <button (click)=\"add()\" class=\"btn btn-primary\" translate>\n Add configuration snapshot\n </button>\n </div>\n <p c8y-guide-docs>\n <small translate ngNonBindable>\n Find out more in the\n <a c8y-guide-href=\"users-guide/device-management/#configuration-repository\">\n User guide`KEEP_ORIGINAL`\n </a>.\n </small>\n </p>\n</div>\n\n<!-- no results empty state -->\n<div class=\"c8y-empty-state\"\n *ngIf=\"shouldShowEmptyState() && (configurations$ | async)?.data.length > 0\"\n>\n <h1 class=\"c8y-icon-duocolor\"\n c8yIcon=\"search\"\n ></h1>\n <h3 translate>\n No results to display.\n </h3>\n <p translate>\n Refine your search terms or check your spelling.\n </p>\n</div>\n\n<c8y-list-group class=\"m-b-24\"\n *ngIf=\"(configurations$ | async)?.data.length > 0\"\n [ngClass]=\"{ 'dd-low': data && data.length ? data.length < 10 : (configurations$ | async)?.data.length < 10 }\"\n\n>\n <c8y-li class=\"page-sticky-header c8y-list__item--empty-actions hidden-xs\"\n *ngIf=\"!shouldShowEmptyState()\"\n >\n <c8y-li-icon>\n <i class=\"fa\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-2\">\n {{ 'Configuration' | translate }}\n </div>\n <div class=\"col-3\">\n {{ 'Description' | translate }}\n </div>\n <div class=\"col-3\">\n {{ 'File' | translate }}\n </div>\n <div class=\"col-2\">\n {{ 'Device type' | translate }}\n </div>\n <div class=\"col-2\">\n {{ 'Configuration type' | translate }}\n </div>\n </c8y-li-body>\n </c8y-li>\n\n <c8y-li *c8yFor=\"let configuration of configurations$; pipe: filterPipe\">\n <c8y-li-icon icon=\"gears\"></c8y-li-icon>\n <div class=\"content-flex-60\">\n <button class=\"btn-clean col-2\"\n (click)=\"edit(configuration)\"\n >\n <span class=\"text-truncate\"\n title=\"{{ configuration.name || '-' }}\"\n >\n <c8y-highlight\n [text]=\"configuration.name || '-'\"\n elementClass=\"text-info\"\n [pattern]=\"filterTerm\"\n ></c8y-highlight>\n </span>\n </button>\n <div class=\"col-3\">\n <div class=\"text-label-small visible-xs-inline m-r-4\">\n {{ 'Description' | translate }}\n </div>\n <small class=\"text-truncate\"\n *ngIf=\"configuration.description; else emptyDescription\"\n [title]=\"configuration.description\"\n >\n {{ configuration.description }}\n </small>\n </div>\n <div class=\"col-3\">\n <span class=\"text-truncate\">\n <span class=\"text-label-small m-r-4 visible-xs-inline\" translate>\n File\n </span>\n <small\n *ngIf=\"isBinaryFile(configuration); else noFile\"\n title=\"{{ getBinaryName(configuration) | async }}\"\n >\n {{ getBinaryName(configuration) | async }}\n </small>\n <ng-template #noFile>\n <small title=\"{{ configuration.url }}\">\n {{ configuration.url }}\n </small>\n </ng-template>\n </span>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\"\n title=\"{{ 'Device type' | translate }}: {{ configuration.deviceType || '-' }}\"\n >\n <span class=\"text-label-small visible-xs-inline m-r-4\" translate>\n Device type\n </span>\n <span *ngIf=\"configuration.deviceType; else emptyText\">\n <c8y-highlight\n [text]=\"configuration.deviceType || '-'\"\n elementClass=\"text-info\"\n [pattern]=\"filterTerm\"\n >\n </c8y-highlight>\n </span>\n </div>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\"\n title=\"{{ configuration.configurationType }}\"\n >\n <span class=\"label label-primary\"\n *ngIf=\"configuration.configurationType; else emptyText\"\n >\n <c8y-highlight\n [text]=\"configuration.configurationType\"\n elementClass=\"text-info\"\n [pattern]=\"filterTerm\"\n >\n </c8y-highlight>\n </span>\n </div>\n </div>\n </div>\n <c8y-li-action\n (click)=\"edit(configuration)\"\n icon=\"pencil\"\n label=\"{{ 'Edit' | translate }}\"\n >\n </c8y-li-action>\n <c8y-li-action\n (click)=\"delete(configuration)\"\n icon=\"trash-o\"\n label=\"{{ 'Delete' | translate }}\"\n >\n </c8y-li-action>\n <c8y-li-action\n *ngIf=\"isBinaryFile(configuration)\"\n (click)=\"download(configuration)\"\n icon=\"download\"\n label=\"{{ 'Download' | translate }}\"\n >\n </c8y-li-action>\n <ng-template #emptyText>\n <small class=\"text-muted\">\n <em>{{ 'Undefined' | translate }}</em>\n </small>\n </ng-template>\n <ng-template #emptyDescription>\n <small class=\"text-muted\">\n <em>{{ 'No description' | translate }}</em>\n </small>\n </ng-template>\n </c8y-li>\n</c8y-list-group>\n"}]}],"members":{"filter":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":24,"character":3},"arguments":[{"__symbolic":"reference","module":"@c8y/ngx-components","name":"FilterInputComponent","line":24,"character":13},{"static":false}]}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":33,"character":19},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":35,"character":28},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"ModalService","line":36,"character":26},{"__symbolic":"reference","module":"@ngx-translate/core","name":"TranslateService","line":37,"character":30},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryBinaryService","line":38,"character":36},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":39,"character":30}]}],"ngOnInit":[{"__symbolic":"method"}],"loadConfigurations":[{"__symbolic":"method"}],"add":[{"__symbolic":"method"}],"edit":[{"__symbolic":"method"}],"isBinaryFile":[{"__symbolic":"method"}],"getBinaryName":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":96,"character":3},"arguments":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"lodash-es","name":"property","line":96,"character":11},"arguments":["id"]}]}]}],"download":[{"__symbolic":"method"}],"delete":[{"__symbolic":"method"}],"setPipe":[{"__symbolic":"method"}],"shouldShowEmptyState":[{"__symbolic":"method"}],"reset":[{"__symbolic":"method"}],"filterContainString":[{"__symbolic":"method"}]}},"ConfigurationDetailComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":12,"character":1},"arguments":[{"selector":"c8y-configuration-detail","template":"<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'cogs'\"></i>\n <h4 translate *ngIf=\"mo.id\">Update configuration</h4>\n <h4 translate *ngIf=\"!mo.id\">Add configuration</h4>\n </div>\n\n <form class=\"d-contents\" #configurationForm=\"ngForm\" (ngSubmit)=\"configurationForm.form.valid && save()\">\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\">\n <c8y-form-group>\n <label translate>Name</label>\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} hosts\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n [(ngModel)]=\"version\"\n name=\"version\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Device type</label>\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n maxlength=\"254\"\n autocomplete=\"off\"\n [(ngModel)]=\"deviceType\"\n name=\"deviceType\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Description</label>\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g. Host configuration' | translate }} c8y_Linux\"\n maxlength=\"254\"\n autocomplete=\"off\"\n [(ngModel)]=\"description\"\n name=\"description\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Configuration type</label>\n <c8y-typeahead\n [(ngModel)]=\"selected\"\n name=\"confType\"\n placeholder=\"{{ 'e.g.' | translate }} ssh\"\n (onSearch)=\"setPipe($event)\"\n displayProperty=\"configurationType\"\n >\n <c8y-li\n *c8yFor=\"let config of configs; pipe: filterPipe; notFound: notFoundTemplate\"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"selected = config; setPipe('')\"\n [active]=\"selected === config\"\n >\n <c8y-highlight\n [text]=\"config.configurationType || '--'\"\n [pattern]=\"pattern\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li class=\"bg-gray-lighter p-8\" *ngIf=\"pattern.length > 0\">\n <span translate>No match found, add new`configuration`?</span>\n <button title=\"Create new`configuration`\" type=\"button\" class=\"btn btn-primary btn-xs m-l-16\" translate>\n Create new`configuration`\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Configuration file</div>\n <c8y-file-picker\n [maxAllowedFiles]=\"1\"\n (onFilesPicked)=\"onFile($event)\"\n [uploadChoice]=\"uploadChoice\"\n [fileUrl]=\"binary.url\"\n [fileBinary]=\"binary.file\"\n [fileUrlPopover]=\"textForConfigurationUrlPopover\"\n >\n </c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button\n (click)=\"cancel()\"\n type=\"button\"\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n [disabled]=\"saving\"\n >\n <span translate>Cancel</span>\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"submit\"\n title=\"{{ submitButtonTitle | translate }}\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !configurationForm.valid ||\n configurationForm.pristine ||\n (!binary?.url && !binary?.file) ||\n saving\n \"\n >\n {{ submitButtonTitle | translate }}\n </button>\n </div>\n </form>\n</div>\n"}]}],"members":{"configurationForm":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":17,"character":3},"arguments":["configurationForm",{"static":true}]}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalRef","line":51,"character":24},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":52,"character":19}]}],"ngOnInit":[{"__symbolic":"method"}],"cancel":[{"__symbolic":"method"}],"setPipe":[{"__symbolic":"method"}],"onFile":[{"__symbolic":"method"}],"save":[{"__symbolic":"method"}]}},"ɵa":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":7,"character":1},"arguments":[{"selector":"c8y-file-download","template":"<a\n *ngIf=\"determineBehavior() === linkRenderType.LINK\"\n href=\"{{ url }}\"\n class=\"pointer\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n>\n {{ getBinaryName$(url) | async }}\n</a>\n\n<span *ngIf=\"determineBehavior() === linkRenderType.TEXTONLY\">{{ getBinaryName$(url) | async }}</span>\n\n<a *ngIf=\"determineBehavior() === linkRenderType.DOWNLOAD\" class=\"pointer\" (click)=\"downloadFile()\">\n {{getBinaryName$(url) | async}}\n</a>\n"}]}],"members":{"url":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":12,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryBinaryService","line":16,"character":36}]}],"getBinaryName$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":19,"character":3}}]}],"determineBehavior":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":24,"character":3}}]}],"downloadFile":[{"__symbolic":"method"}]}}},"origins":{"RepositoryModule":"./repository.module","RepositoryService":"./repository.service","RepositoryType":"./repository.model","REPOSITORY_BINARY_TYPES":"./repository.model","ModalModel":"./repository.model","RepositoryCategory":"./repository.model","FirmwareBinary":"./repository.model","FirmwarePatchBinary":"./repository.model","SoftwareBinary":"./repository.model","RepositoryBinary":"./repository.model","SelectedRepositoryBinary":"./repository.model","DeviceFirmware":"./repository.model","DeviceSoftware":"./repository.model","DeviceSoftwareChange":"./repository.model","ConfigurationSnapshot":"./repository.model","SupportedConfigurationItem":"./repository.model","DeviceConfigurationListEmptyState":"./repository.model","DeviceConfigurationOperation":"./repository.model","RepositoryNavigationFactory":"./repository-navigation-factory","SoftwareListComponent":"./software/software-list.component","AddSoftwareModalComponent":"./software/add-software-modal.component","SoftwareDetailsComponent":"./software/software-details.component","TextBasedConfigurationComponent":"./configuration-device-tab/text-based-configuration.component","DeviceConfigurationGuard":"./configuration-device-tab/device-configuration.guard","ConfigurationFilterPipe":"./configuration-device-tab/configuration-filter.pipe","ConfigurationPreviewComponent":"./configuration-device-tab/configuration-preview.component","DeviceConfigurationComponent":"./configuration-device-tab/device-configuration.component","SaveToRepositoryComponent":"./configuration-device-tab/save-to-repository.component","AddFirmwarePatchModalComponent":"./firmware/add-firmware-patch-modal.component","AddFirmwareModalComponent":"./firmware/add-firmware-modal.component","SourceCodePreviewComponent":"./configuration-device-tab/source-code-preview.component","FirmwareListComponent":"./firmware/firmware-list.component","FirmwareDetailsComponent":"./firmware/firmware-details.component","DeviceConfigurationService":"./configuration-device-tab/device-configuration.service","DeviceConfigurationListComponent":"./configuration-device-tab/device-configuration-list.component","RepositorySelectModalComponent":"./select-modal/repository-select-modal.component","DeviceSoftwareChangesComponent":"./software-device-tab/device-software-changes.component","DeviceSoftwareListComponent":"./software-device-tab/device-software-list.component","FirmwareDeviceTabComponent":"./firmware-device-tab/firmware-device-tab.component","InstalledSoftwareComponent":"./software-device-tab/installed-software.component","FirmwareDeviceTabGuard":"./firmware-device-tab/firmware-device-tab.guard","SoftwareDeviceTabGuard":"./software-device-tab/software-device-tab.guard","SoftwareDeviceTabComponent":"./software-device-tab/software-device-tab.component","ConfigurationListComponent":"./configuration/configuration-list.component","ConfigurationDetailComponent":"./configuration/configuration-detail.component","ɵa":"./file-download/file-download.component"},"importAs":"@c8y/ngx-components/repository"}