@c8y/ngx-components 1011.0.12 → 1011.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICES +3 -227
- package/bundles/c8y-ngx-components-repository.umd.js +1 -1
- package/bundles/c8y-ngx-components-repository.umd.js.map +1 -1
- package/bundles/c8y-ngx-components-repository.umd.min.js +1 -1
- package/bundles/c8y-ngx-components-repository.umd.min.js.map +1 -1
- package/esm2015/repository/configuration-device-tab/source-code-preview.component.js +2 -2
- package/fesm2015/c8y-ngx-components-repository.js +1 -1
- package/fesm2015/c8y-ngx-components-repository.js.map +1 -1
- package/package.json +2 -2
- package/repository/c8y-ngx-components-repository.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":46,"character":1},"arguments":[{"imports":[{"__symbolic":"reference","module":"@c8y/ngx-components","name":"CoreModule","line":48,"character":4},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"FormsModule","line":49,"character":4},{"__symbolic":"reference","module":"@c8y/ngx-components/operations/single-operation-details","name":"SingleOperationDetailsModule","line":50,"character":4},{"__symbolic":"call","expression":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"ngx-bootstrap/dropdown","name":"BsDropdownModule","line":51,"character":4},"member":"forRoot"}},{"__symbolic":"reference","module":"ngx-bootstrap/tooltip","name":"TooltipModule","line":52,"character":4},{"__symbolic":"reference","module":"ngx-bootstrap/popover","name":"PopoverModule","line":53,"character":4},{"__symbolic":"call","expression":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"ngx-bootstrap/tabs","name":"TabsModule","line":54,"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","module":"@c8y/ngx-components","name":"OperationRealtimeService","line":103,"character":4},{"__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":109,"character":15},"useClass":{"__symbolic":"reference","name":"RepositoryNavigationFactory"},"multi":true},{"provide":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"HOOK_ONCE_ROUTE","line":114,"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":125,"character":19},"member":"Device"},"path":"firmware","component":{"__symbolic":"reference","name":"FirmwareDeviceTabComponent"},"label":{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"gettext","line":128,"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":142,"character":19},"member":"Device"},"path":"software","component":{"__symbolic":"reference","name":"SoftwareDeviceTabComponent"},"label":{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"gettext","line":145,"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":155,"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":158,"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":53,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":60,"character":23},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryBinaryService","line":61,"character":29},{"__symbolic":"reference","module":"@c8y/client","name":"OperationService","line":62,"character":23},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":63,"character":19},{"__symbolic":"reference","module":"@c8y/client","name":"EventService","line":64,"character":19},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"OperationRealtimeService","line":65,"character":31},{"__symbolic":"reference","module":"@c8y/client","name":"EventBinaryService","line":66,"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>\n <i class=\"p-l-24\"></i>\n </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 class=\"control-label\" for=\"softwareDeviceTypeFilter\">\n {{ 'Device type filter' | translate }}\n <button\n class=\"btn btn-clean text-primary\"\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 triggers=\"focus\"\n container=\"body\"\n placement=\"right\"\n >\n <i [c8yIcon]=\"'question-circle-o'\"></i>\n </button>\n </label>\n <input\n id=\"softwareDeviceTypeFilter\"\n class=\"form-control\"\n name=\"softwareDeviceTypeFilter\"\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":20,"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=\"row\">\n <div class=\"col-lg-12 col-lg-max\">\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 [ngStyle]=\"{ 'width.ch': (software$ | async)?.name?.length || 31 }\"\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 [ngStyle]=\"{ 'width.ch': (software$ | async)?.description?.length || 31 }\"\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({ description: descriptionInput.value }); descriptionModel.reset()\"\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 <button\n class=\"btn-clean\"\n popover=\"{{ '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.' | translate }}\"\n [outsideClick]=\"true\"\n container=\"body\"\n >\n <i c8yIcon=\"question-circle-o\" class=\"text-info\"></i>\n </button>\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 [ngStyle]=\"{ 'width.ch': (software$ | async)?.type?.length || 31 }\"\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({ c8y_Filter: { type: deviceTypeInput.value } }); deviceTypeModel.reset()\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"row\">\n <div class=\"col-lg-12 col-lg-max\">\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 >\n {{ 'Add software' | translate }}\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 >\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 class=\"text-truncate-wrap\" title=\"{{ baseVersion.c8y_Software.version }}\">\n {{ baseVersion.c8y_Software.version }}\n </p>\n </div>\n <div class=\"col-5\">\n <p class=\"text-truncate-wrap\">\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 a-i-start\">\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>\n {{ '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 </div>\n</div>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":65,"character":28},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":66,"character":30},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":68,"character":26},{"__symbolic":"reference","module":"@ngx-translate/core","name":"TranslateService","line":69,"character":30},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"ModalService","line":70,"character":26},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":71,"character":28}]}],"ngOnInit":[{"__symbolic":"method"}],"getBinaryName$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":92,"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=\"flex-grow\">\n <textarea\n [(ngModel)]=\"config\"\n class=\"form-control fit-h p-r-16 p-l-16\"\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":22,"character":19},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":23,"character":26},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","name":"DeviceConfigurationService"},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":26,"character":30}]}],"ngOnInit":[{"__symbolic":"method"}],"load":[{"__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":20,"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":25,"character":3}}]}],"configurationType":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":26,"character":3}}]}],"configSnapshot":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":33,"character":3}}]}],"canSaveSnapshot":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":34,"character":3}}]}],"actionButtonText":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":35,"character":3}}]}],"actionButtonIcon":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":36,"character":3}}]}],"isLegacy":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":37,"character":3}}]}],"operationToTrigger":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":38,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"DeviceConfigurationService"},{"__symbolic":"reference","module":"@c8y/client","name":"Realtime","line":50,"character":22},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"OperationRealtimeService","line":51,"character":31},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":52,"character":21},{"__symbolic":"reference","module":"@c8y/client","name":"UserService","line":53,"character":18},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AppStateService","line":54,"character":22},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/client","name":"OperationService","line":56,"character":30},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":57,"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":14,"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 bg-gray-white\">\n <div class=\"p-l-16 p-r-16\">\n <h5 class=\"legend form-block\">\n <span translate>Device-supported configurations</span>\n </h5>\n </div>\n <c8y-device-configuration-list\n [items]=\"supportedConfigurations\"\n [itemIcon]=\"'gears'\"\n (configSelected)=\"onConfigTypeSelected($event)\"\n ></c8y-device-configuration-list>\n </div>\n\n <!-- CONFIGURATION PREVIEW -->\n <div class=\"card--grid__inner-scroll d-flex d-col flex-grow\">\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 bg-gray-white\">\n <div class=\"p-l-16 p-r-16\">\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 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></c8y-text-based-configuration>\n </tab>\n </tabset>\n</div>\n"}]}],"members":{"textBasedConfigurationComponent":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":31,"character":3},"arguments":[{"__symbolic":"reference","name":"TextBasedConfigurationComponent"}]}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":34,"character":19},{"__symbolic":"reference","name":"DeviceConfigurationService"},{"__symbolic":"reference","module":"@c8y/client","name":"Realtime","line":36,"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 <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 class=\"control-label\" for=\"firmwareDeviceTypeFilter\">\n {{ 'Device type filter' | translate }}\n <button\n class=\"btn btn-clean text-primary\"\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 triggers=\"focus\"\n container=\"body\"\n placement=\"right\"\n >\n <i [c8yIcon]=\"'question-circle-o'\"></i>\n </button>\n </label>\n <input\n id=\"firmwareDeviceTypeFilter\"\n class=\"form-control\"\n name=\"firmwareDeviceTypeFilter\"\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=\"p-l-24\"></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":114,"character":3},"arguments":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"lodash-es","name":"property","line":114,"character":11},"arguments":["id"]}]}]}],"getDeviceTypeTitle":[{"__symbolic":"method"}]}},"FirmwareDetailsComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":23,"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=\"row\">\n <div class=\"col-lg-12 col-lg-max\">\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 [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.name?.length || 31 }\"\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 [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.description?.length || 31 }\"\n\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({ description: descriptionInput.value }); descriptionModel.reset() \"\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 <button\n class=\"btn-clean\"\n popover=\"{{ '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.' | translate }}\"\n [outsideClick]=\"true\"\n container=\"body\"\n >\n <i c8yIcon=\"question-circle-o\" class=\"text-info\"></i>\n </button>\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 [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.type?.length || 31 }\"\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({ c8y_Filter: { type: deviceTypeInput.value } }); deviceTypeModel.reset()\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"row\">\n <div class=\"col-lg-12 col-lg-max\">\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 >\n {{ 'Add firmware' | translate }}\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]=\"{ 'c8y-list__item--empty-actions': !(getPatchVersions$(baseVersion) | async)?.data.length }\"\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 class=\"text-truncate-wrap\" title=\"{{ baseVersion.c8y_Firmware.version }}\">\n {{ baseVersion.c8y_Firmware.version }}\n </p>\n </div>\n <div class=\"col-5\">\n <p class=\"text-truncate-wrap\">\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 a-i-start\">\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>\n </span>\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 >\n {{ count }} patches\n </span>\n </span>\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>\n {{ '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=\" let patchVersion of getPatchVersions$(baseVersion) | async; let i = index; loadMore: 'auto' \"\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>\n {{ '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 </div>\n</div>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":77,"character":28},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":78,"character":30},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":80,"character":26},{"__symbolic":"reference","module":"@ngx-translate/core","name":"TranslateService","line":81,"character":30},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"ModalService","line":82,"character":26},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":83,"character":28}]}],"ngOnInit":[{"__symbolic":"method"}],"getPatchVersionsCount$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":104,"character":3},"arguments":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"lodash-es","name":"property","line":104,"character":11},"arguments":["id"]}]}]}],"getBinaryName$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":118,"character":3}}]}],"getPatchVersions$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":123,"character":3},"arguments":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"lodash-es","name":"property","line":123,"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\" *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-12 col-lg-max\">\n <div class=\"card\">\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 \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\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 title=\"{{ 'Patches available' | translate }}\"\n >\n {{ 'Patches available' | translate }}\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\n <!-- INSTALL FIRMWARE -->\n <button\n *ngIf=\"isEmpty(deviceFirmwareFragment$ | async)\"\n class=\"btn btn-primary\"\n (click)=\"installFirmware()\"\n title=\"{{ 'Install firmware' | translate }}\"\n >\n {{ 'Install firmware' | translate }}\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 title=\"{{ 'Replace firmware' | translate }}\"\n >\n {{ 'Replace firmware' | translate }}\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> \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> \"\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=\"p-l-24\"></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":46,"character":1},"arguments":[{"imports":[{"__symbolic":"reference","module":"@c8y/ngx-components","name":"CoreModule","line":48,"character":4},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"FormsModule","line":49,"character":4},{"__symbolic":"reference","module":"@c8y/ngx-components/operations/single-operation-details","name":"SingleOperationDetailsModule","line":50,"character":4},{"__symbolic":"call","expression":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"ngx-bootstrap/dropdown","name":"BsDropdownModule","line":51,"character":4},"member":"forRoot"}},{"__symbolic":"reference","module":"ngx-bootstrap/tooltip","name":"TooltipModule","line":52,"character":4},{"__symbolic":"reference","module":"ngx-bootstrap/popover","name":"PopoverModule","line":53,"character":4},{"__symbolic":"call","expression":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"ngx-bootstrap/tabs","name":"TabsModule","line":54,"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","module":"@c8y/ngx-components","name":"OperationRealtimeService","line":103,"character":4},{"__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":109,"character":15},"useClass":{"__symbolic":"reference","name":"RepositoryNavigationFactory"},"multi":true},{"provide":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"HOOK_ONCE_ROUTE","line":114,"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":125,"character":19},"member":"Device"},"path":"firmware","component":{"__symbolic":"reference","name":"FirmwareDeviceTabComponent"},"label":{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"gettext","line":128,"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":142,"character":19},"member":"Device"},"path":"software","component":{"__symbolic":"reference","name":"SoftwareDeviceTabComponent"},"label":{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"gettext","line":145,"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":155,"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":158,"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":53,"character":1}}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":60,"character":23},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryBinaryService","line":61,"character":29},{"__symbolic":"reference","module":"@c8y/client","name":"OperationService","line":62,"character":23},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":63,"character":19},{"__symbolic":"reference","module":"@c8y/client","name":"EventService","line":64,"character":19},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"OperationRealtimeService","line":65,"character":31},{"__symbolic":"reference","module":"@c8y/client","name":"EventBinaryService","line":66,"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>\n <i class=\"p-l-24\"></i>\n </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 class=\"control-label\" for=\"softwareDeviceTypeFilter\">\n {{ 'Device type filter' | translate }}\n <button\n class=\"btn btn-clean text-primary\"\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 triggers=\"focus\"\n container=\"body\"\n placement=\"right\"\n >\n <i [c8yIcon]=\"'question-circle-o'\"></i>\n </button>\n </label>\n <input\n id=\"softwareDeviceTypeFilter\"\n class=\"form-control\"\n name=\"softwareDeviceTypeFilter\"\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":20,"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=\"row\">\n <div class=\"col-lg-12 col-lg-max\">\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 [ngStyle]=\"{ 'width.ch': (software$ | async)?.name?.length || 31 }\"\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 [ngStyle]=\"{ 'width.ch': (software$ | async)?.description?.length || 31 }\"\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({ description: descriptionInput.value }); descriptionModel.reset()\"\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 <button\n class=\"btn-clean\"\n popover=\"{{ '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.' | translate }}\"\n [outsideClick]=\"true\"\n container=\"body\"\n >\n <i c8yIcon=\"question-circle-o\" class=\"text-info\"></i>\n </button>\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 [ngStyle]=\"{ 'width.ch': (software$ | async)?.type?.length || 31 }\"\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({ c8y_Filter: { type: deviceTypeInput.value } }); deviceTypeModel.reset()\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"row\">\n <div class=\"col-lg-12 col-lg-max\">\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 >\n {{ 'Add software' | translate }}\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 >\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 class=\"text-truncate-wrap\" title=\"{{ baseVersion.c8y_Software.version }}\">\n {{ baseVersion.c8y_Software.version }}\n </p>\n </div>\n <div class=\"col-5\">\n <p class=\"text-truncate-wrap\">\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 a-i-start\">\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>\n {{ '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 </div>\n</div>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":65,"character":28},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":66,"character":30},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":68,"character":26},{"__symbolic":"reference","module":"@ngx-translate/core","name":"TranslateService","line":69,"character":30},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"ModalService","line":70,"character":26},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":71,"character":28}]}],"ngOnInit":[{"__symbolic":"method"}],"getBinaryName$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":92,"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=\"flex-grow\">\n <textarea\n [(ngModel)]=\"config\"\n class=\"form-control fit-h p-r-16 p-l-16\"\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":22,"character":19},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":23,"character":26},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","name":"DeviceConfigurationService"},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":26,"character":30}]}],"ngOnInit":[{"__symbolic":"method"}],"load":[{"__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":20,"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":25,"character":3}}]}],"configurationType":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":26,"character":3}}]}],"configSnapshot":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":33,"character":3}}]}],"canSaveSnapshot":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":34,"character":3}}]}],"actionButtonText":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":35,"character":3}}]}],"actionButtonIcon":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":36,"character":3}}]}],"isLegacy":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":37,"character":3}}]}],"operationToTrigger":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":38,"character":3}}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","name":"DeviceConfigurationService"},{"__symbolic":"reference","module":"@c8y/client","name":"Realtime","line":50,"character":22},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"OperationRealtimeService","line":51,"character":31},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":52,"character":21},{"__symbolic":"reference","module":"@c8y/client","name":"UserService","line":53,"character":18},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AppStateService","line":54,"character":22},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/client","name":"OperationService","line":56,"character":30},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":57,"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":14,"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 bg-gray-white\">\n <div class=\"p-l-16 p-r-16\">\n <h5 class=\"legend form-block\">\n <span translate>Device-supported configurations</span>\n </h5>\n </div>\n <c8y-device-configuration-list\n [items]=\"supportedConfigurations\"\n [itemIcon]=\"'gears'\"\n (configSelected)=\"onConfigTypeSelected($event)\"\n ></c8y-device-configuration-list>\n </div>\n\n <!-- CONFIGURATION PREVIEW -->\n <div class=\"card--grid__inner-scroll d-flex d-col flex-grow\">\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 bg-gray-white\">\n <div class=\"p-l-16 p-r-16\">\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 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></c8y-text-based-configuration>\n </tab>\n </tabset>\n</div>\n"}]}],"members":{"textBasedConfigurationComponent":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":31,"character":3},"arguments":[{"__symbolic":"reference","name":"TextBasedConfigurationComponent"}]}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":34,"character":19},{"__symbolic":"reference","name":"DeviceConfigurationService"},{"__symbolic":"reference","module":"@c8y/client","name":"Realtime","line":36,"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 <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 class=\"control-label\" for=\"firmwareDeviceTypeFilter\">\n {{ 'Device type filter' | translate }}\n <button\n class=\"btn btn-clean text-primary\"\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 triggers=\"focus\"\n container=\"body\"\n placement=\"right\"\n >\n <i [c8yIcon]=\"'question-circle-o'\"></i>\n </button>\n </label>\n <input\n id=\"firmwareDeviceTypeFilter\"\n class=\"form-control\"\n name=\"firmwareDeviceTypeFilter\"\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\n [disabled]=\"isDisabled\"\n class=\"text-monospace form-control no-resize flex-grow\"\n rows=\"4\"\n >{{ text }}</textarea\n>\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=\"p-l-24\"></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":114,"character":3},"arguments":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"lodash-es","name":"property","line":114,"character":11},"arguments":["id"]}]}]}],"getDeviceTypeTitle":[{"__symbolic":"method"}]}},"FirmwareDetailsComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":23,"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=\"row\">\n <div class=\"col-lg-12 col-lg-max\">\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 [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.name?.length || 31 }\"\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 [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.description?.length || 31 }\"\n\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({ description: descriptionInput.value }); descriptionModel.reset() \"\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 <button\n class=\"btn-clean\"\n popover=\"{{ '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.' | translate }}\"\n [outsideClick]=\"true\"\n container=\"body\"\n >\n <i c8yIcon=\"question-circle-o\" class=\"text-info\"></i>\n </button>\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 [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.type?.length || 31 }\"\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({ c8y_Filter: { type: deviceTypeInput.value } }); deviceTypeModel.reset()\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n<div class=\"row\">\n <div class=\"col-lg-12 col-lg-max\">\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 >\n {{ 'Add firmware' | translate }}\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]=\"{ 'c8y-list__item--empty-actions': !(getPatchVersions$(baseVersion) | async)?.data.length }\"\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 class=\"text-truncate-wrap\" title=\"{{ baseVersion.c8y_Firmware.version }}\">\n {{ baseVersion.c8y_Firmware.version }}\n </p>\n </div>\n <div class=\"col-5\">\n <p class=\"text-truncate-wrap\">\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 a-i-start\">\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>\n </span>\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 >\n {{ count }} patches\n </span>\n </span>\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>\n {{ '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=\" let patchVersion of getPatchVersions$(baseVersion) | async; let i = index; loadMore: 'auto' \"\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>\n {{ '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 </div>\n</div>\n"}]}],"members":{"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/router","name":"ActivatedRoute","line":77,"character":28},{"__symbolic":"reference","module":"@c8y/client","name":"InventoryService","line":78,"character":30},{"__symbolic":"reference","name":"RepositoryService"},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"AlertService","line":80,"character":26},{"__symbolic":"reference","module":"@ngx-translate/core","name":"TranslateService","line":81,"character":30},{"__symbolic":"reference","module":"@c8y/ngx-components","name":"ModalService","line":82,"character":26},{"__symbolic":"reference","module":"ngx-bootstrap/modal","name":"BsModalService","line":83,"character":28}]}],"ngOnInit":[{"__symbolic":"method"}],"getPatchVersionsCount$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":104,"character":3},"arguments":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"lodash-es","name":"property","line":104,"character":11},"arguments":["id"]}]}]}],"getBinaryName$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":118,"character":3}}]}],"getPatchVersions$":[{"__symbolic":"method","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@c8y/ngx-components","name":"memoize","line":123,"character":3},"arguments":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"lodash-es","name":"property","line":123,"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\" *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-12 col-lg-max\">\n <div class=\"card\">\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 \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\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 title=\"{{ 'Patches available' | translate }}\"\n >\n {{ 'Patches available' | translate }}\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\n <!-- INSTALL FIRMWARE -->\n <button\n *ngIf=\"isEmpty(deviceFirmwareFragment$ | async)\"\n class=\"btn btn-primary\"\n (click)=\"installFirmware()\"\n title=\"{{ 'Install firmware' | translate }}\"\n >\n {{ 'Install firmware' | translate }}\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 title=\"{{ 'Replace firmware' | translate }}\"\n >\n {{ 'Replace firmware' | translate }}\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> \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> \"\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=\"p-l-24\"></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"}
|