@c8y/ngx-components 1011.0.9 → 1011.0.14

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","../../repository/repository.model.ts","../../repository/repository.service.ts","../../repository/firmware/add-firmware-modal.component.ts","../../repository/firmware/add-firmware-patch-modal.component.ts","../../repository/firmware/firmware-list.component.ts","../../repository/firmware/firmware-details.component.ts","../../repository/software/add-software-modal.component.ts","../../repository/software/software-list.component.ts","../../repository/software/software-details.component.ts","../../repository/configuration/configuration-detail.component.ts","../../repository/configuration/configuration-list.component.ts","../../repository/repository-navigation-factory.ts","../../repository/select-modal/repository-select-modal.component.ts","../../repository/firmware-device-tab/firmware-device-tab.component.ts","../../repository/firmware-device-tab/firmware-device-tab.guard.ts","../../repository/software-device-tab/software-device-tab.component.ts","../../repository/software-device-tab/software-device-tab.guard.ts","../../repository/software-device-tab/installed-software.component.ts","../../repository/software-device-tab/device-software-list.component.ts","../../repository/software-device-tab/device-software-changes.component.ts","../../repository/configuration-device-tab/device-configuration.service.ts","../../repository/configuration-device-tab/text-based-configuration.component.ts","../../repository/configuration-device-tab/device-configuration.component.ts","../../repository/configuration-device-tab/source-code-preview.component.ts","../../repository/configuration-device-tab/save-to-repository.component.ts","../../repository/configuration-device-tab/configuration-preview.component.ts","../../repository/configuration-device-tab/configuration-filter.pipe.ts","../../repository/configuration-device-tab/device-configuration.guard.ts","../../repository/file-download/link-render-type.enum.ts","../../repository/configuration-device-tab/device-configuration-list.component.ts","../../repository/file-download/file-download.component.ts","../../repository/repository.module.ts"],"names":["RepositoryType","__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","__generator","body","f","y","t","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","this","n","v","op","TypeError","call","pop","push","__values","o","s","m","__read","ar","error","__spread","concat","DeviceConfigurationOperation","REPOSITORY_BINARY_TYPES","_a","SOFTWARE","FIRMWARE","CONFIGURATION","RepositoryService","inventory","inventoryBinary","operation","alert","event","operationRealtime","eventBinary","dateFrom","Date","dateTo","now","queriesUtil","QueriesUtil","prototype","listRepositoryEntries","type","options","filters","defaultFilters","fullQuery","query","addOrderbys","name","addAndFilter","partialTextFilter","_b","partialText_1","partialText","orFilter","__or","properties","map","property","partialName","skipLegacy","__not","__has","assign","buildQuery","pageSize","withTotalPages","params","list","save","data","mo","configurationType","selected","undefined","version","description","deviceType","c8y_Global","id","existingUrl","url","binary","file","create","response","self","updateEntry","createEntry","modal","createFirmwareOrSoftware","mos","selectedId","saveBinary","_c","binaryURL","createOrUpdateRepositoryEntry","repositoryEntry","isNil","createRepositoryBinary","repositoryBinary","linkBinary","cleanUp","errorMsg","error_1","set","update","parent","prepareRepositoryBinaryMO","childAdditionsCreate","patchVersion","dependency","c8y_Patch","c8y_Firmware","repositoryBinaryId","binaryId","childAdditionsAdd","mosToDelete","_this","forEach","c8y_IsBinary","isUndefined","delete","entity","forceCascade","msg","gettext","danger","getBaseVersionsCount$","entry","isLegacyEntry","of","from","listBaseVersions","pipe","paging","totalPages","getBaseVersionFromMO","isPatch","get","getPatchVersionsCount$","baseVersion","listPatchVersions","Boolean","listAllVersions","getBaseVersionResultListForLegacyEntry","listChildren","__filter","__orderby","creationTime.date","creationTime","PATCH_FILTER_ORDER","c8y_Patch.dependency","isString","listBaseVersionAndPatches","c8y_Firmware.version","childrenFilters","__bygroupid","listQuery","fetchAllItemsFromList","firstPage","allItems","_d","items","nextPage","getRepositoryEntryMO$","reference","detail","withChildren","getRepositoryBinaryMoByVersion","deviceRepositoryFragment","_e","_f","repositoryBinaryType","newModelBaseVersionQuery","legacyVersionQuery","withParents","__and","head","getBinaryName$","binaryUrl","getIdFromUrl","defer","getDeviceTypeQuery","repositoryType","device","c8y_Filter.type","getConfigurationTypeQuery","getDeviceSoftwareList","c8y_SoftwareList","cloneDeep","c8y_Software","_map","createSoftwareUpdateOperation","changes","getSoftwareUpdateOperation","deviceId","change","action","join","c8y_SupportedOperations","includes","c8y_SoftwareUpdate","deviceSoftware","pick","remove","getDeviceSoftwareChangesFromOperation","getDeviceSoftwareChangesFromSoftwareListOperation","getDeviceSoftwareChangesFromSoftwareOperation","createFirmwareUpdateOperation","selectedOption","getFirmwareUpdateOperation","getUploadConfigurationFileOperation","isLegacy","c8y_UploadConfigFile","getDownloadConfigurationFileOperation","configSnapshot","c8y_DownloadConfigFile","c8y_ConfigurationDump","getLastFirmwareUpdateOperation","toISOString","revert","getFirstMatchingOperation","fragmentType","getLastSoftwareUpdateOperation","filtersList","matchingOperation","filtersList_1","filtersList_1_1","operations","createObservedOperation","take","switchMap","createdOperation","observeOperation","observedOperation$","operationUpdates$","observedOperation","onAll$","withLatestFrom","filter","operationUpdate","status","OperationStatus","FAILED","throwError","takeWhile","SUCCESSFUL","merge","getLatestConfigurationEvent","eventFilter","source","getConfigFileOperationList","operationType","operationFilter","getConfigSnapshot","time","text","download","binaryType","getLegacyConfigSnapshot","snapshotId","getBinaryText","allowExternal","getExternalBinaryResponse","res","getInternalBinaryResponse","getBinaryFile","contentType","arrayBuffer","File","getLastConfigUpdateOperation","createTextBasedConfigurationReloadOperation","c8y_SendConfiguration","createTextBasedConfigurationUpdateOperation","config","c8y_Configuration","getBinary","getSnapshotsFromRepository","searchQuery","noAlerts","fetch","fetchRes","newMo","existingBinaryId","newBinaryId","operationSoftware","find","deviceSoftwareVersion","deviceSoftwareName","operationSoftwareVersion","operationSoftwareName","Injectable","InventoryService","InventoryBinaryService","OperationService","AlertService","EventService","OperationRealtimeService","EventBinaryService","AddFirmwareModalComponent","repositoryService","saved","EventEmitter","onInput","BehaviorSubject","model","saving","firmwarePreselected","textForFirmwareUrlPopover","ngOnInit","setInitialState","loadFirmwares","inputSubscription$","tap","form","reset","debounceTime","distinctUntilChanged","searchStr","getFirmwareResult","subscribe","firmwaresResult","savedFirmware","successMsg","cancel","catch","success","hide","complete","ngOnDestroy","unsubscribe","onFile","dropped","droppedFiles","onFirmwareSelect","firmware","Component","args","selector","template","BsModalRef","ViewChild","static","Output","AddFirmwarePatchModalComponent","repository","firmwareInput$","firmwares$","shareReplay","firmwareSelected$","patchDependencyInput$","baseVersions$","selectedFirmware","baseVersionsFilterPipe","partialVersion","toLowerCase","indexOf","FirmwareListComponent","modalService","bsModalService","translateService","alertService","router","activatedRoute","textFilter$","reload$","reloading","combineLatest","getFirmwares","canAddFirmwarePatch$","bind","DEVICE_TYPE_NOT_AVAILABLE","addFirmware","show","class","ignoreBackdropClick","content","editFirmware","addFirmwarePatch","navigate","relativeTo","deleteFirmware","title","instant","labels","ok","confirm","Status","DANGER","addServerFailure","ex_1","getDeviceTypeTitle","ModalService","BsModalService","TranslateService","Router","ActivatedRoute","memoize","FirmwareDetailsComponent","inventoryService","Subject","reloading$","updateFirmware$","firmwareUpdated$","baseVersionsUpdated$","patchVersionsUpdated$","firmware$","distinctUntilKeyChanged","isLegacy$","canAddPatchVersions$","hasBaseVersions","expanded","destroy$","firmwarePartial","takeUntil","getPatchVersions$","addBaseVersion","initialState","addPatchVersion","deleteBaseVersion","deletePatchVersion","ex_2","AddSoftwareModalComponent","softwarePreselected","textForSoftwareUrlPopover","loadSoftwares","getSoftwareResult","softwaresResult","savedSoftware","onSoftwareSelect","software","SoftwareListComponent","softwares$","getSoftwares","addSoftware","editSoftware","deleteSoftware","SoftwareDetailsComponent","updateSoftware$","softwareUpdated$","software$","softwarePartial","ConfigurationDetailComponent","bsModalRef","pattern","uploadChoice","_save","_cancel","configs","existingBinary","setPipe","submitButtonTitle","filterStr","filterPipe","uniqBy","configurationForm","markAsDirty","ConfigurationListComponent","inventoryBinaryService","filterTerm","DELETED_SUCCESS_MSG","loadConfigurations","configurations$","add","edit","configuration","fileBinary","isBinaryFile","getBinaryName","saveAs","confirmationText","hint","proceed","ex_3","trim","filterContainString","shouldShowEmptyState","term","FilterInputComponent","RepositoryNavigationFactory","navs","NavigatorNode","path","icon","priority","RepositorySelectModalComponent","repositoryEntriesWithVersions$","badgeTemplates","=1","other","load","searchTerm","deviceTypeQuery","showFilter","areMoreEntries","resultEmitter","mode","ModalSelectionMode","SINGLE","disableSelected","modalEntries","mergeMap","aggregate","PAGE_SIZE","Error","addOrFilter","getAndAssignRepositoryBinaries","versions","search","selectedItems","emit","all","getSelectModalOptions","getSelectModalObject","selectModalOptions","isSelected","isBinaryRepositorySelected","bodyValue","bodyClass","obj","repositoryFragment","count","groupId","additionalInformation","FirmwareDeviceTabComponent","route","bsModal","isEmpty","device$","snapshot","contextData","deviceFirmwareFragment$","firmwareBinary$","deviceFirmwareFragment","repositoryEntry$","patches$","firmwareBinary","changesOperation$","changesInProgress$","isInProgress","loadDevice","loadOperation","installFirmware","repositoryEntriesWithVersionsFn$","getRepositoryEntriesWithVersions$","subTitle","handleOperation","searchTerm$","addPatch","getRepositoryEntryWithPatches$","patches","trackOperation","PENDING","EXECUTING","FirmwareDeviceTabGuard","canActivate","supportedOperations","SoftwareDeviceTabComponent","deviceTypeQuery$","list$","changes$","addChanges","requestedChanges","stagedChanges","requestedChange","some","stagedChange","areSameChanges","dropChange","changeToBeDropped","change1","change2","clearChanges","applyChanges","displayChangesFromOperation","SoftwareDeviceTabGuard","isAnyOperationSupported","InstalledSoftwareComponent","installSoftware","displaySoftwareSelectModal","getInstallableSoftwareListWithVersions$","softwareToInstall","emitSoftwareInstall","updateSoftware","softwareToRemove","getSingleSoftwareWithVersions$","removeSoftware","emitSoftwareRemoval","installedSoftwareNames","softwareList","attachVersions","initialStateOverrides","MULTI","item","Input","DeviceSoftwareListComponent","ngAfterContentInit","showUpdate","observers","showRemove","isSoftwareGoingToBeChanged","deviceSoftwareChanges","DeviceSoftwareChangesComponent","clear","drop","installations$","removals$","ngOnChanges","currentValue","DeviceConfigurationService","configurationsUpdated","updateConfigurations","repositorySnapsOnly","hasAnySupportedOperation","supported","Array","isArray","supportedOperation","TextBasedConfigurationComponent","deviceConfigurationService","reloadingConfig","showTextBasedConfigReload","SEND_CONFIG","showTextBasedConfigSave","CONFIG","latestOperation","reloadConfiguration","operationCfg","onOperationReloadSuccess","onOperationReloadError","onOperationReloadComplete","ex","updateConfiguration","onOperationUpdateSuccess","onOperationUpdateError","onOperationUpdateComplete","DeviceConfigurationComponent","realtime","supportedConfigurations","showBinaryBasedConfig","updateSnapshots","c8y_SupportedConfigurations","DOWNLOAD_CONFIG","UPLOAD_CONFIG","repositorySnapshotsEmptyState","showTextBasedConfig","onConfigTypeSelected","onRepositoryConfigSelected","repositorySnapshot","repositorySnapshots","textBasedConfigurationComponent","Realtime","SaveToRepositoryComponent","configSnapshotData","close","ConfigurationPreviewComponent","user","appState","operationService","canCallAction","deviceConfigurationOperation","_configurationType","setOperation","operationsSubscription","updatePreview","operationToTrigger","configType","operationList","createDeviceOperation","showOperation","showBinary","isCreateOperationDisabled","updateSnapshotsOnConfigUpload","blob","Blob","fileName","saveToRepository","hasPermission","hasAnyRole","currentUser","UserService","AppStateService","ConfigurationFilterPipe","transform","Pipe","DeviceConfigurationGuard","state","LinkRenderType","DeviceConfigurationListComponent","configSelected","showConfigurationTypePreview","selectedConfig","updatePipe","FileDownloadComponent","linkRenderType","determineBehavior","DOWNLOAD","match","LINK","TEXTONLY","downloadFile","component","context","ViewContext","Device","NgModule","imports","CoreModule","FormsModule","SingleOperationDetailsModule","BsDropdownModule","forRoot","TooltipModule","PopoverModule","TabsModule","exports","declarations","SourceCodePreviewComponent","entryComponents","providers","provide","HOOK_NAVIGATOR_NODES","useClass","multi","HOOK_ONCE_ROUTE","useValue","ɵ0"],"mappings":"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B,MAAOqI,EAAAA,QAAQ,iBACfsW,KAAM,QACNC,SAAU,IACVuE,YAAa,CAACkI,QAOxB,kCA1HCoB,EAAAA,SAAQhX,KAAA,CAAC,CACRiX,QAAS,CACPC,EAAAA,WACAC,EAAAA,YACAC,EAAAA,6BACAC,EAAAA,iBAAiBC,UACjBC,EAAAA,cACAC,EAAAA,cACAC,EAAAA,WAAWH,WAEbI,QAAS,GACTC,aAAc,CACZvW,EACAyC,EACAnG,EACA6C,EACAuF,EACAM,EACAf,EACAsG,EACAiC,EACAoB,EACA5F,EACA8G,EACAO,EACAjJ,EACAf,EACAkM,EACAoD,GACA6B,EACA9D,EACA2B,EACA9B,EACAlC,EACA2E,IAEFyB,gBAAiB,CACfzW,EACAyC,EACAnG,EACA6C,EACAuF,EACAM,EACAf,EACAsG,EACAiC,EACAsC,EACA9G,EACAqH,EACAjJ,EACAf,EACAkM,EACAgB,EACAlC,GAEFqG,UAAW,CACTvrB,EACAiR,EAAAA,yBACAwT,EACAvD,EACAqB,EACA8G,EACA,CACEmC,QAASC,EAAAA,qBACTC,SAAUnP,EACVoP,OAAO,GAET,CACEH,QAASI,EAAAA,gBACTC,SAAQC,GAiDRH,OAAO","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { IManagedObject } from '@c8y/client';\n\nexport enum RepositoryType {\n FIRMWARE = 'c8y_Firmware',\n SOFTWARE = 'c8y_Software',\n CONFIGURATION = 'c8y_ConfigurationDump'\n}\n\nexport const REPOSITORY_BINARY_TYPES = {\n [RepositoryType.SOFTWARE]: 'c8y_SoftwareBinary',\n [RepositoryType.FIRMWARE]: 'c8y_FirmwareBinary',\n [RepositoryType.CONFIGURATION]: 'c8y_ConfigurationDumpBinary'\n};\n\nexport interface ModalModel {\n selected?: { id?: string; name?: string; [key: string]: any };\n version?: string;\n dependency?: { c8y_Firmware: { version: string } };\n patchVersion?: string;\n description?: string;\n deviceType?: string;\n binary?: {\n file?: File;\n url?: string;\n };\n}\n\nexport interface RepositoryCategory extends Partial<IManagedObject> {\n type: string;\n description?: string;\n c8y_Filter?: {\n type: string;\n };\n}\n\nexport interface FirmwareBinary extends Partial<IManagedObject> {\n type: 'c8y_FirmwareBinary';\n c8y_Firmware: {\n version: string;\n url: string;\n };\n}\n\nexport interface FirmwarePatchBinary extends FirmwareBinary {\n c8y_Patch: {\n dependency: string;\n };\n}\n\nexport interface SoftwareBinary extends Partial<IManagedObject> {\n type: string;\n c8y_Software: {\n version: string;\n url: string;\n };\n}\n\nexport type RepositoryBinary = FirmwareBinary | SoftwareBinary | FirmwarePatchBinary;\n\nexport interface SelectedRepositoryBinary {\n id?: string;\n name: string;\n version: string;\n url: string;\n dependency?: string;\n c8y_Patch?: boolean;\n isPatch?: boolean;\n patchDependency?: string;\n}\n\nexport interface DeviceFirmware {\n version: string;\n url: string;\n name: string;\n}\n\nexport interface DeviceSoftware {\n name: string;\n version?: string;\n url: string;\n}\n\nexport interface DeviceSoftwareChange extends DeviceSoftware {\n action: 'install' | 'delete';\n}\n\nexport interface ConfigurationSnapshot {\n id?: string;\n time: string;\n name: string;\n binaryUrl?: string;\n binary?: any;\n binaryType?: any;\n deviceType?: string;\n configurationType?: string;\n description?: string;\n}\n\nexport interface SupportedConfigurationItem {\n name: string;\n deviceType?: string;\n configurationType?: string;\n isLegacy?: boolean;\n}\n\nexport interface DeviceConfigurationListEmptyState {\n icon?: string;\n title?: string;\n text?: string;\n}\n\nexport enum DeviceConfigurationOperation {\n UPLOAD_CONFIG = 'c8y_UploadConfigFile',\n DOWNLOAD_CONFIG = 'c8y_DownloadConfigFile',\n CONFIG = 'c8y_Configuration',\n SEND_CONFIG = 'c8y_SendConfiguration'\n}\n","import { Injectable } from '@angular/core';\nimport {\n EventBinaryService,\n EventService,\n IdReference,\n IEvent,\n IFetchResponse,\n IIdentified,\n IManagedObject,\n IManagedObjectBinary,\n InventoryBinaryService,\n InventoryService,\n IOperation,\n IResult,\n IResultList,\n OperationService,\n OperationStatus,\n QueriesUtil\n} from '@c8y/client';\nimport { AlertService, gettext, OperationRealtimeService } from '@c8y/ngx-components';\nimport {\n assign,\n cloneDeep,\n find,\n forEach,\n get,\n head,\n isNil,\n isString,\n isUndefined,\n map as _map,\n pick,\n remove,\n set\n} from 'lodash-es';\nimport { defer, from, merge, Observable, of, throwError } from 'rxjs';\nimport { filter, map, switchMap, take, takeWhile, withLatestFrom } from 'rxjs/operators';\nimport {\n ConfigurationSnapshot,\n DeviceFirmware,\n DeviceSoftware,\n DeviceSoftwareChange,\n FirmwareBinary,\n FirmwarePatchBinary,\n ModalModel,\n RepositoryBinary,\n RepositoryCategory,\n RepositoryType,\n REPOSITORY_BINARY_TYPES,\n SelectedRepositoryBinary,\n SoftwareBinary\n} from './repository.model';\n\n@Injectable()\nexport class RepositoryService {\n readonly dateFrom = new Date(0);\n readonly dateTo = new Date(Date.now() + 86400000); // 1 day in the future\n private queriesUtil: QueriesUtil;\n\n constructor(\n private inventory: InventoryService,\n private inventoryBinary: InventoryBinaryService,\n private operation: OperationService,\n private alert: AlertService,\n private event: EventService,\n private operationRealtime: OperationRealtimeService,\n private eventBinary: EventBinaryService\n ) {\n this.queriesUtil = new QueriesUtil();\n }\n\n /**\n * Lists repository entries of given type.\n * @param type The type of repository entries to list.\n * @param options Extra listing options.\n */\n listRepositoryEntries(\n type: RepositoryType,\n options?: {\n /** Additional query. */\n query?: any;\n /** (deprecated - to be removed) Only include entries with matching partial names. */\n partialName?: string;\n /** Include entries with matching partial text in the specified properties. */\n partialTextFilter?: { partialText: string; properties: string[] };\n /** Exclude legacy entries. */\n skipLegacy?: boolean;\n /** Other request params. */\n params?: any;\n }\n ) {\n const defaultOrder = [{ name: 1 }];\n const defaultFilters = { type };\n const legacyFilters = { __has: `url` };\n let filters = {};\n\n let fullQuery = (options && options.query) || {};\n fullQuery = this.queriesUtil.addOrderbys(fullQuery, defaultOrder, 'prepend');\n\n fullQuery = this.queriesUtil.addAndFilter(fullQuery, defaultFilters);\n\n if (options && options.partialTextFilter) {\n const { partialText, properties } = options.partialTextFilter;\n const orFilter = { __or: properties.map(property => ({ [property]: `*${partialText}*` })) };\n fullQuery = this.queriesUtil.addAndFilter(fullQuery, orFilter);\n }\n\n if (options && options.partialName) {\n // backwards compatibility if\n fullQuery = this.queriesUtil.addAndFilter(fullQuery, { name: `*${options.partialName}*` });\n }\n\n if (options && options.skipLegacy) {\n fullQuery = this.queriesUtil.addAndFilter(fullQuery, { __not: legacyFilters });\n }\n\n filters = {\n query: this.queriesUtil.buildQuery(fullQuery),\n pageSize: 50,\n withTotalPages: true,\n ...((options && options.params) || {})\n };\n return this.inventory.list(filters);\n }\n\n // TODO: merge with create()\n async save(data: ModalModel, type: RepositoryType, mo: Partial<IManagedObject> = {}) {\n switch (type) {\n case RepositoryType.CONFIGURATION: {\n Object.assign(mo, {\n type: RepositoryType.CONFIGURATION,\n configurationType: data.selected ? data.selected.configurationType : undefined,\n name: data.version,\n description: data.description,\n deviceType: data.deviceType,\n c8y_Global: {}\n });\n if (!data.deviceType && mo.id) {\n mo.deviceType = null;\n }\n if (!data.selected && mo.id) {\n mo.configurationType = null;\n }\n break;\n }\n }\n\n const existingUrl = mo.url;\n if (data.binary.url) {\n mo.url = data.binary.url;\n } else if (data.binary.file) {\n const response = await this.inventoryBinary.create(data.binary.file, {\n c8y_Global: {}\n } as Partial<IManagedObject>);\n mo.url = response.data.self;\n }\n\n if (mo.id) {\n return this.updateEntry(mo, existingUrl);\n }\n return this.createEntry(mo);\n }\n\n async create(modal: ModalModel, type: RepositoryType) {\n switch (type) {\n case RepositoryType.FIRMWARE:\n case RepositoryType.SOFTWARE:\n return this.createFirmwareOrSoftware(modal, type);\n }\n }\n\n async createFirmwareOrSoftware(\n modal: ModalModel,\n type: RepositoryType\n ): Promise<RepositoryCategory> {\n let binary: IManagedObjectBinary;\n let binaryURL: string;\n let repositoryEntry: RepositoryCategory;\n let repositoryBinary: FirmwareBinary | SoftwareBinary;\n const mos = [];\n const {\n selected: { id: selectedId },\n binary: { file, url }\n } = modal;\n try {\n if (file) {\n ({ data: binary } = await this.saveBinary(file));\n ({ self: binaryURL } = binary);\n mos.push(binary);\n } else {\n binaryURL = url;\n }\n\n ({ data: repositoryEntry } = await this.createOrUpdateRepositoryEntry(modal, type));\n if (isNil(selectedId)) {\n mos.push(repositoryEntry);\n }\n\n ({ data: repositoryBinary } = await this.createRepositoryBinary(\n modal,\n binaryURL,\n type,\n repositoryEntry\n ));\n mos.push(repositoryBinary);\n\n if (file) {\n await this.linkBinary(repositoryBinary, binary);\n }\n\n return repositoryEntry;\n } catch (error) {\n this.cleanUp(mos);\n this.errorMsg();\n\n // Propagate error\n throw error;\n }\n }\n\n saveBinary(file: File): Promise<IResult<IManagedObjectBinary>> {\n return this.inventoryBinary.create(file, { c8y_Global: {} } as Partial<IManagedObject>);\n }\n\n createOrUpdateRepositoryEntry(\n modal: ModalModel,\n type: RepositoryType\n ): Promise<IResult<RepositoryCategory>> {\n const {\n selected: { id, name },\n description,\n deviceType\n } = modal;\n\n const mo = {\n id,\n name: id ? undefined : name,\n description,\n type: id ? undefined : type,\n c8y_Global: {}\n };\n\n if (deviceType) {\n set(mo, 'c8y_Filter.type', deviceType);\n }\n\n return id\n ? (this.inventory.update(mo) as Promise<IResult<RepositoryCategory>>)\n : (this.inventory.create(mo) as Promise<IResult<RepositoryCategory>>);\n }\n\n createRepositoryBinary(\n modal: ModalModel,\n binaryURL: string,\n type: RepositoryType,\n parent: RepositoryCategory\n ): Promise<IResult<FirmwareBinary | SoftwareBinary | FirmwarePatchBinary>> {\n const mo = this.prepareRepositoryBinaryMO(modal, binaryURL, type);\n\n return this.inventory.childAdditionsCreate(mo, parent) as Promise<\n IResult<FirmwareBinary | SoftwareBinary | FirmwarePatchBinary>\n >;\n }\n\n prepareRepositoryBinaryMO(modal: ModalModel, binaryURL: string, type: RepositoryType) {\n const { version, patchVersion, dependency } = modal;\n const result = {\n type: REPOSITORY_BINARY_TYPES[type],\n [type]: {\n url: binaryURL\n },\n c8y_Global: {}\n };\n\n if (dependency) {\n set(result, [type, 'version'], patchVersion);\n assign(result, {\n c8y_Patch: {\n dependency: dependency.c8y_Firmware.version\n }\n });\n } else {\n set(result, [type, 'version'], version);\n }\n return result;\n }\n\n async linkBinary(\n repositoryBinary: FirmwareBinary | SoftwareBinary,\n binary: IManagedObjectBinary\n ) {\n const { id: repositoryBinaryId } = repositoryBinary;\n if (binary) {\n const { id: binaryId } = binary;\n return this.inventory.childAdditionsAdd(binaryId, repositoryBinaryId);\n }\n }\n\n cleanUp(mosToDelete: IIdentified[]) {\n mosToDelete.forEach(mo => {\n const { c8y_IsBinary } = mo;\n isUndefined(c8y_IsBinary) ? this.delete(mo) : this.inventoryBinary.delete(mo);\n });\n }\n\n delete(entity: IIdentified): Promise<IResult<null>> {\n return this.inventory.delete(entity, { forceCascade: true });\n }\n\n errorMsg() {\n const msg = gettext('Failed to save');\n this.alert.danger(msg);\n }\n\n getBaseVersionsCount$(entry: IManagedObject): Observable<number> {\n if (this.isLegacyEntry(entry)) {\n return of(1);\n }\n return from(this.listBaseVersions(entry, { pageSize: 1, withTotalPages: true })).pipe(\n map(({ paging }) => paging.totalPages)\n );\n }\n\n getBaseVersionFromMO(mo: RepositoryBinary): string {\n return this.isPatch(mo) ? get(mo, 'c8y_Patch.dependency') : get(mo, 'c8y_Firmware.version');\n }\n\n isPatch(mo: RepositoryBinary): boolean {\n return !!get(mo, 'c8y_Patch.dependency');\n }\n\n getPatchVersionsCount$(entry: IManagedObject, baseVersion: FirmwareBinary): Observable<number> {\n if (this.isLegacyEntry(baseVersion)) {\n return of(0);\n }\n return from(\n this.listPatchVersions(entry, baseVersion, { pageSize: 1, withTotalPages: true })\n ).pipe(map(({ paging }) => paging.totalPages));\n }\n\n isLegacyEntry(entry: Partial<IManagedObject>): boolean {\n return Boolean(entry.url);\n }\n\n /**\n * Lists all versions (base and patch ones) of given top level entry.\n * Versions are ordered by creation time (assuming the earlier created, the older the version).\n * @param entry Top level repository entry.\n * @param params Additional query params.\n */\n listAllVersions(entry: Partial<IManagedObject>, params = {}) {\n if (this.isLegacyEntry(entry)) {\n return this.getBaseVersionResultListForLegacyEntry(entry);\n }\n\n const VERSION_FILTER_ORDER = {\n __filter: {},\n __orderby: [{ 'creationTime.date': -1 }, { creationTime: -1 }]\n };\n return this.listChildren(entry, VERSION_FILTER_ORDER, params);\n }\n\n /**\n * Lists base versions of given top level entry.\n * Versions are ordered by creation time (assuming the earlier created, the older the version).\n * @param entry Top level repository entry.\n * @param params Additional query params.\n */\n listBaseVersions(entry: Partial<IManagedObject>, params = {}) {\n if (this.isLegacyEntry(entry)) {\n return this.getBaseVersionResultListForLegacyEntry(entry);\n }\n\n const NO_PATCH_FILTER_ORDER = {\n __filter: {\n __not: { __has: 'c8y_Patch' }\n },\n __orderby: [{ 'creationTime.date': -1 }, { creationTime: -1 }]\n };\n return this.listChildren(entry, NO_PATCH_FILTER_ORDER, params);\n }\n\n /**\n * Lists patch versions of given base version under the entry.\n * Versions are ordered by creation time (assuming the earlier created, the older the version).\n * @param entry Top level repository entry.\n * @param baseVersion Base version.\n * @param params Additional query params.\n */\n listPatchVersions(entry: IManagedObject, baseVersion: FirmwareBinary | string, params = {}) {\n const version = isString(baseVersion) ? baseVersion : get(baseVersion, 'c8y_Firmware.version');\n const PATCH_FILTER_ORDER = {\n __filter: {\n 'c8y_Patch.dependency': version\n },\n __orderby: [{ 'creationTime.date': -1 }, { creationTime: -1 }]\n };\n return this.listChildren(entry, PATCH_FILTER_ORDER, params);\n }\n\n /**\n * Lists patch versions of given base version under the entry including the base version.\n * Versions are ordered by creation time (assuming the earlier created, the older the version).\n * In terms of legacy base version the entry gets transformed to fit the needed data model.\n * @param entry Top level repository entry.\n * @param baseVersion Base version.\n * @param params Additional query params.\n */\n listBaseVersionAndPatches(entry: IManagedObject, baseVersion: IManagedObject, params = {}) {\n if (this.isLegacyEntry(entry)) {\n return Promise.resolve({\n data: [\n Object.assign(\n {\n c8y_Firmware: {\n version: entry.version,\n url: entry.url\n }\n },\n entry\n )\n ]\n });\n }\n\n const PATCH_FILTER_ORDER = {\n __filter: {\n __or: {\n 'c8y_Patch.dependency': baseVersion.c8y_Firmware.version,\n 'c8y_Firmware.version': baseVersion.c8y_Firmware.version\n }\n },\n __orderby: [{ 'c8y_Patch.dependency': 1 }, { 'c8y_Firmware.version': 1 }]\n };\n return this.listChildren(entry, PATCH_FILTER_ORDER, params);\n }\n\n listChildren(entry: Partial<IManagedObject>, filters = {}, params: any = {}) {\n const childrenFilters = { __bygroupid: entry.id };\n const query = this.queriesUtil.addAndFilter(filters, childrenFilters);\n // FIXME: needed because of issue in forOf directive (...)\n params.withTotalPages = true;\n return this.inventory.listQuery(query, params);\n }\n\n /**\n * Fetches all items from the list starting with the provided page.\n * @param firstPage The first page of the list to fetch all items for.\n */\n async fetchAllItemsFromList(firstPage) {\n let allItems;\n\n if (!firstPage.then) {\n allItems = [...firstPage];\n } else {\n let { paging, data: items } = await firstPage;\n allItems = [...items];\n\n while (paging && paging.nextPage) {\n ({ paging, data: items } = await paging.next());\n allItems = [...allItems, ...items];\n }\n }\n\n return allItems;\n }\n\n /**\n * Gets top level repository entry managed object for base or patch version.\n * @param mo Base or patch version managed object with parents.\n */\n getRepositoryEntryMO$(mo: IManagedObject): Observable<IManagedObject | undefined> {\n if (!mo) {\n return of(undefined);\n }\n const [reference] = get(mo, 'additionParents.references');\n const id = get(reference, 'managedObject.id');\n return id\n ? from(this.inventory.detail(id, { withChildren: false })).pipe(map(({ data }) => data))\n : of(undefined);\n }\n /**\n * Gets base or patch version managed object.\n * @param deviceRepositoryFragment Device repository fragment.\n * @param type Top level repository entry type.\n * @param configuration Configuration object with options:\n * - **skipLegacy** - `boolean` - Exclude legacy entries.\n * - **filters** - `object` - Filter object.\n *\n * @deprecated as it doesn't support 'missing url' case\n */\n getRepositoryBinaryMoByVersion(\n deviceRepositoryFragment: DeviceFirmware | DeviceSoftware,\n type: RepositoryType,\n { skipLegacy = false, filters = {} }: { skipLegacy?: boolean; filters?: object } = {}\n ): Promise<IManagedObject> {\n const { version, url, name } = deviceRepositoryFragment;\n const repositoryBinaryType = REPOSITORY_BINARY_TYPES[type];\n let query;\n const newModelBaseVersionQuery = {\n [`${type}.version`]: version,\n [`${type}.url`]: url,\n type: repositoryBinaryType\n };\n const legacyVersionQuery = { url, type, name };\n filters = { withChildren: false, withParents: true, ...filters };\n\n if (skipLegacy) {\n query = {\n __and: {\n ...newModelBaseVersionQuery\n }\n };\n } else {\n query = {\n __or: [{ __and: { ...newModelBaseVersionQuery } }, { __and: { ...legacyVersionQuery } }]\n };\n }\n\n return this.inventory.listQuery(query, filters).then(({ data }) => head(data));\n }\n\n getBinaryName$(binaryUrl: string): Observable<string> {\n if (!binaryUrl) {\n return of('---');\n }\n\n const binaryId = this.inventoryBinary.getIdFromUrl(binaryUrl);\n if (!binaryId) {\n return of(binaryUrl);\n }\n return defer(() => this.inventory.detail(binaryId).then(result => result.data)).pipe(\n map(mo => mo.name)\n );\n }\n\n /**\n * Generates an inventory query object which can be used to find\n * repository entries of specified type matching the type of provided device.\n * @param repositoryType The type of repository entries which will be queried with the generated query.\n * @param device The device for which matching repository entries will be queried with the generated query.\n */\n\n getDeviceTypeQuery(repositoryType: RepositoryType, device: IManagedObject): object {\n let result = { type: repositoryType };\n if (repositoryType === RepositoryType.CONFIGURATION) {\n if (device.type) {\n result = this.queriesUtil.addAndFilter(result, {\n __or: [{ deviceType: device.type }, { __not: { __has: `deviceType` } }]\n });\n }\n } else {\n result = this.queriesUtil.addAndFilter(result, {\n __or: [\n { 'c8y_Filter.type': device.type },\n { 'c8y_Filter.type': '' },\n { __not: { __has: `c8y_Filter.type` } }\n ]\n });\n }\n return result;\n }\n\n /**\n * Generates an inventory query object which can be used to find configuration repository entries\n * matching the type of provided device and specified configuration type.\n * @param device The device for which matching repository entries will be queried with the generated query.\n * @param configurationType Configuration type for which matching repository entries will be queried with the generated query.\n */\n getConfigurationTypeQuery(device: IManagedObject, configurationType: string): object {\n const query = this.getDeviceTypeQuery(RepositoryType.CONFIGURATION, device);\n return this.queriesUtil.addAndFilter(query, {\n __or: [\n { configurationType },\n { configurationType: '' },\n { __not: { __has: `configurationType` } }\n ]\n });\n }\n\n /**\n * Gets the list of software installed in the device in the uniform format.\n * Supports c8y_SoftwareList and c8y_Software fragments.\n * @param device The device whose software list should be returned.\n */\n getDeviceSoftwareList(device: IManagedObject): DeviceSoftware[] {\n if (device.c8y_SoftwareList) {\n return cloneDeep(device.c8y_SoftwareList);\n }\n if (device.c8y_Software) {\n return _map(device.c8y_Software, (version, name) => ({ name, version }));\n }\n return [];\n }\n\n /**\n * Prepares a software update operation for given device and the list of changes, and sends it to the device.\n * @param device The device which the operation should be prepared for and sent to.\n * @param changes The list of software changes which should be applied.\n */\n async createSoftwareUpdateOperation(\n device: IManagedObject,\n changes: DeviceSoftwareChange[]\n ): Promise<IOperation> {\n const operation = this.getSoftwareUpdateOperation(device, changes);\n return (await this.operation.create(operation)).data;\n }\n\n /**\n * Prepares a software update operation for given device and changes.\n * Returned operation type depends on device's supported operations.\n * Supports c8y_SoftwareUpdate, c8y_SoftwareList, and c8y_Software operations.\n * @param device The device for which operation should be prepared.\n * @param changes The list of software changes which should be applied.\n */\n getSoftwareUpdateOperation(device: IManagedObject, changes: DeviceSoftwareChange[]): IOperation {\n const operation: IOperation = {\n deviceId: device.id,\n description: `Apply software changes: ${changes\n .map(\n change =>\n `${change.action} \"${change.name}\"${\n change.version ? ` (version: ${change.version})` : ''\n }`\n )\n .join(', ')}`\n };\n if (device.c8y_SupportedOperations.includes('c8y_SoftwareUpdate')) {\n operation.c8y_SoftwareUpdate = cloneDeep(changes);\n } else if (device.c8y_SupportedOperations.includes('c8y_SoftwareList')) {\n operation.c8y_SoftwareList = cloneDeep(device.c8y_SoftwareList) || [];\n changes.forEach(change => {\n const deviceSoftware: DeviceSoftware = pick(change, ['name', 'version', 'url']);\n if (change.action === 'delete') {\n remove(operation.c8y_SoftwareList, deviceSoftware);\n }\n if (change.action === 'install') {\n operation.c8y_SoftwareList.push(deviceSoftware);\n }\n });\n } else if (device.c8y_SupportedOperations.includes('c8y_Software')) {\n operation.c8y_Software = cloneDeep(device.c8y_Software) || {};\n changes.forEach(change => {\n if (change.action === 'delete') {\n delete operation.c8y_Software[change.name];\n }\n if (change.action === 'install') {\n operation.c8y_Software[change.name] = change.version;\n }\n });\n }\n return operation;\n }\n\n /**\n * Extracts the list of device software changes from given operation in the context of given device.\n * @param operation The operation from which the list should be extracted.\n * @param device The target device of the operation.\n */\n getDeviceSoftwareChangesFromOperation(\n operation: IOperation,\n device: IManagedObject\n ): DeviceSoftwareChange[] {\n if (operation.c8y_SoftwareUpdate) {\n return cloneDeep(operation.c8y_SoftwareUpdate);\n }\n if (operation.c8y_SoftwareList) {\n return this.getDeviceSoftwareChangesFromSoftwareListOperation(operation, device);\n }\n if (operation.c8y_Software) {\n return this.getDeviceSoftwareChangesFromSoftwareOperation(operation, device);\n }\n return [];\n }\n\n /**\n * Prepares a firmware update operation for given device and the selected repository binary, and sends it to the device.\n * @param device The device which the operation should be prepared for and sent to.\n * @param selectedOption The selected repository binary option.\n */\n async createFirmwareUpdateOperation(\n device: IManagedObject,\n selectedOption: SelectedRepositoryBinary\n ): Promise<IOperation> {\n const operation = this.getFirmwareUpdateOperation(device, selectedOption);\n return (await this.operation.create(operation)).data;\n }\n\n /**\n * Prepares a firmware update operation for given device and selected version.\n * Supports c8y_Firmware operation.\n * @param device The device for which operation should be prepared.\n * @param selectedOption Selected firmware version.\n */\n getFirmwareUpdateOperation(\n device: IManagedObject,\n selectedOption: SelectedRepositoryBinary\n ): IOperation {\n delete selectedOption.id;\n\n const operation: IOperation = {\n deviceId: device.id,\n description: `Update firmware to: \"${selectedOption.name}\"${\n selectedOption.version ? ` (version: ${selectedOption.version})` : ''\n }`,\n c8y_Firmware: { ...selectedOption }\n };\n\n return operation;\n }\n\n /**\n * Prepares a configuration file upload operation for given device and configuration type.\n * @param device The device for which operation should be prepared.\n * @param configurationType Selected configuration type.\n * @param isLegacy A legacy operation is created without a configurationType.\n */\n getUploadConfigurationFileOperation(\n device: IManagedObject,\n configurationType: string,\n isLegacy: boolean = false\n ): IOperation {\n if (isLegacy) {\n return {\n deviceId: device.id,\n description: `Retrieve configuration snapshot from device ${device.name}`,\n c8y_UploadConfigFile: {}\n };\n }\n return {\n deviceId: device.id,\n description: `Retrieve ${configurationType} configuration snapshot from device ${\n device.name\n }`,\n c8y_UploadConfigFile: {\n type: configurationType\n }\n };\n }\n\n /**\n * Prepares a configuration file download operation for given device and configuration type.\n * @param device The device for which operation should be prepared.\n * @param configurationType Selected configuration type.\n * @param binaryUrl The url of a binary to be downloaded.\n * @param isLegacy A legacy operation is created without a configurationType.\n */\n getDownloadConfigurationFileOperation(\n device: IManagedObject,\n configurationType: string,\n configSnapshot: ConfigurationSnapshot,\n isLegacy: boolean = false\n ): IOperation {\n if (isLegacy) {\n return {\n deviceId: device.id,\n description: `Send configuration snapshot ${configSnapshot.name} to device ${device.name}`,\n c8y_DownloadConfigFile: {\n url: configSnapshot.binaryUrl,\n c8y_ConfigurationDump: {\n id: configSnapshot.id\n }\n }\n };\n }\n return {\n deviceId: device.id,\n description: `Send configuration snapshot ${\n configSnapshot.name\n } of configuration type ${configurationType} to device ${device.name}`,\n c8y_DownloadConfigFile: {\n url: configSnapshot.binaryUrl,\n type: configurationType\n }\n };\n }\n\n /**\n * Gets the last firmware update operation for given device.\n * Looks for c8y_Firmware operations.\n * @param deviceId The ID of the device to find an operation for.\n */\n async getLastFirmwareUpdateOperation(deviceId: string | number): Promise<IOperation> {\n const filters = {\n deviceId,\n dateFrom: new Date(0).toISOString(),\n dateTo: new Date(Date.now()).toISOString(),\n revert: true,\n pageSize: 1\n };\n return this.getFirstMatchingOperation([{ ...filters, fragmentType: 'c8y_Firmware' }]);\n }\n\n /**\n * Gets the last software update operation for given device.\n * Looks for c8y_SoftwareUpdate, c8y_SoftwareList, or c8y_Software operations.\n * @param deviceId The ID of the device to find an operation for.\n */\n async getLastSoftwareUpdateOperation(deviceId: string | number): Promise<IOperation> {\n const filters = {\n deviceId,\n dateFrom: new Date(0).toISOString(),\n dateTo: new Date(Date.now()).toISOString(),\n revert: true,\n pageSize: 1\n };\n return this.getFirstMatchingOperation([\n { ...filters, fragmentType: 'c8y_SoftwareUpdate' },\n { ...filters, fragmentType: 'c8y_SoftwareList' },\n { ...filters, fragmentType: 'c8y_Software' }\n ]);\n }\n\n /**\n * Iterates over the list of filters and queries the operations.\n * If a query returns at least one operation, the first one will be returned.\n * Otherwise the next query will be performed.\n * If none of the queries returns any operation, null will be returned.\n * @param filtersList The list of filters for the queries.\n */\n async getFirstMatchingOperation(filtersList: any[]): Promise<IOperation> {\n let matchingOperation = null;\n\n for (const filters of filtersList) {\n const operations = (await this.operation.list(filters)).data;\n if (operations.length) {\n matchingOperation = operations[0];\n break;\n }\n }\n\n return matchingOperation;\n }\n\n /**\n * Creates the operation and returns an observable to track its progress.\n * Fails the observable when the operation returns FAILED status.\n * Completes the observable when the operation returns SUCCESSFUL status.\n * @param operation The operation to create and track.\n */\n createObservedOperation(operation: IOperation): Observable<IOperation> {\n return from(this.operation.create(operation)).pipe(\n map(({ data }) => data),\n take(1),\n switchMap(createdOperation => this.observeOperation(createdOperation))\n );\n }\n\n /**\n * Returns an observable to track progress of given operation.\n * Fails the observable when the operation returns FAILED status.\n * Completes the observable when the operation returns SUCCESSFUL status.\n * @param operation The operation to be observed.\n */\n observeOperation(operation: IOperation): Observable<IOperation> {\n const observedOperation$ = of(operation);\n const operationUpdates$ = observedOperation$.pipe(\n switchMap(observedOperation => this.operationRealtime.onAll$(observedOperation.deviceId)),\n map(({ data }) => data as IOperation),\n withLatestFrom(observedOperation$),\n filter(([operationUpdate, observedOperation]) => operationUpdate.id === observedOperation.id),\n switchMap(([operationUpdate]) => {\n if (operationUpdate.status === OperationStatus.FAILED) {\n return throwError(operationUpdate);\n }\n return of(operationUpdate);\n }),\n takeWhile(operationUpdate => operationUpdate.status !== OperationStatus.SUCCESSFUL, true)\n );\n return merge(observedOperation$, operationUpdates$);\n }\n\n /**\n * Gets a single event with latest creationTime for the given device Id and event type.\n * @param deviceId The device Id for which the events should be queried.\n * @param type Event type.\n */\n async getLatestConfigurationEvent(\n deviceId: string | number,\n type: string\n ): Promise<IEvent | undefined> {\n const eventFilter: object = {\n source: deviceId,\n type,\n dateFrom: this.dateFrom.toISOString(),\n dateTo: this.dateTo.toISOString(),\n pageSize: 1\n };\n\n const { data } = await this.event.list(eventFilter);\n return data[0];\n }\n\n /**\n * Gets a list of operations for the given device Id, and operation type.\n * @param deviceId The device Id for which the operation should be queried.\n * @param operationType Operation type fragment.\n */\n async getConfigFileOperationList(\n deviceId: string | number,\n operationType: string\n ): Promise<IOperation[]> {\n const operationFilter: object = {\n deviceId,\n fragmentType: operationType,\n dateFrom: this.dateFrom.toISOString(),\n dateTo: this.dateTo.toISOString(),\n revert: true,\n pageSize: 2000\n };\n\n return (await this.operation.list(operationFilter)).data;\n }\n\n /**\n * Gets latest uploaded configuration snapshot for the given device, and configuration type.\n * @param device The device for which the configuration snapshot was uploaded.\n * @param configurationType Selected configuration type.\n */\n async getConfigSnapshot(\n device: IManagedObject,\n configurationType: string\n ): Promise<ConfigurationSnapshot | undefined> {\n const event: IEvent = await this.getLatestConfigurationEvent(device.id, configurationType);\n let configSnapshot: ConfigurationSnapshot;\n if (event) {\n configSnapshot = {\n time: event.time,\n name: event.text,\n deviceType: device.type,\n configurationType\n };\n try {\n configSnapshot.binary = await (await this.eventBinary.download(event)).text();\n if (event.c8y_IsBinary) {\n configSnapshot.binaryType = event.c8y_IsBinary.type;\n }\n } catch (ex) {\n const msg = gettext('Could not get the binary.');\n this.alert.danger(msg);\n }\n }\n return configSnapshot;\n }\n\n async getLegacyConfigSnapshot(deviceId) {\n let configSnapshot: ConfigurationSnapshot;\n let mo;\n const device = (await this.inventory.detail(deviceId, { withChildren: false })).data;\n const snapshotId = device.c8y_ConfigurationDump && device.c8y_ConfigurationDump.id;\n if (!snapshotId) {\n return;\n }\n\n try {\n mo = (await this.inventory.detail(snapshotId)).data;\n } catch (ex) {\n // do nothing\n }\n if (mo) {\n configSnapshot = {\n time: mo.creationTime,\n name: mo.name\n };\n configSnapshot.binary = await this.getBinaryText(mo.url, { allowExternal: false });\n }\n return configSnapshot;\n }\n\n /**\n * Returns a binary object as text.\n * @param binaryUrl The URL to find binary\n * @param options The object with additional options:\n * - **allowExternal** - `boolean` - allows downloading external binary file\n * - **noAlerts** - `boolean` - do not display an alert message; defaults to `false`\n */\n async getBinaryText(\n binaryUrl: string,\n options: { allowExternal: boolean; noAlerts?: boolean }\n ): Promise<string> {\n const binaryId = this.inventoryBinary.getIdFromUrl(binaryUrl);\n let res;\n if (!binaryId && options.allowExternal) {\n res = await this.getExternalBinaryResponse(binaryUrl, options);\n } else {\n res = await this.getInternalBinaryResponse(binaryId, options);\n }\n if (!res) {\n return null;\n }\n return res.text();\n }\n\n /**\n * Returns a binary object as File.\n * @param binaryUrl The URL to find binary\n * @param options The object with additional options:\n * - **allowExternal** - `boolean` - allows downloading external binary file\n */\n async getBinaryFile(binaryUrl: string, options: { allowExternal: boolean }): Promise<File> {\n const binaryId = this.inventoryBinary.getIdFromUrl(binaryUrl);\n if (!binaryId && !options.allowExternal) {\n return null;\n }\n // @TODO: note that it doesn't solve issue with external binary here, such url won't have binaryId, so we won't know the name or contentType to use in File constructor, let's add a @FIXME comment for now?\n const { name, contentType } = (await this.inventory.detail(binaryId)).data;\n const res = !!binaryId\n ? await this.getInternalBinaryResponse(binaryId)\n : await this.getExternalBinaryResponse(binaryUrl);\n const arrayBuffer = await res.arrayBuffer();\n return new File([arrayBuffer], name, { type: contentType });\n }\n\n /**\n * Gets the last configuration update operation for given device.\n * Looks for c8y_Configuration and c8y_SendConfiguration operations.\n * @param deviceId The ID of the device to find an operation for.\n */\n async getLastConfigUpdateOperation(deviceId: string | number): Promise<IOperation> {\n const filters = {\n deviceId,\n dateFrom: new Date(0).toISOString(),\n dateTo: new Date(Date.now()).toISOString(),\n revert: true,\n pageSize: 1\n };\n return this.getFirstMatchingOperation([\n { ...filters, fragmentType: 'c8y_Configuration' },\n { ...filters, fragmentType: 'c8y_SendConfiguration' }\n ]);\n }\n\n /**\n * Prepares a configuration download operation for given device and its current configuration.\n * Supports c8y_SendConfiguration operation.\n * @param device The device for which operation should be prepared.\n */\n createTextBasedConfigurationReloadOperation(device: IManagedObject): IOperation {\n return {\n deviceId: device.id,\n description: gettext('Requested current configuration'),\n c8y_SendConfiguration: {}\n };\n }\n\n /**\n * Prepares a configuration update operation for the given device.\n * Supports c8y_Configuration operation.\n * @param device The device for which operation should be prepared.\n * @param config The configuration which will update the existing one.\n */\n createTextBasedConfigurationUpdateOperation(device: IManagedObject, config: string): IOperation {\n return {\n deviceId: device.id,\n description: gettext('Configuration update'),\n c8y_Configuration: {\n config\n }\n };\n }\n\n async getBinary(binaryId: IdReference): Promise<IFetchResponse> {\n try {\n return await this.inventoryBinary.download(binaryId);\n } catch (ex) {\n const msg = gettext('Could not get the binary.');\n this.alert.danger(msg);\n }\n }\n\n /**\n * Gets all available snapshots from the repository for the given device.\n * @param device The device for which the snapshots should be prepared.\n * @param configurationType Selected configuration type.\n */\n async getSnapshotsFromRepository(device, configurationType) {\n const searchQuery = this.getConfigurationTypeQuery(device, configurationType);\n const res = await this.listRepositoryEntries(RepositoryType.CONFIGURATION, {\n query: searchQuery,\n params: { pageSize: 100 }\n });\n return res.data;\n }\n\n /**\n * Returns a binary object.\n * @param binaryId binary ID\n * @param options The object with additional options:\n * - **noAlerts** - `boolean` - do not display an alert message; defaults to `false`\n */\n private async getInternalBinaryResponse(\n binaryId: IdReference,\n options: { noAlerts?: boolean } = {}\n ): Promise<IFetchResponse> {\n let res;\n try {\n res = await this.inventoryBinary.download(binaryId);\n } catch (ex) {\n if (!options.noAlerts) {\n const msg = gettext('Could not get the binary.');\n this.alert.danger(msg);\n }\n }\n return res;\n }\n\n /**\n * Returns a binary object.\n * @param binaryUrl The URL to find binary\n * @param options The object with additional options:\n * - **noAlerts** - `boolean` - do not display an alert message; defaults to `false`\n */\n private async getExternalBinaryResponse(\n binaryUrl: string,\n options: { noAlerts?: boolean } = {}\n ): Promise<IFetchResponse> {\n let res;\n try {\n const fetchRes = await fetch(binaryUrl);\n if (fetchRes.status >= 400) {\n throw res;\n }\n res = fetchRes;\n } catch {\n if (!options.noAlerts) {\n const msg = gettext('Could not get the external binary');\n this.alert.danger(msg);\n }\n }\n return res;\n }\n\n private async createEntry(mo: Partial<IManagedObject>) {\n const binaryId = await this.inventoryBinary.getIdFromUrl(mo.url);\n const newMo = await this.inventory.create(mo);\n if (binaryId) {\n await this.inventory.childAdditionsAdd(binaryId, newMo.data);\n }\n return newMo;\n }\n\n private async updateEntry(mo: Partial<IManagedObject>, url) {\n const existingBinaryId = await this.inventoryBinary.getIdFromUrl(url);\n const newBinaryId = await this.inventoryBinary.getIdFromUrl(mo.url);\n if (existingBinaryId && existingBinaryId !== newBinaryId) {\n const id = this.inventoryBinary.getIdFromUrl(url);\n await this.inventoryBinary.delete(id);\n }\n if (newBinaryId) {\n await this.inventory.childAdditionsAdd(newBinaryId, mo);\n }\n return this.inventory.update(mo);\n }\n\n private getBaseVersionResultListForLegacyEntry(entry) {\n return Promise.resolve({\n res: {} as IFetchResponse,\n data: [\n {\n ...entry,\n [entry.type]: {\n version: entry.version,\n url: entry.url\n }\n }\n ]\n } as IResultList<IManagedObject>);\n }\n\n private getDeviceSoftwareChangesFromSoftwareListOperation(\n operation: IOperation,\n device: IManagedObject\n ): DeviceSoftwareChange[] {\n const changes: DeviceSoftwareChange[] = [];\n forEach(device.c8y_SoftwareList, deviceSoftware => {\n const operationSoftware = find(operation.c8y_SoftwareList, { name: deviceSoftware.name });\n if (\n (operationSoftware && operationSoftware.version) !==\n (deviceSoftware && deviceSoftware.version)\n ) {\n changes.push({\n ...deviceSoftware,\n action: 'delete'\n } as DeviceSoftwareChange);\n }\n });\n forEach(operation.c8y_SoftwareList, operationSoftware => {\n const deviceSoftware = find(device.c8y_SoftwareList, { name: operationSoftware.name });\n if (\n (operationSoftware && operationSoftware.version) !==\n (deviceSoftware && deviceSoftware.version)\n ) {\n changes.push({\n ...operationSoftware,\n action: 'install'\n } as DeviceSoftwareChange);\n }\n });\n return changes;\n }\n\n private getDeviceSoftwareChangesFromSoftwareOperation(\n operation: IOperation,\n device: IManagedObject\n ): DeviceSoftwareChange[] {\n const changes: DeviceSoftwareChange[] = [];\n forEach(device.c8y_Software, (deviceSoftwareVersion, deviceSoftwareName) => {\n if (operation.c8y_Software[deviceSoftwareName] !== deviceSoftwareVersion) {\n changes.push({\n name: deviceSoftwareName,\n version: deviceSoftwareVersion,\n action: 'delete'\n } as DeviceSoftwareChange);\n }\n });\n forEach(operation.c8y_Software, (operationSoftwareVersion, operationSoftwareName) => {\n const deviceSoftwareVersion =\n device.c8y_Software && device.c8y_Software[operationSoftwareName];\n if (deviceSoftwareVersion !== operationSoftwareVersion) {\n changes.push({\n name: operationSoftwareName,\n version: operationSoftwareVersion,\n action: 'install'\n } as DeviceSoftwareChange);\n }\n });\n return changes;\n }\n}\n","import { Component, Output, EventEmitter, ViewChild } from '@angular/core';\nimport { NgForm } from '@angular/forms';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { RepositoryService } from '../repository.service';\nimport { RepositoryType, ModalModel, RepositoryCategory } from '../repository.model';\nimport { AlertService, gettext } from '@c8y/ngx-components';\nimport { isUndefined, get, assign } from 'lodash-es';\nimport { BehaviorSubject, Subscription, from } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, tap, switchMap } from 'rxjs/operators';\nimport { PickedFiles } from '@c8y/ngx-components';\nimport { IManagedObject } from '@c8y/client';\n\n@Component({\n selector: 'c8y-add-firmware-software-modal',\n templateUrl: 'add-firmware-modal.component.html'\n})\nexport class AddFirmwareModalComponent {\n @ViewChild('firmwareForm', { static: false }) form: NgForm;\n @Output() saved: EventEmitter<RepositoryCategory> = new EventEmitter<RepositoryCategory>();\n onInput: BehaviorSubject<string> = new BehaviorSubject<string>('');\n model: ModalModel = {\n selected: undefined,\n version: undefined,\n description: undefined,\n deviceType: undefined,\n binary: {\n file: undefined,\n url: undefined\n }\n };\n firmwaresResult;\n saving = false;\n firmwarePreselected: boolean = false;\n textForFirmwareUrlPopover: string = gettext(`Path for binaries can vary depending on device agent implementation, e.g.:\n /firmware/binaries/firmware1.bin\n https://firmware/binary/123\n ftp://firmware/binary/123.tar.gz\n `);\n private inputSubscription$: Subscription;\n\n constructor(\n private modal: BsModalRef,\n private repositoryService: RepositoryService,\n private alert: AlertService\n ) {}\n\n ngOnInit() {\n this.setInitialState();\n this.loadFirmwares();\n }\n\n setInitialState() {\n if (this.model.selected) {\n this.firmwarePreselected = true;\n }\n }\n\n loadFirmwares() {\n this.inputSubscription$ = this.onInput\n .pipe(\n tap(() => {\n if (!this.firmwarePreselected) {\n this.model.description = null;\n if (this.form) {\n this.form.form.get('description').reset();\n }\n }\n }),\n debounceTime(300),\n distinctUntilChanged(),\n switchMap(searchStr => this.getFirmwareResult(searchStr))\n )\n .subscribe(result => {\n this.firmwaresResult = result;\n });\n }\n\n getFirmwareResult(searchStr: string) {\n return from(\n this.repositoryService.listRepositoryEntries(RepositoryType.FIRMWARE, {\n partialName: searchStr,\n skipLegacy: true\n })\n );\n }\n\n async save() {\n this.saving = true;\n this.repositoryService\n .create(this.model, RepositoryType.FIRMWARE)\n .then(savedFirmware => {\n this.successMsg();\n this.saving = false;\n this.saved.next(savedFirmware);\n this.cancel();\n })\n .catch(e => {\n this.saving = false;\n this.saved.error(e);\n this.cancel();\n });\n }\n\n successMsg() {\n const msg = gettext('Firmware added.');\n this.alert.success(msg);\n }\n\n cancel() {\n this.modal.hide();\n this.saved.complete();\n }\n\n ngOnDestroy() {\n this.inputSubscription$.unsubscribe();\n }\n\n onFile(dropped: PickedFiles) {\n if (!isUndefined(dropped.url)) {\n this.model.binary = {\n url: dropped.url\n };\n return;\n } else if (!isUndefined(dropped.droppedFiles)) {\n this.model.binary = {\n file: dropped.droppedFiles[0].file\n };\n return;\n } else {\n this.model.binary = {\n file: undefined,\n url: undefined\n };\n }\n }\n\n onFirmwareSelect(firmware: IManagedObject) {\n assign(this.model, {\n selected: firmware,\n description: firmware.description,\n deviceType: get(firmware, 'c8y_Filter.type')\n });\n }\n}\n","import { Component, ViewChild, Output, EventEmitter } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { RepositoryService } from '../repository.service';\nimport { RepositoryType, ModalModel, RepositoryCategory } from '../repository.model';\nimport { AlertService, gettext } from '@c8y/ngx-components';\nimport { IManagedObject, IResultList } from '@c8y/client';\nimport { isUndefined } from 'lodash-es';\nimport { BehaviorSubject, of, from, pipe, merge, Observable } from 'rxjs';\nimport { BsDropdownDirective } from 'ngx-bootstrap/dropdown';\nimport { NgForm } from '@angular/forms';\nimport {\n debounceTime,\n tap,\n switchMap,\n distinctUntilChanged,\n shareReplay,\n map\n} from 'rxjs/operators';\nimport { PickedFiles } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-add-firmware-patch-modal.component',\n templateUrl: 'add-firmware-patch-modal.component.html'\n})\nexport class AddFirmwarePatchModalComponent {\n @Output() saved: EventEmitter<RepositoryCategory> = new EventEmitter<RepositoryCategory>();\n\n @ViewChild('dropdown', { static: false }) dropdown: BsDropdownDirective;\n @ViewChild('firmwarePatchForm', { static: false }) form: NgForm;\n textForFirmwareUrlPopover: string = gettext(`Path for binaries can vary depending on device agent implementation, e.g.:\n /firmware/binaries/firmware1.bin\n https://firmware/binary/123\n ftp://firmware/binary/123.tar.gz\n `);\n\n model: ModalModel = {\n selected: undefined,\n dependency: null,\n patchVersion: undefined,\n binary: {\n file: undefined,\n url: undefined\n }\n };\n\n firmwareInput$ = new BehaviorSubject<string>('');\n firmwares$: Observable<IResultList<IManagedObject>> = this.firmwareInput$.pipe(\n debounceTime(300),\n distinctUntilChanged(),\n switchMap(searchStr =>\n from(\n this.repository.listRepositoryEntries(RepositoryType.FIRMWARE, {\n partialName: searchStr,\n skipLegacy: true\n })\n )\n ),\n shareReplay(1)\n );\n firmwareSelected$ = new BehaviorSubject<Partial<RepositoryCategory>>(null);\n patchDependencyInput$ = new BehaviorSubject<string>('');\n\n saving = false;\n firmwarePreselected: boolean = false;\n baseVersions$: Observable<IResultList<IManagedObject>> = merge(\n this.firmwareInput$.pipe(\n tap(() => {\n this.model.dependency = null;\n if (this.form) {\n this.form.form.get('patchDependency').reset();\n }\n }),\n switchMap(() => of(null))\n ),\n this.firmwareSelected$\n ).pipe(\n switchMap(selectedFirmware =>\n selectedFirmware ? this.repository.listBaseVersions(selectedFirmware) : of(null)\n ),\n shareReplay(1)\n );\n baseVersionsFilterPipe = pipe(\n switchMap((data: []) =>\n this.patchDependencyInput$.pipe(\n map(partialVersion =>\n data.filter((mo: any) => {\n const version = mo.c8y_Firmware.version.toLowerCase();\n return (\n partialVersion.length === 0 || version.indexOf(partialVersion.toLowerCase()) > -1\n );\n })\n )\n )\n )\n );\n\n constructor(\n private modal: BsModalRef,\n private repository: RepositoryService,\n private alert: AlertService\n ) {}\n\n async ngOnInit() {\n this.setInitialState();\n }\n\n setInitialState() {\n if (this.model.selected) {\n this.firmwarePreselected = true;\n this.firmwareSelected$.next(this.model.selected);\n }\n }\n\n async save() {\n this.saving = true;\n this.repository\n .create(this.model, RepositoryType.FIRMWARE)\n .then(savedFirmware => {\n this.successMsg();\n this.saving = false;\n this.saved.next(savedFirmware);\n this.cancel();\n })\n .catch(e => {\n this.saving = false;\n this.saved.error(e);\n this.cancel();\n });\n }\n\n successMsg() {\n const msg = gettext('Firmware patch added.');\n this.alert.success(msg);\n }\n\n cancel() {\n this.modal.hide();\n this.saved.complete();\n }\n\n onFile(dropped: PickedFiles) {\n if (!isUndefined(dropped.url)) {\n this.model.binary = {\n url: dropped.url\n };\n return;\n } else if (!isUndefined(dropped.droppedFiles)) {\n this.model.binary = {\n file: dropped.droppedFiles[0].file\n };\n return;\n } else {\n this.model.binary = {\n file: undefined,\n url: undefined\n };\n }\n }\n}\n","import { Router, ActivatedRoute } from '@angular/router';\nimport { Component } from '@angular/core';\nimport { BsModalService, ModalOptions } from 'ngx-bootstrap/modal';\nimport { TranslateService } from '@ngx-translate/core';\nimport {\n distinctUntilChanged,\n tap,\n debounceTime,\n switchMap,\n shareReplay,\n map,\n pluck\n} from 'rxjs/operators';\nimport { Observable, BehaviorSubject, combineLatest, from } from 'rxjs';\nimport { IResultList, IManagedObject } from '@c8y/client';\nimport { ModalService, gettext, Status, AlertService, memoize } from '@c8y/ngx-components';\nimport { RepositoryService } from '../repository.service';\nimport { RepositoryType } from '../repository.model';\nimport { AddFirmwareModalComponent } from './add-firmware-modal.component';\nimport { AddFirmwarePatchModalComponent } from './add-firmware-patch-modal.component';\nimport { property, get } from 'lodash-es';\n\n@Component({\n selector: 'c8y-firmware-list',\n templateUrl: 'firmware-list.component.html'\n})\nexport class FirmwareListComponent {\n textFilter$: BehaviorSubject<string> = new BehaviorSubject('');\n reload$: BehaviorSubject<void> = new BehaviorSubject(null);\n reloading: boolean = false;\n firmwares$: Observable<IResultList<IManagedObject>> = combineLatest(\n this.textFilter$.pipe(\n debounceTime(400),\n distinctUntilChanged()\n ),\n this.reload$\n ).pipe(\n tap(() => {\n this.reloading = true;\n }),\n switchMap(([text]) => this.getFirmwares(text)),\n tap(() => {\n this.reloading = false;\n }),\n shareReplay(1)\n );\n canAddFirmwarePatch$: Observable<boolean> = from(\n this.repositoryService.listRepositoryEntries(RepositoryType.FIRMWARE, { skipLegacy: true })\n ).pipe(map(({ data }) => data.length > 0));\n isLegacy = this.repositoryService.isLegacyEntry.bind(this.repositoryService);\n readonly DEVICE_TYPE_NOT_AVAILABLE: string = gettext('No device type available');\n\n constructor(\n private repositoryService: RepositoryService,\n private modalService: ModalService,\n private bsModalService: BsModalService,\n private translateService: TranslateService,\n private alertService: AlertService,\n private router: Router,\n private activatedRoute: ActivatedRoute\n ) {}\n\n getFirmwares(partialText?: string) {\n const properties: string[] = ['name', 'description', 'c8y_Filter.type'];\n const partialTextFilter = { partialText, properties };\n return this.repositoryService.listRepositoryEntries(RepositoryType.FIRMWARE, {\n partialTextFilter\n });\n }\n\n addFirmware() {\n const config: ModalOptions<AddFirmwareModalComponent> = { class: 'modal-sm', ignoreBackdropClick: true };\n const modalRef = this.bsModalService.show(AddFirmwareModalComponent, config);\n modalRef.content.saved.subscribe(savedFirmware => this.editFirmware(savedFirmware));\n }\n\n addFirmwarePatch() {\n const config: ModalOptions<AddFirmwarePatchModalComponent> = { class: 'modal-sm', ignoreBackdropClick: true };\n const modalRef = this.bsModalService.show(AddFirmwarePatchModalComponent, config);\n modalRef.content.saved.subscribe(savedFirmware => this.editFirmware(savedFirmware));\n }\n\n editFirmware(firmware: Partial<IManagedObject>) {\n this.router.navigate([firmware.id], { relativeTo: this.activatedRoute });\n }\n\n async deleteFirmware(firmware: IManagedObject) {\n try {\n const title = gettext('Delete firmware');\n const body = `\n ${this.translateService.instant(\n gettext(\n 'You are about to delete firmware \"{{ name }}\" with all its versions and patches.'\n ),\n { name: firmware.name }\n )}\n ${this.translateService.instant(gettext('This operation is irreversible.'))}\n ${this.translateService.instant(gettext('Do you want to proceed?'))}\n `;\n const labels = {\n ok: gettext('Delete')\n };\n await this.modalService.confirm(title, body, Status.DANGER, labels);\n await this.repositoryService.delete(firmware);\n this.alertService.success(gettext('Firmware deleted.'));\n this.reload$.next();\n } catch (ex) {\n // only if not cancel from modal\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n @memoize(property('id'))\n getBaseVersionsCount$(firmware: IManagedObject): Observable<number | string> {\n return this.firmwares$.pipe(\n switchMap(() => this.repositoryService.getBaseVersionsCount$(firmware)),\n shareReplay(1)\n );\n }\n\n getDeviceTypeTitle(firmware: IManagedObject): string {\n return get(\n firmware,\n 'c8y_Filter.type',\n this.translateService.instant(this.DEVICE_TYPE_NOT_AVAILABLE)\n );\n }\n}\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { IManagedObject, InventoryService, IResultList } from '@c8y/client';\nimport { AlertService, gettext, memoize, ModalService, Status } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { property } from 'lodash-es';\nimport { BsModalService, ModalOptions } from 'ngx-bootstrap/modal';\nimport { BehaviorSubject, combineLatest, defer, merge, Observable, Subject } from 'rxjs';\nimport {\n distinctUntilKeyChanged,\n map,\n shareReplay,\n switchMap,\n take,\n takeUntil,\n tap,\n withLatestFrom\n} from 'rxjs/operators';\nimport { FirmwareBinary } from '../repository.model';\nimport { RepositoryService } from './../repository.service';\nimport { AddFirmwareModalComponent } from './add-firmware-modal.component';\nimport { AddFirmwarePatchModalComponent } from './add-firmware-patch-modal.component';\n\n@Component({\n selector: 'c8y-firmware-details',\n templateUrl: './firmware-details.component.html'\n})\nexport class FirmwareDetailsComponent implements OnInit, OnDestroy {\n reload$: Subject<void> = new Subject();\n reloading$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n\n updateFirmware$: Subject<Partial<IManagedObject>> = new Subject();\n firmwareUpdated$: Subject<IManagedObject> = new Subject();\n baseVersionsUpdated$: Subject<void> = new Subject();\n patchVersionsUpdated$: Subject<void> = new Subject();\n\n firmware$: Observable<IManagedObject> = merge(\n this.activatedRoute.params.pipe(\n map(params => params.id),\n switchMap(id => defer(() => this.inventoryService.detail(id).then(result => result.data)))\n ),\n this.reload$.pipe(\n tap(() => this.reloading$.next(true)),\n switchMap(() => this.activatedRoute.params),\n map(params => params.id),\n switchMap(id => defer(() => this.inventoryService.detail(id).then(result => result.data))),\n tap(() => this.reloading$.next(false))\n ),\n this.firmwareUpdated$\n ).pipe(shareReplay(1));\n\n baseVersions$: Observable<IResultList<IManagedObject>> = merge(\n this.firmware$.pipe(distinctUntilKeyChanged('id')),\n this.baseVersionsUpdated$,\n this.patchVersionsUpdated$,\n this.reload$\n ).pipe(\n switchMap(() => this.firmware$),\n switchMap(firmware => this.repositoryService.listBaseVersions(firmware)),\n shareReplay(1)\n );\n\n isLegacy$: Observable<boolean> = this.firmware$.pipe(\n map(firmware => this.repositoryService.isLegacyEntry(firmware)),\n shareReplay(1)\n );\n\n canAddPatchVersions$: Observable<boolean> = combineLatest(\n this.isLegacy$,\n this.baseVersions$.pipe(map(({ data }) => data.length > 0))\n ).pipe(map(([isLegacy, hasBaseVersions]) => !isLegacy && hasBaseVersions));\n\n expanded: { [id: string]: boolean } = {};\n\n destroy$: Subject<boolean> = new Subject<boolean>();\n\n constructor(\n private activatedRoute: ActivatedRoute,\n private inventoryService: InventoryService,\n private repositoryService: RepositoryService,\n private alertService: AlertService,\n private translateService: TranslateService,\n private modalService: ModalService,\n private bsModalService: BsModalService\n ) {}\n\n ngOnInit() {\n this.updateFirmware$\n .pipe(\n withLatestFrom(this.firmware$),\n switchMap(([firmwarePartial, firmware]) =>\n this.inventoryService.update({\n id: firmware.id,\n ...firmwarePartial\n })\n ),\n map(({ data }) => data),\n tap(firmware => this.firmwareUpdated$.next(firmware)),\n tap(() => this.alertService.success(gettext('Saved.'))),\n takeUntil(this.destroy$)\n )\n .subscribe();\n }\n\n @memoize(property('id'))\n getPatchVersionsCount$(baseVersion: FirmwareBinary) {\n return merge(\n this.firmware$.pipe(distinctUntilKeyChanged('id')),\n this.baseVersionsUpdated$,\n this.patchVersionsUpdated$,\n this.reload$\n ).pipe(\n switchMap(() => this.firmware$),\n switchMap(firmware => this.repositoryService.getPatchVersionsCount$(firmware, baseVersion)),\n shareReplay(1)\n );\n }\n\n @memoize()\n getBinaryName$(binaryUrl) {\n return this.repositoryService.getBinaryName$(binaryUrl);\n }\n\n @memoize(property('id'))\n getPatchVersions$(baseVersion) {\n return merge(\n this.firmware$.pipe(distinctUntilKeyChanged('id')),\n this.patchVersionsUpdated$,\n this.reload$\n ).pipe(\n switchMap(() => this.firmware$),\n switchMap(firmware => this.repositoryService.listPatchVersions(firmware, baseVersion)),\n shareReplay(1)\n );\n }\n\n addBaseVersion() {\n this.firmware$\n .pipe(\n take(1),\n switchMap(firmware => {\n const initialState = {\n model: {\n selected: firmware,\n description: firmware.description\n }\n };\n const config: ModalOptions<AddFirmwareModalComponent> = {\n class: 'modal-sm',\n ignoreBackdropClick: true,\n initialState\n };\n const modalRef = this.bsModalService.show(AddFirmwareModalComponent, config);\n return modalRef.content.saved;\n })\n )\n .subscribe(() => this.baseVersionsUpdated$.next());\n }\n\n addPatchVersion() {\n this.firmware$\n .pipe(\n take(1),\n switchMap(firmware => {\n const initialState = {\n model: {\n selected: firmware\n }\n };\n const config: ModalOptions<AddFirmwarePatchModalComponent> = {\n class: 'modal-sm',\n ignoreBackdropClick: true,\n initialState\n };\n const modalRef = this.bsModalService.show(AddFirmwarePatchModalComponent, config);\n return modalRef.content.saved;\n })\n )\n .subscribe(() => this.patchVersionsUpdated$.next());\n }\n\n async deleteBaseVersion(baseVersion: IManagedObject) {\n try {\n const title = gettext('Delete firmware');\n const body = `\n ${this.translateService.instant(\n gettext('You are about to delete firmware {{ version }} with all its patches.'),\n { version: baseVersion.c8y_Firmware.version }\n )}\n ${this.translateService.instant(gettext('This operation is irreversible.'))}\n ${this.translateService.instant(gettext('Do you want to proceed?'))}\n `;\n const labels = {\n ok: gettext('Delete')\n };\n await this.modalService.confirm(title, body, Status.DANGER, labels);\n await this.repositoryService.delete(baseVersion);\n this.alertService.success(gettext('Firmware deleted.'));\n this.baseVersionsUpdated$.next();\n } catch (ex) {\n // only if not cancel from modal\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n async deletePatchVersion(patchVersion: IManagedObject) {\n try {\n const title = gettext('Delete firmware patch');\n const body = `\n ${this.translateService.instant(\n gettext('You are about to delete firmware patch {{ version }}.'),\n { version: patchVersion.c8y_Firmware.version }\n )}\n ${this.translateService.instant(gettext('This operation is irreversible.'))}\n ${this.translateService.instant(gettext('Do you want to proceed?'))}\n `;\n const labels = {\n ok: gettext('Delete')\n };\n await this.modalService.confirm(title, body, Status.DANGER, labels);\n await this.repositoryService.delete(patchVersion);\n this.alertService.success(gettext('Firmware patch deleted.'));\n this.patchVersionsUpdated$.next();\n } catch (ex) {\n // only if not cancel from modal\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next(true);\n this.destroy$.unsubscribe();\n }\n}\n","import { Component, Output, EventEmitter, ViewChild } from '@angular/core';\nimport { NgForm } from '@angular/forms';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { RepositoryService } from '../repository.service';\nimport { RepositoryType, ModalModel, RepositoryCategory } from '../repository.model';\nimport { AlertService, gettext } from '@c8y/ngx-components';\nimport { isUndefined, get, assign } from 'lodash-es';\nimport { BehaviorSubject, Subscription, from } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, tap, switchMap } from 'rxjs/operators';\nimport { PickedFiles } from '@c8y/ngx-components';\nimport { IManagedObject } from '@c8y/client';\n\n@Component({\n selector: 'c8y-add-software-software-modal',\n templateUrl: 'add-software-modal.component.html'\n})\nexport class AddSoftwareModalComponent {\n @ViewChild('softwareForm', { static: false }) form: NgForm;\n @Output() saved: EventEmitter<RepositoryCategory> = new EventEmitter<RepositoryCategory>();\n onInput: BehaviorSubject<string> = new BehaviorSubject<string>('');\n model: ModalModel = {\n selected: undefined,\n version: undefined,\n description: undefined,\n deviceType: undefined,\n binary: {\n file: undefined,\n url: undefined\n }\n };\n softwaresResult;\n saving = false;\n softwarePreselected: boolean = false;\n textForSoftwareUrlPopover: string = gettext(`Path for binaries can vary depending on device agent implementation, e.g.:\n /software/binaries/software1.bin\n https://software/binary/123\n ftp://software/binary/123.tar.gz\n `);\n private inputSubscription$: Subscription;\n\n constructor(\n private modal: BsModalRef,\n private repositoryService: RepositoryService,\n private alert: AlertService\n ) {}\n\n ngOnInit() {\n this.setInitialState();\n this.loadSoftwares();\n }\n\n setInitialState() {\n if (this.model.selected) {\n this.softwarePreselected = true;\n }\n }\n\n loadSoftwares() {\n this.inputSubscription$ = this.onInput\n .pipe(\n tap(() => {\n if (!this.softwarePreselected) {\n this.model.description = null;\n if (this.form) {\n this.form.form.get('description').reset();\n }\n }\n }),\n debounceTime(300),\n distinctUntilChanged(),\n switchMap(searchStr => this.getSoftwareResult(searchStr))\n )\n .subscribe(result => {\n this.softwaresResult = result;\n });\n }\n\n getSoftwareResult(searchStr: string) {\n return from(\n this.repositoryService.listRepositoryEntries(RepositoryType.SOFTWARE, {\n partialName: searchStr,\n skipLegacy: true\n })\n );\n }\n\n async save() {\n this.saving = true;\n this.repositoryService\n .create(this.model, RepositoryType.SOFTWARE)\n .then(savedSoftware => {\n this.successMsg();\n this.saving = false;\n this.saved.next(savedSoftware);\n this.cancel();\n })\n .catch(e => {\n this.saving = false;\n this.saved.error(e);\n this.cancel();\n });\n }\n\n successMsg() {\n const msg = gettext('Software added.');\n this.alert.success(msg);\n }\n\n cancel() {\n this.modal.hide();\n this.saved.complete();\n }\n\n ngOnDestroy() {\n this.inputSubscription$.unsubscribe();\n }\n\n onFile(dropped: PickedFiles) {\n if (!isUndefined(dropped.url)) {\n this.model.binary = {\n url: dropped.url\n };\n return;\n } else if (!isUndefined(dropped.droppedFiles)) {\n this.model.binary = {\n file: dropped.droppedFiles[0].file\n };\n return;\n } else {\n this.model.binary = {\n file: undefined,\n url: undefined\n };\n }\n }\n\n onSoftwareSelect(software: IManagedObject) {\n assign(this.model, {\n selected: software,\n description: software.description,\n deviceType: get(software, 'c8y_Filter.type')\n });\n }\n}\n","import { Router, ActivatedRoute } from '@angular/router';\nimport { Component } from '@angular/core';\nimport { BsModalService, ModalOptions } from 'ngx-bootstrap/modal';\nimport { TranslateService } from '@ngx-translate/core';\nimport {\n distinctUntilChanged,\n tap,\n debounceTime,\n switchMap,\n shareReplay,\n} from 'rxjs/operators';\nimport { Observable, BehaviorSubject, combineLatest } from 'rxjs';\nimport { IResultList, IManagedObject } from '@c8y/client';\nimport { ModalService, gettext, Status, AlertService, memoize } from '@c8y/ngx-components';\nimport { RepositoryService } from '../repository.service';\nimport { RepositoryType } from '../repository.model';\nimport { AddSoftwareModalComponent } from './add-software-modal.component';\nimport { property, get } from 'lodash-es';\n\n@Component({\n selector: 'c8y-software-list',\n templateUrl: 'software-list.component.html'\n})\nexport class SoftwareListComponent {\n textFilter$: BehaviorSubject<string> = new BehaviorSubject('');\n reload$: BehaviorSubject<void> = new BehaviorSubject(null);\n reloading: boolean = false;\n softwares$: Observable<IResultList<IManagedObject>> = combineLatest(\n this.textFilter$.pipe(\n debounceTime(400),\n distinctUntilChanged()\n ),\n this.reload$\n ).pipe(\n tap(() => {\n this.reloading = true;\n }),\n switchMap(([text]) => this.getSoftwares(text)),\n tap(() => {\n this.reloading = false;\n }),\n shareReplay(1)\n );\n isLegacy = this.repositoryService.isLegacyEntry.bind(this.repositoryService);\n readonly DEVICE_TYPE_NOT_AVAILABLE: string = gettext('No device type available');\n\n constructor(\n private repositoryService: RepositoryService,\n private modalService: ModalService,\n private bsModalService: BsModalService,\n private translateService: TranslateService,\n private alertService: AlertService,\n private router: Router,\n private activatedRoute: ActivatedRoute\n ) {}\n\n getSoftwares(partialText?: string) {\n const properties: string[] = ['name', 'description', 'c8y_Filter.type'];\n const partialTextFilter = {partialText, properties};\n return this.repositoryService.listRepositoryEntries(RepositoryType.SOFTWARE, { partialTextFilter });\n }\n\n addSoftware() {\n const config: ModalOptions<AddSoftwareModalComponent> = { class: 'modal-sm', ignoreBackdropClick: true };\n const modalRef = this.bsModalService.show(AddSoftwareModalComponent, config);\n modalRef.content.saved.subscribe(savedSoftware => this.editSoftware(savedSoftware));\n }\n\n editSoftware(software: Partial<IManagedObject>) {\n this.router.navigate([software.id], { relativeTo: this.activatedRoute });\n }\n\n async deleteSoftware(software: IManagedObject) {\n try {\n const title = gettext('Delete software');\n const body = `\n ${this.translateService.instant(\n gettext('You are about to delete software \"{{ name }}\" with all its versions.'),\n { name: software.name }\n )}\n ${this.translateService.instant(gettext('This operation is irreversible.'))}\n ${this.translateService.instant(gettext('Do you want to proceed?'))}\n `;\n const labels = {\n ok: gettext('Delete')\n };\n await this.modalService.confirm(title, body, Status.DANGER, labels);\n await this.repositoryService.delete(software);\n this.alertService.success(gettext('Software deleted.'));\n this.reload$.next();\n } catch (ex) {\n // only if not cancel from modal\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n @memoize(property('id'))\n getBaseVersionsCount$(software: IManagedObject): Observable<number | string> {\n return this.softwares$.pipe(\n switchMap(() => this.repositoryService.getBaseVersionsCount$(software)),\n shareReplay(1)\n );\n }\n\n getDeviceTypeTitle(software: IManagedObject): string {\n return get(\n software,\n 'c8y_Filter.type',\n this.translateService.instant(this.DEVICE_TYPE_NOT_AVAILABLE));\n }\n}\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { IManagedObject, InventoryService, IResultList } from '@c8y/client';\nimport { AlertService, gettext, memoize, ModalService, Status } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BsModalService, ModalOptions } from 'ngx-bootstrap/modal';\nimport { BehaviorSubject, from, merge, Observable, Subject } from 'rxjs';\nimport {\n distinctUntilKeyChanged,\n map,\n shareReplay,\n switchMap,\n take,\n takeUntil,\n tap,\n withLatestFrom\n} from 'rxjs/operators';\nimport { RepositoryService } from '../repository.service';\nimport { AddSoftwareModalComponent } from './add-software-modal.component';\n\n@Component({\n selector: 'c8y-software-details',\n templateUrl: './software-details.component.html'\n})\nexport class SoftwareDetailsComponent implements OnInit, OnDestroy {\n reload$: Subject<void> = new Subject();\n reloading$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n\n updateSoftware$: Subject<Partial<IManagedObject>> = new Subject();\n softwareUpdated$: Subject<IManagedObject> = new Subject();\n baseVersionsUpdated$: Subject<void> = new Subject();\n\n software$: Observable<IManagedObject> = merge(\n this.activatedRoute.params.pipe(\n map(params => params.id),\n switchMap(id => from(this.inventoryService.detail(id).then(result => result.data)))\n ),\n this.reload$.pipe(\n tap(() => this.reloading$.next(true)),\n switchMap(() => this.activatedRoute.params),\n map(params => params.id),\n switchMap(id => from(this.inventoryService.detail(id).then(result => result.data))),\n tap(() => this.reloading$.next(false))\n ),\n this.softwareUpdated$\n ).pipe(shareReplay(1));\n\n baseVersions$: Observable<IResultList<IManagedObject>> = merge(\n this.software$.pipe(distinctUntilKeyChanged('id')),\n this.baseVersionsUpdated$,\n this.reload$\n ).pipe(\n switchMap(() => this.software$),\n switchMap(software => this.repositoryService.listBaseVersions(software)),\n shareReplay(1)\n );\n\n isLegacy$: Observable<boolean> = this.software$.pipe(\n map(software => this.repositoryService.isLegacyEntry(software)),\n shareReplay(1)\n );\n\n destroy$: Subject<boolean> = new Subject<boolean>();\n\n constructor(\n private activatedRoute: ActivatedRoute,\n private inventoryService: InventoryService,\n private repositoryService: RepositoryService,\n private alertService: AlertService,\n private translateService: TranslateService,\n private modalService: ModalService,\n private bsModalService: BsModalService\n ) {}\n\n ngOnInit() {\n this.updateSoftware$\n .pipe(\n withLatestFrom(this.software$),\n switchMap(([softwarePartial, software]) =>\n this.inventoryService.update({\n id: software.id,\n ...softwarePartial\n })\n ),\n map(({ data }) => data),\n tap(software => this.softwareUpdated$.next(software)),\n tap(() => this.alertService.success(gettext('Saved.'))),\n takeUntil(this.destroy$)\n )\n .subscribe();\n }\n\n @memoize()\n getBinaryName$(binaryUrl) {\n return this.repositoryService.getBinaryName$(binaryUrl);\n }\n\n addBaseVersion() {\n this.software$\n .pipe(\n take(1),\n switchMap(software => {\n const initialState = {\n model: {\n selected: software,\n description: software.description\n }\n };\n const config: ModalOptions<AddSoftwareModalComponent> = {\n class: 'modal-sm',\n ignoreBackdropClick: true,\n initialState\n };\n const modalRef = this.bsModalService.show(AddSoftwareModalComponent, config);\n return modalRef.content.saved;\n })\n )\n .subscribe(() => this.baseVersionsUpdated$.next());\n }\n\n async deleteBaseVersion(baseVersion: IManagedObject) {\n try {\n const title = gettext('Delete software');\n const body = `\n ${this.translateService.instant(\n gettext('You are about to delete software {{ version }}.'),\n { version: baseVersion.c8y_Software.version }\n )}\n ${this.translateService.instant(gettext('This operation is irreversible.'))}\n ${this.translateService.instant(gettext('Do you want to proceed?'))}\n `;\n const labels = {\n ok: gettext('Delete')\n };\n await this.modalService.confirm(title, body, Status.DANGER, labels);\n await this.repositoryService.delete(baseVersion);\n this.alertService.success(gettext('Software deleted.'));\n this.baseVersionsUpdated$.next();\n } catch (ex) {\n // only if not cancel from modal\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next(true);\n this.destroy$.unsubscribe();\n }\n}\n","import { Component, ViewChild } from '@angular/core';\nimport { IManagedObject } from '@c8y/client';\nimport { AlertService, gettext } from '@c8y/ngx-components';\nimport { uniqBy, isUndefined } from 'lodash-es';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { pipe } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { ModalModel, RepositoryType } from '../repository.model';\nimport { RepositoryService } from '../repository.service';\nimport { PickedFiles } from '@c8y/ngx-components';\nimport { NgForm } from '@angular/forms';\n\n@Component({\n selector: 'c8y-configuration-detail',\n templateUrl: './configuration-detail.component.html'\n})\nexport class ConfigurationDetailComponent implements ModalModel {\n @ViewChild('configurationForm', { static: true }) configurationForm: NgForm;\n selected: { id: string; name: string };\n version: string;\n description: string;\n binary: { file?: File; url?: string } = {\n file: undefined,\n url: undefined\n };\n deviceType: string;\n\n pattern: string = '';\n filterPipe;\n configs;\n mo: Partial<IManagedObject> = {};\n saving = false;\n uploadChoice: 'uploadBinary' | 'uploadUrl' = 'uploadBinary';\n existingBinary: File;\n submitButtonTitle: string;\n\n result: Promise<void> = new Promise((resolve, reject) => {\n this._save = resolve;\n this._cancel = reject;\n });\n\n private _save;\n private _cancel;\n\n constructor(\n private repositoryService: RepositoryService,\n private bsModalRef: BsModalRef,\n private alert: AlertService\n ) {}\n\n async ngOnInit() {\n this.configs = await this.repositoryService.listRepositoryEntries(RepositoryType.CONFIGURATION);\n if (this.selected) {\n this.uploadChoice = this.binary.file ? 'uploadBinary' : 'uploadUrl';\n this.existingBinary = this.binary.file;\n }\n this.setPipe('');\n this.submitButtonTitle = this.mo.id\n ? gettext('Update configuration')\n : gettext('Add configuration');\n }\n\n cancel() {\n this.bsModalRef.hide();\n this._cancel();\n }\n\n setPipe(filterStr: string) {\n this.pattern = filterStr;\n this.filterPipe = pipe(\n map((data: []) => uniqBy(data, 'configurationType')),\n map((data: []) => {\n return data.filter(\n (mo: any) =>\n mo.configurationType &&\n mo.configurationType.toLowerCase().indexOf(filterStr.toLowerCase()) > -1\n );\n })\n );\n }\n\n onFile(dropped: PickedFiles) {\n this.configurationForm.form.markAsDirty();\n if (!isUndefined(dropped.url)) {\n this.binary = {\n url: dropped.url\n };\n return;\n } else if (!isUndefined(dropped.droppedFiles)) {\n this.binary = {\n file: dropped.droppedFiles[0].file\n };\n return;\n } else {\n this.binary = {\n file: undefined,\n url: undefined\n };\n }\n }\n\n async save() {\n try {\n this.saving = true;\n const { selected, version, description, binary, deviceType } = this;\n if (this.existingBinary === this.binary.file) {\n binary.file = undefined;\n }\n await this.repositoryService.save(\n { selected, version, description, binary, deviceType },\n RepositoryType.CONFIGURATION,\n this.mo\n );\n this.alert.success(\n this.mo.id ? gettext('Configuration updated.') : gettext('Configuration created.')\n );\n this.bsModalRef.hide();\n this._save();\n } catch (ex) {\n this.alert.addServerFailure(ex);\n this._cancel();\n } finally {\n this.saving = false;\n }\n }\n}\n","import { Component, OnInit, Pipe, ViewChild } from '@angular/core';\nimport {IManagedObject, InventoryBinaryService, InventoryService, IResultList} from '@c8y/client';\nimport {\n AlertService,\n FilterInputComponent,\n gettext, memoize,\n ModalService,\n Status\n} from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { Observable, of, pipe } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { RepositoryType } from '../repository.model';\nimport { RepositoryService } from '../repository.service';\nimport { ConfigurationDetailComponent } from './configuration-detail.component';\nimport { property } from 'lodash-es';\nimport { saveAs } from 'file-saver';\n\n@Component({\n selector: 'c8y-configuration-list',\n templateUrl: './configuration-list.component.html'\n})\nexport class ConfigurationListComponent implements OnInit {\n @ViewChild(FilterInputComponent, { static: false }) filter: FilterInputComponent;\n configurations$: Observable<IResultList<IManagedObject>>;\n filterPipe: Pipe;\n filterTerm = '';\n reloading: boolean = false;\n data;\n private readonly DELETED_SUCCESS_MSG = gettext('Configuration deleted.');\n\n constructor(\n private alert: AlertService,\n private repositoryService: RepositoryService,\n private bsModalService: BsModalService,\n private modalService: ModalService,\n private translateService: TranslateService,\n private inventoryBinaryService: InventoryBinaryService,\n private inventoryService: InventoryService\n ) {}\n\n ngOnInit() {\n this.loadConfigurations();\n }\n\n async loadConfigurations() {\n this.reloading = true;\n this.configurations$ = of(\n await this.repositoryService.listRepositoryEntries(RepositoryType.CONFIGURATION)\n );\n this.reloading = false;\n this.reset();\n }\n\n async add() {\n try {\n await (this.bsModalService.show(ConfigurationDetailComponent, {\n class: 'modal-sm',\n ignoreBackdropClick: true\n }).content as ConfigurationDetailComponent).result;\n await this.loadConfigurations();\n } catch (ex) {\n // intended empty\n }\n }\n\n async edit(configuration: IManagedObject) {\n const fileBinary: File = await this.repositoryService.getBinaryFile(configuration.url, {\n allowExternal: false\n });\n try {\n const modal = this.bsModalService.show(ConfigurationDetailComponent, {\n class: 'modal-sm',\n ignoreBackdropClick: true,\n initialState: {\n selected: { id: configuration.id, name: configuration.configurationType },\n version: configuration.name,\n deviceType: configuration.deviceType,\n description: configuration.description,\n binary: { file: fileBinary, url: configuration.url }\n }\n }).content as ConfigurationDetailComponent;\n modal.mo = configuration;\n await modal.result;\n await this.loadConfigurations();\n } catch (ex) {\n // intended empty\n }\n }\n\n isBinaryFile(configuration: IManagedObject) {\n const id: string = this.inventoryBinaryService.getIdFromUrl(configuration.url);\n return id ? true : false;\n }\n\n @memoize(property('id'))\n getBinaryName(configuration: IManagedObject) {\n return this.repositoryService.getBinaryName$(configuration.url);\n }\n\n async download(configuration: IManagedObject) {\n const fileBinary: File = await this.repositoryService.getBinaryFile(configuration.url, {\n allowExternal: false\n });\n saveAs(fileBinary);\n }\n\n async delete(configuration: IManagedObject) {\n try {\n const title = gettext('Delete configuration snapshot');\n const confirmationText = gettext(\n 'You are about to delete the configuration snapshot {{ name }}.'\n );\n const hint = gettext('This operation is irreversible.');\n const proceed = gettext('Do you want to proceed?');\n const body = [\n this.translateService.instant(confirmationText, {\n name: configuration.name\n }),\n this.translateService.instant(hint),\n this.translateService.instant(proceed)\n ].join(' ');\n const labels = {\n ok: gettext('Delete')\n };\n await this.modalService.confirm(title, body, Status.DANGER, labels);\n await this.repositoryService.delete(configuration);\n this.alert.success(this.DELETED_SUCCESS_MSG);\n await this.loadConfigurations();\n } catch (ex) {\n if (ex) {\n this.alert.addServerFailure(ex);\n }\n }\n }\n\n setPipe(filterTerm: string) {\n this.filterTerm = filterTerm;\n this.filterPipe = pipe(\n map((data: []) => {\n this.data =\n filterTerm.trim().length === 0\n ? data\n : data.filter(\n (mo: IManagedObject) =>\n this.filterContainString(mo.name, filterTerm) ||\n this.filterContainString(mo.configurationType, filterTerm) ||\n this.filterContainString(mo.deviceType, filterTerm)\n );\n\n return this.data;\n })\n );\n }\n\n shouldShowEmptyState() {\n return !(this.data && this.data.length > 0);\n }\n\n reset() {\n this.filter.filterTerm = '';\n this.setPipe('');\n }\n\n private filterContainString(name: string, filterTerm: string) {\n const term = filterTerm.toLowerCase().trim();\n return name && name.toLowerCase().indexOf(term) > -1;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { gettext, NavigatorNode, NavigatorNodeFactory } from '@c8y/ngx-components';\n\n@Injectable()\nexport class RepositoryNavigationFactory implements NavigatorNodeFactory {\n navs: NavigatorNode[] = [];\n\n async get() {\n if (this.navs.length === 0) {\n this.navs.push(\n new NavigatorNode({\n label: gettext('Firmware repository'),\n path: 'firmware',\n icon: 'c8y-firmware',\n parent: gettext('Management'),\n priority: 1000\n })\n );\n this.navs.push(\n new NavigatorNode({\n label: gettext('Software repository'),\n path: 'software',\n icon: 'c8y-tools',\n parent: gettext('Management'),\n priority: 900\n })\n );\n this.navs.push(\n new NavigatorNode({\n label: gettext('Configuration repository'),\n path: 'configuration',\n icon: 'gears',\n parent: gettext('Management'),\n priority: 800\n })\n );\n }\n return this.navs;\n }\n}\n","import { Component, EventEmitter } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport {\n gettext,\n ISelectModalObject,\n ISelectModalOption,\n ModalLabels,\n ModalSelectionMode\n} from '@c8y/ngx-components';\nimport { get } from 'lodash-es';\nimport { IManagedObject, QueriesUtil } from '@c8y/client';\nimport { Subject, Observable, from, BehaviorSubject } from 'rxjs';\nimport { switchMap, map, mergeMap, shareReplay, tap } from 'rxjs/operators';\nimport { RepositoryService } from '../repository.service';\nimport {\n RepositoryType,\n RepositoryCategory,\n RepositoryBinary,\n SelectedRepositoryBinary\n} from '../repository.model';\n\n// MODAL STRUCTURE\n// - selectModalObject (repository entry (repositoryCategory) -> type c8y_Firmware/c8y_Software)\n// -- ISelectModalOption (repository binary entry (repositoryBinary) => type c8y_FirmwareBinary/c8y_SoftwareBinary)\n// -- ISelectModalOption...\n// - selectModalObject...\n\n/**\n * RepositorySelectModalComponent displays repository entries options and allows to select them.\n *\n * @example\n * ```\n * import { take } from 'rxjs/operators';\n * import { RepositorySelectModalComponent, ModalSelectionMode, RepositoryType } from '@c8y/ngx-components/repository';\n *\n * const initialState = {\n * repositoryType: RepositoryType.FIRMWARE,\n * title: gettext('Install firmware'),\n * subTitle: gettext('Available firmwares matching the device type'),\n * icon: 'c8y-firmware',\n * mode: ModalSelectionMode.SINGLE,\n * labels: { ok: gettext('Install') },\n * disableSelected: false\n * };\n *\n * const modal = this.bsModal.show(RepositorySelectModalComponent, {\n * ignoreBackdropClick: true,\n * initialState\n * });\n *\n * modal.content.load.next();\n * modal.content.resultEmitter.pipe(take(1)).subscribe((firmware) => {\n * ...\n * })\n * ```\n */\n\n@Component({\n selector: 'c8y-repository-select-modal',\n templateUrl: './repository-select-modal.component.html'\n})\nexport class RepositorySelectModalComponent {\n /**\n * Optional\n * Allows to provide custom data.\n * @example\n * ```\n * import { from } from 'rxjs';\n *\n * const repositoryEntry = { name: 'ExampleEntry', type: 'c8y_Firmware' };\n * const versions = [{ c8y_Firmware: { version: '1.0.0', url: 'http://example.com' } }];\n *\n * const initialState = {repositoryEntriesWithVersions$: from({ ...repositoryEntry, versions })};\n * ```\n */\n repositoryEntriesWithVersions$: Observable<IManagedObject[]> = undefined;\n /**\n * Repository entry type.\n */\n repositoryType: RepositoryType.FIRMWARE | RepositoryType.SOFTWARE;\n /**\n * Optional\n * Allows to use custom badges templates.\n * @example\n * ```\n * import { gettext } from '@c8y/ngx-components';\n *\n * const badgeTemplates = { '=1': gettext('{{count}} version'), other: gettext('{{count}} versions') };\n * const initialState = { badgeTemplates };\n * ```\n */\n badgeTemplates = { '=1': gettext('{{count}} version'), other: gettext('{{count}} versions') };\n /**\n * Optional\n * Allows to provide custom modal title.\n */\n title: string = gettext('Select repository entry');\n /**\n * Optional\n * Allows to provide custom modal subtitle.\n */\n subTitle: string;\n /**\n * Loads the content of the modal.\n * Must be invoked by the modal's caller.\n */\n load: Subject<void> = new Subject();\n /**\n * Optional\n * Emits a search string currently entered in the filter input.\n * Use it to filter the items if you use custom repositoryEntriesWithVersions$.\n */\n searchTerm: BehaviorSubject<string> = new BehaviorSubject('');\n /**\n * Optional\n * Allows to provide device type query to restrict search criteria.\n * Only takes effect when repositoryEntriesWithVersions$ is not provided,\n * otherwise modal's caller have to provide already filtered data in the repositoryEntriesWithVersions$.\n */\n deviceTypeQuery: any = {};\n /**\n * Optional\n * Allows to provide query to restrict search criteria.\n * Only takes effect when repositoryEntriesWithVersions$ is not provided,\n * otherwise modal's caller have to provide already filtered data in the repositoryEntriesWithVersions$.\n */\n searchQuery: any = {};\n /**\n * Optional\n * Allows to provide custom labels for the buttons responsible for confirm/dismiss modal actions.\n */\n labels: ModalLabels = { ok: gettext('Save') };\n /**\n * Optional\n * Allows to hide the filter input field.\n * By default, the filter input field is displayed.\n */\n showFilter: boolean = true;\n /**\n * Optional\n * Allows to show a warning that the search criteria should be narrowed down.\n * By default, this warning is hidden.\n */\n areMoreEntries: boolean = false;\n /**\n * Optional\n * Allows to pass the array of items. Each item from this array will be marked as selected in the modal.\n */\n selected: SelectedRepositoryBinary[];\n /**\n * Emits the list of selected options.\n */\n resultEmitter: EventEmitter<SelectedRepositoryBinary[]> = new EventEmitter<\n SelectedRepositoryBinary[]\n >();\n /**\n * Optional\n * Allows to change selection mode.\n * Supported options:\n * * single: only single option can be selected.\n * * multiple: multiple options can be selected.\n */\n mode: ModalSelectionMode = ModalSelectionMode.SINGLE;\n /**\n * Optional\n * Allows to use custom icon in the modal header.\n */\n icon: string;\n /**\n * Allows to block selection of the other versions from the same repository entry.\n */\n disableSelected: boolean = true;\n modalEntries: Observable<ISelectModalObject[]> = this.load.pipe(\n switchMap(() => this.repositoryEntriesWithVersions$),\n mergeMap(mos => this.aggregate(mos)),\n tap(items => {\n this.areMoreEntries = items.length >= this.PAGE_SIZE ? true : false;\n })\n );\n private PAGE_SIZE = 100;\n private queriesUtil: QueriesUtil;\n\n constructor(\n private repositoryService: RepositoryService,\n private translateService: TranslateService\n ) {\n this.queriesUtil = new QueriesUtil();\n }\n\n ngOnInit() {\n if (!this.repositoryType) {\n throw new Error('Repository type must be defined');\n }\n\n if (!this.repositoryEntriesWithVersions$) {\n this.repositoryEntriesWithVersions$ = from(\n this.repositoryService.listRepositoryEntries(this.repositoryType, {\n query: this.queriesUtil.addOrFilter(this.deviceTypeQuery, this.searchQuery),\n params: { pageSize: this.PAGE_SIZE }\n })\n ).pipe(\n map(({ data }) => data),\n map(mos => this.getAndAssignRepositoryBinaries(mos)),\n shareReplay(1)\n );\n }\n }\n\n getAndAssignRepositoryBinaries(mos: IManagedObject[]) {\n mos.forEach(mo => {\n mo.versions = this.repositoryService.listAllVersions(mo);\n });\n return mos;\n }\n\n search(searchTerm: string) {\n this.searchTerm.next(searchTerm);\n if (!searchTerm) {\n this.searchQuery = {};\n } else {\n this.searchQuery = { name: `*${searchTerm}*` };\n }\n this.load.next();\n }\n\n result(selectedItems: SelectedRepositoryBinary[]) {\n this.resultEmitter.emit(selectedItems);\n }\n\n async aggregate(mos: IManagedObject[]): Promise<ISelectModalObject[]> {\n const repositoryType = this.repositoryType;\n const selectedItems: SelectedRepositoryBinary[] = this.selected;\n\n return Promise.all(\n mos.map(async repositoryEntry => {\n const options: ISelectModalOption[] = this.getSelectModalOptions(\n await this.repositoryService.fetchAllItemsFromList(repositoryEntry.versions),\n selectedItems,\n repositoryEntry as RepositoryCategory,\n repositoryType\n );\n const selectModalObject = this.getSelectModalObject(\n repositoryEntry as RepositoryCategory,\n options\n );\n\n return selectModalObject;\n })\n );\n }\n\n getSelectModalOptions(\n versions: RepositoryBinary[],\n selectedItems: SelectedRepositoryBinary[],\n repositoryEntry: RepositoryCategory,\n repositoryType: RepositoryType\n ): ISelectModalOption[] {\n const selectModalOptions: ISelectModalOption[] = [];\n versions.forEach(repositoryBinary => {\n const isSelected: boolean = this.isBinaryRepositorySelected(\n selectedItems,\n repositoryEntry,\n repositoryBinary,\n repositoryType\n );\n\n const { version } = repositoryBinary[`${repositoryType}`];\n const bodyValue =\n version || `(${this.translateService.instant(gettext('not specified`version`'))})`;\n const bodyClass = version ? '' : 'text-muted';\n selectModalOptions.push({\n body: [\n {\n value: bodyValue,\n class: bodyClass\n }\n ],\n obj: {\n id: repositoryBinary.id,\n name: repositoryEntry.name,\n version,\n ...(get(repositoryBinary, 'c8y_Patch.dependency') && {\n dependency: get(repositoryBinary, 'c8y_Patch.dependency')\n }),\n ...(get(repositoryBinary, 'c8y_Patch') && { c8y_Patch: true }),\n url: repositoryBinary[`${repositoryType}`].url\n },\n selected: isSelected\n });\n });\n return selectModalOptions;\n }\n\n isBinaryRepositorySelected(\n selectedItems: SelectedRepositoryBinary[],\n repositoryEntry: RepositoryCategory,\n repositoryBinary: RepositoryBinary,\n repositoryType: RepositoryType\n ): boolean {\n const isSelected = selectedItems\n ? selectedItems.filter(\n repositoryFragment =>\n repositoryFragment.name === repositoryEntry.name &&\n repositoryFragment.version === repositoryBinary[`${repositoryType}`].version\n ).length > 0\n : false;\n\n return isSelected;\n }\n\n getSelectModalObject(\n repositoryEntry: RepositoryCategory,\n options: ISelectModalOption[]\n ): ISelectModalObject {\n const label =\n options.length === 1\n ? this.translateService.instant(this.badgeTemplates['=1'], { count: options.length })\n : this.translateService.instant(this.badgeTemplates.other, { count: options.length });\n\n const selectModalObject: ISelectModalObject = {\n groupId: repositoryEntry.id,\n body: [\n { value: repositoryEntry.name, class: 'text-truncate' },\n { value: repositoryEntry.description, class: 'text-truncate text-muted' }\n ],\n additionalInformation: { value: label, class: 'label label-info' },\n options\n };\n\n return selectModalObject;\n }\n\n}\n","import { Component } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { assign, isEmpty } from 'lodash-es';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { BehaviorSubject, Observable, combineLatest, from, of } from 'rxjs';\nimport { distinctUntilChanged, filter, map, shareReplay, switchMap, take } from 'rxjs/operators';\n\nimport { ModalSelectionMode, gettext } from '@c8y/ngx-components';\nimport { IManagedObject, IOperation, InventoryService, OperationStatus } from '@c8y/client';\n\nimport { RepositoryService } from '../repository.service';\nimport { DeviceFirmware, FirmwareBinary, RepositoryType } from '../repository.model';\nimport { RepositorySelectModalComponent } from '../select-modal/repository-select-modal.component';\n\n@Component({\n selector: 'c8y-firmware-device-tab',\n templateUrl: 'firmware-device-tab.component.html'\n})\nexport class FirmwareDeviceTabComponent {\n isEmpty = isEmpty;\n reloading: boolean = false;\n device$: BehaviorSubject<IManagedObject> = new BehaviorSubject(\n this.route.parent.snapshot.data.contextData\n );\n deviceFirmwareFragment$: Observable<DeviceFirmware> = this.device$.pipe(\n map(device => device.c8y_Firmware)\n );\n firmwareBinary$: Observable<IManagedObject> = this.deviceFirmwareFragment$.pipe(\n filter(deviceFirmwareFragment => !isEmpty(deviceFirmwareFragment)),\n switchMap(deviceFirmwareFragment =>\n from(\n this.repository.getRepositoryBinaryMoByVersion(\n deviceFirmwareFragment,\n RepositoryType.FIRMWARE\n )\n )\n ),\n shareReplay(1)\n );\n repositoryEntry$: Observable<IManagedObject> = this.firmwareBinary$.pipe(\n switchMap(mo => this.repository.getRepositoryEntryMO$(mo)),\n shareReplay(1)\n );\n patches$: Observable<IManagedObject[]> = combineLatest(\n this.firmwareBinary$,\n this.repositoryEntry$\n ).pipe(\n switchMap(([firmwareBinary, repositoryEntry]) => {\n if (repositoryEntry && firmwareBinary) {\n const version: string = this.repository.getBaseVersionFromMO(\n firmwareBinary as FirmwareBinary\n );\n\n return from(this.repository.listPatchVersions(repositoryEntry, version)).pipe(\n map(({ data }) => data)\n );\n } else {\n return of([]);\n }\n }),\n shareReplay(1)\n );\n changesOperation$ = new BehaviorSubject<IOperation>(null);\n changesInProgress$: Observable<boolean> = this.changesOperation$.pipe(\n map(operation => this.isInProgress(operation))\n );\n\n constructor(\n private route: ActivatedRoute,\n private repository: RepositoryService,\n private inventory: InventoryService,\n private bsModal: BsModalService\n ) {}\n\n async ngOnInit() {\n // TODO check route snapshot, why is not refreshing device.\n // Scenario: missing deviceFirmwareFragment => install new version => switch tabs.\n // Expected: device should be set.\n await this.loadDevice();\n await this.loadOperation();\n }\n\n installFirmware() {\n const initialState: Partial<RepositorySelectModalComponent> & {\n repositoryEntriesWithVersionsFn$: (modal: any) => Observable<IManagedObject[]>;\n } = {\n repositoryEntriesWithVersions$: of([]),\n repositoryEntriesWithVersionsFn$: modal =>\n this.getRepositoryEntriesWithVersions$(modal.content.searchTerm),\n repositoryType: RepositoryType.FIRMWARE,\n title: gettext('Install firmware'),\n subTitle: gettext('Available firmwares matching the device type'),\n icon: 'c8y-firmware',\n mode: ModalSelectionMode.SINGLE,\n labels: { ok: gettext('Install') },\n disableSelected: false\n };\n\n this.deviceFirmwareFragment$\n .pipe(\n take(1),\n switchMap(deviceFirmwareFragment => {\n if (deviceFirmwareFragment) {\n const { name, version } = deviceFirmwareFragment;\n const selected = [{ name, version }];\n assign(initialState, { selected });\n }\n\n const modal = this.bsModal.show(RepositorySelectModalComponent, {\n ignoreBackdropClick: true,\n initialState\n });\n\n if (initialState.repositoryEntriesWithVersionsFn$) {\n modal.content.repositoryEntriesWithVersions$ = initialState.repositoryEntriesWithVersionsFn$(\n modal\n );\n }\n\n modal.content.load.next();\n\n return modal.content.resultEmitter;\n })\n )\n .subscribe(([selectedFirmware]) => {\n this.handleOperation(selectedFirmware);\n });\n }\n\n getRepositoryEntriesWithVersions$(searchTerm$: BehaviorSubject<string>) {\n return searchTerm$.pipe(\n distinctUntilChanged(),\n switchMap(searchTerm =>\n this.repository.listRepositoryEntries(RepositoryType.FIRMWARE, {\n query: this.repository.getDeviceTypeQuery(RepositoryType.FIRMWARE, this.device$.value),\n partialName: searchTerm,\n params: { pageSize: 100 }\n })\n ),\n map(({ data }) => data),\n map(mos => this.getAndAssignRepositoryBinaries(mos)),\n shareReplay(1)\n );\n }\n\n getAndAssignRepositoryBinaries(mos: IManagedObject[]) {\n mos.forEach(mo => {\n mo.versions = this.repository.listBaseVersions(mo);\n });\n return mos;\n }\n\n addPatch() {\n const initialState: Partial<RepositorySelectModalComponent> & {\n repositoryEntriesWithVersions$: Observable<IManagedObject[]>;\n } = {\n repositoryType: RepositoryType.FIRMWARE,\n repositoryEntriesWithVersions$: this.getRepositoryEntryWithPatches$(),\n title: gettext('Install firmware'),\n subTitle: gettext('Available firmwares matching the device type'),\n icon: 'c8y-firmware',\n mode: ModalSelectionMode.SINGLE,\n labels: { ok: gettext('Install') },\n disableSelected: false\n };\n\n this.deviceFirmwareFragment$\n .pipe(\n take(1),\n switchMap(deviceFirmwareFragment => {\n if (deviceFirmwareFragment) {\n const { name, version } = deviceFirmwareFragment;\n const selected = [{ name, version }];\n assign(initialState, { selected });\n }\n\n const modal = this.bsModal.show(RepositorySelectModalComponent, {\n ignoreBackdropClick: true,\n initialState\n });\n modal.content.load.next();\n\n return modal.content.resultEmitter;\n })\n )\n .subscribe(selectedOption => {\n this.handleOperation(selectedOption);\n });\n }\n\n getRepositoryEntryWithPatches$() {\n return combineLatest(this.repositoryEntry$, this.patches$).pipe(\n map(([repositoryEntry, patches]) => {\n return [{ ...repositoryEntry, versions: patches }];\n })\n );\n }\n\n async loadDevice() {\n this.reloading = true;\n const deviceId = this.device$.value.id;\n const device = (await this.inventory.detail(deviceId, { withChildren: false })).data;\n this.device$.next(device);\n this.reloading = false;\n }\n\n private async handleOperation(selectedFirmware) {\n const operation = await this.repository.createFirmwareUpdateOperation(\n this.device$.value,\n selectedFirmware\n );\n this.trackOperation(operation);\n }\n\n private async loadOperation() {\n const deviceId = this.device$.value.id;\n const operation = await this.repository.getLastFirmwareUpdateOperation(deviceId);\n this.trackOperation(operation);\n }\n\n private trackOperation(operation: IOperation) {\n this.changesOperation$.next(operation);\n\n if (this.isInProgress(operation)) {\n this.repository.observeOperation(operation).subscribe(\n operationUpdate => {\n this.changesOperation$.next(operationUpdate);\n if (operationUpdate.status === OperationStatus.SUCCESSFUL) {\n this.loadDevice();\n }\n },\n operationUpdate => {\n this.changesOperation$.next(operationUpdate);\n }\n );\n }\n }\n\n private isInProgress(operation: IOperation) {\n return (\n operation && [OperationStatus.PENDING, OperationStatus.EXECUTING].includes(operation.status)\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { CanActivate } from '@angular/router';\nimport { get, indexOf } from 'lodash-es';\n\nconst FIRMWARE_FRAGMENT = 'c8y_Firmware';\nconst SUPPORTED_OPERATIONS_FRAGMENT = 'c8y_SupportedOperations';\n\n@Injectable()\nexport class FirmwareDeviceTabGuard implements CanActivate {\n canActivate(route) {\n const contextData = get(route, 'data.contextData') || get(route, 'parent.data.contextData');\n const supportedOperations = get(contextData, SUPPORTED_OPERATIONS_FRAGMENT);\n return !!supportedOperations\n ? indexOf(supportedOperations, FIRMWARE_FRAGMENT) >= 0\n : false;\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { Observable, BehaviorSubject } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { IManagedObject, InventoryService, OperationStatus, IOperation } from '@c8y/client';\nimport { DeviceSoftware, DeviceSoftwareChange, RepositoryType } from '../repository.model';\nimport { RepositoryService } from '../repository.service';\n\n@Component({\n selector: 'c8y-software-device-tab',\n templateUrl: 'software-device-tab.component.html'\n})\nexport class SoftwareDeviceTabComponent implements OnInit {\n deviceId: string | number = this.route.snapshot.parent.data.contextData.id;\n device$ = new BehaviorSubject<IManagedObject>(this.route.snapshot.parent.data.contextData);\n deviceTypeQuery$: Observable<object> = this.device$.pipe(\n map(device => this.repository.getDeviceTypeQuery(RepositoryType.SOFTWARE, device))\n );\n list$: Observable<DeviceSoftware[]> = this.device$.pipe(\n map(device => this.repository.getDeviceSoftwareList(device))\n );\n changes$ = new BehaviorSubject<DeviceSoftwareChange[]>([]);\n changesOperation$ = new BehaviorSubject<IOperation>(null);\n changesInProgress$: Observable<boolean> = this.changesOperation$.pipe(\n map(operation => this.isInProgress(operation))\n );\n reloading: boolean = false;\n\n constructor(\n private route: ActivatedRoute,\n private repository: RepositoryService,\n private inventory: InventoryService\n ) {}\n\n async ngOnInit() {\n await this.loadDevice();\n await this.loadOperation();\n }\n\n addChanges(requestedChanges: DeviceSoftwareChange[]) {\n let stagedChanges = [...this.changes$.value];\n requestedChanges.forEach(requestedChange => {\n const alreadyStaged = stagedChanges.some(stagedChange =>\n this.areSameChanges(stagedChange, requestedChange));\n if (!alreadyStaged) {\n stagedChanges = [...stagedChanges, requestedChange];\n }\n });\n this.changes$.next(stagedChanges);\n }\n\n dropChange(changeToBeDropped: DeviceSoftwareChange) {\n let stagedChanges = [...this.changes$.value];\n stagedChanges = stagedChanges.filter(stagedChange => !this.areSameChanges(stagedChange, changeToBeDropped));\n this.changes$.next(stagedChanges);\n }\n\n areSameChanges(change1: DeviceSoftwareChange, change2: DeviceSoftwareChange) {\n return change1.name === change2.name &&\n change1.version === change2.version &&\n change1.action === change2.action;\n }\n\n clearChanges() {\n this.changes$.next([]);\n }\n\n async loadDevice() {\n this.reloading = true;\n const device = (await this.inventory.detail(this.deviceId, { withChildren: false })).data;\n this.device$.next(device);\n this.reloading = false;\n }\n\n async applyChanges() {\n const operation = await this.repository.createSoftwareUpdateOperation(\n this.device$.value,\n this.changes$.value\n );\n this.trackOperation(operation);\n }\n\n private async loadOperation() {\n const operation = await this.repository.getLastSoftwareUpdateOperation(this.deviceId);\n this.trackOperation(operation);\n }\n\n private trackOperation(operation: IOperation) {\n this.changesOperation$.next(operation);\n\n if (this.isInProgress(operation)) {\n this.displayChangesFromOperation(operation);\n this.repository.observeOperation(operation).subscribe(\n operationUpdate => {\n this.changesOperation$.next(operationUpdate);\n if (operationUpdate.status === OperationStatus.SUCCESSFUL) {\n this.clearChanges();\n this.loadDevice();\n }\n },\n operationUpdate => {\n this.changesOperation$.next(operationUpdate);\n }\n );\n }\n }\n\n private displayChangesFromOperation(operation: IOperation) {\n const changes = this.repository.getDeviceSoftwareChangesFromOperation(\n operation,\n this.device$.value\n );\n this.changes$.next(changes);\n }\n\n private isInProgress(operation: IOperation) {\n return (\n operation && [OperationStatus.PENDING, OperationStatus.EXECUTING].includes(operation.status)\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { CanActivate, ActivatedRouteSnapshot } from '@angular/router';\n\n@Injectable()\nexport class SoftwareDeviceTabGuard implements CanActivate {\n private readonly operations = ['c8y_SoftwareUpdate', 'c8y_SoftwareList', 'c8y_Software'];\n\n canActivate(route: ActivatedRouteSnapshot) {\n return this.isAnyOperationSupported(route);\n }\n\n private isAnyOperationSupported(route: ActivatedRouteSnapshot) {\n const device = route.data.contextData || route.parent.data.contextData;\n const supportedOperations = (device && device.c8y_SupportedOperations) || [];\n return this.operations.some(operation => supportedOperations.indexOf(operation) >= 0);\n }\n}\n","import { Component, Output, Input, EventEmitter } from '@angular/core';\nimport { from, of, BehaviorSubject } from 'rxjs';\nimport { shareReplay, map, switchMap, distinctUntilChanged } from 'rxjs/operators';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { IManagedObject, InventoryService, IOperation } from '@c8y/client';\nimport { gettext, ModalSelectionMode } from '@c8y/ngx-components';\nimport { RepositoryService } from '../repository.service';\nimport { DeviceSoftware, DeviceSoftwareChange, RepositoryType } from './../repository.model';\nimport { RepositorySelectModalComponent } from '../select-modal/repository-select-modal.component';\n\n@Component({\n selector: 'c8y-installed-software',\n templateUrl: 'installed-software.component.html'\n})\nexport class InstalledSoftwareComponent {\n @Input() softwareList: DeviceSoftware[];\n @Input() deviceSoftwareChanges: DeviceSoftwareChange[];\n @Input() deviceSoftwareChangesOperation: IOperation;\n @Input() deviceSoftwareChangesInProgress: boolean;\n @Input() deviceTypeQuery: object;\n @Output() changes = new EventEmitter<DeviceSoftwareChange[]>();\n\n constructor(\n private repository: RepositoryService,\n private inventory: InventoryService,\n private bsModal: BsModalService\n ) {\n }\n\n installSoftware() {\n this.displaySoftwareSelectModal({\n title: gettext('Install software'),\n labels: { ok: gettext('Install') },\n repositoryEntriesWithVersions$: of([]),\n repositoryEntriesWithVersionsFn$: modal =>\n this.getInstallableSoftwareListWithVersions$(modal.content.searchTerm)\n }).subscribe(softwareToInstall => {\n this.emitSoftwareInstall(softwareToInstall);\n });\n }\n\n updateSoftware(softwareToRemove) {\n this.displaySoftwareSelectModal({\n title: gettext('Update software'),\n labels: { ok: gettext('Update') },\n showFilter: false,\n repositoryEntriesWithVersions$: this.getSingleSoftwareWithVersions$(softwareToRemove)\n }).subscribe(softwareToInstall => {\n this.emitSoftwareInstall(softwareToInstall);\n });\n }\n\n removeSoftware(softwareToRemove) {\n this.emitSoftwareRemoval([softwareToRemove]);\n }\n\n getInstallableSoftwareListWithVersions$(searchTerm$: BehaviorSubject<string>) {\n const installedSoftwareNames = this.softwareList.map(s => s.name);\n return searchTerm$.pipe(\n distinctUntilChanged(),\n switchMap(searchTerm =>\n this.repository.listRepositoryEntries(RepositoryType.SOFTWARE, {\n query: this.deviceTypeQuery,\n partialName: searchTerm,\n params: { pageSize: 100 }\n })\n ),\n map(({ data }) => data),\n map(softwareList => {\n return softwareList.filter(software => {\n return !installedSoftwareNames.includes(software.name);\n });\n }),\n map(softwareList => this.attachVersions(softwareList)),\n shareReplay(1)\n );\n }\n\n getSingleSoftwareWithVersions$(software: DeviceSoftware) {\n return from(\n this.repository.listRepositoryEntries(RepositoryType.SOFTWARE, {\n query: { name: software.name }\n })\n ).pipe(\n map(({ data }) => data),\n map(softwareList => this.attachVersions(softwareList)),\n shareReplay(1)\n );\n }\n\n attachVersions(softwareList: IManagedObject[]) {\n softwareList.forEach(software => {\n software.versions = this.repository.listBaseVersions(software);\n });\n return softwareList;\n }\n\n displaySoftwareSelectModal(initialStateOverrides) {\n const initialState = {\n repositoryType: RepositoryType.SOFTWARE,\n subTitle: gettext('Available softwares matching the device type'),\n mode: ModalSelectionMode.MULTI,\n icon: 'c8y-tools',\n disableSelected: false,\n selected: this.softwareList,\n ...initialStateOverrides\n };\n const modal = this.bsModal.show(RepositorySelectModalComponent, {\n ignoreBackdropClick: true,\n class: 'modal-sm',\n initialState\n });\n\n if (initialStateOverrides.repositoryEntriesWithVersionsFn$) {\n modal.content.repositoryEntriesWithVersions$ = initialStateOverrides.repositoryEntriesWithVersionsFn$(\n modal\n );\n }\n\n modal.content.load.next();\n return modal.content.resultEmitter;\n }\n\n emitSoftwareInstall(items: DeviceSoftware[]) {\n this.changes.emit(items.map(item => {\n return { ...item, action: 'install' };\n }));\n }\n\n emitSoftwareRemoval(items: DeviceSoftware[]) {\n this.changes.emit(items.map(item => {\n return { ...item, action: 'delete' };\n }));\n }\n}\n","import { Component, Output, Input, EventEmitter } from '@angular/core';\nimport { filter } from 'lodash-es';\nimport { OperationStatus } from '@c8y/client';\nimport { DeviceSoftware, DeviceSoftwareChange } from '../repository.model';\n\n@Component({\n selector: 'c8y-device-software-list',\n templateUrl: 'device-software-list.component.html'\n})\nexport class DeviceSoftwareListComponent {\n @Input() softwareList: DeviceSoftware[];\n @Input() deviceSoftwareChanges: DeviceSoftwareChange[];\n @Output() update = new EventEmitter<DeviceSoftware>();\n @Output() remove = new EventEmitter<DeviceSoftware>();\n showUpdate: boolean;\n showRemove: boolean;\n\n ngAfterContentInit() {\n this.showUpdate = this.update.observers.length > 0;\n this.showRemove = this.remove.observers.length > 0;\n }\n\n isSoftwareGoingToBeChanged(software: DeviceSoftware): boolean {\n const relevantChanges = filter(this.deviceSoftwareChanges, software);\n return relevantChanges.length > 0;\n }\n}\n","import { Component, Output, Input, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { DeviceSoftwareChange } from '../repository.model';\n\n@Component({\n selector: 'c8y-device-software-changes',\n templateUrl: 'device-software-changes.component.html'\n})\nexport class DeviceSoftwareChangesComponent implements OnChanges {\n @Input() changes: DeviceSoftwareChange[];\n @Input() changesInProgress: boolean;\n @Output() clear: EventEmitter<void> = new EventEmitter();\n @Output() drop: EventEmitter<DeviceSoftwareChange> = new EventEmitter();\n @Output() apply: EventEmitter<void> = new EventEmitter();\n\n changes$ = new BehaviorSubject<DeviceSoftwareChange[]>([]);\n installations$ = this.changes$.pipe(\n map(changes => {\n return changes.filter(change => change.action === 'install');\n })\n );\n\n removals$ = this.changes$.pipe(\n map(changes => {\n return changes.filter(change => change.action === 'delete');\n })\n );\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.changes) {\n this.changes$.next(changes.changes.currentValue);\n }\n }\n}\n","import { EventEmitter, Injectable } from '@angular/core';\nimport { DeviceConfigurationOperation } from '../repository.model';\nimport { IManagedObject } from '@c8y/client';\n\n@Injectable()\nexport class DeviceConfigurationService {\n configurationsUpdated = new EventEmitter<any>();\n\n updateConfigurations(repositorySnapsOnly?: boolean) {\n this.configurationsUpdated.emit(repositorySnapsOnly);\n }\n\n hasAnySupportedOperation(\n mo: IManagedObject,\n operation: DeviceConfigurationOperation | DeviceConfigurationOperation[]\n ) {\n const supported = mo.c8y_SupportedOperations as [];\n if (!supported) {\n return false;\n }\n if (!Array.isArray(operation)) {\n operation = [operation];\n }\n return supported.some(supportedOperation => operation.includes(supportedOperation));\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { InventoryService, IManagedObject, OperationStatus, IOperation } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components';\nimport { RepositoryService } from '../repository.service';\nimport { AlertService } from '@c8y/ngx-components';\nimport { DeviceConfigurationOperation } from '../repository.model';\nimport { DeviceConfigurationService } from './device-configuration.service';\n\n@Component({\n selector: 'c8y-text-based-configuration',\n templateUrl: './text-based-configuration.component.html'\n})\nexport class TextBasedConfigurationComponent implements OnInit {\n device: IManagedObject;\n latestOperation: IOperation;\n showTextBasedConfigReload: boolean;\n showTextBasedConfigSave: boolean;\n reloadingConfig = false;\n config: string;\n\n constructor(\n private route: ActivatedRoute,\n private alertService: AlertService,\n private repositoryService: RepositoryService,\n private deviceConfigurationService: DeviceConfigurationService,\n private inventoryService: InventoryService\n ) {\n }\n\n async ngOnInit() {\n await this.load();\n }\n\n async load() {\n this.device = this.route.snapshot.parent.data.contextData;\n await this.loadDevice();\n await this.loadOperation();\n this.showTextBasedConfigReload = this.deviceConfigurationService.hasAnySupportedOperation(\n this.device,\n [DeviceConfigurationOperation.SEND_CONFIG]\n );\n this.showTextBasedConfigSave = this.deviceConfigurationService.hasAnySupportedOperation(\n this.device,\n [DeviceConfigurationOperation.CONFIG]\n );\n if (this.device.c8y_Configuration && this.device.c8y_Configuration.config) {\n this.config = this.device.c8y_Configuration.config;\n }\n }\n\n async loadOperation() {\n const operation = await this.repositoryService.getLastConfigUpdateOperation(this.device.id);\n if (operation !== null) {\n this.repositoryService.observeOperation(operation).subscribe(operationUpdate => {\n this.latestOperation = operationUpdate;\n });\n }\n }\n\n get savingConfig() {\n return this.latestOperation\n ? this.latestOperation.status === OperationStatus.PENDING ||\n this.latestOperation.status === OperationStatus.EXECUTING\n : false;\n }\n\n async reloadConfiguration() {\n this.reloadingConfig = true;\n const operationCfg = await this.repositoryService.createTextBasedConfigurationReloadOperation(\n this.device\n );\n try {\n this.repositoryService\n .createObservedOperation(operationCfg)\n .subscribe(\n operationUpdate => this.onOperationReloadSuccess(operationUpdate),\n operationUpdate => this.onOperationReloadError(operationUpdate),\n () => this.onOperationReloadComplete()\n );\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n async updateConfiguration(config) {\n const operationCfg = await this.repositoryService.createTextBasedConfigurationUpdateOperation(\n this.device,\n config\n );\n try {\n this.repositoryService\n .createObservedOperation(operationCfg)\n .subscribe(\n operationUpdate => this.onOperationUpdateSuccess(operationUpdate),\n operationUpdate => this.onOperationUpdateError(operationUpdate),\n () => this.onOperationUpdateComplete()\n );\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n private onOperationReloadSuccess(operationUpdate) {\n this.latestOperation = operationUpdate;\n if (operationUpdate.status === OperationStatus.PENDING) {\n this.alertService.success(gettext('Configuration will be reloaded.'));\n }\n }\n\n private onOperationReloadError(operationUpdate) {\n this.latestOperation = operationUpdate;\n this.reloadingConfig = false;\n }\n\n private async onOperationReloadComplete() {\n await this.loadDevice();\n this.config = this.device.c8y_Configuration.config;\n this.reloadingConfig = false;\n }\n\n private onOperationUpdateSuccess(operationUpdate) {\n this.latestOperation = operationUpdate;\n if (operationUpdate.status === OperationStatus.PENDING) {\n this.alertService.success(gettext('Configuration will be updated.'));\n }\n }\n\n private onOperationUpdateError(operationUpdate) {\n this.latestOperation = operationUpdate;\n }\n\n private onOperationUpdateComplete() {\n this.device.c8y_Configuration.config = this.config;\n }\n\n private async loadDevice() {\n this.device = (await this.inventoryService.detail(this.device.id, {\n withChildren: false\n })).data;\n }\n}\n","import { Component, OnInit, ViewChild } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { IManagedObject, Realtime } from '@c8y/client';\nimport { DeviceConfigurationService } from './device-configuration.service';\nimport {\n DeviceConfigurationListEmptyState,\n ConfigurationSnapshot,\n SupportedConfigurationItem,\n DeviceConfigurationOperation\n} from '../repository.model';\nimport { gettext } from '@c8y/ngx-components';\nimport { RepositoryService } from '../repository.service';\nimport { TextBasedConfigurationComponent } from './text-based-configuration.component';\n\n@Component({\n selector: 'c8y-device-configuration',\n templateUrl: './device-configuration.component.html'\n})\nexport class DeviceConfigurationComponent implements OnInit {\n supportedConfigurations: SupportedConfigurationItem[] = [];\n showBinaryBasedConfig = false;\n configurationType: string;\n configSnapshot: Partial<ConfigurationSnapshot> = {};\n repositorySnapshots: IManagedObject[];\n repositorySnapshot: ConfigurationSnapshot;\n repositorySnapshotsEmptyState: DeviceConfigurationListEmptyState;\n device: IManagedObject;\n isLegacy: boolean;\n showTextBasedConfig: boolean;\n reloading: boolean = false;\n\n @ViewChild(TextBasedConfigurationComponent) textBasedConfigurationComponent: TextBasedConfigurationComponent;\n\n constructor(\n private route: ActivatedRoute,\n private deviceConfigurationService: DeviceConfigurationService,\n private realtime: Realtime,\n private repositoryService: RepositoryService\n ) {\n this.deviceConfigurationService.configurationsUpdated.subscribe(repositorySnapsOnly => {\n this.updateSnapshots(repositorySnapsOnly);\n });\n }\n\n ngOnInit() {\n this.device = this.route.snapshot.parent.data.contextData;\n if (this.device.c8y_SupportedConfigurations) {\n this.supportedConfigurations = this.device.c8y_SupportedConfigurations.map(item => ({\n name: item\n }));\n }\n\n if (\n this.deviceConfigurationService.hasAnySupportedOperation(this.device, [\n DeviceConfigurationOperation.DOWNLOAD_CONFIG,\n DeviceConfigurationOperation.UPLOAD_CONFIG\n ])\n ) {\n this.supportedConfigurations.push({\n name: gettext('Legacy configuration snapshot'),\n isLegacy: true\n });\n }\n if (this.supportedConfigurations.length > 0) {\n this.showBinaryBasedConfig = true;\n }\n\n this.repositorySnapshotsEmptyState = {\n icon: 'gears',\n title: gettext('No configurations available.'),\n text: gettext('Add configuration to configuration repository')\n };\n\n this.showTextBasedConfig = this.deviceConfigurationService.hasAnySupportedOperation(\n this.device,\n [DeviceConfigurationOperation.CONFIG, DeviceConfigurationOperation.SEND_CONFIG]\n );\n }\n\n async onConfigTypeSelected(config) {\n this.configurationType = config.name;\n this.isLegacy = config.isLegacy;\n this.updateSnapshots();\n }\n\n async onRepositoryConfigSelected(config) {\n this.repositorySnapshot = {\n id: config.id,\n time: config.creationTime,\n name: config.name,\n binaryUrl: config.url,\n deviceType: config.deviceType,\n configurationType: config.configurationType\n };\n if (config.url) {\n try {\n const binary = await this.repositoryService.getBinaryFile(config.url, {\n allowExternal: false\n });\n if (binary) {\n this.repositorySnapshot.binary = await (binary as any).text();\n }\n } catch (ex) {\n // do nothing\n }\n }\n }\n\n async updateSnapshots(repositorySnapsOnly?: boolean) {\n this.reloading = true;\n this.repositorySnapshot = undefined;\n this.repositorySnapshots = await this.repositoryService.getSnapshotsFromRepository(\n this.device,\n this.configurationType\n );\n if (!repositorySnapsOnly) {\n this.configSnapshot = this.isLegacy\n ? await this.repositoryService.getLegacyConfigSnapshot(this.device)\n : await this.repositoryService.getConfigSnapshot(this.device, this.configurationType);\n }\n if ( this.showTextBasedConfig ) {\n await this.textBasedConfigurationComponent.load();\n }\n this.reloading = false;\n }\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'c8y-source-code-preview',\n templateUrl: './source-code-preview.component.html'\n})\nexport class SourceCodePreviewComponent {\n @Input() isDisabled: boolean;\n @Input() text: string;\n}\n","import { Component } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { ConfigurationSnapshot, RepositoryType } from '../repository.model';\nimport { AlertService, gettext } from '@c8y/ngx-components';\nimport { RepositoryService } from '../repository.service';\n\n@Component({\n selector: 'c8y-save-config-to-configuration-repository',\n templateUrl: 'save-to-repository.component.html'\n})\nexport class SaveToRepositoryComponent {\n configSnapshot: ConfigurationSnapshot;\n result: Promise<any> = new Promise((resolve, reject) => {\n this._save = resolve;\n this._cancel = reject;\n });\n private _save;\n private _cancel;\n\n constructor(\n private modal: BsModalRef,\n private alertService: AlertService,\n private repositoryService: RepositoryService\n ) {}\n\n async save() {\n {\n try {\n const configSnapshotData = {\n selected: {\n configurationType: this.configSnapshot.configurationType\n },\n version: this.configSnapshot.name,\n deviceType: this.configSnapshot.deviceType,\n description: this.configSnapshot.description,\n binary: {\n file: new File([this.configSnapshot.binary], this.configSnapshot.name)\n }\n };\n await this.repositoryService.save(configSnapshotData, RepositoryType.CONFIGURATION);\n this.alertService.success(gettext('Configuration saved.'));\n this._save();\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n close() {\n this._cancel();\n this.modal.hide();\n }\n}\n","import { Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { ConfigurationSnapshot, DeviceConfigurationOperation } from '../repository.model';\nimport {\n IManagedObject,\n IOperation,\n OperationService,\n OperationStatus,\n Realtime,\n UserService\n} from '@c8y/client';\nimport { DeviceConfigurationService } from './device-configuration.service';\nimport { Subscription } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { saveAs } from 'file-saver/FileSaver';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { SaveToRepositoryComponent } from './save-to-repository.component';\nimport { cloneDeep } from 'lodash-es';\nimport { AlertService, AppStateService, OperationRealtimeService } from '@c8y/ngx-components';\nimport { RepositoryService } from '../repository.service';\n\n@Component({\n selector: 'c8y-device-configuration-preview',\n templateUrl: './configuration-preview.component.html'\n})\nexport class ConfigurationPreviewComponent implements OnInit, OnDestroy {\n @Input() device: IManagedObject;\n @Input() set configurationType(type: string) {\n this._configurationType = type;\n this.setOperation(type);\n }\n get configurationType(): string {\n return this._configurationType;\n }\n @Input() configSnapshot: ConfigurationSnapshot;\n @Input() canSaveSnapshot: boolean;\n @Input() actionButtonText: string;\n @Input() actionButtonIcon: string;\n @Input() isLegacy: boolean = false;\n @Input() operationToTrigger:\n | DeviceConfigurationOperation.UPLOAD_CONFIG\n | DeviceConfigurationOperation.DOWNLOAD_CONFIG;\n\n operation: IOperation;\n canCallAction = true;\n deviceConfigurationOperation = DeviceConfigurationOperation;\n private _configurationType: string;\n private operationsSubscription: Subscription;\n\n constructor(\n private deviceConfigurationService: DeviceConfigurationService,\n private realtime: Realtime,\n private operationRealtime: OperationRealtimeService,\n private bsModal: BsModalService,\n private user: UserService,\n private appState: AppStateService,\n private repositoryService: RepositoryService,\n private operationService: OperationService,\n private alertService: AlertService\n ) {}\n\n async ngOnInit() {\n this.setOperation(this._configurationType);\n this.operationsSubscription = this.operationRealtime\n .onAll$(this.device.id)\n .pipe(map(({ data }) => data as IOperation))\n .subscribe(operation => {\n this.updatePreview(operation);\n });\n if (this.isLegacy) {\n this.canCallAction = this.deviceConfigurationService.hasAnySupportedOperation(\n this.device,\n this.operationToTrigger\n );\n }\n }\n\n async setOperation(configType): Promise<void> {\n const operationList = await this.repositoryService.getConfigFileOperationList(\n this.device.id,\n this.operationToTrigger\n );\n\n const operation = this.isLegacy\n ? operationList.find(op => op[this.operationToTrigger] && !op[this.operationToTrigger].type)\n : operationList.find(op => op[this.operationToTrigger].type === configType);\n\n this.operation =\n operation && operation.status !== OperationStatus.SUCCESSFUL ? operation : undefined;\n }\n\n async createDeviceOperation() {\n let operationCfg;\n if (this.operationToTrigger === DeviceConfigurationOperation.DOWNLOAD_CONFIG) {\n operationCfg = this.repositoryService.getDownloadConfigurationFileOperation(\n this.device,\n this._configurationType,\n this.configSnapshot,\n this.isLegacy\n );\n }\n if (this.operationToTrigger === DeviceConfigurationOperation.UPLOAD_CONFIG) {\n operationCfg = this.repositoryService.getUploadConfigurationFileOperation(\n this.device,\n this._configurationType,\n this.isLegacy\n );\n }\n try {\n this.operation = (await this.operationService.create(operationCfg)).data;\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n showOperation(): boolean {\n if (this.operationToTrigger === DeviceConfigurationOperation.DOWNLOAD_CONFIG) {\n return !!this.operation;\n }\n return (\n this.operation &&\n [OperationStatus.PENDING, OperationStatus.EXECUTING, OperationStatus.FAILED].includes(\n this.operation.status\n )\n );\n }\n\n showBinary(): boolean {\n if (this.operationToTrigger === DeviceConfigurationOperation.DOWNLOAD_CONFIG) {\n return true;\n }\n return !this.showOperation();\n }\n\n isCreateOperationDisabled(): boolean {\n return (\n this.operation &&\n [OperationStatus.PENDING, OperationStatus.EXECUTING].includes(this.operation.status)\n );\n }\n\n updatePreview(operation: IOperation) {\n if (\n operation &&\n operation[this.operationToTrigger] &&\n (this.isLegacy ||\n (operation[this.operationToTrigger].type &&\n operation[this.operationToTrigger].type === this.configurationType))\n ) {\n this.operation = operation;\n this.updateSnapshotsOnConfigUpload(operation);\n }\n }\n\n download() {\n const blob = new Blob([this.configSnapshot.binary], { type: this.configSnapshot.binaryType });\n let fileName = this.configSnapshot.name;\n switch (this.configSnapshot.binaryType) {\n case 'text/csv':\n case 'application/csv':\n fileName = fileName.concat('.csv');\n break;\n case 'text/yaml':\n case 'application/x-yaml':\n fileName = fileName.concat('.yaml');\n break;\n case 'application/json':\n fileName = fileName.concat('.json');\n break;\n }\n saveAs(blob, fileName);\n }\n\n async saveToRepository() {\n const initialState = {\n configSnapshot: cloneDeep(this.configSnapshot)\n };\n const modal = this.bsModal.show(SaveToRepositoryComponent, {\n class: 'modal-sm',\n initialState,\n ignoreBackdropClick: true\n }).content as SaveToRepositoryComponent;\n try {\n await modal.result;\n this.deviceConfigurationService.updateConfigurations(true);\n modal.close();\n } catch (ex) {\n // do nothing\n }\n }\n\n hasPermission(): boolean {\n return this.user.hasAnyRole(this.appState.currentUser.value, [\n 'ROLE_INVENTORY_ADMIN',\n 'ROLE_INVENTORY_CREATE'\n ]);\n }\n\n ngOnDestroy() {\n if (this.operationsSubscription) {\n this.operationsSubscription.unsubscribe();\n }\n }\n\n private async updateSnapshotsOnConfigUpload(operation) {\n if (\n operation[DeviceConfigurationOperation.UPLOAD_CONFIG] &&\n operation.status === OperationStatus.SUCCESSFUL\n ) {\n this.deviceConfigurationService.updateConfigurations();\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { SupportedConfigurationItem } from '../repository.model';\n\n@Pipe({\n name: 'configurationFilterPipe'\n})\nexport class ConfigurationFilterPipe implements PipeTransform {\n transform(items: any[], filterTerm: string): any {\n return filterTerm.trim().length === 0\n ? items\n : items.filter(\n (item: SupportedConfigurationItem) =>\n this.filterContainString(item.name, filterTerm) ||\n this.filterContainString(item.deviceType, filterTerm)\n );\n }\n\n private filterContainString(name: string, filterTerm: string) {\n const term = filterTerm.toLowerCase().trim();\n return name && name.toLowerCase().indexOf(term) > -1;\n }\n}\n","import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router';\nimport { Injectable } from '@angular/core';\nimport { DeviceConfigurationService } from './device-configuration.service';\nimport { DeviceConfigurationOperation } from '../repository.model';\n\n@Injectable()\nexport class DeviceConfigurationGuard implements CanActivate {\n constructor(private deviceConfigurationService: DeviceConfigurationService) {}\n\n canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {\n const contextData = route.data.contextData || route.parent.data.contextData;\n if (!contextData) {\n return false;\n }\n return (\n (contextData.c8y_SupportedConfigurations &&\n contextData.c8y_SupportedConfigurations.length > 0) ||\n this.deviceConfigurationService.hasAnySupportedOperation(contextData, [\n DeviceConfigurationOperation.DOWNLOAD_CONFIG,\n DeviceConfigurationOperation.UPLOAD_CONFIG,\n DeviceConfigurationOperation.CONFIG,\n DeviceConfigurationOperation.SEND_CONFIG\n ])\n );\n }\n}\n","export enum LinkRenderType {\n DOWNLOAD,\n LINK,\n TEXTONLY\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { DeviceConfigurationListEmptyState, SupportedConfigurationItem } from '../repository.model';\n\n@Component({\n selector: 'c8y-device-configuration-list',\n templateUrl: './device-configuration-list.component.html'\n})\nexport class DeviceConfigurationListComponent {\n @Input() items: SupportedConfigurationItem[];\n @Input() itemIcon: string;\n @Input() emptyState: DeviceConfigurationListEmptyState;\n @Input() isFilterEnabled: boolean;\n @Output() configSelected = new EventEmitter<string>();\n selectedConfig;\n filterTerm: string = '';\n\n showConfigurationTypePreview(config): void {\n this.selectedConfig = config;\n this.configSelected.emit(config);\n }\n\n updatePipe(filterTerm: string) {\n this.filterTerm = filterTerm;\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { RepositoryService } from './../repository.service';\nimport { memoize } from '@c8y/ngx-components';\nimport { saveAs } from 'file-saver';\nimport { InventoryBinaryService } from '@c8y/client';\nimport { LinkRenderType } from './link-render-type.enum';\n\n@Component({\n selector: 'c8y-file-download',\n templateUrl: './file-download.component.html'\n})\nexport class FileDownloadComponent {\n @Input() url: string;\n linkRenderType = LinkRenderType;\n constructor(\n private repositoryService: RepositoryService,\n private inventoryBinaryService: InventoryBinaryService\n ) {}\n\n @memoize()\n getBinaryName$(binaryUrl) {\n return this.repositoryService.getBinaryName$(binaryUrl);\n }\n\n @memoize()\n determineBehavior(): LinkRenderType {\n let result: LinkRenderType;\n if (this.inventoryBinaryService.getIdFromUrl(this.url)) {\n result = LinkRenderType.DOWNLOAD;\n } else if (this.url.match(/\\/\\//g)) {\n result = LinkRenderType.LINK;\n } else {\n result = LinkRenderType.TEXTONLY;\n }\n return result;\n }\n\n async downloadFile() {\n const binary: File = await this.repositoryService.getBinaryFile(this.url, {\n allowExternal: false\n });\n saveAs(binary);\n }\n}\n","import { NgModule } from '@angular/core';\nimport {\n CoreModule,\n FormsModule,\n HOOK_NAVIGATOR_NODES,\n HOOK_ONCE_ROUTE,\n Route,\n ViewContext,\n gettext,\n OperationRealtimeService\n} from '@c8y/ngx-components';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { TabsModule } from 'ngx-bootstrap/tabs';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { SingleOperationDetailsModule } from '@c8y/ngx-components/operations/single-operation-details';\nimport { RepositoryService } from './repository.service';\nimport { FirmwareListComponent } from './firmware/firmware-list.component';\nimport { FirmwareDetailsComponent } from './firmware/firmware-details.component';\nimport { AddFirmwareModalComponent } from './firmware/add-firmware-modal.component';\nimport { AddFirmwarePatchModalComponent } from './firmware/add-firmware-patch-modal.component';\nimport { SoftwareListComponent } from './software/software-list.component';\nimport { SoftwareDetailsComponent } from './software/software-details.component';\nimport { AddSoftwareModalComponent } from './software/add-software-modal.component';\nimport { ConfigurationListComponent } from './configuration/configuration-list.component';\nimport { ConfigurationDetailComponent } from './configuration/configuration-detail.component';\nimport { RepositoryNavigationFactory } from './repository-navigation-factory';\nimport { FirmwareDeviceTabComponent } from './firmware-device-tab/firmware-device-tab.component';\nimport { FirmwareDeviceTabGuard } from './firmware-device-tab/firmware-device-tab.guard';\nimport { SoftwareDeviceTabComponent } from './software-device-tab/software-device-tab.component';\nimport { SoftwareDeviceTabGuard } from './software-device-tab/software-device-tab.guard';\nimport { InstalledSoftwareComponent } from './software-device-tab/installed-software.component';\nimport { RepositorySelectModalComponent } from './select-modal/repository-select-modal.component';\nimport { DeviceSoftwareListComponent } from './software-device-tab/device-software-list.component';\nimport { DeviceSoftwareChangesComponent } from './software-device-tab/device-software-changes.component';\nimport { DeviceConfigurationComponent } from './configuration-device-tab/device-configuration.component';\nimport { SourceCodePreviewComponent } from './configuration-device-tab/source-code-preview.component';\nimport { ConfigurationPreviewComponent } from './configuration-device-tab/configuration-preview.component';\nimport { ConfigurationFilterPipe } from './configuration-device-tab/configuration-filter.pipe';\nimport { SaveToRepositoryComponent } from './configuration-device-tab/save-to-repository.component';\nimport { DeviceConfigurationService } from './configuration-device-tab/device-configuration.service';\nimport { DeviceConfigurationGuard } from './configuration-device-tab/device-configuration.guard';\nimport { DeviceConfigurationListComponent } from './configuration-device-tab/device-configuration-list.component';\nimport { TextBasedConfigurationComponent } from './configuration-device-tab/text-based-configuration.component';\nimport { FileDownloadComponent } from './file-download/file-download.component';\n\n@NgModule({\n imports: [\n CoreModule,\n FormsModule,\n SingleOperationDetailsModule,\n BsDropdownModule.forRoot(),\n TooltipModule,\n PopoverModule,\n TabsModule.forRoot()\n ],\n exports: [],\n declarations: [\n FirmwareListComponent,\n FirmwareDetailsComponent,\n AddFirmwareModalComponent,\n AddFirmwarePatchModalComponent,\n SoftwareListComponent,\n SoftwareDetailsComponent,\n AddSoftwareModalComponent,\n FirmwareDeviceTabComponent,\n SoftwareDeviceTabComponent,\n InstalledSoftwareComponent,\n RepositorySelectModalComponent,\n DeviceSoftwareListComponent,\n DeviceSoftwareChangesComponent,\n ConfigurationListComponent,\n ConfigurationDetailComponent,\n DeviceConfigurationComponent,\n DeviceConfigurationListComponent,\n SourceCodePreviewComponent,\n ConfigurationPreviewComponent,\n ConfigurationFilterPipe,\n SaveToRepositoryComponent,\n TextBasedConfigurationComponent,\n FileDownloadComponent\n ],\n entryComponents: [\n FirmwareListComponent,\n FirmwareDetailsComponent,\n AddFirmwareModalComponent,\n AddFirmwarePatchModalComponent,\n SoftwareListComponent,\n SoftwareDetailsComponent,\n AddSoftwareModalComponent,\n FirmwareDeviceTabComponent,\n SoftwareDeviceTabComponent,\n DeviceSoftwareListComponent,\n RepositorySelectModalComponent,\n DeviceSoftwareChangesComponent,\n ConfigurationListComponent,\n ConfigurationDetailComponent,\n DeviceConfigurationComponent,\n SaveToRepositoryComponent,\n TextBasedConfigurationComponent\n ],\n providers: [\n RepositoryService,\n OperationRealtimeService,\n DeviceConfigurationService,\n FirmwareDeviceTabGuard,\n SoftwareDeviceTabGuard,\n DeviceConfigurationGuard,\n {\n provide: HOOK_NAVIGATOR_NODES,\n useClass: RepositoryNavigationFactory,\n multi: true\n },\n {\n provide: HOOK_ONCE_ROUTE,\n useValue: [\n {\n path: 'firmware',\n component: FirmwareListComponent\n },\n {\n path: 'firmware/:id',\n component: FirmwareDetailsComponent\n },\n {\n context: ViewContext.Device,\n path: 'firmware',\n component: FirmwareDeviceTabComponent,\n label: gettext('Firmware'),\n icon: 'c8y-firmware',\n priority: 500,\n canActivate: [FirmwareDeviceTabGuard]\n },\n {\n path: 'software',\n component: SoftwareListComponent\n },\n {\n path: 'software/:id',\n component: SoftwareDetailsComponent\n },\n {\n context: ViewContext.Device,\n path: 'software',\n component: SoftwareDeviceTabComponent,\n label: gettext('Software'),\n icon: 'c8y-tools',\n priority: 499,\n canActivate: [SoftwareDeviceTabGuard]\n },\n {\n path: 'configuration',\n component: ConfigurationListComponent\n },\n {\n context: ViewContext.Device,\n path: 'device-configuration',\n component: DeviceConfigurationComponent,\n label: gettext('Configuration'),\n icon: 'gears',\n priority: 600,\n canActivate: [DeviceConfigurationGuard]\n }\n ] as Route[],\n multi: true\n }\n ]\n})\nexport class RepositoryModule {}\n"]}
1
+ {"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","../../repository/repository.model.ts","../../repository/repository.service.ts","../../repository/firmware/add-firmware-modal.component.ts","../../repository/firmware/add-firmware-patch-modal.component.ts","../../repository/firmware/firmware-list.component.ts","../../repository/firmware/firmware-details.component.ts","../../repository/software/add-software-modal.component.ts","../../repository/software/software-list.component.ts","../../repository/software/software-details.component.ts","../../repository/configuration/configuration-detail.component.ts","../../repository/configuration/configuration-list.component.ts","../../repository/repository-navigation-factory.ts","../../repository/select-modal/repository-select-modal.component.ts","../../repository/firmware-device-tab/firmware-device-tab.component.ts","../../repository/firmware-device-tab/firmware-device-tab.guard.ts","../../repository/software-device-tab/software-device-tab.component.ts","../../repository/software-device-tab/software-device-tab.guard.ts","../../repository/software-device-tab/installed-software.component.ts","../../repository/software-device-tab/device-software-list.component.ts","../../repository/software-device-tab/device-software-changes.component.ts","../../repository/configuration-device-tab/device-configuration.service.ts","../../repository/configuration-device-tab/text-based-configuration.component.ts","../../repository/configuration-device-tab/device-configuration.component.ts","../../repository/configuration-device-tab/source-code-preview.component.ts","../../repository/configuration-device-tab/save-to-repository.component.ts","../../repository/configuration-device-tab/configuration-preview.component.ts","../../repository/configuration-device-tab/configuration-filter.pipe.ts","../../repository/configuration-device-tab/device-configuration.guard.ts","../../repository/file-download/link-render-type.enum.ts","../../repository/configuration-device-tab/device-configuration-list.component.ts","../../repository/file-download/file-download.component.ts","../../repository/repository.module.ts"],"names":["RepositoryType","__decorate","decorators","target","key","desc","d","c","arguments","length","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","__generator","body","f","y","t","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","this","n","v","op","TypeError","call","pop","push","__values","o","s","m","__read","ar","error","__spread","concat","DeviceConfigurationOperation","REPOSITORY_BINARY_TYPES","_a","SOFTWARE","FIRMWARE","CONFIGURATION","RepositoryService","inventory","inventoryBinary","operation","alert","event","operationRealtime","eventBinary","dateFrom","Date","dateTo","now","queriesUtil","QueriesUtil","prototype","listRepositoryEntries","type","options","filters","defaultFilters","fullQuery","query","addOrderbys","name","addAndFilter","partialTextFilter","_b","partialText_1","partialText","orFilter","__or","properties","map","property","partialName","skipLegacy","__not","__has","assign","buildQuery","pageSize","withTotalPages","params","list","save","data","mo","configurationType","selected","undefined","version","description","deviceType","c8y_Global","id","existingUrl","url","binary","file","create","response","self","updateEntry","createEntry","modal","createFirmwareOrSoftware","mos","selectedId","saveBinary","_c","binaryURL","createOrUpdateRepositoryEntry","repositoryEntry","isNil","createRepositoryBinary","repositoryBinary","linkBinary","cleanUp","errorMsg","error_1","set","update","parent","prepareRepositoryBinaryMO","childAdditionsCreate","patchVersion","dependency","c8y_Patch","c8y_Firmware","repositoryBinaryId","binaryId","childAdditionsAdd","mosToDelete","_this","forEach","c8y_IsBinary","isUndefined","delete","entity","forceCascade","msg","gettext","danger","getBaseVersionsCount$","entry","isLegacyEntry","of","from","listBaseVersions","pipe","paging","totalPages","getBaseVersionFromMO","isPatch","get","getPatchVersionsCount$","baseVersion","listPatchVersions","Boolean","listAllVersions","getBaseVersionResultListForLegacyEntry","listChildren","__filter","__orderby","creationTime.date","creationTime","PATCH_FILTER_ORDER","c8y_Patch.dependency","isString","listBaseVersionAndPatches","c8y_Firmware.version","childrenFilters","__bygroupid","listQuery","fetchAllItemsFromList","firstPage","allItems","_d","items","nextPage","getRepositoryEntryMO$","reference","detail","withChildren","getRepositoryBinaryMoByVersion","deviceRepositoryFragment","_e","_f","repositoryBinaryType","newModelBaseVersionQuery","legacyVersionQuery","withParents","__and","head","getBinaryName$","binaryUrl","getIdFromUrl","defer","getDeviceTypeQuery","repositoryType","device","c8y_Filter.type","getConfigurationTypeQuery","getDeviceSoftwareList","c8y_SoftwareList","cloneDeep","c8y_Software","_map","createSoftwareUpdateOperation","changes","getSoftwareUpdateOperation","deviceId","change","action","join","c8y_SupportedOperations","includes","c8y_SoftwareUpdate","deviceSoftware","pick","remove","getDeviceSoftwareChangesFromOperation","getDeviceSoftwareChangesFromSoftwareListOperation","getDeviceSoftwareChangesFromSoftwareOperation","createFirmwareUpdateOperation","selectedOption","getFirmwareUpdateOperation","getUploadConfigurationFileOperation","isLegacy","c8y_UploadConfigFile","getDownloadConfigurationFileOperation","configSnapshot","c8y_DownloadConfigFile","c8y_ConfigurationDump","getLastFirmwareUpdateOperation","toISOString","revert","getFirstMatchingOperation","fragmentType","getLastSoftwareUpdateOperation","filtersList","matchingOperation","filtersList_1","filtersList_1_1","operations","createObservedOperation","take","switchMap","createdOperation","observeOperation","observedOperation$","operationUpdates$","observedOperation","onAll$","withLatestFrom","filter","operationUpdate","status","OperationStatus","FAILED","throwError","takeWhile","SUCCESSFUL","merge","getLatestConfigurationEvent","eventFilter","source","getConfigFileOperationList","operationType","operationFilter","getConfigSnapshot","time","text","download","binaryType","getLegacyConfigSnapshot","snapshotId","getBinaryText","allowExternal","getExternalBinaryResponse","res","getInternalBinaryResponse","getBinaryFile","contentType","arrayBuffer","File","getLastConfigUpdateOperation","createTextBasedConfigurationReloadOperation","c8y_SendConfiguration","createTextBasedConfigurationUpdateOperation","config","c8y_Configuration","getBinary","getSnapshotsFromRepository","searchQuery","noAlerts","fetch","fetchRes","newMo","existingBinaryId","newBinaryId","operationSoftware","find","deviceSoftwareVersion","deviceSoftwareName","operationSoftwareVersion","operationSoftwareName","Injectable","InventoryService","InventoryBinaryService","OperationService","AlertService","EventService","OperationRealtimeService","EventBinaryService","AddFirmwareModalComponent","repositoryService","saved","EventEmitter","onInput","BehaviorSubject","model","saving","firmwarePreselected","textForFirmwareUrlPopover","ngOnInit","setInitialState","loadFirmwares","inputSubscription$","tap","form","reset","debounceTime","distinctUntilChanged","searchStr","getFirmwareResult","subscribe","firmwaresResult","savedFirmware","successMsg","cancel","catch","success","hide","complete","ngOnDestroy","unsubscribe","onFile","dropped","droppedFiles","onFirmwareSelect","firmware","Component","args","selector","template","BsModalRef","ViewChild","static","Output","AddFirmwarePatchModalComponent","repository","firmwareInput$","firmwares$","shareReplay","firmwareSelected$","patchDependencyInput$","baseVersions$","selectedFirmware","baseVersionsFilterPipe","partialVersion","toLowerCase","indexOf","FirmwareListComponent","modalService","bsModalService","translateService","alertService","router","activatedRoute","textFilter$","reload$","reloading","combineLatest","getFirmwares","canAddFirmwarePatch$","bind","DEVICE_TYPE_NOT_AVAILABLE","addFirmware","show","class","ignoreBackdropClick","content","editFirmware","addFirmwarePatch","navigate","relativeTo","deleteFirmware","title","instant","labels","ok","confirm","Status","DANGER","addServerFailure","ex_1","getDeviceTypeTitle","ModalService","BsModalService","TranslateService","Router","ActivatedRoute","memoize","FirmwareDetailsComponent","inventoryService","Subject","reloading$","updateFirmware$","firmwareUpdated$","baseVersionsUpdated$","patchVersionsUpdated$","firmware$","distinctUntilKeyChanged","isLegacy$","canAddPatchVersions$","hasBaseVersions","expanded","destroy$","firmwarePartial","takeUntil","getPatchVersions$","addBaseVersion","initialState","addPatchVersion","deleteBaseVersion","deletePatchVersion","ex_2","AddSoftwareModalComponent","softwarePreselected","textForSoftwareUrlPopover","loadSoftwares","getSoftwareResult","softwaresResult","savedSoftware","onSoftwareSelect","software","SoftwareListComponent","softwares$","getSoftwares","addSoftware","editSoftware","deleteSoftware","SoftwareDetailsComponent","updateSoftware$","softwareUpdated$","software$","softwarePartial","ConfigurationDetailComponent","bsModalRef","pattern","uploadChoice","_save","_cancel","configs","existingBinary","setPipe","submitButtonTitle","filterStr","filterPipe","uniqBy","configurationForm","markAsDirty","ConfigurationListComponent","inventoryBinaryService","filterTerm","DELETED_SUCCESS_MSG","loadConfigurations","configurations$","add","edit","configuration","fileBinary","isBinaryFile","getBinaryName","saveAs","confirmationText","hint","proceed","ex_3","trim","filterContainString","shouldShowEmptyState","term","FilterInputComponent","RepositoryNavigationFactory","navs","NavigatorNode","path","icon","priority","RepositorySelectModalComponent","repositoryEntriesWithVersions$","badgeTemplates","=1","other","load","searchTerm","deviceTypeQuery","showFilter","areMoreEntries","resultEmitter","mode","ModalSelectionMode","SINGLE","disableSelected","modalEntries","mergeMap","aggregate","PAGE_SIZE","Error","addOrFilter","getAndAssignRepositoryBinaries","versions","search","selectedItems","emit","all","getSelectModalOptions","getSelectModalObject","selectModalOptions","isSelected","isBinaryRepositorySelected","bodyValue","bodyClass","obj","repositoryFragment","count","groupId","additionalInformation","FirmwareDeviceTabComponent","route","bsModal","isEmpty","device$","snapshot","contextData","deviceFirmwareFragment$","firmwareBinary$","deviceFirmwareFragment","repositoryEntry$","patches$","firmwareBinary","changesOperation$","changesInProgress$","isInProgress","loadDevice","loadOperation","installFirmware","repositoryEntriesWithVersionsFn$","getRepositoryEntriesWithVersions$","subTitle","handleOperation","searchTerm$","addPatch","getRepositoryEntryWithPatches$","patches","trackOperation","PENDING","EXECUTING","FirmwareDeviceTabGuard","canActivate","supportedOperations","SoftwareDeviceTabComponent","deviceTypeQuery$","list$","changes$","addChanges","requestedChanges","stagedChanges","requestedChange","some","stagedChange","areSameChanges","dropChange","changeToBeDropped","change1","change2","clearChanges","applyChanges","displayChangesFromOperation","SoftwareDeviceTabGuard","isAnyOperationSupported","InstalledSoftwareComponent","installSoftware","displaySoftwareSelectModal","getInstallableSoftwareListWithVersions$","softwareToInstall","emitSoftwareInstall","updateSoftware","softwareToRemove","getSingleSoftwareWithVersions$","removeSoftware","emitSoftwareRemoval","installedSoftwareNames","softwareList","attachVersions","initialStateOverrides","MULTI","item","Input","DeviceSoftwareListComponent","ngAfterContentInit","showUpdate","observers","showRemove","isSoftwareGoingToBeChanged","deviceSoftwareChanges","DeviceSoftwareChangesComponent","clear","drop","installations$","removals$","ngOnChanges","currentValue","DeviceConfigurationService","configurationsUpdated","updateConfigurations","repositorySnapsOnly","hasAnySupportedOperation","supported","Array","isArray","supportedOperation","TextBasedConfigurationComponent","deviceConfigurationService","reloadingConfig","showTextBasedConfigReload","SEND_CONFIG","showTextBasedConfigSave","CONFIG","latestOperation","reloadConfiguration","operationCfg","onOperationReloadSuccess","onOperationReloadError","onOperationReloadComplete","ex","updateConfiguration","onOperationUpdateSuccess","onOperationUpdateError","onOperationUpdateComplete","DeviceConfigurationComponent","realtime","supportedConfigurations","showBinaryBasedConfig","updateSnapshots","c8y_SupportedConfigurations","DOWNLOAD_CONFIG","UPLOAD_CONFIG","repositorySnapshotsEmptyState","showTextBasedConfig","onConfigTypeSelected","onRepositoryConfigSelected","repositorySnapshot","repositorySnapshots","textBasedConfigurationComponent","Realtime","SaveToRepositoryComponent","configSnapshotData","close","ConfigurationPreviewComponent","user","appState","operationService","canCallAction","deviceConfigurationOperation","_configurationType","setOperation","operationsSubscription","updatePreview","operationToTrigger","configType","operationList","createDeviceOperation","showOperation","showBinary","isCreateOperationDisabled","updateSnapshotsOnConfigUpload","blob","Blob","fileName","saveToRepository","hasPermission","hasAnyRole","currentUser","UserService","AppStateService","ConfigurationFilterPipe","transform","Pipe","DeviceConfigurationGuard","state","LinkRenderType","DeviceConfigurationListComponent","configSelected","showConfigurationTypePreview","selectedConfig","updatePipe","FileDownloadComponent","linkRenderType","determineBehavior","DOWNLOAD","match","LINK","TEXTONLY","downloadFile","component","context","ViewContext","Device","NgModule","imports","CoreModule","FormsModule","SingleOperationDetailsModule","BsDropdownModule","forRoot","TooltipModule","PopoverModule","TabsModule","exports","declarations","SourceCodePreviewComponent","entryComponents","providers","provide","HOOK_NAVIGATOR_NODES","useClass","multi","HOOK_ONCE_ROUTE","useValue","ɵ0"],"mappings":"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B,MAAOqI,EAAAA,QAAQ,iBACfsW,KAAM,QACNC,SAAU,IACVuE,YAAa,CAACkI,QAOxB,kCA1HCoB,EAAAA,SAAQhX,KAAA,CAAC,CACRiX,QAAS,CACPC,EAAAA,WACAC,EAAAA,YACAC,EAAAA,6BACAC,EAAAA,iBAAiBC,UACjBC,EAAAA,cACAC,EAAAA,cACAC,EAAAA,WAAWH,WAEbI,QAAS,GACTC,aAAc,CACZvW,EACAyC,EACAnG,EACA6C,EACAuF,EACAM,EACAf,EACAsG,EACAiC,EACAoB,EACA5F,EACA8G,EACAO,EACAjJ,EACAf,EACAkM,EACAoD,GACA6B,EACA9D,EACA2B,EACA9B,EACAlC,EACA2E,IAEFyB,gBAAiB,CACfzW,EACAyC,EACAnG,EACA6C,EACAuF,EACAM,EACAf,EACAsG,EACAiC,EACAsC,EACA9G,EACAqH,EACAjJ,EACAf,EACAkM,EACAgB,EACAlC,GAEFqG,UAAW,CACTvrB,EACAiR,EAAAA,yBACAwT,EACAvD,EACAqB,EACA8G,EACA,CACEmC,QAASC,EAAAA,qBACTC,SAAUnP,EACVoP,OAAO,GAET,CACEH,QAASI,EAAAA,gBACTC,SAAQC,GAiDRH,OAAO","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { IManagedObject } from '@c8y/client';\n\nexport enum RepositoryType {\n FIRMWARE = 'c8y_Firmware',\n SOFTWARE = 'c8y_Software',\n CONFIGURATION = 'c8y_ConfigurationDump'\n}\n\nexport const REPOSITORY_BINARY_TYPES = {\n [RepositoryType.SOFTWARE]: 'c8y_SoftwareBinary',\n [RepositoryType.FIRMWARE]: 'c8y_FirmwareBinary',\n [RepositoryType.CONFIGURATION]: 'c8y_ConfigurationDumpBinary'\n};\n\nexport interface ModalModel {\n selected?: { id?: string; name?: string; [key: string]: any };\n version?: string;\n dependency?: { c8y_Firmware: { version: string } };\n patchVersion?: string;\n description?: string;\n deviceType?: string;\n binary?: {\n file?: File;\n url?: string;\n };\n}\n\nexport interface RepositoryCategory extends Partial<IManagedObject> {\n type: string;\n description?: string;\n c8y_Filter?: {\n type: string;\n };\n}\n\nexport interface FirmwareBinary extends Partial<IManagedObject> {\n type: 'c8y_FirmwareBinary';\n c8y_Firmware: {\n version: string;\n url: string;\n };\n}\n\nexport interface FirmwarePatchBinary extends FirmwareBinary {\n c8y_Patch: {\n dependency: string;\n };\n}\n\nexport interface SoftwareBinary extends Partial<IManagedObject> {\n type: string;\n c8y_Software: {\n version: string;\n url: string;\n };\n}\n\nexport type RepositoryBinary = FirmwareBinary | SoftwareBinary | FirmwarePatchBinary;\n\nexport interface SelectedRepositoryBinary {\n id?: string;\n name: string;\n version: string;\n url: string;\n dependency?: string;\n c8y_Patch?: boolean;\n isPatch?: boolean;\n patchDependency?: string;\n}\n\nexport interface DeviceFirmware {\n version: string;\n url: string;\n name: string;\n}\n\nexport interface DeviceSoftware {\n name: string;\n version?: string;\n url: string;\n}\n\nexport interface DeviceSoftwareChange extends DeviceSoftware {\n action: 'install' | 'delete';\n}\n\nexport interface ConfigurationSnapshot {\n id?: string;\n time: string;\n name: string;\n binaryUrl?: string;\n binary?: any;\n binaryType?: any;\n deviceType?: string;\n configurationType?: string;\n description?: string;\n}\n\nexport interface SupportedConfigurationItem {\n name: string;\n deviceType?: string;\n configurationType?: string;\n isLegacy?: boolean;\n}\n\nexport interface DeviceConfigurationListEmptyState {\n icon?: string;\n title?: string;\n text?: string;\n}\n\nexport enum DeviceConfigurationOperation {\n UPLOAD_CONFIG = 'c8y_UploadConfigFile',\n DOWNLOAD_CONFIG = 'c8y_DownloadConfigFile',\n CONFIG = 'c8y_Configuration',\n SEND_CONFIG = 'c8y_SendConfiguration'\n}\n","import { Injectable } from '@angular/core';\nimport {\n EventBinaryService,\n EventService,\n IdReference,\n IEvent,\n IFetchResponse,\n IIdentified,\n IManagedObject,\n IManagedObjectBinary,\n InventoryBinaryService,\n InventoryService,\n IOperation,\n IResult,\n IResultList,\n OperationService,\n OperationStatus,\n QueriesUtil\n} from '@c8y/client';\nimport { AlertService, gettext, OperationRealtimeService } from '@c8y/ngx-components';\nimport {\n assign,\n cloneDeep,\n find,\n forEach,\n get,\n head,\n isNil,\n isString,\n isUndefined,\n map as _map,\n pick,\n remove,\n set\n} from 'lodash-es';\nimport { defer, from, merge, Observable, of, throwError } from 'rxjs';\nimport { filter, map, switchMap, take, takeWhile, withLatestFrom } from 'rxjs/operators';\nimport {\n ConfigurationSnapshot,\n DeviceFirmware,\n DeviceSoftware,\n DeviceSoftwareChange,\n FirmwareBinary,\n FirmwarePatchBinary,\n ModalModel,\n RepositoryBinary,\n RepositoryCategory,\n RepositoryType,\n REPOSITORY_BINARY_TYPES,\n SelectedRepositoryBinary,\n SoftwareBinary\n} from './repository.model';\n\n@Injectable()\nexport class RepositoryService {\n readonly dateFrom = new Date(0);\n readonly dateTo = new Date(Date.now() + 86400000); // 1 day in the future\n private queriesUtil: QueriesUtil;\n\n constructor(\n private inventory: InventoryService,\n private inventoryBinary: InventoryBinaryService,\n private operation: OperationService,\n private alert: AlertService,\n private event: EventService,\n private operationRealtime: OperationRealtimeService,\n private eventBinary: EventBinaryService\n ) {\n this.queriesUtil = new QueriesUtil();\n }\n\n /**\n * Lists repository entries of given type.\n * @param type The type of repository entries to list.\n * @param options Extra listing options.\n */\n listRepositoryEntries(\n type: RepositoryType,\n options?: {\n /** Additional query. */\n query?: any;\n /** (deprecated - to be removed) Only include entries with matching partial names. */\n partialName?: string;\n /** Include entries with matching partial text in the specified properties. */\n partialTextFilter?: { partialText: string; properties: string[] };\n /** Exclude legacy entries. */\n skipLegacy?: boolean;\n /** Other request params. */\n params?: any;\n }\n ) {\n const defaultOrder = [{ name: 1 }];\n const defaultFilters = { type };\n const legacyFilters = { __has: `url` };\n let filters = {};\n\n let fullQuery = (options && options.query) || {};\n fullQuery = this.queriesUtil.addOrderbys(fullQuery, defaultOrder, 'prepend');\n\n fullQuery = this.queriesUtil.addAndFilter(fullQuery, defaultFilters);\n\n if (options && options.partialTextFilter) {\n const { partialText, properties } = options.partialTextFilter;\n const orFilter = { __or: properties.map(property => ({ [property]: `*${partialText}*` })) };\n fullQuery = this.queriesUtil.addAndFilter(fullQuery, orFilter);\n }\n\n if (options && options.partialName) {\n // backwards compatibility if\n fullQuery = this.queriesUtil.addAndFilter(fullQuery, { name: `*${options.partialName}*` });\n }\n\n if (options && options.skipLegacy) {\n fullQuery = this.queriesUtil.addAndFilter(fullQuery, { __not: legacyFilters });\n }\n\n filters = {\n query: this.queriesUtil.buildQuery(fullQuery),\n pageSize: 50,\n withTotalPages: true,\n ...((options && options.params) || {})\n };\n return this.inventory.list(filters);\n }\n\n // TODO: merge with create()\n async save(data: ModalModel, type: RepositoryType, mo: Partial<IManagedObject> = {}) {\n switch (type) {\n case RepositoryType.CONFIGURATION: {\n Object.assign(mo, {\n type: RepositoryType.CONFIGURATION,\n configurationType: data.selected ? data.selected.configurationType : undefined,\n name: data.version,\n description: data.description,\n deviceType: data.deviceType,\n c8y_Global: {}\n });\n if (!data.deviceType && mo.id) {\n mo.deviceType = null;\n }\n if (!data.selected && mo.id) {\n mo.configurationType = null;\n }\n break;\n }\n }\n\n const existingUrl = mo.url;\n if (data.binary.url) {\n mo.url = data.binary.url;\n } else if (data.binary.file) {\n const response = await this.inventoryBinary.create(data.binary.file, {\n c8y_Global: {}\n } as Partial<IManagedObject>);\n mo.url = response.data.self;\n }\n\n if (mo.id) {\n return this.updateEntry(mo, existingUrl);\n }\n return this.createEntry(mo);\n }\n\n async create(modal: ModalModel, type: RepositoryType) {\n switch (type) {\n case RepositoryType.FIRMWARE:\n case RepositoryType.SOFTWARE:\n return this.createFirmwareOrSoftware(modal, type);\n }\n }\n\n async createFirmwareOrSoftware(\n modal: ModalModel,\n type: RepositoryType\n ): Promise<RepositoryCategory> {\n let binary: IManagedObjectBinary;\n let binaryURL: string;\n let repositoryEntry: RepositoryCategory;\n let repositoryBinary: FirmwareBinary | SoftwareBinary;\n const mos = [];\n const {\n selected: { id: selectedId },\n binary: { file, url }\n } = modal;\n try {\n if (file) {\n ({ data: binary } = await this.saveBinary(file));\n ({ self: binaryURL } = binary);\n mos.push(binary);\n } else {\n binaryURL = url;\n }\n\n ({ data: repositoryEntry } = await this.createOrUpdateRepositoryEntry(modal, type));\n if (isNil(selectedId)) {\n mos.push(repositoryEntry);\n }\n\n ({ data: repositoryBinary } = await this.createRepositoryBinary(\n modal,\n binaryURL,\n type,\n repositoryEntry\n ));\n mos.push(repositoryBinary);\n\n if (file) {\n await this.linkBinary(repositoryBinary, binary);\n }\n\n return repositoryEntry;\n } catch (error) {\n this.cleanUp(mos);\n this.errorMsg();\n\n // Propagate error\n throw error;\n }\n }\n\n saveBinary(file: File): Promise<IResult<IManagedObjectBinary>> {\n return this.inventoryBinary.create(file, { c8y_Global: {} } as Partial<IManagedObject>);\n }\n\n createOrUpdateRepositoryEntry(\n modal: ModalModel,\n type: RepositoryType\n ): Promise<IResult<RepositoryCategory>> {\n const {\n selected: { id, name },\n description,\n deviceType\n } = modal;\n\n const mo = {\n id,\n name: id ? undefined : name,\n description,\n type: id ? undefined : type,\n c8y_Global: {}\n };\n\n if (deviceType) {\n set(mo, 'c8y_Filter.type', deviceType);\n }\n\n return id\n ? (this.inventory.update(mo) as Promise<IResult<RepositoryCategory>>)\n : (this.inventory.create(mo) as Promise<IResult<RepositoryCategory>>);\n }\n\n createRepositoryBinary(\n modal: ModalModel,\n binaryURL: string,\n type: RepositoryType,\n parent: RepositoryCategory\n ): Promise<IResult<FirmwareBinary | SoftwareBinary | FirmwarePatchBinary>> {\n const mo = this.prepareRepositoryBinaryMO(modal, binaryURL, type);\n\n return this.inventory.childAdditionsCreate(mo, parent) as Promise<\n IResult<FirmwareBinary | SoftwareBinary | FirmwarePatchBinary>\n >;\n }\n\n prepareRepositoryBinaryMO(modal: ModalModel, binaryURL: string, type: RepositoryType) {\n const { version, patchVersion, dependency } = modal;\n const result = {\n type: REPOSITORY_BINARY_TYPES[type],\n [type]: {\n url: binaryURL\n },\n c8y_Global: {}\n };\n\n if (dependency) {\n set(result, [type, 'version'], patchVersion);\n assign(result, {\n c8y_Patch: {\n dependency: dependency.c8y_Firmware.version\n }\n });\n } else {\n set(result, [type, 'version'], version);\n }\n return result;\n }\n\n async linkBinary(\n repositoryBinary: FirmwareBinary | SoftwareBinary,\n binary: IManagedObjectBinary\n ) {\n const { id: repositoryBinaryId } = repositoryBinary;\n if (binary) {\n const { id: binaryId } = binary;\n return this.inventory.childAdditionsAdd(binaryId, repositoryBinaryId);\n }\n }\n\n cleanUp(mosToDelete: IIdentified[]) {\n mosToDelete.forEach(mo => {\n const { c8y_IsBinary } = mo;\n isUndefined(c8y_IsBinary) ? this.delete(mo) : this.inventoryBinary.delete(mo);\n });\n }\n\n delete(entity: IIdentified): Promise<IResult<null>> {\n return this.inventory.delete(entity, { forceCascade: true });\n }\n\n errorMsg() {\n const msg = gettext('Failed to save');\n this.alert.danger(msg);\n }\n\n getBaseVersionsCount$(entry: IManagedObject): Observable<number> {\n if (this.isLegacyEntry(entry)) {\n return of(1);\n }\n return from(this.listBaseVersions(entry, { pageSize: 1, withTotalPages: true })).pipe(\n map(({ paging }) => paging.totalPages)\n );\n }\n\n getBaseVersionFromMO(mo: RepositoryBinary): string {\n return this.isPatch(mo) ? get(mo, 'c8y_Patch.dependency') : get(mo, 'c8y_Firmware.version');\n }\n\n isPatch(mo: RepositoryBinary): boolean {\n return !!get(mo, 'c8y_Patch.dependency');\n }\n\n getPatchVersionsCount$(entry: IManagedObject, baseVersion: FirmwareBinary): Observable<number> {\n if (this.isLegacyEntry(baseVersion)) {\n return of(0);\n }\n return from(\n this.listPatchVersions(entry, baseVersion, { pageSize: 1, withTotalPages: true })\n ).pipe(map(({ paging }) => paging.totalPages));\n }\n\n isLegacyEntry(entry: Partial<IManagedObject>): boolean {\n return Boolean(entry.url);\n }\n\n /**\n * Lists all versions (base and patch ones) of given top level entry.\n * Versions are ordered by creation time (assuming the earlier created, the older the version).\n * @param entry Top level repository entry.\n * @param params Additional query params.\n */\n listAllVersions(entry: Partial<IManagedObject>, params = {}) {\n if (this.isLegacyEntry(entry)) {\n return this.getBaseVersionResultListForLegacyEntry(entry);\n }\n\n const VERSION_FILTER_ORDER = {\n __filter: {},\n __orderby: [{ 'creationTime.date': -1 }, { creationTime: -1 }]\n };\n return this.listChildren(entry, VERSION_FILTER_ORDER, params);\n }\n\n /**\n * Lists base versions of given top level entry.\n * Versions are ordered by creation time (assuming the earlier created, the older the version).\n * @param entry Top level repository entry.\n * @param params Additional query params.\n */\n listBaseVersions(entry: Partial<IManagedObject>, params = {}) {\n if (this.isLegacyEntry(entry)) {\n return this.getBaseVersionResultListForLegacyEntry(entry);\n }\n\n const NO_PATCH_FILTER_ORDER = {\n __filter: {\n __not: { __has: 'c8y_Patch' }\n },\n __orderby: [{ 'creationTime.date': -1 }, { creationTime: -1 }]\n };\n return this.listChildren(entry, NO_PATCH_FILTER_ORDER, params);\n }\n\n /**\n * Lists patch versions of given base version under the entry.\n * Versions are ordered by creation time (assuming the earlier created, the older the version).\n * @param entry Top level repository entry.\n * @param baseVersion Base version.\n * @param params Additional query params.\n */\n listPatchVersions(entry: IManagedObject, baseVersion: FirmwareBinary | string, params = {}) {\n const version = isString(baseVersion) ? baseVersion : get(baseVersion, 'c8y_Firmware.version');\n const PATCH_FILTER_ORDER = {\n __filter: {\n 'c8y_Patch.dependency': version\n },\n __orderby: [{ 'creationTime.date': -1 }, { creationTime: -1 }]\n };\n return this.listChildren(entry, PATCH_FILTER_ORDER, params);\n }\n\n /**\n * Lists patch versions of given base version under the entry including the base version.\n * Versions are ordered by creation time (assuming the earlier created, the older the version).\n * In terms of legacy base version the entry gets transformed to fit the needed data model.\n * @param entry Top level repository entry.\n * @param baseVersion Base version.\n * @param params Additional query params.\n */\n listBaseVersionAndPatches(entry: IManagedObject, baseVersion: IManagedObject, params = {}) {\n if (this.isLegacyEntry(entry)) {\n return Promise.resolve({\n data: [\n Object.assign(\n {\n c8y_Firmware: {\n version: entry.version,\n url: entry.url\n }\n },\n entry\n )\n ]\n });\n }\n\n const PATCH_FILTER_ORDER = {\n __filter: {\n __or: {\n 'c8y_Patch.dependency': baseVersion.c8y_Firmware.version,\n 'c8y_Firmware.version': baseVersion.c8y_Firmware.version\n }\n },\n __orderby: [{ 'c8y_Patch.dependency': 1 }, { 'c8y_Firmware.version': 1 }]\n };\n return this.listChildren(entry, PATCH_FILTER_ORDER, params);\n }\n\n listChildren(entry: Partial<IManagedObject>, filters = {}, params: any = {}) {\n const childrenFilters = { __bygroupid: entry.id };\n const query = this.queriesUtil.addAndFilter(filters, childrenFilters);\n // FIXME: needed because of issue in forOf directive (...)\n params.withTotalPages = true;\n return this.inventory.listQuery(query, params);\n }\n\n /**\n * Fetches all items from the list starting with the provided page.\n * @param firstPage The first page of the list to fetch all items for.\n */\n async fetchAllItemsFromList(firstPage) {\n let allItems;\n\n if (!firstPage.then) {\n allItems = [...firstPage];\n } else {\n let { paging, data: items } = await firstPage;\n allItems = [...items];\n\n while (paging && paging.nextPage) {\n ({ paging, data: items } = await paging.next());\n allItems = [...allItems, ...items];\n }\n }\n\n return allItems;\n }\n\n /**\n * Gets top level repository entry managed object for base or patch version.\n * @param mo Base or patch version managed object with parents.\n */\n getRepositoryEntryMO$(mo: IManagedObject): Observable<IManagedObject | undefined> {\n if (!mo) {\n return of(undefined);\n }\n const [reference] = get(mo, 'additionParents.references');\n const id = get(reference, 'managedObject.id');\n return id\n ? from(this.inventory.detail(id, { withChildren: false })).pipe(map(({ data }) => data))\n : of(undefined);\n }\n /**\n * Gets base or patch version managed object.\n * @param deviceRepositoryFragment Device repository fragment.\n * @param type Top level repository entry type.\n * @param configuration Configuration object with options:\n * - **skipLegacy** - `boolean` - Exclude legacy entries.\n * - **filters** - `object` - Filter object.\n *\n * @deprecated as it doesn't support 'missing url' case\n */\n getRepositoryBinaryMoByVersion(\n deviceRepositoryFragment: DeviceFirmware | DeviceSoftware,\n type: RepositoryType,\n { skipLegacy = false, filters = {} }: { skipLegacy?: boolean; filters?: object } = {}\n ): Promise<IManagedObject> {\n const { version, url, name } = deviceRepositoryFragment;\n const repositoryBinaryType = REPOSITORY_BINARY_TYPES[type];\n let query;\n const newModelBaseVersionQuery = {\n [`${type}.version`]: version,\n [`${type}.url`]: url,\n type: repositoryBinaryType\n };\n const legacyVersionQuery = { url, type, name };\n filters = { withChildren: false, withParents: true, ...filters };\n\n if (skipLegacy) {\n query = {\n __and: {\n ...newModelBaseVersionQuery\n }\n };\n } else {\n query = {\n __or: [{ __and: { ...newModelBaseVersionQuery } }, { __and: { ...legacyVersionQuery } }]\n };\n }\n\n return this.inventory.listQuery(query, filters).then(({ data }) => head(data));\n }\n\n getBinaryName$(binaryUrl: string): Observable<string> {\n if (!binaryUrl) {\n return of('---');\n }\n\n const binaryId = this.inventoryBinary.getIdFromUrl(binaryUrl);\n if (!binaryId) {\n return of(binaryUrl);\n }\n return defer(() => this.inventory.detail(binaryId).then(result => result.data)).pipe(\n map(mo => mo.name)\n );\n }\n\n /**\n * Generates an inventory query object which can be used to find\n * repository entries of specified type matching the type of provided device.\n * @param repositoryType The type of repository entries which will be queried with the generated query.\n * @param device The device for which matching repository entries will be queried with the generated query.\n */\n\n getDeviceTypeQuery(repositoryType: RepositoryType, device: IManagedObject): object {\n let result = { type: repositoryType };\n if (repositoryType === RepositoryType.CONFIGURATION) {\n if (device.type) {\n result = this.queriesUtil.addAndFilter(result, {\n __or: [{ deviceType: device.type }, { __not: { __has: `deviceType` } }]\n });\n }\n } else {\n result = this.queriesUtil.addAndFilter(result, {\n __or: [\n { 'c8y_Filter.type': device.type },\n { 'c8y_Filter.type': '' },\n { __not: { __has: `c8y_Filter.type` } }\n ]\n });\n }\n return result;\n }\n\n /**\n * Generates an inventory query object which can be used to find configuration repository entries\n * matching the type of provided device and specified configuration type.\n * @param device The device for which matching repository entries will be queried with the generated query.\n * @param configurationType Configuration type for which matching repository entries will be queried with the generated query.\n */\n getConfigurationTypeQuery(device: IManagedObject, configurationType: string): object {\n const query = this.getDeviceTypeQuery(RepositoryType.CONFIGURATION, device);\n return this.queriesUtil.addAndFilter(query, {\n __or: [\n { configurationType },\n { configurationType: '' },\n { __not: { __has: `configurationType` } }\n ]\n });\n }\n\n /**\n * Gets the list of software installed in the device in the uniform format.\n * Supports c8y_SoftwareList and c8y_Software fragments.\n * @param device The device whose software list should be returned.\n */\n getDeviceSoftwareList(device: IManagedObject): DeviceSoftware[] {\n if (device.c8y_SoftwareList) {\n return cloneDeep(device.c8y_SoftwareList);\n }\n if (device.c8y_Software) {\n return _map(device.c8y_Software, (version, name) => ({ name, version }));\n }\n return [];\n }\n\n /**\n * Prepares a software update operation for given device and the list of changes, and sends it to the device.\n * @param device The device which the operation should be prepared for and sent to.\n * @param changes The list of software changes which should be applied.\n */\n async createSoftwareUpdateOperation(\n device: IManagedObject,\n changes: DeviceSoftwareChange[]\n ): Promise<IOperation> {\n const operation = this.getSoftwareUpdateOperation(device, changes);\n return (await this.operation.create(operation)).data;\n }\n\n /**\n * Prepares a software update operation for given device and changes.\n * Returned operation type depends on device's supported operations.\n * Supports c8y_SoftwareUpdate, c8y_SoftwareList, and c8y_Software operations.\n * @param device The device for which operation should be prepared.\n * @param changes The list of software changes which should be applied.\n */\n getSoftwareUpdateOperation(device: IManagedObject, changes: DeviceSoftwareChange[]): IOperation {\n const operation: IOperation = {\n deviceId: device.id,\n description: `Apply software changes: ${changes\n .map(\n change =>\n `${change.action} \"${change.name}\"${\n change.version ? ` (version: ${change.version})` : ''\n }`\n )\n .join(', ')}`\n };\n if (device.c8y_SupportedOperations.includes('c8y_SoftwareUpdate')) {\n operation.c8y_SoftwareUpdate = cloneDeep(changes);\n } else if (device.c8y_SupportedOperations.includes('c8y_SoftwareList')) {\n operation.c8y_SoftwareList = cloneDeep(device.c8y_SoftwareList) || [];\n changes.forEach(change => {\n const deviceSoftware: DeviceSoftware = pick(change, ['name', 'version', 'url']);\n if (change.action === 'delete') {\n remove(operation.c8y_SoftwareList, deviceSoftware);\n }\n if (change.action === 'install') {\n operation.c8y_SoftwareList.push(deviceSoftware);\n }\n });\n } else if (device.c8y_SupportedOperations.includes('c8y_Software')) {\n operation.c8y_Software = cloneDeep(device.c8y_Software) || {};\n changes.forEach(change => {\n if (change.action === 'delete') {\n delete operation.c8y_Software[change.name];\n }\n if (change.action === 'install') {\n operation.c8y_Software[change.name] = change.version;\n }\n });\n }\n return operation;\n }\n\n /**\n * Extracts the list of device software changes from given operation in the context of given device.\n * @param operation The operation from which the list should be extracted.\n * @param device The target device of the operation.\n */\n getDeviceSoftwareChangesFromOperation(\n operation: IOperation,\n device: IManagedObject\n ): DeviceSoftwareChange[] {\n if (operation.c8y_SoftwareUpdate) {\n return cloneDeep(operation.c8y_SoftwareUpdate);\n }\n if (operation.c8y_SoftwareList) {\n return this.getDeviceSoftwareChangesFromSoftwareListOperation(operation, device);\n }\n if (operation.c8y_Software) {\n return this.getDeviceSoftwareChangesFromSoftwareOperation(operation, device);\n }\n return [];\n }\n\n /**\n * Prepares a firmware update operation for given device and the selected repository binary, and sends it to the device.\n * @param device The device which the operation should be prepared for and sent to.\n * @param selectedOption The selected repository binary option.\n */\n async createFirmwareUpdateOperation(\n device: IManagedObject,\n selectedOption: SelectedRepositoryBinary\n ): Promise<IOperation> {\n const operation = this.getFirmwareUpdateOperation(device, selectedOption);\n return (await this.operation.create(operation)).data;\n }\n\n /**\n * Prepares a firmware update operation for given device and selected version.\n * Supports c8y_Firmware operation.\n * @param device The device for which operation should be prepared.\n * @param selectedOption Selected firmware version.\n */\n getFirmwareUpdateOperation(\n device: IManagedObject,\n selectedOption: SelectedRepositoryBinary\n ): IOperation {\n delete selectedOption.id;\n\n const operation: IOperation = {\n deviceId: device.id,\n description: `Update firmware to: \"${selectedOption.name}\"${\n selectedOption.version ? ` (version: ${selectedOption.version})` : ''\n }`,\n c8y_Firmware: { ...selectedOption }\n };\n\n return operation;\n }\n\n /**\n * Prepares a configuration file upload operation for given device and configuration type.\n * @param device The device for which operation should be prepared.\n * @param configurationType Selected configuration type.\n * @param isLegacy A legacy operation is created without a configurationType.\n */\n getUploadConfigurationFileOperation(\n device: IManagedObject,\n configurationType: string,\n isLegacy: boolean = false\n ): IOperation {\n if (isLegacy) {\n return {\n deviceId: device.id,\n description: `Retrieve configuration snapshot from device ${device.name}`,\n c8y_UploadConfigFile: {}\n };\n }\n return {\n deviceId: device.id,\n description: `Retrieve ${configurationType} configuration snapshot from device ${\n device.name\n }`,\n c8y_UploadConfigFile: {\n type: configurationType\n }\n };\n }\n\n /**\n * Prepares a configuration file download operation for given device and configuration type.\n * @param device The device for which operation should be prepared.\n * @param configurationType Selected configuration type.\n * @param binaryUrl The url of a binary to be downloaded.\n * @param isLegacy A legacy operation is created without a configurationType.\n */\n getDownloadConfigurationFileOperation(\n device: IManagedObject,\n configurationType: string,\n configSnapshot: ConfigurationSnapshot,\n isLegacy: boolean = false\n ): IOperation {\n if (isLegacy) {\n return {\n deviceId: device.id,\n description: `Send configuration snapshot ${configSnapshot.name} to device ${device.name}`,\n c8y_DownloadConfigFile: {\n url: configSnapshot.binaryUrl,\n c8y_ConfigurationDump: {\n id: configSnapshot.id\n }\n }\n };\n }\n return {\n deviceId: device.id,\n description: `Send configuration snapshot ${\n configSnapshot.name\n } of configuration type ${configurationType} to device ${device.name}`,\n c8y_DownloadConfigFile: {\n url: configSnapshot.binaryUrl,\n type: configurationType\n }\n };\n }\n\n /**\n * Gets the last firmware update operation for given device.\n * Looks for c8y_Firmware operations.\n * @param deviceId The ID of the device to find an operation for.\n */\n async getLastFirmwareUpdateOperation(deviceId: string | number): Promise<IOperation> {\n const filters = {\n deviceId,\n dateFrom: new Date(0).toISOString(),\n dateTo: new Date(Date.now()).toISOString(),\n revert: true,\n pageSize: 1\n };\n return this.getFirstMatchingOperation([{ ...filters, fragmentType: 'c8y_Firmware' }]);\n }\n\n /**\n * Gets the last software update operation for given device.\n * Looks for c8y_SoftwareUpdate, c8y_SoftwareList, or c8y_Software operations.\n * @param deviceId The ID of the device to find an operation for.\n */\n async getLastSoftwareUpdateOperation(deviceId: string | number): Promise<IOperation> {\n const filters = {\n deviceId,\n dateFrom: new Date(0).toISOString(),\n dateTo: new Date(Date.now()).toISOString(),\n revert: true,\n pageSize: 1\n };\n return this.getFirstMatchingOperation([\n { ...filters, fragmentType: 'c8y_SoftwareUpdate' },\n { ...filters, fragmentType: 'c8y_SoftwareList' },\n { ...filters, fragmentType: 'c8y_Software' }\n ]);\n }\n\n /**\n * Iterates over the list of filters and queries the operations.\n * If a query returns at least one operation, the first one will be returned.\n * Otherwise the next query will be performed.\n * If none of the queries returns any operation, null will be returned.\n * @param filtersList The list of filters for the queries.\n */\n async getFirstMatchingOperation(filtersList: any[]): Promise<IOperation> {\n let matchingOperation = null;\n\n for (const filters of filtersList) {\n const operations = (await this.operation.list(filters)).data;\n if (operations.length) {\n matchingOperation = operations[0];\n break;\n }\n }\n\n return matchingOperation;\n }\n\n /**\n * Creates the operation and returns an observable to track its progress.\n * Fails the observable when the operation returns FAILED status.\n * Completes the observable when the operation returns SUCCESSFUL status.\n * @param operation The operation to create and track.\n */\n createObservedOperation(operation: IOperation): Observable<IOperation> {\n return from(this.operation.create(operation)).pipe(\n map(({ data }) => data),\n take(1),\n switchMap(createdOperation => this.observeOperation(createdOperation))\n );\n }\n\n /**\n * Returns an observable to track progress of given operation.\n * Fails the observable when the operation returns FAILED status.\n * Completes the observable when the operation returns SUCCESSFUL status.\n * @param operation The operation to be observed.\n */\n observeOperation(operation: IOperation): Observable<IOperation> {\n const observedOperation$ = of(operation);\n const operationUpdates$ = observedOperation$.pipe(\n switchMap(observedOperation => this.operationRealtime.onAll$(observedOperation.deviceId)),\n map(({ data }) => data as IOperation),\n withLatestFrom(observedOperation$),\n filter(([operationUpdate, observedOperation]) => operationUpdate.id === observedOperation.id),\n switchMap(([operationUpdate]) => {\n if (operationUpdate.status === OperationStatus.FAILED) {\n return throwError(operationUpdate);\n }\n return of(operationUpdate);\n }),\n takeWhile(operationUpdate => operationUpdate.status !== OperationStatus.SUCCESSFUL, true)\n );\n return merge(observedOperation$, operationUpdates$);\n }\n\n /**\n * Gets a single event with latest creationTime for the given device Id and event type.\n * @param deviceId The device Id for which the events should be queried.\n * @param type Event type.\n */\n async getLatestConfigurationEvent(\n deviceId: string | number,\n type: string\n ): Promise<IEvent | undefined> {\n const eventFilter: object = {\n source: deviceId,\n type,\n dateFrom: this.dateFrom.toISOString(),\n dateTo: this.dateTo.toISOString(),\n pageSize: 1\n };\n\n const { data } = await this.event.list(eventFilter);\n return data[0];\n }\n\n /**\n * Gets a list of operations for the given device Id, and operation type.\n * @param deviceId The device Id for which the operation should be queried.\n * @param operationType Operation type fragment.\n */\n async getConfigFileOperationList(\n deviceId: string | number,\n operationType: string\n ): Promise<IOperation[]> {\n const operationFilter: object = {\n deviceId,\n fragmentType: operationType,\n dateFrom: this.dateFrom.toISOString(),\n dateTo: this.dateTo.toISOString(),\n revert: true,\n pageSize: 2000\n };\n\n return (await this.operation.list(operationFilter)).data;\n }\n\n /**\n * Gets latest uploaded configuration snapshot for the given device, and configuration type.\n * @param device The device for which the configuration snapshot was uploaded.\n * @param configurationType Selected configuration type.\n */\n async getConfigSnapshot(\n device: IManagedObject,\n configurationType: string\n ): Promise<ConfigurationSnapshot | undefined> {\n const event: IEvent = await this.getLatestConfigurationEvent(device.id, configurationType);\n let configSnapshot: ConfigurationSnapshot;\n if (event) {\n configSnapshot = {\n time: event.time,\n name: event.text,\n deviceType: device.type,\n configurationType\n };\n try {\n configSnapshot.binary = await (await this.eventBinary.download(event)).text();\n if (event.c8y_IsBinary) {\n configSnapshot.binaryType = event.c8y_IsBinary.type;\n }\n } catch (ex) {\n const msg = gettext('Could not get the binary.');\n this.alert.danger(msg);\n }\n }\n return configSnapshot;\n }\n\n async getLegacyConfigSnapshot(deviceId) {\n let configSnapshot: ConfigurationSnapshot;\n let mo;\n const device = (await this.inventory.detail(deviceId, { withChildren: false })).data;\n const snapshotId = device.c8y_ConfigurationDump && device.c8y_ConfigurationDump.id;\n if (!snapshotId) {\n return;\n }\n\n try {\n mo = (await this.inventory.detail(snapshotId)).data;\n } catch (ex) {\n // do nothing\n }\n if (mo) {\n configSnapshot = {\n time: mo.creationTime,\n name: mo.name\n };\n configSnapshot.binary = await this.getBinaryText(mo.url, { allowExternal: false });\n }\n return configSnapshot;\n }\n\n /**\n * Returns a binary object as text.\n * @param binaryUrl The URL to find binary\n * @param options The object with additional options:\n * - **allowExternal** - `boolean` - allows downloading external binary file\n * - **noAlerts** - `boolean` - do not display an alert message; defaults to `false`\n */\n async getBinaryText(\n binaryUrl: string,\n options: { allowExternal: boolean; noAlerts?: boolean }\n ): Promise<string> {\n const binaryId = this.inventoryBinary.getIdFromUrl(binaryUrl);\n let res;\n if (!binaryId && options.allowExternal) {\n res = await this.getExternalBinaryResponse(binaryUrl, options);\n } else {\n res = await this.getInternalBinaryResponse(binaryId, options);\n }\n if (!res) {\n return null;\n }\n return res.text();\n }\n\n /**\n * Returns a binary object as File.\n * @param binaryUrl The URL to find binary\n * @param options The object with additional options:\n * - **allowExternal** - `boolean` - allows downloading external binary file\n */\n async getBinaryFile(binaryUrl: string, options: { allowExternal: boolean }): Promise<File> {\n const binaryId = this.inventoryBinary.getIdFromUrl(binaryUrl);\n if (!binaryId && !options.allowExternal) {\n return null;\n }\n // @TODO: note that it doesn't solve issue with external binary here, such url won't have binaryId, so we won't know the name or contentType to use in File constructor, let's add a @FIXME comment for now?\n const { name, contentType } = (await this.inventory.detail(binaryId)).data;\n const res = !!binaryId\n ? await this.getInternalBinaryResponse(binaryId)\n : await this.getExternalBinaryResponse(binaryUrl);\n const arrayBuffer = await res.arrayBuffer();\n return new File([arrayBuffer], name, { type: contentType });\n }\n\n /**\n * Gets the last configuration update operation for given device.\n * Looks for c8y_Configuration and c8y_SendConfiguration operations.\n * @param deviceId The ID of the device to find an operation for.\n */\n async getLastConfigUpdateOperation(deviceId: string | number): Promise<IOperation> {\n const filters = {\n deviceId,\n dateFrom: new Date(0).toISOString(),\n dateTo: new Date(Date.now()).toISOString(),\n revert: true,\n pageSize: 1\n };\n return this.getFirstMatchingOperation([\n { ...filters, fragmentType: 'c8y_Configuration' },\n { ...filters, fragmentType: 'c8y_SendConfiguration' }\n ]);\n }\n\n /**\n * Prepares a configuration download operation for given device and its current configuration.\n * Supports c8y_SendConfiguration operation.\n * @param device The device for which operation should be prepared.\n */\n createTextBasedConfigurationReloadOperation(device: IManagedObject): IOperation {\n return {\n deviceId: device.id,\n description: gettext('Requested current configuration'),\n c8y_SendConfiguration: {}\n };\n }\n\n /**\n * Prepares a configuration update operation for the given device.\n * Supports c8y_Configuration operation.\n * @param device The device for which operation should be prepared.\n * @param config The configuration which will update the existing one.\n */\n createTextBasedConfigurationUpdateOperation(device: IManagedObject, config: string): IOperation {\n return {\n deviceId: device.id,\n description: gettext('Configuration update'),\n c8y_Configuration: {\n config\n }\n };\n }\n\n async getBinary(binaryId: IdReference): Promise<IFetchResponse> {\n try {\n return await this.inventoryBinary.download(binaryId);\n } catch (ex) {\n const msg = gettext('Could not get the binary.');\n this.alert.danger(msg);\n }\n }\n\n /**\n * Gets all available snapshots from the repository for the given device.\n * @param device The device for which the snapshots should be prepared.\n * @param configurationType Selected configuration type.\n */\n async getSnapshotsFromRepository(device, configurationType) {\n const searchQuery = this.getConfigurationTypeQuery(device, configurationType);\n const res = await this.listRepositoryEntries(RepositoryType.CONFIGURATION, {\n query: searchQuery,\n params: { pageSize: 100 }\n });\n return res.data;\n }\n\n /**\n * Returns a binary object.\n * @param binaryId binary ID\n * @param options The object with additional options:\n * - **noAlerts** - `boolean` - do not display an alert message; defaults to `false`\n */\n private async getInternalBinaryResponse(\n binaryId: IdReference,\n options: { noAlerts?: boolean } = {}\n ): Promise<IFetchResponse> {\n let res;\n try {\n res = await this.inventoryBinary.download(binaryId);\n } catch (ex) {\n if (!options.noAlerts) {\n const msg = gettext('Could not get the binary.');\n this.alert.danger(msg);\n }\n }\n return res;\n }\n\n /**\n * Returns a binary object.\n * @param binaryUrl The URL to find binary\n * @param options The object with additional options:\n * - **noAlerts** - `boolean` - do not display an alert message; defaults to `false`\n */\n private async getExternalBinaryResponse(\n binaryUrl: string,\n options: { noAlerts?: boolean } = {}\n ): Promise<IFetchResponse> {\n let res;\n try {\n const fetchRes = await fetch(binaryUrl);\n if (fetchRes.status >= 400) {\n throw res;\n }\n res = fetchRes;\n } catch {\n if (!options.noAlerts) {\n const msg = gettext('Could not get the external binary');\n this.alert.danger(msg);\n }\n }\n return res;\n }\n\n private async createEntry(mo: Partial<IManagedObject>) {\n const binaryId = await this.inventoryBinary.getIdFromUrl(mo.url);\n const newMo = await this.inventory.create(mo);\n if (binaryId) {\n await this.inventory.childAdditionsAdd(binaryId, newMo.data);\n }\n return newMo;\n }\n\n private async updateEntry(mo: Partial<IManagedObject>, url) {\n const existingBinaryId = await this.inventoryBinary.getIdFromUrl(url);\n const newBinaryId = await this.inventoryBinary.getIdFromUrl(mo.url);\n if (existingBinaryId && existingBinaryId !== newBinaryId) {\n const id = this.inventoryBinary.getIdFromUrl(url);\n await this.inventoryBinary.delete(id);\n }\n if (newBinaryId) {\n await this.inventory.childAdditionsAdd(newBinaryId, mo);\n }\n return this.inventory.update(mo);\n }\n\n private getBaseVersionResultListForLegacyEntry(entry) {\n return Promise.resolve({\n res: {} as IFetchResponse,\n data: [\n {\n ...entry,\n [entry.type]: {\n version: entry.version,\n url: entry.url\n }\n }\n ]\n } as IResultList<IManagedObject>);\n }\n\n private getDeviceSoftwareChangesFromSoftwareListOperation(\n operation: IOperation,\n device: IManagedObject\n ): DeviceSoftwareChange[] {\n const changes: DeviceSoftwareChange[] = [];\n forEach(device.c8y_SoftwareList, deviceSoftware => {\n const operationSoftware = find(operation.c8y_SoftwareList, { name: deviceSoftware.name });\n if (\n (operationSoftware && operationSoftware.version) !==\n (deviceSoftware && deviceSoftware.version)\n ) {\n changes.push({\n ...deviceSoftware,\n action: 'delete'\n } as DeviceSoftwareChange);\n }\n });\n forEach(operation.c8y_SoftwareList, operationSoftware => {\n const deviceSoftware = find(device.c8y_SoftwareList, { name: operationSoftware.name });\n if (\n (operationSoftware && operationSoftware.version) !==\n (deviceSoftware && deviceSoftware.version)\n ) {\n changes.push({\n ...operationSoftware,\n action: 'install'\n } as DeviceSoftwareChange);\n }\n });\n return changes;\n }\n\n private getDeviceSoftwareChangesFromSoftwareOperation(\n operation: IOperation,\n device: IManagedObject\n ): DeviceSoftwareChange[] {\n const changes: DeviceSoftwareChange[] = [];\n forEach(device.c8y_Software, (deviceSoftwareVersion, deviceSoftwareName) => {\n if (operation.c8y_Software[deviceSoftwareName] !== deviceSoftwareVersion) {\n changes.push({\n name: deviceSoftwareName,\n version: deviceSoftwareVersion,\n action: 'delete'\n } as DeviceSoftwareChange);\n }\n });\n forEach(operation.c8y_Software, (operationSoftwareVersion, operationSoftwareName) => {\n const deviceSoftwareVersion =\n device.c8y_Software && device.c8y_Software[operationSoftwareName];\n if (deviceSoftwareVersion !== operationSoftwareVersion) {\n changes.push({\n name: operationSoftwareName,\n version: operationSoftwareVersion,\n action: 'install'\n } as DeviceSoftwareChange);\n }\n });\n return changes;\n }\n}\n","import { Component, Output, EventEmitter, ViewChild } from '@angular/core';\nimport { NgForm } from '@angular/forms';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { RepositoryService } from '../repository.service';\nimport { RepositoryType, ModalModel, RepositoryCategory } from '../repository.model';\nimport { AlertService, gettext } from '@c8y/ngx-components';\nimport { isUndefined, get, assign } from 'lodash-es';\nimport { BehaviorSubject, Subscription, from } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, tap, switchMap } from 'rxjs/operators';\nimport { PickedFiles } from '@c8y/ngx-components';\nimport { IManagedObject } from '@c8y/client';\n\n@Component({\n selector: 'c8y-add-firmware-software-modal',\n templateUrl: 'add-firmware-modal.component.html'\n})\nexport class AddFirmwareModalComponent {\n @ViewChild('firmwareForm', { static: false }) form: NgForm;\n @Output() saved: EventEmitter<RepositoryCategory> = new EventEmitter<RepositoryCategory>();\n onInput: BehaviorSubject<string> = new BehaviorSubject<string>('');\n model: ModalModel = {\n selected: undefined,\n version: undefined,\n description: undefined,\n deviceType: undefined,\n binary: {\n file: undefined,\n url: undefined\n }\n };\n firmwaresResult;\n saving = false;\n firmwarePreselected: boolean = false;\n textForFirmwareUrlPopover: string = gettext(`Path for binaries can vary depending on device agent implementation, e.g.:\n /firmware/binaries/firmware1.bin\n https://firmware/binary/123\n ftp://firmware/binary/123.tar.gz\n `);\n private inputSubscription$: Subscription;\n\n constructor(\n private modal: BsModalRef,\n private repositoryService: RepositoryService,\n private alert: AlertService\n ) {}\n\n ngOnInit() {\n this.setInitialState();\n this.loadFirmwares();\n }\n\n setInitialState() {\n if (this.model.selected) {\n this.firmwarePreselected = true;\n }\n }\n\n loadFirmwares() {\n this.inputSubscription$ = this.onInput\n .pipe(\n tap(() => {\n if (!this.firmwarePreselected) {\n this.model.description = null;\n if (this.form) {\n this.form.form.get('description').reset();\n }\n }\n }),\n debounceTime(300),\n distinctUntilChanged(),\n switchMap(searchStr => this.getFirmwareResult(searchStr))\n )\n .subscribe(result => {\n this.firmwaresResult = result;\n });\n }\n\n getFirmwareResult(searchStr: string) {\n return from(\n this.repositoryService.listRepositoryEntries(RepositoryType.FIRMWARE, {\n partialName: searchStr,\n skipLegacy: true\n })\n );\n }\n\n async save() {\n this.saving = true;\n this.repositoryService\n .create(this.model, RepositoryType.FIRMWARE)\n .then(savedFirmware => {\n this.successMsg();\n this.saving = false;\n this.saved.next(savedFirmware);\n this.cancel();\n })\n .catch(e => {\n this.saving = false;\n this.saved.error(e);\n this.cancel();\n });\n }\n\n successMsg() {\n const msg = gettext('Firmware added.');\n this.alert.success(msg);\n }\n\n cancel() {\n this.modal.hide();\n this.saved.complete();\n }\n\n ngOnDestroy() {\n this.inputSubscription$.unsubscribe();\n }\n\n onFile(dropped: PickedFiles) {\n if (!isUndefined(dropped.url)) {\n this.model.binary = {\n url: dropped.url\n };\n return;\n } else if (!isUndefined(dropped.droppedFiles)) {\n this.model.binary = {\n file: dropped.droppedFiles[0].file\n };\n return;\n } else {\n this.model.binary = {\n file: undefined,\n url: undefined\n };\n }\n }\n\n onFirmwareSelect(firmware: IManagedObject) {\n assign(this.model, {\n selected: firmware,\n description: firmware.description,\n deviceType: get(firmware, 'c8y_Filter.type')\n });\n }\n}\n","import { Component, ViewChild, Output, EventEmitter } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { RepositoryService } from '../repository.service';\nimport { RepositoryType, ModalModel, RepositoryCategory } from '../repository.model';\nimport { AlertService, gettext } from '@c8y/ngx-components';\nimport { IManagedObject, IResultList } from '@c8y/client';\nimport { isUndefined } from 'lodash-es';\nimport { BehaviorSubject, of, from, pipe, merge, Observable } from 'rxjs';\nimport { BsDropdownDirective } from 'ngx-bootstrap/dropdown';\nimport { NgForm } from '@angular/forms';\nimport {\n debounceTime,\n tap,\n switchMap,\n distinctUntilChanged,\n shareReplay,\n map\n} from 'rxjs/operators';\nimport { PickedFiles } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-add-firmware-patch-modal.component',\n templateUrl: 'add-firmware-patch-modal.component.html'\n})\nexport class AddFirmwarePatchModalComponent {\n @Output() saved: EventEmitter<RepositoryCategory> = new EventEmitter<RepositoryCategory>();\n\n @ViewChild('dropdown', { static: false }) dropdown: BsDropdownDirective;\n @ViewChild('firmwarePatchForm', { static: false }) form: NgForm;\n textForFirmwareUrlPopover: string = gettext(`Path for binaries can vary depending on device agent implementation, e.g.:\n /firmware/binaries/firmware1.bin\n https://firmware/binary/123\n ftp://firmware/binary/123.tar.gz\n `);\n\n model: ModalModel = {\n selected: undefined,\n dependency: null,\n patchVersion: undefined,\n binary: {\n file: undefined,\n url: undefined\n }\n };\n\n firmwareInput$ = new BehaviorSubject<string>('');\n firmwares$: Observable<IResultList<IManagedObject>> = this.firmwareInput$.pipe(\n debounceTime(300),\n distinctUntilChanged(),\n switchMap(searchStr =>\n from(\n this.repository.listRepositoryEntries(RepositoryType.FIRMWARE, {\n partialName: searchStr,\n skipLegacy: true\n })\n )\n ),\n shareReplay(1)\n );\n firmwareSelected$ = new BehaviorSubject<Partial<RepositoryCategory>>(null);\n patchDependencyInput$ = new BehaviorSubject<string>('');\n\n saving = false;\n firmwarePreselected: boolean = false;\n baseVersions$: Observable<IResultList<IManagedObject>> = merge(\n this.firmwareInput$.pipe(\n tap(() => {\n this.model.dependency = null;\n if (this.form) {\n this.form.form.get('patchDependency').reset();\n }\n }),\n switchMap(() => of(null))\n ),\n this.firmwareSelected$\n ).pipe(\n switchMap(selectedFirmware =>\n selectedFirmware ? this.repository.listBaseVersions(selectedFirmware) : of(null)\n ),\n shareReplay(1)\n );\n baseVersionsFilterPipe = pipe(\n switchMap((data: []) =>\n this.patchDependencyInput$.pipe(\n map(partialVersion =>\n data.filter((mo: any) => {\n const version = mo.c8y_Firmware.version.toLowerCase();\n return (\n partialVersion.length === 0 || version.indexOf(partialVersion.toLowerCase()) > -1\n );\n })\n )\n )\n )\n );\n\n constructor(\n private modal: BsModalRef,\n private repository: RepositoryService,\n private alert: AlertService\n ) {}\n\n async ngOnInit() {\n this.setInitialState();\n }\n\n setInitialState() {\n if (this.model.selected) {\n this.firmwarePreselected = true;\n this.firmwareSelected$.next(this.model.selected);\n }\n }\n\n async save() {\n this.saving = true;\n this.repository\n .create(this.model, RepositoryType.FIRMWARE)\n .then(savedFirmware => {\n this.successMsg();\n this.saving = false;\n this.saved.next(savedFirmware);\n this.cancel();\n })\n .catch(e => {\n this.saving = false;\n this.saved.error(e);\n this.cancel();\n });\n }\n\n successMsg() {\n const msg = gettext('Firmware patch added.');\n this.alert.success(msg);\n }\n\n cancel() {\n this.modal.hide();\n this.saved.complete();\n }\n\n onFile(dropped: PickedFiles) {\n if (!isUndefined(dropped.url)) {\n this.model.binary = {\n url: dropped.url\n };\n return;\n } else if (!isUndefined(dropped.droppedFiles)) {\n this.model.binary = {\n file: dropped.droppedFiles[0].file\n };\n return;\n } else {\n this.model.binary = {\n file: undefined,\n url: undefined\n };\n }\n }\n}\n","import { Router, ActivatedRoute } from '@angular/router';\nimport { Component } from '@angular/core';\nimport { BsModalService, ModalOptions } from 'ngx-bootstrap/modal';\nimport { TranslateService } from '@ngx-translate/core';\nimport {\n distinctUntilChanged,\n tap,\n debounceTime,\n switchMap,\n shareReplay,\n map,\n pluck\n} from 'rxjs/operators';\nimport { Observable, BehaviorSubject, combineLatest, from } from 'rxjs';\nimport { IResultList, IManagedObject } from '@c8y/client';\nimport { ModalService, gettext, Status, AlertService, memoize } from '@c8y/ngx-components';\nimport { RepositoryService } from '../repository.service';\nimport { RepositoryType } from '../repository.model';\nimport { AddFirmwareModalComponent } from './add-firmware-modal.component';\nimport { AddFirmwarePatchModalComponent } from './add-firmware-patch-modal.component';\nimport { property, get } from 'lodash-es';\n\n@Component({\n selector: 'c8y-firmware-list',\n templateUrl: 'firmware-list.component.html'\n})\nexport class FirmwareListComponent {\n textFilter$: BehaviorSubject<string> = new BehaviorSubject('');\n reload$: BehaviorSubject<void> = new BehaviorSubject(null);\n reloading: boolean = false;\n firmwares$: Observable<IResultList<IManagedObject>> = combineLatest(\n this.textFilter$.pipe(\n debounceTime(400),\n distinctUntilChanged()\n ),\n this.reload$\n ).pipe(\n tap(() => {\n this.reloading = true;\n }),\n switchMap(([text]) => this.getFirmwares(text)),\n tap(() => {\n this.reloading = false;\n }),\n shareReplay(1)\n );\n canAddFirmwarePatch$: Observable<boolean> = from(\n this.repositoryService.listRepositoryEntries(RepositoryType.FIRMWARE, { skipLegacy: true })\n ).pipe(map(({ data }) => data.length > 0));\n isLegacy = this.repositoryService.isLegacyEntry.bind(this.repositoryService);\n readonly DEVICE_TYPE_NOT_AVAILABLE: string = gettext('No device type available');\n\n constructor(\n private repositoryService: RepositoryService,\n private modalService: ModalService,\n private bsModalService: BsModalService,\n private translateService: TranslateService,\n private alertService: AlertService,\n private router: Router,\n private activatedRoute: ActivatedRoute\n ) {}\n\n getFirmwares(partialText?: string) {\n const properties: string[] = ['name', 'description', 'c8y_Filter.type'];\n const partialTextFilter = { partialText, properties };\n return this.repositoryService.listRepositoryEntries(RepositoryType.FIRMWARE, {\n partialTextFilter\n });\n }\n\n addFirmware() {\n const config: ModalOptions<AddFirmwareModalComponent> = { class: 'modal-sm', ignoreBackdropClick: true };\n const modalRef = this.bsModalService.show(AddFirmwareModalComponent, config);\n modalRef.content.saved.subscribe(savedFirmware => this.editFirmware(savedFirmware));\n }\n\n addFirmwarePatch() {\n const config: ModalOptions<AddFirmwarePatchModalComponent> = { class: 'modal-sm', ignoreBackdropClick: true };\n const modalRef = this.bsModalService.show(AddFirmwarePatchModalComponent, config);\n modalRef.content.saved.subscribe(savedFirmware => this.editFirmware(savedFirmware));\n }\n\n editFirmware(firmware: Partial<IManagedObject>) {\n this.router.navigate([firmware.id], { relativeTo: this.activatedRoute });\n }\n\n async deleteFirmware(firmware: IManagedObject) {\n try {\n const title = gettext('Delete firmware');\n const body = `\n ${this.translateService.instant(\n gettext(\n 'You are about to delete firmware \"{{ name }}\" with all its versions and patches.'\n ),\n { name: firmware.name }\n )}\n ${this.translateService.instant(gettext('This operation is irreversible.'))}\n ${this.translateService.instant(gettext('Do you want to proceed?'))}\n `;\n const labels = {\n ok: gettext('Delete')\n };\n await this.modalService.confirm(title, body, Status.DANGER, labels);\n await this.repositoryService.delete(firmware);\n this.alertService.success(gettext('Firmware deleted.'));\n this.reload$.next();\n } catch (ex) {\n // only if not cancel from modal\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n @memoize(property('id'))\n getBaseVersionsCount$(firmware: IManagedObject): Observable<number | string> {\n return this.firmwares$.pipe(\n switchMap(() => this.repositoryService.getBaseVersionsCount$(firmware)),\n shareReplay(1)\n );\n }\n\n getDeviceTypeTitle(firmware: IManagedObject): string {\n return get(\n firmware,\n 'c8y_Filter.type',\n this.translateService.instant(this.DEVICE_TYPE_NOT_AVAILABLE)\n );\n }\n}\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { IManagedObject, InventoryService, IResultList } from '@c8y/client';\nimport { AlertService, gettext, memoize, ModalService, Status } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { property } from 'lodash-es';\nimport { BsModalService, ModalOptions } from 'ngx-bootstrap/modal';\nimport { BehaviorSubject, combineLatest, defer, merge, Observable, Subject } from 'rxjs';\nimport {\n distinctUntilKeyChanged,\n map,\n shareReplay,\n switchMap,\n take,\n takeUntil,\n tap,\n withLatestFrom\n} from 'rxjs/operators';\nimport { FirmwareBinary } from '../repository.model';\nimport { RepositoryService } from './../repository.service';\nimport { AddFirmwareModalComponent } from './add-firmware-modal.component';\nimport { AddFirmwarePatchModalComponent } from './add-firmware-patch-modal.component';\n\n@Component({\n selector: 'c8y-firmware-details',\n templateUrl: './firmware-details.component.html'\n})\nexport class FirmwareDetailsComponent implements OnInit, OnDestroy {\n reload$: Subject<void> = new Subject();\n reloading$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n\n updateFirmware$: Subject<Partial<IManagedObject>> = new Subject();\n firmwareUpdated$: Subject<IManagedObject> = new Subject();\n baseVersionsUpdated$: Subject<void> = new Subject();\n patchVersionsUpdated$: Subject<void> = new Subject();\n\n firmware$: Observable<IManagedObject> = merge(\n this.activatedRoute.params.pipe(\n map(params => params.id),\n switchMap(id => defer(() => this.inventoryService.detail(id).then(result => result.data)))\n ),\n this.reload$.pipe(\n tap(() => this.reloading$.next(true)),\n switchMap(() => this.activatedRoute.params),\n map(params => params.id),\n switchMap(id => defer(() => this.inventoryService.detail(id).then(result => result.data))),\n tap(() => this.reloading$.next(false))\n ),\n this.firmwareUpdated$\n ).pipe(shareReplay(1));\n\n baseVersions$: Observable<IResultList<IManagedObject>> = merge(\n this.firmware$.pipe(distinctUntilKeyChanged('id')),\n this.baseVersionsUpdated$,\n this.patchVersionsUpdated$,\n this.reload$\n ).pipe(\n switchMap(() => this.firmware$),\n switchMap(firmware => this.repositoryService.listBaseVersions(firmware)),\n shareReplay(1)\n );\n\n isLegacy$: Observable<boolean> = this.firmware$.pipe(\n map(firmware => this.repositoryService.isLegacyEntry(firmware)),\n shareReplay(1)\n );\n\n canAddPatchVersions$: Observable<boolean> = combineLatest(\n this.isLegacy$,\n this.baseVersions$.pipe(map(({ data }) => data.length > 0))\n ).pipe(map(([isLegacy, hasBaseVersions]) => !isLegacy && hasBaseVersions));\n\n expanded: { [id: string]: boolean } = {};\n\n destroy$: Subject<boolean> = new Subject<boolean>();\n\n constructor(\n private activatedRoute: ActivatedRoute,\n private inventoryService: InventoryService,\n private repositoryService: RepositoryService,\n private alertService: AlertService,\n private translateService: TranslateService,\n private modalService: ModalService,\n private bsModalService: BsModalService\n ) {}\n\n ngOnInit() {\n this.updateFirmware$\n .pipe(\n withLatestFrom(this.firmware$),\n switchMap(([firmwarePartial, firmware]) =>\n this.inventoryService.update({\n id: firmware.id,\n ...firmwarePartial\n })\n ),\n map(({ data }) => data),\n tap(firmware => this.firmwareUpdated$.next(firmware)),\n tap(() => this.alertService.success(gettext('Saved.'))),\n takeUntil(this.destroy$)\n )\n .subscribe();\n }\n\n @memoize(property('id'))\n getPatchVersionsCount$(baseVersion: FirmwareBinary) {\n return merge(\n this.firmware$.pipe(distinctUntilKeyChanged('id')),\n this.baseVersionsUpdated$,\n this.patchVersionsUpdated$,\n this.reload$\n ).pipe(\n switchMap(() => this.firmware$),\n switchMap(firmware => this.repositoryService.getPatchVersionsCount$(firmware, baseVersion)),\n shareReplay(1)\n );\n }\n\n @memoize()\n getBinaryName$(binaryUrl) {\n return this.repositoryService.getBinaryName$(binaryUrl);\n }\n\n @memoize(property('id'))\n getPatchVersions$(baseVersion) {\n return merge(\n this.firmware$.pipe(distinctUntilKeyChanged('id')),\n this.patchVersionsUpdated$,\n this.reload$\n ).pipe(\n switchMap(() => this.firmware$),\n switchMap(firmware => this.repositoryService.listPatchVersions(firmware, baseVersion)),\n shareReplay(1)\n );\n }\n\n addBaseVersion() {\n this.firmware$\n .pipe(\n take(1),\n switchMap(firmware => {\n const initialState = {\n model: {\n selected: firmware,\n description: firmware.description\n }\n };\n const config: ModalOptions<AddFirmwareModalComponent> = {\n class: 'modal-sm',\n ignoreBackdropClick: true,\n initialState\n };\n const modalRef = this.bsModalService.show(AddFirmwareModalComponent, config);\n return modalRef.content.saved;\n })\n )\n .subscribe(() => this.baseVersionsUpdated$.next());\n }\n\n addPatchVersion() {\n this.firmware$\n .pipe(\n take(1),\n switchMap(firmware => {\n const initialState = {\n model: {\n selected: firmware\n }\n };\n const config: ModalOptions<AddFirmwarePatchModalComponent> = {\n class: 'modal-sm',\n ignoreBackdropClick: true,\n initialState\n };\n const modalRef = this.bsModalService.show(AddFirmwarePatchModalComponent, config);\n return modalRef.content.saved;\n })\n )\n .subscribe(() => this.patchVersionsUpdated$.next());\n }\n\n async deleteBaseVersion(baseVersion: IManagedObject) {\n try {\n const title = gettext('Delete firmware');\n const body = `\n ${this.translateService.instant(\n gettext('You are about to delete firmware {{ version }} with all its patches.'),\n { version: baseVersion.c8y_Firmware.version }\n )}\n ${this.translateService.instant(gettext('This operation is irreversible.'))}\n ${this.translateService.instant(gettext('Do you want to proceed?'))}\n `;\n const labels = {\n ok: gettext('Delete')\n };\n await this.modalService.confirm(title, body, Status.DANGER, labels);\n await this.repositoryService.delete(baseVersion);\n this.alertService.success(gettext('Firmware deleted.'));\n this.baseVersionsUpdated$.next();\n } catch (ex) {\n // only if not cancel from modal\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n async deletePatchVersion(patchVersion: IManagedObject) {\n try {\n const title = gettext('Delete firmware patch');\n const body = `\n ${this.translateService.instant(\n gettext('You are about to delete firmware patch {{ version }}.'),\n { version: patchVersion.c8y_Firmware.version }\n )}\n ${this.translateService.instant(gettext('This operation is irreversible.'))}\n ${this.translateService.instant(gettext('Do you want to proceed?'))}\n `;\n const labels = {\n ok: gettext('Delete')\n };\n await this.modalService.confirm(title, body, Status.DANGER, labels);\n await this.repositoryService.delete(patchVersion);\n this.alertService.success(gettext('Firmware patch deleted.'));\n this.patchVersionsUpdated$.next();\n } catch (ex) {\n // only if not cancel from modal\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next(true);\n this.destroy$.unsubscribe();\n }\n}\n","import { Component, Output, EventEmitter, ViewChild } from '@angular/core';\nimport { NgForm } from '@angular/forms';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { RepositoryService } from '../repository.service';\nimport { RepositoryType, ModalModel, RepositoryCategory } from '../repository.model';\nimport { AlertService, gettext } from '@c8y/ngx-components';\nimport { isUndefined, get, assign } from 'lodash-es';\nimport { BehaviorSubject, Subscription, from } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, tap, switchMap } from 'rxjs/operators';\nimport { PickedFiles } from '@c8y/ngx-components';\nimport { IManagedObject } from '@c8y/client';\n\n@Component({\n selector: 'c8y-add-software-software-modal',\n templateUrl: 'add-software-modal.component.html'\n})\nexport class AddSoftwareModalComponent {\n @ViewChild('softwareForm', { static: false }) form: NgForm;\n @Output() saved: EventEmitter<RepositoryCategory> = new EventEmitter<RepositoryCategory>();\n onInput: BehaviorSubject<string> = new BehaviorSubject<string>('');\n model: ModalModel = {\n selected: undefined,\n version: undefined,\n description: undefined,\n deviceType: undefined,\n binary: {\n file: undefined,\n url: undefined\n }\n };\n softwaresResult;\n saving = false;\n softwarePreselected: boolean = false;\n textForSoftwareUrlPopover: string = gettext(`Path for binaries can vary depending on device agent implementation, e.g.:\n /software/binaries/software1.bin\n https://software/binary/123\n ftp://software/binary/123.tar.gz\n `);\n private inputSubscription$: Subscription;\n\n constructor(\n private modal: BsModalRef,\n private repositoryService: RepositoryService,\n private alert: AlertService\n ) {}\n\n ngOnInit() {\n this.setInitialState();\n this.loadSoftwares();\n }\n\n setInitialState() {\n if (this.model.selected) {\n this.softwarePreselected = true;\n }\n }\n\n loadSoftwares() {\n this.inputSubscription$ = this.onInput\n .pipe(\n tap(() => {\n if (!this.softwarePreselected) {\n this.model.description = null;\n if (this.form) {\n this.form.form.get('description').reset();\n }\n }\n }),\n debounceTime(300),\n distinctUntilChanged(),\n switchMap(searchStr => this.getSoftwareResult(searchStr))\n )\n .subscribe(result => {\n this.softwaresResult = result;\n });\n }\n\n getSoftwareResult(searchStr: string) {\n return from(\n this.repositoryService.listRepositoryEntries(RepositoryType.SOFTWARE, {\n partialName: searchStr,\n skipLegacy: true\n })\n );\n }\n\n async save() {\n this.saving = true;\n this.repositoryService\n .create(this.model, RepositoryType.SOFTWARE)\n .then(savedSoftware => {\n this.successMsg();\n this.saving = false;\n this.saved.next(savedSoftware);\n this.cancel();\n })\n .catch(e => {\n this.saving = false;\n this.saved.error(e);\n this.cancel();\n });\n }\n\n successMsg() {\n const msg = gettext('Software added.');\n this.alert.success(msg);\n }\n\n cancel() {\n this.modal.hide();\n this.saved.complete();\n }\n\n ngOnDestroy() {\n this.inputSubscription$.unsubscribe();\n }\n\n onFile(dropped: PickedFiles) {\n if (!isUndefined(dropped.url)) {\n this.model.binary = {\n url: dropped.url\n };\n return;\n } else if (!isUndefined(dropped.droppedFiles)) {\n this.model.binary = {\n file: dropped.droppedFiles[0].file\n };\n return;\n } else {\n this.model.binary = {\n file: undefined,\n url: undefined\n };\n }\n }\n\n onSoftwareSelect(software: IManagedObject) {\n assign(this.model, {\n selected: software,\n description: software.description,\n deviceType: get(software, 'c8y_Filter.type')\n });\n }\n}\n","import { Router, ActivatedRoute } from '@angular/router';\nimport { Component } from '@angular/core';\nimport { BsModalService, ModalOptions } from 'ngx-bootstrap/modal';\nimport { TranslateService } from '@ngx-translate/core';\nimport {\n distinctUntilChanged,\n tap,\n debounceTime,\n switchMap,\n shareReplay,\n} from 'rxjs/operators';\nimport { Observable, BehaviorSubject, combineLatest } from 'rxjs';\nimport { IResultList, IManagedObject } from '@c8y/client';\nimport { ModalService, gettext, Status, AlertService, memoize } from '@c8y/ngx-components';\nimport { RepositoryService } from '../repository.service';\nimport { RepositoryType } from '../repository.model';\nimport { AddSoftwareModalComponent } from './add-software-modal.component';\nimport { property, get } from 'lodash-es';\n\n@Component({\n selector: 'c8y-software-list',\n templateUrl: 'software-list.component.html'\n})\nexport class SoftwareListComponent {\n textFilter$: BehaviorSubject<string> = new BehaviorSubject('');\n reload$: BehaviorSubject<void> = new BehaviorSubject(null);\n reloading: boolean = false;\n softwares$: Observable<IResultList<IManagedObject>> = combineLatest(\n this.textFilter$.pipe(\n debounceTime(400),\n distinctUntilChanged()\n ),\n this.reload$\n ).pipe(\n tap(() => {\n this.reloading = true;\n }),\n switchMap(([text]) => this.getSoftwares(text)),\n tap(() => {\n this.reloading = false;\n }),\n shareReplay(1)\n );\n isLegacy = this.repositoryService.isLegacyEntry.bind(this.repositoryService);\n readonly DEVICE_TYPE_NOT_AVAILABLE: string = gettext('No device type available');\n\n constructor(\n private repositoryService: RepositoryService,\n private modalService: ModalService,\n private bsModalService: BsModalService,\n private translateService: TranslateService,\n private alertService: AlertService,\n private router: Router,\n private activatedRoute: ActivatedRoute\n ) {}\n\n getSoftwares(partialText?: string) {\n const properties: string[] = ['name', 'description', 'c8y_Filter.type'];\n const partialTextFilter = {partialText, properties};\n return this.repositoryService.listRepositoryEntries(RepositoryType.SOFTWARE, { partialTextFilter });\n }\n\n addSoftware() {\n const config: ModalOptions<AddSoftwareModalComponent> = { class: 'modal-sm', ignoreBackdropClick: true };\n const modalRef = this.bsModalService.show(AddSoftwareModalComponent, config);\n modalRef.content.saved.subscribe(savedSoftware => this.editSoftware(savedSoftware));\n }\n\n editSoftware(software: Partial<IManagedObject>) {\n this.router.navigate([software.id], { relativeTo: this.activatedRoute });\n }\n\n async deleteSoftware(software: IManagedObject) {\n try {\n const title = gettext('Delete software');\n const body = `\n ${this.translateService.instant(\n gettext('You are about to delete software \"{{ name }}\" with all its versions.'),\n { name: software.name }\n )}\n ${this.translateService.instant(gettext('This operation is irreversible.'))}\n ${this.translateService.instant(gettext('Do you want to proceed?'))}\n `;\n const labels = {\n ok: gettext('Delete')\n };\n await this.modalService.confirm(title, body, Status.DANGER, labels);\n await this.repositoryService.delete(software);\n this.alertService.success(gettext('Software deleted.'));\n this.reload$.next();\n } catch (ex) {\n // only if not cancel from modal\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n @memoize(property('id'))\n getBaseVersionsCount$(software: IManagedObject): Observable<number | string> {\n return this.softwares$.pipe(\n switchMap(() => this.repositoryService.getBaseVersionsCount$(software)),\n shareReplay(1)\n );\n }\n\n getDeviceTypeTitle(software: IManagedObject): string {\n return get(\n software,\n 'c8y_Filter.type',\n this.translateService.instant(this.DEVICE_TYPE_NOT_AVAILABLE));\n }\n}\n","import { Component, OnDestroy, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { IManagedObject, InventoryService, IResultList } from '@c8y/client';\nimport { AlertService, gettext, memoize, ModalService, Status } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BsModalService, ModalOptions } from 'ngx-bootstrap/modal';\nimport { BehaviorSubject, from, merge, Observable, Subject } from 'rxjs';\nimport {\n distinctUntilKeyChanged,\n map,\n shareReplay,\n switchMap,\n take,\n takeUntil,\n tap,\n withLatestFrom\n} from 'rxjs/operators';\nimport { RepositoryService } from '../repository.service';\nimport { AddSoftwareModalComponent } from './add-software-modal.component';\n\n@Component({\n selector: 'c8y-software-details',\n templateUrl: './software-details.component.html'\n})\nexport class SoftwareDetailsComponent implements OnInit, OnDestroy {\n reload$: Subject<void> = new Subject();\n reloading$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n\n updateSoftware$: Subject<Partial<IManagedObject>> = new Subject();\n softwareUpdated$: Subject<IManagedObject> = new Subject();\n baseVersionsUpdated$: Subject<void> = new Subject();\n\n software$: Observable<IManagedObject> = merge(\n this.activatedRoute.params.pipe(\n map(params => params.id),\n switchMap(id => from(this.inventoryService.detail(id).then(result => result.data)))\n ),\n this.reload$.pipe(\n tap(() => this.reloading$.next(true)),\n switchMap(() => this.activatedRoute.params),\n map(params => params.id),\n switchMap(id => from(this.inventoryService.detail(id).then(result => result.data))),\n tap(() => this.reloading$.next(false))\n ),\n this.softwareUpdated$\n ).pipe(shareReplay(1));\n\n baseVersions$: Observable<IResultList<IManagedObject>> = merge(\n this.software$.pipe(distinctUntilKeyChanged('id')),\n this.baseVersionsUpdated$,\n this.reload$\n ).pipe(\n switchMap(() => this.software$),\n switchMap(software => this.repositoryService.listBaseVersions(software)),\n shareReplay(1)\n );\n\n isLegacy$: Observable<boolean> = this.software$.pipe(\n map(software => this.repositoryService.isLegacyEntry(software)),\n shareReplay(1)\n );\n\n destroy$: Subject<boolean> = new Subject<boolean>();\n\n constructor(\n private activatedRoute: ActivatedRoute,\n private inventoryService: InventoryService,\n private repositoryService: RepositoryService,\n private alertService: AlertService,\n private translateService: TranslateService,\n private modalService: ModalService,\n private bsModalService: BsModalService\n ) {}\n\n ngOnInit() {\n this.updateSoftware$\n .pipe(\n withLatestFrom(this.software$),\n switchMap(([softwarePartial, software]) =>\n this.inventoryService.update({\n id: software.id,\n ...softwarePartial\n })\n ),\n map(({ data }) => data),\n tap(software => this.softwareUpdated$.next(software)),\n tap(() => this.alertService.success(gettext('Saved.'))),\n takeUntil(this.destroy$)\n )\n .subscribe();\n }\n\n @memoize()\n getBinaryName$(binaryUrl) {\n return this.repositoryService.getBinaryName$(binaryUrl);\n }\n\n addBaseVersion() {\n this.software$\n .pipe(\n take(1),\n switchMap(software => {\n const initialState = {\n model: {\n selected: software,\n description: software.description\n }\n };\n const config: ModalOptions<AddSoftwareModalComponent> = {\n class: 'modal-sm',\n ignoreBackdropClick: true,\n initialState\n };\n const modalRef = this.bsModalService.show(AddSoftwareModalComponent, config);\n return modalRef.content.saved;\n })\n )\n .subscribe(() => this.baseVersionsUpdated$.next());\n }\n\n async deleteBaseVersion(baseVersion: IManagedObject) {\n try {\n const title = gettext('Delete software');\n const body = `\n ${this.translateService.instant(\n gettext('You are about to delete software {{ version }}.'),\n { version: baseVersion.c8y_Software.version }\n )}\n ${this.translateService.instant(gettext('This operation is irreversible.'))}\n ${this.translateService.instant(gettext('Do you want to proceed?'))}\n `;\n const labels = {\n ok: gettext('Delete')\n };\n await this.modalService.confirm(title, body, Status.DANGER, labels);\n await this.repositoryService.delete(baseVersion);\n this.alertService.success(gettext('Software deleted.'));\n this.baseVersionsUpdated$.next();\n } catch (ex) {\n // only if not cancel from modal\n if (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next(true);\n this.destroy$.unsubscribe();\n }\n}\n","import { Component, ViewChild } from '@angular/core';\nimport { IManagedObject } from '@c8y/client';\nimport { AlertService, gettext } from '@c8y/ngx-components';\nimport { uniqBy, isUndefined } from 'lodash-es';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { pipe } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { ModalModel, RepositoryType } from '../repository.model';\nimport { RepositoryService } from '../repository.service';\nimport { PickedFiles } from '@c8y/ngx-components';\nimport { NgForm } from '@angular/forms';\n\n@Component({\n selector: 'c8y-configuration-detail',\n templateUrl: './configuration-detail.component.html'\n})\nexport class ConfigurationDetailComponent implements ModalModel {\n @ViewChild('configurationForm', { static: true }) configurationForm: NgForm;\n selected: { id: string; name: string };\n version: string;\n description: string;\n binary: { file?: File; url?: string } = {\n file: undefined,\n url: undefined\n };\n deviceType: string;\n\n pattern: string = '';\n filterPipe;\n configs;\n mo: Partial<IManagedObject> = {};\n saving = false;\n uploadChoice: 'uploadBinary' | 'uploadUrl' = 'uploadBinary';\n existingBinary: File;\n submitButtonTitle: string;\n\n result: Promise<void> = new Promise((resolve, reject) => {\n this._save = resolve;\n this._cancel = reject;\n });\n\n private _save;\n private _cancel;\n\n constructor(\n private repositoryService: RepositoryService,\n private bsModalRef: BsModalRef,\n private alert: AlertService\n ) {}\n\n async ngOnInit() {\n this.configs = await this.repositoryService.listRepositoryEntries(RepositoryType.CONFIGURATION);\n if (this.selected) {\n this.uploadChoice = this.binary.file ? 'uploadBinary' : 'uploadUrl';\n this.existingBinary = this.binary.file;\n }\n this.setPipe('');\n this.submitButtonTitle = this.mo.id\n ? gettext('Update configuration')\n : gettext('Add configuration');\n }\n\n cancel() {\n this.bsModalRef.hide();\n this._cancel();\n }\n\n setPipe(filterStr: string) {\n this.pattern = filterStr;\n this.filterPipe = pipe(\n map((data: []) => uniqBy(data, 'configurationType')),\n map((data: []) => {\n return data.filter(\n (mo: any) =>\n mo.configurationType &&\n mo.configurationType.toLowerCase().indexOf(filterStr.toLowerCase()) > -1\n );\n })\n );\n }\n\n onFile(dropped: PickedFiles) {\n this.configurationForm.form.markAsDirty();\n if (!isUndefined(dropped.url)) {\n this.binary = {\n url: dropped.url\n };\n return;\n } else if (!isUndefined(dropped.droppedFiles)) {\n this.binary = {\n file: dropped.droppedFiles[0].file\n };\n return;\n } else {\n this.binary = {\n file: undefined,\n url: undefined\n };\n }\n }\n\n async save() {\n try {\n this.saving = true;\n const { selected, version, description, binary, deviceType } = this;\n if (this.existingBinary === this.binary.file) {\n binary.file = undefined;\n }\n await this.repositoryService.save(\n { selected, version, description, binary, deviceType },\n RepositoryType.CONFIGURATION,\n this.mo\n );\n this.alert.success(\n this.mo.id ? gettext('Configuration updated.') : gettext('Configuration created.')\n );\n this.bsModalRef.hide();\n this._save();\n } catch (ex) {\n this.alert.addServerFailure(ex);\n this._cancel();\n } finally {\n this.saving = false;\n }\n }\n}\n","import { Component, OnInit, Pipe, ViewChild } from '@angular/core';\nimport {IManagedObject, InventoryBinaryService, InventoryService, IResultList} from '@c8y/client';\nimport {\n AlertService,\n FilterInputComponent,\n gettext, memoize,\n ModalService,\n Status\n} from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { Observable, of, pipe } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { RepositoryType } from '../repository.model';\nimport { RepositoryService } from '../repository.service';\nimport { ConfigurationDetailComponent } from './configuration-detail.component';\nimport { property } from 'lodash-es';\nimport { saveAs } from 'file-saver';\n\n@Component({\n selector: 'c8y-configuration-list',\n templateUrl: './configuration-list.component.html'\n})\nexport class ConfigurationListComponent implements OnInit {\n @ViewChild(FilterInputComponent, { static: false }) filter: FilterInputComponent;\n configurations$: Observable<IResultList<IManagedObject>>;\n filterPipe: Pipe;\n filterTerm = '';\n reloading: boolean = false;\n data;\n private readonly DELETED_SUCCESS_MSG = gettext('Configuration deleted.');\n\n constructor(\n private alert: AlertService,\n private repositoryService: RepositoryService,\n private bsModalService: BsModalService,\n private modalService: ModalService,\n private translateService: TranslateService,\n private inventoryBinaryService: InventoryBinaryService,\n private inventoryService: InventoryService\n ) {}\n\n ngOnInit() {\n this.loadConfigurations();\n }\n\n async loadConfigurations() {\n this.reloading = true;\n this.configurations$ = of(\n await this.repositoryService.listRepositoryEntries(RepositoryType.CONFIGURATION)\n );\n this.reloading = false;\n this.reset();\n }\n\n async add() {\n try {\n await (this.bsModalService.show(ConfigurationDetailComponent, {\n class: 'modal-sm',\n ignoreBackdropClick: true\n }).content as ConfigurationDetailComponent).result;\n await this.loadConfigurations();\n } catch (ex) {\n // intended empty\n }\n }\n\n async edit(configuration: IManagedObject) {\n const fileBinary: File = await this.repositoryService.getBinaryFile(configuration.url, {\n allowExternal: false\n });\n try {\n const modal = this.bsModalService.show(ConfigurationDetailComponent, {\n class: 'modal-sm',\n ignoreBackdropClick: true,\n initialState: {\n selected: { id: configuration.id, name: configuration.configurationType },\n version: configuration.name,\n deviceType: configuration.deviceType,\n description: configuration.description,\n binary: { file: fileBinary, url: configuration.url }\n }\n }).content as ConfigurationDetailComponent;\n modal.mo = configuration;\n await modal.result;\n await this.loadConfigurations();\n } catch (ex) {\n // intended empty\n }\n }\n\n isBinaryFile(configuration: IManagedObject) {\n const id: string = this.inventoryBinaryService.getIdFromUrl(configuration.url);\n return id ? true : false;\n }\n\n @memoize(property('id'))\n getBinaryName(configuration: IManagedObject) {\n return this.repositoryService.getBinaryName$(configuration.url);\n }\n\n async download(configuration: IManagedObject) {\n const fileBinary: File = await this.repositoryService.getBinaryFile(configuration.url, {\n allowExternal: false\n });\n saveAs(fileBinary);\n }\n\n async delete(configuration: IManagedObject) {\n try {\n const title = gettext('Delete configuration snapshot');\n const confirmationText = gettext(\n 'You are about to delete the configuration snapshot {{ name }}.'\n );\n const hint = gettext('This operation is irreversible.');\n const proceed = gettext('Do you want to proceed?');\n const body = [\n this.translateService.instant(confirmationText, {\n name: configuration.name\n }),\n this.translateService.instant(hint),\n this.translateService.instant(proceed)\n ].join(' ');\n const labels = {\n ok: gettext('Delete')\n };\n await this.modalService.confirm(title, body, Status.DANGER, labels);\n await this.repositoryService.delete(configuration);\n this.alert.success(this.DELETED_SUCCESS_MSG);\n await this.loadConfigurations();\n } catch (ex) {\n if (ex) {\n this.alert.addServerFailure(ex);\n }\n }\n }\n\n setPipe(filterTerm: string) {\n this.filterTerm = filterTerm;\n this.filterPipe = pipe(\n map((data: []) => {\n this.data =\n filterTerm.trim().length === 0\n ? data\n : data.filter(\n (mo: IManagedObject) =>\n this.filterContainString(mo.name, filterTerm) ||\n this.filterContainString(mo.configurationType, filterTerm) ||\n this.filterContainString(mo.deviceType, filterTerm)\n );\n\n return this.data;\n })\n );\n }\n\n shouldShowEmptyState() {\n return !(this.data && this.data.length > 0);\n }\n\n reset() {\n this.filter.filterTerm = '';\n this.setPipe('');\n }\n\n private filterContainString(name: string, filterTerm: string) {\n const term = filterTerm.toLowerCase().trim();\n return name && name.toLowerCase().indexOf(term) > -1;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { gettext, NavigatorNode, NavigatorNodeFactory } from '@c8y/ngx-components';\n\n@Injectable()\nexport class RepositoryNavigationFactory implements NavigatorNodeFactory {\n navs: NavigatorNode[] = [];\n\n async get() {\n if (this.navs.length === 0) {\n this.navs.push(\n new NavigatorNode({\n label: gettext('Firmware repository'),\n path: 'firmware',\n icon: 'c8y-firmware',\n parent: gettext('Management'),\n priority: 1000\n })\n );\n this.navs.push(\n new NavigatorNode({\n label: gettext('Software repository'),\n path: 'software',\n icon: 'c8y-tools',\n parent: gettext('Management'),\n priority: 900\n })\n );\n this.navs.push(\n new NavigatorNode({\n label: gettext('Configuration repository'),\n path: 'configuration',\n icon: 'gears',\n parent: gettext('Management'),\n priority: 800\n })\n );\n }\n return this.navs;\n }\n}\n","import { Component, EventEmitter } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport {\n gettext,\n ISelectModalObject,\n ISelectModalOption,\n ModalLabels,\n ModalSelectionMode\n} from '@c8y/ngx-components';\nimport { get } from 'lodash-es';\nimport { IManagedObject, QueriesUtil } from '@c8y/client';\nimport { Subject, Observable, from, BehaviorSubject } from 'rxjs';\nimport { switchMap, map, mergeMap, shareReplay, tap } from 'rxjs/operators';\nimport { RepositoryService } from '../repository.service';\nimport {\n RepositoryType,\n RepositoryCategory,\n RepositoryBinary,\n SelectedRepositoryBinary\n} from '../repository.model';\n\n// MODAL STRUCTURE\n// - selectModalObject (repository entry (repositoryCategory) -> type c8y_Firmware/c8y_Software)\n// -- ISelectModalOption (repository binary entry (repositoryBinary) => type c8y_FirmwareBinary/c8y_SoftwareBinary)\n// -- ISelectModalOption...\n// - selectModalObject...\n\n/**\n * RepositorySelectModalComponent displays repository entries options and allows to select them.\n *\n * @example\n * ```\n * import { take } from 'rxjs/operators';\n * import { RepositorySelectModalComponent, ModalSelectionMode, RepositoryType } from '@c8y/ngx-components/repository';\n *\n * const initialState = {\n * repositoryType: RepositoryType.FIRMWARE,\n * title: gettext('Install firmware'),\n * subTitle: gettext('Available firmwares matching the device type'),\n * icon: 'c8y-firmware',\n * mode: ModalSelectionMode.SINGLE,\n * labels: { ok: gettext('Install') },\n * disableSelected: false\n * };\n *\n * const modal = this.bsModal.show(RepositorySelectModalComponent, {\n * ignoreBackdropClick: true,\n * initialState\n * });\n *\n * modal.content.load.next();\n * modal.content.resultEmitter.pipe(take(1)).subscribe((firmware) => {\n * ...\n * })\n * ```\n */\n\n@Component({\n selector: 'c8y-repository-select-modal',\n templateUrl: './repository-select-modal.component.html'\n})\nexport class RepositorySelectModalComponent {\n /**\n * Optional\n * Allows to provide custom data.\n * @example\n * ```\n * import { from } from 'rxjs';\n *\n * const repositoryEntry = { name: 'ExampleEntry', type: 'c8y_Firmware' };\n * const versions = [{ c8y_Firmware: { version: '1.0.0', url: 'http://example.com' } }];\n *\n * const initialState = {repositoryEntriesWithVersions$: from({ ...repositoryEntry, versions })};\n * ```\n */\n repositoryEntriesWithVersions$: Observable<IManagedObject[]> = undefined;\n /**\n * Repository entry type.\n */\n repositoryType: RepositoryType.FIRMWARE | RepositoryType.SOFTWARE;\n /**\n * Optional\n * Allows to use custom badges templates.\n * @example\n * ```\n * import { gettext } from '@c8y/ngx-components';\n *\n * const badgeTemplates = { '=1': gettext('{{count}} version'), other: gettext('{{count}} versions') };\n * const initialState = { badgeTemplates };\n * ```\n */\n badgeTemplates = { '=1': gettext('{{count}} version'), other: gettext('{{count}} versions') };\n /**\n * Optional\n * Allows to provide custom modal title.\n */\n title: string = gettext('Select repository entry');\n /**\n * Optional\n * Allows to provide custom modal subtitle.\n */\n subTitle: string;\n /**\n * Loads the content of the modal.\n * Must be invoked by the modal's caller.\n */\n load: Subject<void> = new Subject();\n /**\n * Optional\n * Emits a search string currently entered in the filter input.\n * Use it to filter the items if you use custom repositoryEntriesWithVersions$.\n */\n searchTerm: BehaviorSubject<string> = new BehaviorSubject('');\n /**\n * Optional\n * Allows to provide device type query to restrict search criteria.\n * Only takes effect when repositoryEntriesWithVersions$ is not provided,\n * otherwise modal's caller have to provide already filtered data in the repositoryEntriesWithVersions$.\n */\n deviceTypeQuery: any = {};\n /**\n * Optional\n * Allows to provide query to restrict search criteria.\n * Only takes effect when repositoryEntriesWithVersions$ is not provided,\n * otherwise modal's caller have to provide already filtered data in the repositoryEntriesWithVersions$.\n */\n searchQuery: any = {};\n /**\n * Optional\n * Allows to provide custom labels for the buttons responsible for confirm/dismiss modal actions.\n */\n labels: ModalLabels = { ok: gettext('Save') };\n /**\n * Optional\n * Allows to hide the filter input field.\n * By default, the filter input field is displayed.\n */\n showFilter: boolean = true;\n /**\n * Optional\n * Allows to show a warning that the search criteria should be narrowed down.\n * By default, this warning is hidden.\n */\n areMoreEntries: boolean = false;\n /**\n * Optional\n * Allows to pass the array of items. Each item from this array will be marked as selected in the modal.\n */\n selected: SelectedRepositoryBinary[];\n /**\n * Emits the list of selected options.\n */\n resultEmitter: EventEmitter<SelectedRepositoryBinary[]> = new EventEmitter<\n SelectedRepositoryBinary[]\n >();\n /**\n * Optional\n * Allows to change selection mode.\n * Supported options:\n * * single: only single option can be selected.\n * * multiple: multiple options can be selected.\n */\n mode: ModalSelectionMode = ModalSelectionMode.SINGLE;\n /**\n * Optional\n * Allows to use custom icon in the modal header.\n */\n icon: string;\n /**\n * Allows to block selection of the other versions from the same repository entry.\n */\n disableSelected: boolean = true;\n modalEntries: Observable<ISelectModalObject[]> = this.load.pipe(\n switchMap(() => this.repositoryEntriesWithVersions$),\n mergeMap(mos => this.aggregate(mos)),\n tap(items => {\n this.areMoreEntries = items.length >= this.PAGE_SIZE ? true : false;\n })\n );\n private PAGE_SIZE = 100;\n private queriesUtil: QueriesUtil;\n\n constructor(\n private repositoryService: RepositoryService,\n private translateService: TranslateService\n ) {\n this.queriesUtil = new QueriesUtil();\n }\n\n ngOnInit() {\n if (!this.repositoryType) {\n throw new Error('Repository type must be defined');\n }\n\n if (!this.repositoryEntriesWithVersions$) {\n this.repositoryEntriesWithVersions$ = from(\n this.repositoryService.listRepositoryEntries(this.repositoryType, {\n query: this.queriesUtil.addOrFilter(this.deviceTypeQuery, this.searchQuery),\n params: { pageSize: this.PAGE_SIZE }\n })\n ).pipe(\n map(({ data }) => data),\n map(mos => this.getAndAssignRepositoryBinaries(mos)),\n shareReplay(1)\n );\n }\n }\n\n getAndAssignRepositoryBinaries(mos: IManagedObject[]) {\n mos.forEach(mo => {\n mo.versions = this.repositoryService.listAllVersions(mo);\n });\n return mos;\n }\n\n search(searchTerm: string) {\n this.searchTerm.next(searchTerm);\n if (!searchTerm) {\n this.searchQuery = {};\n } else {\n this.searchQuery = { name: `*${searchTerm}*` };\n }\n this.load.next();\n }\n\n result(selectedItems: SelectedRepositoryBinary[]) {\n this.resultEmitter.emit(selectedItems);\n }\n\n async aggregate(mos: IManagedObject[]): Promise<ISelectModalObject[]> {\n const repositoryType = this.repositoryType;\n const selectedItems: SelectedRepositoryBinary[] = this.selected;\n\n return Promise.all(\n mos.map(async repositoryEntry => {\n const options: ISelectModalOption[] = this.getSelectModalOptions(\n await this.repositoryService.fetchAllItemsFromList(repositoryEntry.versions),\n selectedItems,\n repositoryEntry as RepositoryCategory,\n repositoryType\n );\n const selectModalObject = this.getSelectModalObject(\n repositoryEntry as RepositoryCategory,\n options\n );\n\n return selectModalObject;\n })\n );\n }\n\n getSelectModalOptions(\n versions: RepositoryBinary[],\n selectedItems: SelectedRepositoryBinary[],\n repositoryEntry: RepositoryCategory,\n repositoryType: RepositoryType\n ): ISelectModalOption[] {\n const selectModalOptions: ISelectModalOption[] = [];\n versions.forEach(repositoryBinary => {\n const isSelected: boolean = this.isBinaryRepositorySelected(\n selectedItems,\n repositoryEntry,\n repositoryBinary,\n repositoryType\n );\n\n const { version } = repositoryBinary[`${repositoryType}`];\n const bodyValue =\n version || `(${this.translateService.instant(gettext('not specified`version`'))})`;\n const bodyClass = version ? '' : 'text-muted';\n selectModalOptions.push({\n body: [\n {\n value: bodyValue,\n class: bodyClass\n }\n ],\n obj: {\n id: repositoryBinary.id,\n name: repositoryEntry.name,\n version,\n ...(get(repositoryBinary, 'c8y_Patch.dependency') && {\n dependency: get(repositoryBinary, 'c8y_Patch.dependency')\n }),\n ...(get(repositoryBinary, 'c8y_Patch') && { c8y_Patch: true }),\n url: repositoryBinary[`${repositoryType}`].url\n },\n selected: isSelected\n });\n });\n return selectModalOptions;\n }\n\n isBinaryRepositorySelected(\n selectedItems: SelectedRepositoryBinary[],\n repositoryEntry: RepositoryCategory,\n repositoryBinary: RepositoryBinary,\n repositoryType: RepositoryType\n ): boolean {\n const isSelected = selectedItems\n ? selectedItems.filter(\n repositoryFragment =>\n repositoryFragment.name === repositoryEntry.name &&\n repositoryFragment.version === repositoryBinary[`${repositoryType}`].version\n ).length > 0\n : false;\n\n return isSelected;\n }\n\n getSelectModalObject(\n repositoryEntry: RepositoryCategory,\n options: ISelectModalOption[]\n ): ISelectModalObject {\n const label =\n options.length === 1\n ? this.translateService.instant(this.badgeTemplates['=1'], { count: options.length })\n : this.translateService.instant(this.badgeTemplates.other, { count: options.length });\n\n const selectModalObject: ISelectModalObject = {\n groupId: repositoryEntry.id,\n body: [\n { value: repositoryEntry.name, class: 'text-truncate' },\n { value: repositoryEntry.description, class: 'text-truncate text-muted' }\n ],\n additionalInformation: { value: label, class: 'label label-info' },\n options\n };\n\n return selectModalObject;\n }\n\n}\n","import { Component } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { assign, isEmpty } from 'lodash-es';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { BehaviorSubject, Observable, combineLatest, from, of } from 'rxjs';\nimport { distinctUntilChanged, filter, map, shareReplay, switchMap, take } from 'rxjs/operators';\n\nimport { ModalSelectionMode, gettext } from '@c8y/ngx-components';\nimport { IManagedObject, IOperation, InventoryService, OperationStatus } from '@c8y/client';\n\nimport { RepositoryService } from '../repository.service';\nimport { DeviceFirmware, FirmwareBinary, RepositoryType } from '../repository.model';\nimport { RepositorySelectModalComponent } from '../select-modal/repository-select-modal.component';\n\n@Component({\n selector: 'c8y-firmware-device-tab',\n templateUrl: 'firmware-device-tab.component.html'\n})\nexport class FirmwareDeviceTabComponent {\n isEmpty = isEmpty;\n reloading: boolean = false;\n device$: BehaviorSubject<IManagedObject> = new BehaviorSubject(\n this.route.parent.snapshot.data.contextData\n );\n deviceFirmwareFragment$: Observable<DeviceFirmware> = this.device$.pipe(\n map(device => device.c8y_Firmware)\n );\n firmwareBinary$: Observable<IManagedObject> = this.deviceFirmwareFragment$.pipe(\n filter(deviceFirmwareFragment => !isEmpty(deviceFirmwareFragment)),\n switchMap(deviceFirmwareFragment =>\n from(\n this.repository.getRepositoryBinaryMoByVersion(\n deviceFirmwareFragment,\n RepositoryType.FIRMWARE\n )\n )\n ),\n shareReplay(1)\n );\n repositoryEntry$: Observable<IManagedObject> = this.firmwareBinary$.pipe(\n switchMap(mo => this.repository.getRepositoryEntryMO$(mo)),\n shareReplay(1)\n );\n patches$: Observable<IManagedObject[]> = combineLatest(\n this.firmwareBinary$,\n this.repositoryEntry$\n ).pipe(\n switchMap(([firmwareBinary, repositoryEntry]) => {\n if (repositoryEntry && firmwareBinary) {\n const version: string = this.repository.getBaseVersionFromMO(\n firmwareBinary as FirmwareBinary\n );\n\n return from(this.repository.listPatchVersions(repositoryEntry, version)).pipe(\n map(({ data }) => data)\n );\n } else {\n return of([]);\n }\n }),\n shareReplay(1)\n );\n changesOperation$ = new BehaviorSubject<IOperation>(null);\n changesInProgress$: Observable<boolean> = this.changesOperation$.pipe(\n map(operation => this.isInProgress(operation))\n );\n\n constructor(\n private route: ActivatedRoute,\n private repository: RepositoryService,\n private inventory: InventoryService,\n private bsModal: BsModalService\n ) {}\n\n async ngOnInit() {\n // TODO check route snapshot, why is not refreshing device.\n // Scenario: missing deviceFirmwareFragment => install new version => switch tabs.\n // Expected: device should be set.\n await this.loadDevice();\n await this.loadOperation();\n }\n\n installFirmware() {\n const initialState: Partial<RepositorySelectModalComponent> & {\n repositoryEntriesWithVersionsFn$: (modal: any) => Observable<IManagedObject[]>;\n } = {\n repositoryEntriesWithVersions$: of([]),\n repositoryEntriesWithVersionsFn$: modal =>\n this.getRepositoryEntriesWithVersions$(modal.content.searchTerm),\n repositoryType: RepositoryType.FIRMWARE,\n title: gettext('Install firmware'),\n subTitle: gettext('Available firmwares matching the device type'),\n icon: 'c8y-firmware',\n mode: ModalSelectionMode.SINGLE,\n labels: { ok: gettext('Install') },\n disableSelected: false\n };\n\n this.deviceFirmwareFragment$\n .pipe(\n take(1),\n switchMap(deviceFirmwareFragment => {\n if (deviceFirmwareFragment) {\n const { name, version } = deviceFirmwareFragment;\n const selected = [{ name, version }];\n assign(initialState, { selected });\n }\n\n const modal = this.bsModal.show(RepositorySelectModalComponent, {\n ignoreBackdropClick: true,\n initialState\n });\n\n if (initialState.repositoryEntriesWithVersionsFn$) {\n modal.content.repositoryEntriesWithVersions$ = initialState.repositoryEntriesWithVersionsFn$(\n modal\n );\n }\n\n modal.content.load.next();\n\n return modal.content.resultEmitter;\n })\n )\n .subscribe(([selectedFirmware]) => {\n this.handleOperation(selectedFirmware);\n });\n }\n\n getRepositoryEntriesWithVersions$(searchTerm$: BehaviorSubject<string>) {\n return searchTerm$.pipe(\n distinctUntilChanged(),\n switchMap(searchTerm =>\n this.repository.listRepositoryEntries(RepositoryType.FIRMWARE, {\n query: this.repository.getDeviceTypeQuery(RepositoryType.FIRMWARE, this.device$.value),\n partialName: searchTerm,\n params: { pageSize: 100 }\n })\n ),\n map(({ data }) => data),\n map(mos => this.getAndAssignRepositoryBinaries(mos)),\n shareReplay(1)\n );\n }\n\n getAndAssignRepositoryBinaries(mos: IManagedObject[]) {\n mos.forEach(mo => {\n mo.versions = this.repository.listBaseVersions(mo);\n });\n return mos;\n }\n\n addPatch() {\n const initialState: Partial<RepositorySelectModalComponent> & {\n repositoryEntriesWithVersions$: Observable<IManagedObject[]>;\n } = {\n repositoryType: RepositoryType.FIRMWARE,\n repositoryEntriesWithVersions$: this.getRepositoryEntryWithPatches$(),\n title: gettext('Install firmware'),\n subTitle: gettext('Available firmwares matching the device type'),\n icon: 'c8y-firmware',\n mode: ModalSelectionMode.SINGLE,\n labels: { ok: gettext('Install') },\n disableSelected: false\n };\n\n this.deviceFirmwareFragment$\n .pipe(\n take(1),\n switchMap(deviceFirmwareFragment => {\n if (deviceFirmwareFragment) {\n const { name, version } = deviceFirmwareFragment;\n const selected = [{ name, version }];\n assign(initialState, { selected });\n }\n\n const modal = this.bsModal.show(RepositorySelectModalComponent, {\n ignoreBackdropClick: true,\n initialState\n });\n modal.content.load.next();\n\n return modal.content.resultEmitter;\n })\n )\n .subscribe(selectedOption => {\n this.handleOperation(selectedOption);\n });\n }\n\n getRepositoryEntryWithPatches$() {\n return combineLatest(this.repositoryEntry$, this.patches$).pipe(\n map(([repositoryEntry, patches]) => {\n return [{ ...repositoryEntry, versions: patches }];\n })\n );\n }\n\n async loadDevice() {\n this.reloading = true;\n const deviceId = this.device$.value.id;\n const device = (await this.inventory.detail(deviceId, { withChildren: false })).data;\n this.device$.next(device);\n this.reloading = false;\n }\n\n private async handleOperation(selectedFirmware) {\n const operation = await this.repository.createFirmwareUpdateOperation(\n this.device$.value,\n selectedFirmware\n );\n this.trackOperation(operation);\n }\n\n private async loadOperation() {\n const deviceId = this.device$.value.id;\n const operation = await this.repository.getLastFirmwareUpdateOperation(deviceId);\n this.trackOperation(operation);\n }\n\n private trackOperation(operation: IOperation) {\n this.changesOperation$.next(operation);\n\n if (this.isInProgress(operation)) {\n this.repository.observeOperation(operation).subscribe(\n operationUpdate => {\n this.changesOperation$.next(operationUpdate);\n if (operationUpdate.status === OperationStatus.SUCCESSFUL) {\n this.loadDevice();\n }\n },\n operationUpdate => {\n this.changesOperation$.next(operationUpdate);\n }\n );\n }\n }\n\n private isInProgress(operation: IOperation) {\n return (\n operation && [OperationStatus.PENDING, OperationStatus.EXECUTING].includes(operation.status)\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { CanActivate } from '@angular/router';\nimport { get, indexOf } from 'lodash-es';\n\nconst FIRMWARE_FRAGMENT = 'c8y_Firmware';\nconst SUPPORTED_OPERATIONS_FRAGMENT = 'c8y_SupportedOperations';\n\n@Injectable()\nexport class FirmwareDeviceTabGuard implements CanActivate {\n canActivate(route) {\n const contextData = get(route, 'data.contextData') || get(route, 'parent.data.contextData');\n const supportedOperations = get(contextData, SUPPORTED_OPERATIONS_FRAGMENT);\n return !!supportedOperations\n ? indexOf(supportedOperations, FIRMWARE_FRAGMENT) >= 0\n : false;\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { Observable, BehaviorSubject } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { IManagedObject, InventoryService, OperationStatus, IOperation } from '@c8y/client';\nimport { DeviceSoftware, DeviceSoftwareChange, RepositoryType } from '../repository.model';\nimport { RepositoryService } from '../repository.service';\n\n@Component({\n selector: 'c8y-software-device-tab',\n templateUrl: 'software-device-tab.component.html'\n})\nexport class SoftwareDeviceTabComponent implements OnInit {\n deviceId: string | number = this.route.snapshot.parent.data.contextData.id;\n device$ = new BehaviorSubject<IManagedObject>(this.route.snapshot.parent.data.contextData);\n deviceTypeQuery$: Observable<object> = this.device$.pipe(\n map(device => this.repository.getDeviceTypeQuery(RepositoryType.SOFTWARE, device))\n );\n list$: Observable<DeviceSoftware[]> = this.device$.pipe(\n map(device => this.repository.getDeviceSoftwareList(device))\n );\n changes$ = new BehaviorSubject<DeviceSoftwareChange[]>([]);\n changesOperation$ = new BehaviorSubject<IOperation>(null);\n changesInProgress$: Observable<boolean> = this.changesOperation$.pipe(\n map(operation => this.isInProgress(operation))\n );\n reloading: boolean = false;\n\n constructor(\n private route: ActivatedRoute,\n private repository: RepositoryService,\n private inventory: InventoryService\n ) {}\n\n async ngOnInit() {\n await this.loadDevice();\n await this.loadOperation();\n }\n\n addChanges(requestedChanges: DeviceSoftwareChange[]) {\n let stagedChanges = [...this.changes$.value];\n requestedChanges.forEach(requestedChange => {\n const alreadyStaged = stagedChanges.some(stagedChange =>\n this.areSameChanges(stagedChange, requestedChange));\n if (!alreadyStaged) {\n stagedChanges = [...stagedChanges, requestedChange];\n }\n });\n this.changes$.next(stagedChanges);\n }\n\n dropChange(changeToBeDropped: DeviceSoftwareChange) {\n let stagedChanges = [...this.changes$.value];\n stagedChanges = stagedChanges.filter(stagedChange => !this.areSameChanges(stagedChange, changeToBeDropped));\n this.changes$.next(stagedChanges);\n }\n\n areSameChanges(change1: DeviceSoftwareChange, change2: DeviceSoftwareChange) {\n return change1.name === change2.name &&\n change1.version === change2.version &&\n change1.action === change2.action;\n }\n\n clearChanges() {\n this.changes$.next([]);\n }\n\n async loadDevice() {\n this.reloading = true;\n const device = (await this.inventory.detail(this.deviceId, { withChildren: false })).data;\n this.device$.next(device);\n this.reloading = false;\n }\n\n async applyChanges() {\n const operation = await this.repository.createSoftwareUpdateOperation(\n this.device$.value,\n this.changes$.value\n );\n this.trackOperation(operation);\n }\n\n private async loadOperation() {\n const operation = await this.repository.getLastSoftwareUpdateOperation(this.deviceId);\n this.trackOperation(operation);\n }\n\n private trackOperation(operation: IOperation) {\n this.changesOperation$.next(operation);\n\n if (this.isInProgress(operation)) {\n this.displayChangesFromOperation(operation);\n this.repository.observeOperation(operation).subscribe(\n operationUpdate => {\n this.changesOperation$.next(operationUpdate);\n if (operationUpdate.status === OperationStatus.SUCCESSFUL) {\n this.clearChanges();\n this.loadDevice();\n }\n },\n operationUpdate => {\n this.changesOperation$.next(operationUpdate);\n }\n );\n }\n }\n\n private displayChangesFromOperation(operation: IOperation) {\n const changes = this.repository.getDeviceSoftwareChangesFromOperation(\n operation,\n this.device$.value\n );\n this.changes$.next(changes);\n }\n\n private isInProgress(operation: IOperation) {\n return (\n operation && [OperationStatus.PENDING, OperationStatus.EXECUTING].includes(operation.status)\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { CanActivate, ActivatedRouteSnapshot } from '@angular/router';\n\n@Injectable()\nexport class SoftwareDeviceTabGuard implements CanActivate {\n private readonly operations = ['c8y_SoftwareUpdate', 'c8y_SoftwareList', 'c8y_Software'];\n\n canActivate(route: ActivatedRouteSnapshot) {\n return this.isAnyOperationSupported(route);\n }\n\n private isAnyOperationSupported(route: ActivatedRouteSnapshot) {\n const device = route.data.contextData || route.parent.data.contextData;\n const supportedOperations = (device && device.c8y_SupportedOperations) || [];\n return this.operations.some(operation => supportedOperations.indexOf(operation) >= 0);\n }\n}\n","import { Component, Output, Input, EventEmitter } from '@angular/core';\nimport { from, of, BehaviorSubject } from 'rxjs';\nimport { shareReplay, map, switchMap, distinctUntilChanged } from 'rxjs/operators';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { IManagedObject, InventoryService, IOperation } from '@c8y/client';\nimport { gettext, ModalSelectionMode } from '@c8y/ngx-components';\nimport { RepositoryService } from '../repository.service';\nimport { DeviceSoftware, DeviceSoftwareChange, RepositoryType } from './../repository.model';\nimport { RepositorySelectModalComponent } from '../select-modal/repository-select-modal.component';\n\n@Component({\n selector: 'c8y-installed-software',\n templateUrl: 'installed-software.component.html'\n})\nexport class InstalledSoftwareComponent {\n @Input() softwareList: DeviceSoftware[];\n @Input() deviceSoftwareChanges: DeviceSoftwareChange[];\n @Input() deviceSoftwareChangesOperation: IOperation;\n @Input() deviceSoftwareChangesInProgress: boolean;\n @Input() deviceTypeQuery: object;\n @Output() changes = new EventEmitter<DeviceSoftwareChange[]>();\n\n constructor(\n private repository: RepositoryService,\n private inventory: InventoryService,\n private bsModal: BsModalService\n ) {\n }\n\n installSoftware() {\n this.displaySoftwareSelectModal({\n title: gettext('Install software'),\n labels: { ok: gettext('Install') },\n repositoryEntriesWithVersions$: of([]),\n repositoryEntriesWithVersionsFn$: modal =>\n this.getInstallableSoftwareListWithVersions$(modal.content.searchTerm)\n }).subscribe(softwareToInstall => {\n this.emitSoftwareInstall(softwareToInstall);\n });\n }\n\n updateSoftware(softwareToRemove) {\n this.displaySoftwareSelectModal({\n title: gettext('Update software'),\n labels: { ok: gettext('Update') },\n showFilter: false,\n repositoryEntriesWithVersions$: this.getSingleSoftwareWithVersions$(softwareToRemove)\n }).subscribe(softwareToInstall => {\n this.emitSoftwareInstall(softwareToInstall);\n });\n }\n\n removeSoftware(softwareToRemove) {\n this.emitSoftwareRemoval([softwareToRemove]);\n }\n\n getInstallableSoftwareListWithVersions$(searchTerm$: BehaviorSubject<string>) {\n const installedSoftwareNames = this.softwareList.map(s => s.name);\n return searchTerm$.pipe(\n distinctUntilChanged(),\n switchMap(searchTerm =>\n this.repository.listRepositoryEntries(RepositoryType.SOFTWARE, {\n query: this.deviceTypeQuery,\n partialName: searchTerm,\n params: { pageSize: 100 }\n })\n ),\n map(({ data }) => data),\n map(softwareList => {\n return softwareList.filter(software => {\n return !installedSoftwareNames.includes(software.name);\n });\n }),\n map(softwareList => this.attachVersions(softwareList)),\n shareReplay(1)\n );\n }\n\n getSingleSoftwareWithVersions$(software: DeviceSoftware) {\n return from(\n this.repository.listRepositoryEntries(RepositoryType.SOFTWARE, {\n query: { name: software.name }\n })\n ).pipe(\n map(({ data }) => data),\n map(softwareList => this.attachVersions(softwareList)),\n shareReplay(1)\n );\n }\n\n attachVersions(softwareList: IManagedObject[]) {\n softwareList.forEach(software => {\n software.versions = this.repository.listBaseVersions(software);\n });\n return softwareList;\n }\n\n displaySoftwareSelectModal(initialStateOverrides) {\n const initialState = {\n repositoryType: RepositoryType.SOFTWARE,\n subTitle: gettext('Available softwares matching the device type'),\n mode: ModalSelectionMode.MULTI,\n icon: 'c8y-tools',\n disableSelected: false,\n selected: this.softwareList,\n ...initialStateOverrides\n };\n const modal = this.bsModal.show(RepositorySelectModalComponent, {\n ignoreBackdropClick: true,\n class: 'modal-sm',\n initialState\n });\n\n if (initialStateOverrides.repositoryEntriesWithVersionsFn$) {\n modal.content.repositoryEntriesWithVersions$ = initialStateOverrides.repositoryEntriesWithVersionsFn$(\n modal\n );\n }\n\n modal.content.load.next();\n return modal.content.resultEmitter;\n }\n\n emitSoftwareInstall(items: DeviceSoftware[]) {\n this.changes.emit(items.map(item => {\n return { ...item, action: 'install' };\n }));\n }\n\n emitSoftwareRemoval(items: DeviceSoftware[]) {\n this.changes.emit(items.map(item => {\n return { ...item, action: 'delete' };\n }));\n }\n}\n","import { Component, Output, Input, EventEmitter } from '@angular/core';\nimport { filter } from 'lodash-es';\nimport { OperationStatus } from '@c8y/client';\nimport { DeviceSoftware, DeviceSoftwareChange } from '../repository.model';\n\n@Component({\n selector: 'c8y-device-software-list',\n templateUrl: 'device-software-list.component.html'\n})\nexport class DeviceSoftwareListComponent {\n @Input() softwareList: DeviceSoftware[];\n @Input() deviceSoftwareChanges: DeviceSoftwareChange[];\n @Output() update = new EventEmitter<DeviceSoftware>();\n @Output() remove = new EventEmitter<DeviceSoftware>();\n showUpdate: boolean;\n showRemove: boolean;\n\n ngAfterContentInit() {\n this.showUpdate = this.update.observers.length > 0;\n this.showRemove = this.remove.observers.length > 0;\n }\n\n isSoftwareGoingToBeChanged(software: DeviceSoftware): boolean {\n const relevantChanges = filter(this.deviceSoftwareChanges, software);\n return relevantChanges.length > 0;\n }\n}\n","import { Component, Output, Input, EventEmitter, OnChanges, SimpleChanges } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { DeviceSoftwareChange } from '../repository.model';\n\n@Component({\n selector: 'c8y-device-software-changes',\n templateUrl: 'device-software-changes.component.html'\n})\nexport class DeviceSoftwareChangesComponent implements OnChanges {\n @Input() changes: DeviceSoftwareChange[];\n @Input() changesInProgress: boolean;\n @Output() clear: EventEmitter<void> = new EventEmitter();\n @Output() drop: EventEmitter<DeviceSoftwareChange> = new EventEmitter();\n @Output() apply: EventEmitter<void> = new EventEmitter();\n\n changes$ = new BehaviorSubject<DeviceSoftwareChange[]>([]);\n installations$ = this.changes$.pipe(\n map(changes => {\n return changes.filter(change => change.action === 'install');\n })\n );\n\n removals$ = this.changes$.pipe(\n map(changes => {\n return changes.filter(change => change.action === 'delete');\n })\n );\n\n ngOnChanges(changes: SimpleChanges) {\n if (changes.changes) {\n this.changes$.next(changes.changes.currentValue);\n }\n }\n}\n","import { EventEmitter, Injectable } from '@angular/core';\nimport { DeviceConfigurationOperation } from '../repository.model';\nimport { IManagedObject } from '@c8y/client';\n\n@Injectable()\nexport class DeviceConfigurationService {\n configurationsUpdated = new EventEmitter<any>();\n\n updateConfigurations(repositorySnapsOnly?: boolean) {\n this.configurationsUpdated.emit(repositorySnapsOnly);\n }\n\n hasAnySupportedOperation(\n mo: IManagedObject,\n operation: DeviceConfigurationOperation | DeviceConfigurationOperation[]\n ) {\n const supported = mo.c8y_SupportedOperations as [];\n if (!supported) {\n return false;\n }\n if (!Array.isArray(operation)) {\n operation = [operation];\n }\n return supported.some(supportedOperation => operation.includes(supportedOperation));\n }\n}\n","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { InventoryService, IManagedObject, OperationStatus, IOperation } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components';\nimport { RepositoryService } from '../repository.service';\nimport { AlertService } from '@c8y/ngx-components';\nimport { DeviceConfigurationOperation } from '../repository.model';\nimport { DeviceConfigurationService } from './device-configuration.service';\n\n@Component({\n selector: 'c8y-text-based-configuration',\n templateUrl: './text-based-configuration.component.html'\n})\nexport class TextBasedConfigurationComponent implements OnInit {\n device: IManagedObject;\n latestOperation: IOperation;\n showTextBasedConfigReload: boolean;\n showTextBasedConfigSave: boolean;\n reloadingConfig = false;\n config: string;\n\n constructor(\n private route: ActivatedRoute,\n private alertService: AlertService,\n private repositoryService: RepositoryService,\n private deviceConfigurationService: DeviceConfigurationService,\n private inventoryService: InventoryService\n ) {\n }\n\n async ngOnInit() {\n await this.load();\n }\n\n async load() {\n this.device = this.route.snapshot.parent.data.contextData;\n await this.loadDevice();\n await this.loadOperation();\n this.showTextBasedConfigReload = this.deviceConfigurationService.hasAnySupportedOperation(\n this.device,\n [DeviceConfigurationOperation.SEND_CONFIG]\n );\n this.showTextBasedConfigSave = this.deviceConfigurationService.hasAnySupportedOperation(\n this.device,\n [DeviceConfigurationOperation.CONFIG]\n );\n if (this.device.c8y_Configuration && this.device.c8y_Configuration.config) {\n this.config = this.device.c8y_Configuration.config;\n }\n }\n\n async loadOperation() {\n const operation = await this.repositoryService.getLastConfigUpdateOperation(this.device.id);\n if (operation !== null) {\n this.repositoryService.observeOperation(operation).subscribe(operationUpdate => {\n this.latestOperation = operationUpdate;\n });\n }\n }\n\n get savingConfig() {\n return this.latestOperation\n ? this.latestOperation.status === OperationStatus.PENDING ||\n this.latestOperation.status === OperationStatus.EXECUTING\n : false;\n }\n\n async reloadConfiguration() {\n this.reloadingConfig = true;\n const operationCfg = await this.repositoryService.createTextBasedConfigurationReloadOperation(\n this.device\n );\n try {\n this.repositoryService\n .createObservedOperation(operationCfg)\n .subscribe(\n operationUpdate => this.onOperationReloadSuccess(operationUpdate),\n operationUpdate => this.onOperationReloadError(operationUpdate),\n () => this.onOperationReloadComplete()\n );\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n async updateConfiguration(config) {\n const operationCfg = await this.repositoryService.createTextBasedConfigurationUpdateOperation(\n this.device,\n config\n );\n try {\n this.repositoryService\n .createObservedOperation(operationCfg)\n .subscribe(\n operationUpdate => this.onOperationUpdateSuccess(operationUpdate),\n operationUpdate => this.onOperationUpdateError(operationUpdate),\n () => this.onOperationUpdateComplete()\n );\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n private onOperationReloadSuccess(operationUpdate) {\n this.latestOperation = operationUpdate;\n if (operationUpdate.status === OperationStatus.PENDING) {\n this.alertService.success(gettext('Configuration will be reloaded.'));\n }\n }\n\n private onOperationReloadError(operationUpdate) {\n this.latestOperation = operationUpdate;\n this.reloadingConfig = false;\n }\n\n private async onOperationReloadComplete() {\n await this.loadDevice();\n this.config = this.device.c8y_Configuration.config;\n this.reloadingConfig = false;\n }\n\n private onOperationUpdateSuccess(operationUpdate) {\n this.latestOperation = operationUpdate;\n if (operationUpdate.status === OperationStatus.PENDING) {\n this.alertService.success(gettext('Configuration will be updated.'));\n }\n }\n\n private onOperationUpdateError(operationUpdate) {\n this.latestOperation = operationUpdate;\n }\n\n private onOperationUpdateComplete() {\n this.device.c8y_Configuration.config = this.config;\n }\n\n private async loadDevice() {\n this.device = (await this.inventoryService.detail(this.device.id, {\n withChildren: false\n })).data;\n }\n}\n","import { Component, OnInit, ViewChild } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { IManagedObject, Realtime } from '@c8y/client';\nimport { DeviceConfigurationService } from './device-configuration.service';\nimport {\n DeviceConfigurationListEmptyState,\n ConfigurationSnapshot,\n SupportedConfigurationItem,\n DeviceConfigurationOperation\n} from '../repository.model';\nimport { gettext } from '@c8y/ngx-components';\nimport { RepositoryService } from '../repository.service';\nimport { TextBasedConfigurationComponent } from './text-based-configuration.component';\n\n@Component({\n selector: 'c8y-device-configuration',\n templateUrl: './device-configuration.component.html'\n})\nexport class DeviceConfigurationComponent implements OnInit {\n supportedConfigurations: SupportedConfigurationItem[] = [];\n showBinaryBasedConfig = false;\n configurationType: string;\n configSnapshot: Partial<ConfigurationSnapshot> = {};\n repositorySnapshots: IManagedObject[];\n repositorySnapshot: ConfigurationSnapshot;\n repositorySnapshotsEmptyState: DeviceConfigurationListEmptyState;\n device: IManagedObject;\n isLegacy: boolean;\n showTextBasedConfig: boolean;\n reloading: boolean = false;\n\n @ViewChild(TextBasedConfigurationComponent) textBasedConfigurationComponent: TextBasedConfigurationComponent;\n\n constructor(\n private route: ActivatedRoute,\n private deviceConfigurationService: DeviceConfigurationService,\n private realtime: Realtime,\n private repositoryService: RepositoryService\n ) {\n this.deviceConfigurationService.configurationsUpdated.subscribe(repositorySnapsOnly => {\n this.updateSnapshots(repositorySnapsOnly);\n });\n }\n\n ngOnInit() {\n this.device = this.route.snapshot.parent.data.contextData;\n if (this.device.c8y_SupportedConfigurations) {\n this.supportedConfigurations = this.device.c8y_SupportedConfigurations.map(item => ({\n name: item\n }));\n }\n\n if (\n this.deviceConfigurationService.hasAnySupportedOperation(this.device, [\n DeviceConfigurationOperation.DOWNLOAD_CONFIG,\n DeviceConfigurationOperation.UPLOAD_CONFIG\n ])\n ) {\n this.supportedConfigurations.push({\n name: gettext('Legacy configuration snapshot'),\n isLegacy: true\n });\n }\n if (this.supportedConfigurations.length > 0) {\n this.showBinaryBasedConfig = true;\n }\n\n this.repositorySnapshotsEmptyState = {\n icon: 'gears',\n title: gettext('No configurations available.'),\n text: gettext('Add configuration to configuration repository')\n };\n\n this.showTextBasedConfig = this.deviceConfigurationService.hasAnySupportedOperation(\n this.device,\n [DeviceConfigurationOperation.CONFIG, DeviceConfigurationOperation.SEND_CONFIG]\n );\n }\n\n async onConfigTypeSelected(config) {\n this.configurationType = config.name;\n this.isLegacy = config.isLegacy;\n this.updateSnapshots();\n }\n\n async onRepositoryConfigSelected(config) {\n this.repositorySnapshot = {\n id: config.id,\n time: config.creationTime,\n name: config.name,\n binaryUrl: config.url,\n deviceType: config.deviceType,\n configurationType: config.configurationType\n };\n if (config.url) {\n try {\n const binary = await this.repositoryService.getBinaryFile(config.url, {\n allowExternal: false\n });\n if (binary) {\n this.repositorySnapshot.binary = await (binary as any).text();\n }\n } catch (ex) {\n // do nothing\n }\n }\n }\n\n async updateSnapshots(repositorySnapsOnly?: boolean) {\n this.reloading = true;\n this.repositorySnapshot = undefined;\n this.repositorySnapshots = await this.repositoryService.getSnapshotsFromRepository(\n this.device,\n this.configurationType\n );\n if (!repositorySnapsOnly) {\n this.configSnapshot = this.isLegacy\n ? await this.repositoryService.getLegacyConfigSnapshot(this.device)\n : await this.repositoryService.getConfigSnapshot(this.device, this.configurationType);\n }\n if ( this.showTextBasedConfig ) {\n await this.textBasedConfigurationComponent.load();\n }\n this.reloading = false;\n }\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'c8y-source-code-preview',\n templateUrl: './source-code-preview.component.html'\n})\nexport class SourceCodePreviewComponent {\n @Input() isDisabled: boolean;\n @Input() text: string;\n}\n","import { Component } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { ConfigurationSnapshot, RepositoryType } from '../repository.model';\nimport { AlertService, gettext } from '@c8y/ngx-components';\nimport { RepositoryService } from '../repository.service';\n\n@Component({\n selector: 'c8y-save-config-to-configuration-repository',\n templateUrl: 'save-to-repository.component.html'\n})\nexport class SaveToRepositoryComponent {\n configSnapshot: ConfigurationSnapshot;\n result: Promise<any> = new Promise((resolve, reject) => {\n this._save = resolve;\n this._cancel = reject;\n });\n private _save;\n private _cancel;\n\n constructor(\n private modal: BsModalRef,\n private alertService: AlertService,\n private repositoryService: RepositoryService\n ) {}\n\n async save() {\n {\n try {\n const configSnapshotData = {\n selected: {\n configurationType: this.configSnapshot.configurationType\n },\n version: this.configSnapshot.name,\n deviceType: this.configSnapshot.deviceType,\n description: this.configSnapshot.description,\n binary: {\n file: new File([this.configSnapshot.binary], this.configSnapshot.name)\n }\n };\n await this.repositoryService.save(configSnapshotData, RepositoryType.CONFIGURATION);\n this.alertService.success(gettext('Configuration saved.'));\n this._save();\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n }\n\n close() {\n this._cancel();\n this.modal.hide();\n }\n}\n","import { Component, Input, OnDestroy, OnInit } from '@angular/core';\nimport { ConfigurationSnapshot, DeviceConfigurationOperation } from '../repository.model';\nimport {\n IManagedObject,\n IOperation,\n OperationService,\n OperationStatus,\n Realtime,\n UserService\n} from '@c8y/client';\nimport { DeviceConfigurationService } from './device-configuration.service';\nimport { Subscription } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { saveAs } from 'file-saver/FileSaver';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { SaveToRepositoryComponent } from './save-to-repository.component';\nimport { cloneDeep } from 'lodash-es';\nimport { AlertService, AppStateService, OperationRealtimeService } from '@c8y/ngx-components';\nimport { RepositoryService } from '../repository.service';\n\n@Component({\n selector: 'c8y-device-configuration-preview',\n templateUrl: './configuration-preview.component.html'\n})\nexport class ConfigurationPreviewComponent implements OnInit, OnDestroy {\n @Input() device: IManagedObject;\n @Input() set configurationType(type: string) {\n this._configurationType = type;\n this.setOperation(type);\n }\n get configurationType(): string {\n return this._configurationType;\n }\n @Input() configSnapshot: ConfigurationSnapshot;\n @Input() canSaveSnapshot: boolean;\n @Input() actionButtonText: string;\n @Input() actionButtonIcon: string;\n @Input() isLegacy: boolean = false;\n @Input() operationToTrigger:\n | DeviceConfigurationOperation.UPLOAD_CONFIG\n | DeviceConfigurationOperation.DOWNLOAD_CONFIG;\n\n operation: IOperation;\n canCallAction = true;\n deviceConfigurationOperation = DeviceConfigurationOperation;\n private _configurationType: string;\n private operationsSubscription: Subscription;\n\n constructor(\n private deviceConfigurationService: DeviceConfigurationService,\n private realtime: Realtime,\n private operationRealtime: OperationRealtimeService,\n private bsModal: BsModalService,\n private user: UserService,\n private appState: AppStateService,\n private repositoryService: RepositoryService,\n private operationService: OperationService,\n private alertService: AlertService\n ) {}\n\n async ngOnInit() {\n this.setOperation(this._configurationType);\n this.operationsSubscription = this.operationRealtime\n .onAll$(this.device.id)\n .pipe(map(({ data }) => data as IOperation))\n .subscribe(operation => {\n this.updatePreview(operation);\n });\n if (this.isLegacy) {\n this.canCallAction = this.deviceConfigurationService.hasAnySupportedOperation(\n this.device,\n this.operationToTrigger\n );\n }\n }\n\n async setOperation(configType): Promise<void> {\n const operationList = await this.repositoryService.getConfigFileOperationList(\n this.device.id,\n this.operationToTrigger\n );\n\n const operation = this.isLegacy\n ? operationList.find(op => op[this.operationToTrigger] && !op[this.operationToTrigger].type)\n : operationList.find(op => op[this.operationToTrigger].type === configType);\n\n this.operation =\n operation && operation.status !== OperationStatus.SUCCESSFUL ? operation : undefined;\n }\n\n async createDeviceOperation() {\n let operationCfg;\n if (this.operationToTrigger === DeviceConfigurationOperation.DOWNLOAD_CONFIG) {\n operationCfg = this.repositoryService.getDownloadConfigurationFileOperation(\n this.device,\n this._configurationType,\n this.configSnapshot,\n this.isLegacy\n );\n }\n if (this.operationToTrigger === DeviceConfigurationOperation.UPLOAD_CONFIG) {\n operationCfg = this.repositoryService.getUploadConfigurationFileOperation(\n this.device,\n this._configurationType,\n this.isLegacy\n );\n }\n try {\n this.operation = (await this.operationService.create(operationCfg)).data;\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n showOperation(): boolean {\n if (this.operationToTrigger === DeviceConfigurationOperation.DOWNLOAD_CONFIG) {\n return !!this.operation;\n }\n return (\n this.operation &&\n [OperationStatus.PENDING, OperationStatus.EXECUTING, OperationStatus.FAILED].includes(\n this.operation.status\n )\n );\n }\n\n showBinary(): boolean {\n if (this.operationToTrigger === DeviceConfigurationOperation.DOWNLOAD_CONFIG) {\n return true;\n }\n return !this.showOperation();\n }\n\n isCreateOperationDisabled(): boolean {\n return (\n this.operation &&\n [OperationStatus.PENDING, OperationStatus.EXECUTING].includes(this.operation.status)\n );\n }\n\n updatePreview(operation: IOperation) {\n if (\n operation &&\n operation[this.operationToTrigger] &&\n (this.isLegacy ||\n (operation[this.operationToTrigger].type &&\n operation[this.operationToTrigger].type === this.configurationType))\n ) {\n this.operation = operation;\n this.updateSnapshotsOnConfigUpload(operation);\n }\n }\n\n download() {\n const blob = new Blob([this.configSnapshot.binary], { type: this.configSnapshot.binaryType });\n let fileName = this.configSnapshot.name;\n switch (this.configSnapshot.binaryType) {\n case 'text/csv':\n case 'application/csv':\n fileName = fileName.concat('.csv');\n break;\n case 'text/yaml':\n case 'application/x-yaml':\n fileName = fileName.concat('.yaml');\n break;\n case 'application/json':\n fileName = fileName.concat('.json');\n break;\n }\n saveAs(blob, fileName);\n }\n\n async saveToRepository() {\n const initialState = {\n configSnapshot: cloneDeep(this.configSnapshot)\n };\n const modal = this.bsModal.show(SaveToRepositoryComponent, {\n class: 'modal-sm',\n initialState,\n ignoreBackdropClick: true\n }).content as SaveToRepositoryComponent;\n try {\n await modal.result;\n this.deviceConfigurationService.updateConfigurations(true);\n modal.close();\n } catch (ex) {\n // do nothing\n }\n }\n\n hasPermission(): boolean {\n return this.user.hasAnyRole(this.appState.currentUser.value, [\n 'ROLE_INVENTORY_ADMIN',\n 'ROLE_INVENTORY_CREATE'\n ]);\n }\n\n ngOnDestroy() {\n if (this.operationsSubscription) {\n this.operationsSubscription.unsubscribe();\n }\n }\n\n private async updateSnapshotsOnConfigUpload(operation) {\n if (\n operation[DeviceConfigurationOperation.UPLOAD_CONFIG] &&\n operation.status === OperationStatus.SUCCESSFUL\n ) {\n this.deviceConfigurationService.updateConfigurations();\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { SupportedConfigurationItem } from '../repository.model';\n\n@Pipe({\n name: 'configurationFilterPipe'\n})\nexport class ConfigurationFilterPipe implements PipeTransform {\n transform(items: any[], filterTerm: string): any {\n return filterTerm.trim().length === 0\n ? items\n : items.filter(\n (item: SupportedConfigurationItem) =>\n this.filterContainString(item.name, filterTerm) ||\n this.filterContainString(item.deviceType, filterTerm)\n );\n }\n\n private filterContainString(name: string, filterTerm: string) {\n const term = filterTerm.toLowerCase().trim();\n return name && name.toLowerCase().indexOf(term) > -1;\n }\n}\n","import { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from '@angular/router';\nimport { Injectable } from '@angular/core';\nimport { DeviceConfigurationService } from './device-configuration.service';\nimport { DeviceConfigurationOperation } from '../repository.model';\n\n@Injectable()\nexport class DeviceConfigurationGuard implements CanActivate {\n constructor(private deviceConfigurationService: DeviceConfigurationService) {}\n\n canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {\n const contextData = route.data.contextData || route.parent.data.contextData;\n if (!contextData) {\n return false;\n }\n return (\n (contextData.c8y_SupportedConfigurations &&\n contextData.c8y_SupportedConfigurations.length > 0) ||\n this.deviceConfigurationService.hasAnySupportedOperation(contextData, [\n DeviceConfigurationOperation.DOWNLOAD_CONFIG,\n DeviceConfigurationOperation.UPLOAD_CONFIG,\n DeviceConfigurationOperation.CONFIG,\n DeviceConfigurationOperation.SEND_CONFIG\n ])\n );\n }\n}\n","export enum LinkRenderType {\n DOWNLOAD,\n LINK,\n TEXTONLY\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { DeviceConfigurationListEmptyState, SupportedConfigurationItem } from '../repository.model';\n\n@Component({\n selector: 'c8y-device-configuration-list',\n templateUrl: './device-configuration-list.component.html'\n})\nexport class DeviceConfigurationListComponent {\n @Input() items: SupportedConfigurationItem[];\n @Input() itemIcon: string;\n @Input() emptyState: DeviceConfigurationListEmptyState;\n @Input() isFilterEnabled: boolean;\n @Output() configSelected = new EventEmitter<string>();\n selectedConfig;\n filterTerm: string = '';\n\n showConfigurationTypePreview(config): void {\n this.selectedConfig = config;\n this.configSelected.emit(config);\n }\n\n updatePipe(filterTerm: string) {\n this.filterTerm = filterTerm;\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { RepositoryService } from './../repository.service';\nimport { memoize } from '@c8y/ngx-components';\nimport { saveAs } from 'file-saver';\nimport { InventoryBinaryService } from '@c8y/client';\nimport { LinkRenderType } from './link-render-type.enum';\n\n@Component({\n selector: 'c8y-file-download',\n templateUrl: './file-download.component.html'\n})\nexport class FileDownloadComponent {\n @Input() url: string;\n linkRenderType = LinkRenderType;\n constructor(\n private repositoryService: RepositoryService,\n private inventoryBinaryService: InventoryBinaryService\n ) {}\n\n @memoize()\n getBinaryName$(binaryUrl) {\n return this.repositoryService.getBinaryName$(binaryUrl);\n }\n\n @memoize()\n determineBehavior(): LinkRenderType {\n let result: LinkRenderType;\n if (this.inventoryBinaryService.getIdFromUrl(this.url)) {\n result = LinkRenderType.DOWNLOAD;\n } else if (this.url.match(/\\/\\//g)) {\n result = LinkRenderType.LINK;\n } else {\n result = LinkRenderType.TEXTONLY;\n }\n return result;\n }\n\n async downloadFile() {\n const binary: File = await this.repositoryService.getBinaryFile(this.url, {\n allowExternal: false\n });\n saveAs(binary);\n }\n}\n","import { NgModule } from '@angular/core';\nimport {\n CoreModule,\n FormsModule,\n HOOK_NAVIGATOR_NODES,\n HOOK_ONCE_ROUTE,\n Route,\n ViewContext,\n gettext,\n OperationRealtimeService\n} from '@c8y/ngx-components';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { TabsModule } from 'ngx-bootstrap/tabs';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { SingleOperationDetailsModule } from '@c8y/ngx-components/operations/single-operation-details';\nimport { RepositoryService } from './repository.service';\nimport { FirmwareListComponent } from './firmware/firmware-list.component';\nimport { FirmwareDetailsComponent } from './firmware/firmware-details.component';\nimport { AddFirmwareModalComponent } from './firmware/add-firmware-modal.component';\nimport { AddFirmwarePatchModalComponent } from './firmware/add-firmware-patch-modal.component';\nimport { SoftwareListComponent } from './software/software-list.component';\nimport { SoftwareDetailsComponent } from './software/software-details.component';\nimport { AddSoftwareModalComponent } from './software/add-software-modal.component';\nimport { ConfigurationListComponent } from './configuration/configuration-list.component';\nimport { ConfigurationDetailComponent } from './configuration/configuration-detail.component';\nimport { RepositoryNavigationFactory } from './repository-navigation-factory';\nimport { FirmwareDeviceTabComponent } from './firmware-device-tab/firmware-device-tab.component';\nimport { FirmwareDeviceTabGuard } from './firmware-device-tab/firmware-device-tab.guard';\nimport { SoftwareDeviceTabComponent } from './software-device-tab/software-device-tab.component';\nimport { SoftwareDeviceTabGuard } from './software-device-tab/software-device-tab.guard';\nimport { InstalledSoftwareComponent } from './software-device-tab/installed-software.component';\nimport { RepositorySelectModalComponent } from './select-modal/repository-select-modal.component';\nimport { DeviceSoftwareListComponent } from './software-device-tab/device-software-list.component';\nimport { DeviceSoftwareChangesComponent } from './software-device-tab/device-software-changes.component';\nimport { DeviceConfigurationComponent } from './configuration-device-tab/device-configuration.component';\nimport { SourceCodePreviewComponent } from './configuration-device-tab/source-code-preview.component';\nimport { ConfigurationPreviewComponent } from './configuration-device-tab/configuration-preview.component';\nimport { ConfigurationFilterPipe } from './configuration-device-tab/configuration-filter.pipe';\nimport { SaveToRepositoryComponent } from './configuration-device-tab/save-to-repository.component';\nimport { DeviceConfigurationService } from './configuration-device-tab/device-configuration.service';\nimport { DeviceConfigurationGuard } from './configuration-device-tab/device-configuration.guard';\nimport { DeviceConfigurationListComponent } from './configuration-device-tab/device-configuration-list.component';\nimport { TextBasedConfigurationComponent } from './configuration-device-tab/text-based-configuration.component';\nimport { FileDownloadComponent } from './file-download/file-download.component';\n\n@NgModule({\n imports: [\n CoreModule,\n FormsModule,\n SingleOperationDetailsModule,\n BsDropdownModule.forRoot(),\n TooltipModule,\n PopoverModule,\n TabsModule.forRoot()\n ],\n exports: [],\n declarations: [\n FirmwareListComponent,\n FirmwareDetailsComponent,\n AddFirmwareModalComponent,\n AddFirmwarePatchModalComponent,\n SoftwareListComponent,\n SoftwareDetailsComponent,\n AddSoftwareModalComponent,\n FirmwareDeviceTabComponent,\n SoftwareDeviceTabComponent,\n InstalledSoftwareComponent,\n RepositorySelectModalComponent,\n DeviceSoftwareListComponent,\n DeviceSoftwareChangesComponent,\n ConfigurationListComponent,\n ConfigurationDetailComponent,\n DeviceConfigurationComponent,\n DeviceConfigurationListComponent,\n SourceCodePreviewComponent,\n ConfigurationPreviewComponent,\n ConfigurationFilterPipe,\n SaveToRepositoryComponent,\n TextBasedConfigurationComponent,\n FileDownloadComponent\n ],\n entryComponents: [\n FirmwareListComponent,\n FirmwareDetailsComponent,\n AddFirmwareModalComponent,\n AddFirmwarePatchModalComponent,\n SoftwareListComponent,\n SoftwareDetailsComponent,\n AddSoftwareModalComponent,\n FirmwareDeviceTabComponent,\n SoftwareDeviceTabComponent,\n DeviceSoftwareListComponent,\n RepositorySelectModalComponent,\n DeviceSoftwareChangesComponent,\n ConfigurationListComponent,\n ConfigurationDetailComponent,\n DeviceConfigurationComponent,\n SaveToRepositoryComponent,\n TextBasedConfigurationComponent\n ],\n providers: [\n RepositoryService,\n OperationRealtimeService,\n DeviceConfigurationService,\n FirmwareDeviceTabGuard,\n SoftwareDeviceTabGuard,\n DeviceConfigurationGuard,\n {\n provide: HOOK_NAVIGATOR_NODES,\n useClass: RepositoryNavigationFactory,\n multi: true\n },\n {\n provide: HOOK_ONCE_ROUTE,\n useValue: [\n {\n path: 'firmware',\n component: FirmwareListComponent\n },\n {\n path: 'firmware/:id',\n component: FirmwareDetailsComponent\n },\n {\n context: ViewContext.Device,\n path: 'firmware',\n component: FirmwareDeviceTabComponent,\n label: gettext('Firmware'),\n icon: 'c8y-firmware',\n priority: 500,\n canActivate: [FirmwareDeviceTabGuard]\n },\n {\n path: 'software',\n component: SoftwareListComponent\n },\n {\n path: 'software/:id',\n component: SoftwareDetailsComponent\n },\n {\n context: ViewContext.Device,\n path: 'software',\n component: SoftwareDeviceTabComponent,\n label: gettext('Software'),\n icon: 'c8y-tools',\n priority: 499,\n canActivate: [SoftwareDeviceTabGuard]\n },\n {\n path: 'configuration',\n component: ConfigurationListComponent\n },\n {\n context: ViewContext.Device,\n path: 'device-configuration',\n component: DeviceConfigurationComponent,\n label: gettext('Configuration'),\n icon: 'gears',\n priority: 600,\n canActivate: [DeviceConfigurationGuard]\n }\n ] as Route[],\n multi: true\n }\n ]\n})\nexport class RepositoryModule {}\n"]}