@c8y/ngx-components 1024.2.4 → 1024.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{c8y-ngx-components-asset-property-grid.component-DhfJagxU.mjs → c8y-ngx-components-asset-property-grid.component-Ddva2QJW.mjs} +35 -19
- package/fesm2022/c8y-ngx-components-asset-property-grid.component-Ddva2QJW.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-bookmarks.mjs +33 -23
- package/fesm2022/c8y-ngx-components-bookmarks.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +30 -16
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +3 -2
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +2 -2
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-profile.mjs +27 -9
- package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector.mjs +1538 -59
- package/fesm2022/c8y-ngx-components-icon-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +9 -11
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-data.mjs +52 -2
- package/fesm2022/c8y-ngx-components-remote-access-data.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs +17 -3
- package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs +184 -41
- package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs +94 -49
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs +5 -4
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-software.mjs +10 -4
- package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +5 -4
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs +6 -5
- package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +10 -5
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/de.po +327 -8
- package/locales/es.po +327 -8
- package/locales/fr.po +327 -8
- package/locales/ja_JP.po +325 -9
- package/locales/ko.po +327 -8
- package/locales/locales.pot +326 -7
- package/locales/nl.po +327 -8
- package/locales/pl.po +327 -8
- package/locales/pt_BR.po +327 -8
- package/locales/zh_CN.po +327 -8
- package/locales/zh_TW.po +327 -8
- package/package.json +1 -1
- package/types/c8y-ngx-components-bookmarks.d.ts +7 -7
- package/types/c8y-ngx-components-bookmarks.d.ts.map +1 -1
- package/types/c8y-ngx-components-context-dashboard.d.ts +7 -3
- package/types/c8y-ngx-components-context-dashboard.d.ts.map +1 -1
- package/types/c8y-ngx-components-device-profile.d.ts +5 -2
- package/types/c8y-ngx-components-device-profile.d.ts.map +1 -1
- package/types/c8y-ngx-components-icon-selector.d.ts +286 -32
- package/types/c8y-ngx-components-icon-selector.d.ts.map +1 -1
- package/types/c8y-ngx-components-protocol-opcua.d.ts.map +1 -1
- package/types/c8y-ngx-components-remote-access-data.d.ts +27 -1
- package/types/c8y-ngx-components-remote-access-data.d.ts.map +1 -1
- package/types/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.d.ts +10 -3
- package/types/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.d.ts.map +1 -1
- package/types/c8y-ngx-components-remote-access-terminal-viewer.d.ts +20 -2
- package/types/c8y-ngx-components-remote-access-terminal-viewer.d.ts.map +1 -1
- package/types/c8y-ngx-components-repository-configuration.d.ts +20 -10
- package/types/c8y-ngx-components-repository-configuration.d.ts.map +1 -1
- package/types/c8y-ngx-components-repository-firmware.d.ts.map +1 -1
- package/types/c8y-ngx-components-repository-software.d.ts +2 -0
- package/types/c8y-ngx-components-repository-software.d.ts.map +1 -1
- package/types/c8y-ngx-components-trusted-certificates.d.ts.map +1 -1
- package/types/c8y-ngx-components-widgets-implementations-asset-table.d.ts.map +1 -1
- package/types/c8y-ngx-components.d.ts +5 -1
- package/types/c8y-ngx-components.d.ts.map +1 -1
- package/fesm2022/c8y-ngx-components-asset-property-grid.component-DhfJagxU.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-repository-configuration.mjs","sources":["../../repository/configuration/device-tab/device-configuration.service.ts","../../repository/configuration/device-tab/text-based-configuration.component.ts","../../repository/configuration/device-tab/text-based-configuration.component.html","../../repository/configuration/device-tab/device-configuration.guard.ts","../../repository/configuration/device-tab/configuration-filter.pipe.ts","../../repository/configuration/list/configuration-detail.component.ts","../../repository/configuration/list/configuration-detail.component.html","../../repository/configuration/device-tab/source-code-preview.component.ts","../../repository/configuration/device-tab/source-code-preview.component.html","../../repository/configuration/device-tab/configuration-preview.component.ts","../../repository/configuration/device-tab/configuration-preview.component.html","../../repository/configuration/device-tab/device-configuration-list.component.ts","../../repository/configuration/device-tab/device-configuration-list.component.html","../../repository/configuration/device-tab/device-configuration.component.ts","../../repository/configuration/device-tab/device-configuration.component.html","../../repository/configuration/device-tab/save-to-repository.component.ts","../../repository/configuration/device-tab/save-to-repository.component.html","../../repository/configuration/device-tab/configuration-repository-device-tab.module.ts","../../repository/configuration/list/configuration-list.component.ts","../../repository/configuration/list/configuration-list.component.html","../../repository/configuration/list/configuration-repository-navigation-factory.ts","../../repository/configuration/list/configuration-repository-list.module.ts","../../repository/configuration/configuration-repository.module.ts","../../repository/configuration/c8y-ngx-components-repository-configuration.ts"],"sourcesContent":["import { EventEmitter, Injectable, Type } from '@angular/core';\nimport { BottomDrawerService } from '@c8y/ngx-components';\nimport { DeviceConfigurationOperation } from '@c8y/ngx-components/repository/shared';\nimport { IManagedObject } from '@c8y/client';\n\n@Injectable()\nexport class DeviceConfigurationService {\n configurationsUpdated = new EventEmitter<any>();\n\n constructor(private bottomDrawerService: BottomDrawerService) {}\n\n updateConfigurations(repositorySnapsOnly?: boolean) {\n this.configurationsUpdated.emit(repositorySnapsOnly);\n }\n\n /**\n * Opens a component in a bottom drawer prefilled with `initialState` and resolves once the\n * user saves (the drawer's `result` promise settles), or `false` if they cancel. Shared by\n * the \"Save to repository\" and \"Edit in repository\" flows, which differ only in the payload.\n */\n async openConfigurationDrawer<C extends { result: Promise<unknown> }>(\n component: Type<C>,\n initialState: Partial<C>\n ): Promise<boolean> {\n try {\n const drawer = this.bottomDrawerService.openDrawer(component, {\n disableClickOutside: true,\n closeOnNavigation: true,\n initialState\n });\n await drawer.instance.result;\n return true;\n } catch {\n return false;\n }\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 { IManagedObject, IOperation, InventoryService, OperationStatus } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AlertService, IconDirective, C8yTranslatePipe } from '@c8y/ngx-components';\nimport {\n DeviceConfigurationOperation,\n RepositoryService\n} from '@c8y/ngx-components/repository/shared';\nimport { DeviceConfigurationService } from './device-configuration.service';\nimport { NgClass } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { OperationDetailsComponent } from '@c8y/ngx-components/operations/operation-details';\n\n@Component({\n selector: 'c8y-text-based-configuration',\n templateUrl: './text-based-configuration.component.html',\n imports: [IconDirective, NgClass, FormsModule, OperationDetailsComponent, C8yTranslatePipe]\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 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.reloadingConfig =\n !!operation.c8y_SendConfiguration &&\n (operation.status === OperationStatus.PENDING ||\n operation.status === OperationStatus.EXECUTING);\n this.repositoryService.observeOperation(operation).subscribe(operationUpdate => {\n if (\n operationUpdate.status === OperationStatus.PENDING ||\n operationUpdate.status === OperationStatus.EXECUTING\n ) {\n this.latestOperation = operationUpdate;\n } else this.latestOperation = null;\n });\n }\n }\n\n get savingConfig() {\n return this.latestOperation\n ? !!this.latestOperation.c8y_Configuration &&\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.createObservedOperation(operationCfg).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.createObservedOperation(operationCfg).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 = (\n await this.inventoryService.detail(this.device.id, {\n withChildren: false\n })\n ).data;\n }\n}\n","<div class=\"d-flex d-col fit-h\">\n <fieldset class=\"card-block bg-level-1 fit-w\">\n <div class=\"content-flex-50\">\n <div class=\"m-l-auto d-flex\">\n @if (showTextBasedConfigReload) {\n <button\n class=\"btn btn-default btn-sm a-s-center m-t-8 m-b-8\"\n title=\"{{ 'Get configuration from device' | translate }}\"\n type=\"button\"\n (click)=\"reloadConfiguration()\"\n [disabled]=\"reloadingConfig || savingConfig\"\n >\n @if (reloadingConfig) {\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reloadingConfig }\"\n ></i>\n }\n @if (!reloadingConfig) {\n <i\n class=\"m-r-4\"\n c8yIcon=\"download\"\n ></i>\n }\n\n {{ 'Get configuration from device' | translate }}\n </button>\n }\n </div>\n </div>\n </fieldset>\n <div class=\"flex-grow\">\n <textarea\n class=\"form-control fit-h p-r-16 p-l-16\"\n [attr.aria-label]=\"'Operations' | translate\"\n [(ngModel)]=\"config\"\n [disabled]=\"reloadingConfig || savingConfig\"\n c8y-spellcheck=\"false\"\n ></textarea>\n </div>\n @if (latestOperation !== undefined) {\n <c8y-operation-details\n class=\"bg-level-2 p-0\"\n [operation]=\"latestOperation\"\n ></c8y-operation-details>\n }\n @if (showTextBasedConfigSave) {\n <div class=\"card-footer fit-w separator\">\n <button\n class=\"btn btn-primary\"\n id=\"send-config-btn\"\n type=\"button\"\n (click)=\"updateConfiguration(config)\"\n [disabled]=\"reloadingConfig || savingConfig || !config\"\n [ngClass]=\"{ 'btn-pending': savingConfig }\"\n >\n @if (!savingConfig) {\n <span title=\"{{ 'Send' | translate }}\">\n {{ 'Send configuration to device' | translate }}\n </span>\n }\n @if (savingConfig) {\n <span title=\"{{ 'Sending…' | translate }}\">\n {{ 'Sending…' | translate }}\n </span>\n }\n </button>\n </div>\n }\n</div>\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot } from '@angular/router';\nimport { DeviceConfigurationOperation } from '@c8y/ngx-components/repository/shared';\nimport { has } from 'lodash-es';\nimport { DeviceConfigurationService } from './device-configuration.service';\n\n@Injectable()\nexport class DeviceConfigurationGuard {\n constructor(private deviceConfigurationService: DeviceConfigurationService) {}\n\n canActivate(route: ActivatedRouteSnapshot) {\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 has(contextData, 'c8y_Configuration')\n );\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { SupportedConfigurationItem } from '@c8y/ngx-components/repository/shared';\n\n@Pipe({ name: 'configurationFilterPipe' })\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 { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnInit,\n computed,\n inject,\n signal\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport {\n FormControl,\n FormGroup,\n FormsModule,\n ReactiveFormsModule,\n Validators\n} from '@angular/forms';\nimport { IManagedObject, IResultList, InventoryBinaryService } from '@c8y/client';\nimport {\n AlertService,\n BottomDrawerRef,\n C8yTranslateDirective,\n C8yTranslatePipe,\n FilePickerComponent,\n ForOfDirective,\n ForOfFilterPipe,\n FormGroupComponent,\n HighlightComponent,\n IconDirective,\n ListItemComponent,\n MessagesComponent,\n RequiredInputPlaceholderDirective,\n SelectComponent,\n TextFilePicked,\n TypeaheadComponent,\n ValidationPattern,\n isBinaryFile\n} from '@c8y/ngx-components';\nimport { EditorComponent, MonacoEditorMarkerValidatorDirective } from '@c8y/ngx-components/editor';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n ModalModel,\n RepositoryService,\n RepositoryType\n} from '@c8y/ngx-components/repository/shared';\nimport { uniqBy } from 'lodash-es';\nimport { pipe } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nconst EXT_LANGUAGE_MAP: Record<string, string> = {\n json: 'json',\n yaml: 'yaml',\n yml: 'yaml',\n xml: 'xml',\n html: 'html',\n css: 'css',\n ts: 'typescript',\n js: 'javascript',\n md: 'markdown',\n toml: 'ini',\n properties: 'ini',\n ini: 'ini',\n conf: 'ini',\n cfg: 'ini',\n sh: 'shell'\n};\n\nexport function detectLanguage(filename: string): string {\n const ext = (filename.split('.').pop() ?? '').toLowerCase();\n return EXT_LANGUAGE_MAP[ext] ?? 'plaintext';\n}\n\nconst EXT_MIME_MAP: Record<string, string> = {\n json: 'application/json',\n xml: 'application/xml',\n yaml: 'application/yaml',\n yml: 'application/yaml',\n js: 'application/javascript',\n ts: 'application/typescript',\n html: 'text/html',\n css: 'text/css',\n md: 'text/markdown',\n sh: 'application/x-sh',\n toml: 'application/toml'\n};\n\nfunction mimeForFilename(filename: string): string {\n const ext = (filename.split('.').pop() ?? '').toLowerCase();\n return EXT_MIME_MAP[ext] ?? 'text/plain';\n}\n\ntype UploadChoice = 'uploadBinary' | 'uploadUrl' | 'editInline';\n\n/** Sentinel value meaning \"derive language from filename\". */\nconst AUTO_LANGUAGE = 'auto';\n\ninterface EditorLanguageOption {\n value: string;\n label: string;\n}\n\nconst EDITOR_LANGUAGES: EditorLanguageOption[] = [\n { value: AUTO_LANGUAGE, label: gettext('Auto (from filename)') },\n { value: 'json', label: gettext('JSON') },\n { value: 'javascript', label: gettext('JavaScript') },\n { value: 'typescript', label: gettext('TypeScript') },\n { value: 'css', label: gettext('CSS') },\n { value: 'html', label: gettext('HTML') },\n { value: 'yaml', label: gettext('YAML') },\n { value: 'markdown', label: gettext('Markdown') },\n { value: 'xml', label: gettext('XML') },\n { value: 'ini', label: gettext('INI / TOML / Properties') },\n { value: 'shell', label: gettext('Shell') },\n { value: 'plaintext', label: gettext('Plain text') }\n];\n\n@Component({\n selector: 'c8y-configuration-detail',\n templateUrl: './configuration-detail.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'd-contents' },\n imports: [\n ReactiveFormsModule,\n FormsModule,\n IconDirective,\n C8yTranslateDirective,\n FormGroupComponent,\n TypeaheadComponent,\n ForOfDirective,\n ListItemComponent,\n HighlightComponent,\n FilePickerComponent,\n NgClass,\n C8yTranslatePipe,\n EditorComponent,\n MonacoEditorMarkerValidatorDirective,\n MessagesComponent,\n RequiredInputPlaceholderDirective,\n SelectComponent\n ]\n})\nexport class ConfigurationDetailComponent implements ModalModel, OnInit {\n private readonly repositoryService = inject(RepositoryService);\n private readonly bottomDrawerRef = inject(BottomDrawerRef);\n private readonly alert = inject(AlertService);\n private readonly inventoryBinaryService = inject(InventoryBinaryService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n /** Set via BottomDrawerService initialState before ngOnInit */\n @Input() version: string;\n @Input() description: string;\n @Input() binary: { file?: File | null; url?: string } = { file: undefined, url: undefined };\n @Input() deviceType: string;\n @Input() mo: Partial<IManagedObject> = {};\n\n readonly form = new FormGroup({\n version: new FormControl('', [\n Validators.required,\n Validators.maxLength(254),\n Validators.pattern(ValidationPattern.rules.noWhiteSpaceOnly.pattern)\n ]),\n deviceType: new FormControl('', [\n Validators.maxLength(254),\n Validators.pattern(ValidationPattern.rules.noWhiteSpaceOnly.pattern)\n ]),\n description: new FormControl('', [\n Validators.maxLength(254),\n Validators.pattern(ValidationPattern.rules.noWhiteSpaceOnly.pattern)\n ]),\n uploadChoice: new FormControl<UploadChoice>('uploadBinary'),\n editorFilename: new FormControl('', [\n Validators.pattern(ValidationPattern.rules.noWhiteSpaceOnly.pattern)\n ]),\n editorLanguage: new FormControl<EditorLanguageOption>(EDITOR_LANGUAGES[0]),\n editorContent: new FormControl('')\n });\n\n configs: IResultList<Partial<IManagedObject>>;\n filterPipe: ForOfFilterPipe;\n existingBinary: File | undefined;\n configurationTypeMO: Partial<IManagedObject> = {};\n\n readonly saving = signal(false);\n readonly pattern = signal('');\n readonly isExternalUrl = signal(false);\n\n readonly ValidationPattern = ValidationPattern;\n readonly textForConfigurationUrlPopover: string =\n gettext(`Path for binaries can vary depending on device agent implementation, for example:\n /configuration/binaries/configuration1.bin\n https://configuration/binary/123\n ftp://configuration/binary/123.tar.gz\n Configurations with external URLs only work with the configuration typed devices (file-based configuration), not with devices with a legacy configuration.\n `);\n\n result: Promise<void> = new Promise((resolve, reject) => {\n this._save = resolve;\n this._cancel = reject;\n });\n\n private settled = false;\n\n private readonly editorFilenameValue = toSignal(this.form.controls.editorFilename.valueChanges, {\n initialValue: ''\n });\n private readonly editorLanguageValue = toSignal(this.form.controls.editorLanguage.valueChanges, {\n initialValue: EDITOR_LANGUAGES[0]\n });\n /** User's manual pick (when not \"auto\") wins over auto-detection from filename. */\n readonly editorLanguage = computed(() => {\n const picked = this.editorLanguageValue()?.value;\n return !picked || picked === AUTO_LANGUAGE\n ? detectLanguage(this.editorFilenameValue() ?? '')\n : picked;\n });\n readonly editorLanguages = EDITOR_LANGUAGES;\n readonly submitButtonTitle = computed(() =>\n this.mo?.id ? gettext('Update configuration') : gettext('Add configuration')\n );\n\n private _save: () => void;\n private _cancel: (reason?: unknown) => void;\n\n constructor() {\n this.form.controls.uploadChoice.valueChanges.pipe(takeUntilDestroyed()).subscribe(choice => {\n const ctrl = this.form.controls.editorFilename;\n if (choice === 'editInline') {\n ctrl.addValidators(Validators.required);\n } else {\n ctrl.removeValidators(Validators.required);\n }\n ctrl.updateValueAndValidity();\n });\n\n // Drawer can be closed externally (Escape, navigation, programmatic close).\n // Make sure the result promise is always settled, otherwise callers awaiting it hang.\n this.bottomDrawerRef.onClosed$.pipe(takeUntilDestroyed()).subscribe(() => {\n if (!this.settled) {\n this.settled = true;\n this._cancel('Drawer closed');\n }\n });\n }\n\n async ngOnInit(): Promise<void> {\n this.configs = await this.repositoryService.listRepositoryEntries(RepositoryType.CONFIGURATION);\n this.setPipe('');\n\n // Prefill when editing an existing entry (mo.id) or when the caller supplies\n // content to seed a new entry — e.g. saving a device snapshot to the repository.\n const shouldPrefill = !!(this.mo?.id || this.binary?.file || this.version);\n if (shouldPrefill) {\n this.configurationTypeMO = this.mo;\n const hasExternalUrl =\n !!this.binary?.url && !this.inventoryBinaryService.getIdFromUrl(this.binary.url);\n\n if (hasExternalUrl) {\n this.isExternalUrl.set(true);\n this.form.patchValue({\n version: this.version ?? '',\n deviceType: this.deviceType ?? '',\n description: this.description ?? '',\n uploadChoice: 'uploadUrl'\n });\n } else {\n const patchValues: {\n version: string;\n deviceType: string;\n description: string;\n uploadChoice: UploadChoice;\n editorContent?: string;\n editorFilename?: string;\n } = {\n version: this.version ?? '',\n deviceType: this.deviceType ?? '',\n description: this.description ?? '',\n uploadChoice: 'editInline'\n };\n\n if (this.binary?.file) {\n this.existingBinary = this.binary.file;\n // Decide from the content, not the declared MIME type: platform-served binaries\n // are often labelled text/plain, and their bytes must never open in the editor.\n if (await isBinaryFile(this.binary.file, { ignoreMimeType: true })) {\n patchValues.uploadChoice = 'uploadBinary';\n } else {\n patchValues.editorContent = await this.binary.file.text();\n patchValues.editorFilename = this.binary.file.name;\n }\n }\n\n this.form.patchValue(patchValues);\n }\n this.form.markAsDirty();\n }\n\n this.cdr.markForCheck();\n }\n\n cancel(): void {\n this.settled = true;\n this._cancel('User canceled');\n this.bottomDrawerRef.close();\n }\n\n setPipe(filterStr: string): void {\n this.pattern.set(filterStr);\n this.filterPipe = pipe(\n map(data => uniqBy(data as Partial<IManagedObject>[], 'configurationType')),\n map(data =>\n (data as Partial<IManagedObject>[]).filter(\n mo =>\n mo.configurationType &&\n mo.configurationType.toLowerCase().indexOf(filterStr.toLowerCase()) > -1\n )\n )\n );\n }\n\n onUploadChoiceChange(choice: UploadChoice): void {\n this.form.controls.uploadChoice.setValue(choice);\n this.form.markAsDirty();\n }\n\n onFileBinaryChange(file: File | undefined): void {\n this.binary = { ...this.binary, file };\n this.form.markAsDirty();\n this.cdr.markForCheck();\n }\n\n onFileUrlChange(url: string | undefined): void {\n this.binary = { ...this.binary, url };\n this.form.markAsDirty();\n this.cdr.markForCheck();\n }\n\n onTextFilePicked({ name, content }: TextFilePicked): void {\n this.form.patchValue({\n uploadChoice: 'editInline',\n editorFilename: name,\n editorContent: content\n });\n this.form.markAsDirty();\n this.cdr.markForCheck();\n }\n\n get isSaveDisabled(): boolean {\n if (this.saving() || !this.form.valid || this.form.pristine) {\n return true;\n }\n const { uploadChoice, editorFilename, editorContent } = this.form.value;\n if (uploadChoice === 'uploadBinary') {\n return !this.binary?.file;\n }\n if (uploadChoice === 'uploadUrl') {\n return !this.binary?.url?.trim();\n }\n if (uploadChoice === 'editInline') {\n return !editorFilename?.trim() || !editorContent;\n }\n return false;\n }\n\n async save(): Promise<void> {\n if (this.isSaveDisabled) {\n return;\n }\n try {\n this.saving.set(true);\n const { version, deviceType, description, uploadChoice, editorFilename, editorContent } =\n this.form.value;\n let binary = { ...this.binary };\n\n if (uploadChoice === 'uploadUrl') {\n binary = { url: this.binary?.url };\n } else if (uploadChoice === 'editInline') {\n binary = {\n file: new File([editorContent], editorFilename, { type: mimeForFilename(editorFilename) })\n };\n } else if (this.existingBinary === this.binary?.file && this.binary?.url) {\n // Editing an entry whose binary is unchanged: reuse the persisted url instead of\n // re-uploading. Only valid when a url exists — a new entry (e.g. from a device\n // snapshot) has no persisted binary, so its file must still be uploaded.\n binary = { ...this.binary, file: undefined };\n }\n\n await this.repositoryService.create(\n {\n version,\n description,\n binary,\n deviceType,\n configurationType: this.configurationTypeMO?.configurationType\n },\n RepositoryType.CONFIGURATION,\n this.mo\n );\n this.alert.success(\n this.mo?.id ? gettext('Configuration updated.') : gettext('Configuration created.')\n );\n this.settled = true;\n this._save();\n this.bottomDrawerRef.close();\n } catch (ex) {\n // Keep the drawer open so the user can fix and retry.\n // Do NOT settle the result promise here.\n this.alert.addServerFailure(ex);\n } finally {\n this.saving.set(false);\n }\n }\n}\n","<div class=\"card-header j-c-center separator flex-no-shrink p-24\">\n <i\n class=\"m-r-8\"\n [c8yIcon]=\"'cogs'\"\n aria-hidden=\"true\"\n ></i>\n <h4 id=\"drawerTitle\">\n @if (mo?.id) {\n {{ 'Update configuration' | translate }}\n } @else {\n {{ 'Add configuration' | translate }}\n }\n </h4>\n</div>\n\n<form\n class=\"d-contents\"\n [formGroup]=\"form\"\n (ngSubmit)=\"save()\"\n>\n <div\n class=\"card-body inner-scroll p-24\"\n [class.d-col]=\"form.value.uploadChoice === 'editInline'\"\n >\n <div class=\"row\">\n <c8y-form-group class=\"col-sm-3\">\n <label\n for=\"confVersion\"\n translate\n >\n Name\n </label>\n <input\n class=\"form-control\"\n id=\"confVersion\"\n placeholder=\"{{ 'e.g.' | translate }} hosts\"\n aria-required=\"true\"\n type=\"text\"\n autocomplete=\"off\"\n formControlName=\"version\"\n />\n </c8y-form-group>\n\n <c8y-form-group class=\"col-sm-3\">\n <label\n for=\"confDeviceType\"\n translate\n >\n Device type\n </label>\n <input\n class=\"form-control\"\n id=\"confDeviceType\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n type=\"text\"\n autocomplete=\"off\"\n formControlName=\"deviceType\"\n />\n </c8y-form-group>\n\n <c8y-form-group class=\"col-sm-3\">\n <label\n for=\"confDescription\"\n translate\n >\n Description\n </label>\n <input\n class=\"form-control\"\n id=\"confDescription\"\n placeholder=\"{{ 'e.g.' | translate }} Host configuration\"\n type=\"text\"\n autocomplete=\"off\"\n formControlName=\"description\"\n />\n </c8y-form-group>\n\n <c8y-form-group class=\"col-sm-3\">\n <label translate>Configuration type</label>\n <c8y-typeahead\n placeholder=\"{{ 'e.g.' | translate }} ssh\"\n name=\"confType\"\n data-cy=\"conf-detail--configuration-type\"\n [ngModel]=\"configurationTypeMO\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"configurationTypeMO = $event\"\n maxlength=\"254\"\n (onSearch)=\"setPipe($event)\"\n displayProperty=\"configurationType\"\n >\n @let patternStr = pattern();\n <c8y-li\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n *c8yFor=\"let config of configs; pipe: filterPipe; notFound: notFoundTemplate\"\n (click)=\"configurationTypeMO = config; setPipe('')\"\n [active]=\"configurationTypeMO === config\"\n >\n <c8y-highlight\n [text]=\"config.configurationType || '--'\"\n [pattern]=\"patternStr\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n @if (patternStr.length > 0) {\n <c8y-li class=\"bg-level-2 p-8\">\n <span translate>No match found.</span>\n <button\n class=\"btn btn-primary btn-xs m-l-8\"\n title=\"{{ 'Add new`configuration type`' | translate }}\"\n type=\"button\"\n translate\n >\n Add new`configuration type`\n </button>\n </c8y-li>\n }\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n </div>\n\n <fieldset\n class=\"d-col\"\n [class.flex-grow]=\"form.value.uploadChoice === 'editInline'\"\n [class.min-height-0]=\"form.value.uploadChoice === 'editInline'\"\n >\n <legend\n class=\"legend form-block m-t-40\"\n translate\n >\n Configuration file\n </legend>\n\n @if (isExternalUrl()) {\n <p\n class=\"text-muted m-b-8\"\n translate\n >\n Content is sourced from a remote URL and cannot be edited inline.\n </p>\n <c8y-form-group>\n <label\n for=\"confFileUrl\"\n translate\n >\n File URL\n </label>\n <input\n class=\"form-control\"\n id=\"confFileUrl\"\n placeholder=\"https://...\"\n type=\"url\"\n autocomplete=\"off\"\n [ngModel]=\"binary.url\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"binary = { url: $event }; form.markAsDirty()\"\n />\n </c8y-form-group>\n } @else {\n <c8y-file-picker\n [maxAllowedFiles]=\"1\"\n [allowedUploadChoices]=\"['uploadBinary', 'uploadUrl', 'editInline']\"\n [uploadChoice]=\"form.controls.uploadChoice.value\"\n (uploadChoiceChange)=\"onUploadChoiceChange($event)\"\n [fileUrl]=\"binary.url\"\n (fileUrlChange)=\"onFileUrlChange($event)\"\n [fileBinary]=\"binary.file\"\n (fileBinaryChange)=\"onFileBinaryChange($event)\"\n (textFilePicked)=\"onTextFilePicked($event)\"\n [fileUrlPopover]=\"textForConfigurationUrlPopover\"\n >\n <ng-container c8yInlineEditor>\n <div class=\"row\">\n <c8y-form-group class=\"col-sm-9\">\n <label\n for=\"confEditorFilename\"\n translate\n >\n Filename\n </label>\n <input\n class=\"form-control\"\n id=\"confEditorFilename\"\n placeholder=\"config.json\"\n aria-required=\"true\"\n type=\"text\"\n autocomplete=\"off\"\n formControlName=\"editorFilename\"\n />\n </c8y-form-group>\n <c8y-form-group class=\"col-sm-3\">\n <label\n for=\"confEditorLanguage\"\n translate\n >\n Language\n </label>\n <c8y-select\n aria-label=\"{{ 'Editor language' | translate }}\"\n id=\"confEditorLanguage\"\n [items]=\"editorLanguages\"\n formControlName=\"editorLanguage\"\n ></c8y-select>\n </c8y-form-group>\n </div>\n <c8y-form-group class=\"d-col flex-grow min-height-0 m-b-0\">\n <label\n for=\"confEditorContent\"\n translate\n >\n Content\n </label>\n <c8y-editor\n class=\"flex-grow\"\n style=\"min-height: 95px\"\n id=\"confEditorContent\"\n formControlName=\"editorContent\"\n monacoEditorMarkerValidator\n [editorOptions]=\"{ language: editorLanguage() }\"\n ></c8y-editor>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </ng-container>\n </c8y-file-picker>\n }\n </fieldset>\n </div>\n\n <div class=\"card-footer j-c-between separator flex-no-shrink p-24\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving()\"\n >\n <span translate>Cancel</span>\n </button>\n <button\n class=\"btn btn-primary\"\n [class.btn-pending]=\"saving()\"\n [title]=\"submitButtonTitle() | translate\"\n type=\"submit\"\n [disabled]=\"isSaveDisabled\"\n >\n {{ submitButtonTitle() | translate }}\n </button>\n </div>\n</form>\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnChanges,\n SimpleChanges,\n inject\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { EditorComponent } from '@c8y/ngx-components/editor';\nimport { mimeTypeToEditorLanguage } from '@c8y/ngx-components/repository/shared';\nimport type * as Monaco from 'monaco-editor';\n\n@Component({\n selector: 'c8y-source-code-preview',\n templateUrl: './source-code-preview.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [EditorComponent, FormsModule]\n})\nexport class SourceCodePreviewComponent implements OnChanges {\n @Input() isDisabled: boolean;\n @Input() text: string;\n @Input() binaryType: string;\n\n // Kept as a stable reference — a fresh object every change detection cycle would make the\n // editor re-run updateOptions() needlessly. Only rebuilt when the relevant inputs change.\n editorOptions: Monaco.editor.IStandaloneEditorConstructionOptions = this.buildEditorOptions();\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.isDisabled || changes.binaryType) {\n this.editorOptions = this.buildEditorOptions();\n }\n }\n\n onEditorInit(): void {\n this.cdr.detectChanges();\n }\n\n private buildEditorOptions(): Monaco.editor.IStandaloneEditorConstructionOptions {\n return {\n readOnly: this.isDisabled,\n language: mimeTypeToEditorLanguage(this.binaryType),\n minimap: { enabled: false },\n scrollBeyondLastLine: false\n };\n }\n}\n","<c8y-editor\n class=\"flex-grow\"\n [ngModel]=\"text\"\n [editorOptions]=\"editorOptions\"\n (editorInit)=\"onEditorInit()\"\n></c8y-editor>\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport {\n IManagedObject,\n IOperation,\n OperationService,\n OperationStatus,\n UserService\n} from '@c8y/client';\nimport {\n AlertService,\n AppStateService,\n C8yTranslateDirective,\n C8yTranslatePipe,\n DatePipe,\n IconDirective,\n OperationRealtimeService,\n Permissions\n} from '@c8y/ngx-components';\nimport {\n ConfigurationSnapshot,\n DeviceConfigurationOperation,\n RepositoryService\n} from '@c8y/ngx-components/repository/shared';\nimport { saveAs } from 'file-saver';\nimport { Subscription } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { ConfigurationDetailComponent } from '../list/configuration-detail.component';\nimport { DeviceConfigurationService } from './device-configuration.service';\n\nimport { OperationDetailsComponent } from '@c8y/ngx-components/operations/operation-details';\nimport { SourceCodePreviewComponent } from './source-code-preview.component';\n\n@Component({\n selector: 'c8y-device-configuration-preview',\n templateUrl: './configuration-preview.component.html',\n imports: [\n C8yTranslateDirective,\n IconDirective,\n SourceCodePreviewComponent,\n OperationDetailsComponent,\n C8yTranslatePipe,\n DatePipe\n ]\n})\nexport class ConfigurationPreviewComponent implements OnInit, OnDestroy {\n @Input() device: IManagedObject;\n\n @Input() set configurationType(type: string) {\n this._configurationType = type;\n this.setOperation(type);\n }\n\n get configurationType(): string {\n return this._configurationType;\n }\n\n @Input() configSnapshot: ConfigurationSnapshot;\n @Input() canSaveSnapshot: boolean;\n @Input() actionButtonText: string;\n @Input() actionButtonIcon: string;\n @Input() isLegacy = false;\n @Input() operationToTrigger:\n | DeviceConfigurationOperation.UPLOAD_CONFIG\n | DeviceConfigurationOperation.DOWNLOAD_CONFIG;\n @Input() editableRepositoryMo: IManagedObject;\n @Output() editInRepository = new EventEmitter<IManagedObject>();\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 operationRealtime: OperationRealtimeService,\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.setCanCallAction();\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 }\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 setCanCallAction(): void {\n this.canCallAction = this.deviceConfigurationService.hasAnySupportedOperation(\n this.device,\n this.operationToTrigger\n );\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].includes(this.operation.status)\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(): Promise<void> {\n const snapshot = this.configSnapshot;\n // Prefer the original binary (real bytes + filename) so the drawer can tell text\n // from binary: text opens in the inline editor, binary in the upload-binary option.\n const file =\n snapshot.binaryFile ??\n new File([snapshot.binary ?? ''], snapshot.name, { type: snapshot.binaryType });\n const saved = await this.deviceConfigurationService.openConfigurationDrawer(\n ConfigurationDetailComponent,\n {\n version: snapshot.name,\n deviceType: snapshot.deviceType,\n description: snapshot.description,\n binary: { file },\n // No id — the drawer treats this as a new entry, but carries the\n // configuration type so the user can review and edit before saving.\n mo: { configurationType: snapshot.configurationType }\n }\n );\n if (saved) {\n this.deviceConfigurationService.updateConfigurations(true);\n }\n }\n\n hasPermission(): boolean {\n return (\n this.user.hasAnyRole(this.appState.currentUser.value, [\n Permissions.ROLE_INVENTORY_ADMIN,\n Permissions.ROLE_INVENTORY_CREATE\n ]) ||\n (this.user.hasAnyRole(this.appState.currentUser.value, [\n Permissions.ROLE_MANAGED_OBJECT_ADMIN,\n Permissions.ROLE_MANAGED_OBJECT_CREATE\n ]) &&\n this.user.hasAnyRole(this.appState.currentUser.value, [\n Permissions.ROLE_BINARY_ADMIN,\n Permissions.ROLE_BINARY_CREATE\n ]))\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","<div class=\"content-flex-55 p-b-16\">\n <div class=\"col-7 p-t-4\">\n <p>\n <span\n class=\"text-label-small text-uppercase m-r-4\"\n translate\n >Configuration</span\n >\n @if (configSnapshot?.name) {\n <span>\n <strong>{{ configSnapshot.name }}</strong>\n </span>\n } @else {\n ---\n }\n </p>\n <p>\n <span\n class=\"text-label-small text-uppercase m-r-4\"\n translate\n >Last updated</span\n >\n @if (configSnapshot?.time) {\n <small>\n {{ configSnapshot.time | c8yDate }}\n </small>\n } @else {\n ---\n }\n </p>\n </div>\n <div class=\"col-5 d-flex j-c-end gap-4\">\n @if (editableRepositoryMo) {\n <button\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Edit in repository' | translate }}\"\n type=\"button\"\n (click)=\"editInRepository.emit(editableRepositoryMo)\"\n >\n <i\n [c8yIcon]=\"'pencil'\"\n aria-hidden=\"true\"\n ></i>\n {{ 'Edit in repository' | translate }}\n </button>\n }\n @if (canCallAction) {\n <button\n class=\"btn btn-default btn-sm\"\n title=\"{{ actionButtonText | translate }}\"\n id=\"action-btn\"\n type=\"button\"\n (click)=\"createDeviceOperation()\"\n [disabled]=\"isCreateOperationDisabled()\"\n >\n <i [c8yIcon]=\"actionButtonIcon\"></i>\n {{ actionButtonText | translate }}\n </button>\n }\n </div>\n</div>\n@if (!configSnapshot?.binary && showBinary()) {\n <div class=\"c8y-empty-state text-left\">\n <h1 [c8yIcon]=\"'file-image-o'\"></h1>\n <p>\n <strong translate>No preview available.</strong>\n <br />\n @if (configSnapshot?.binary !== '') {\n <small translate> The file is not available. </small>\n } @else {\n <small translate>The file is empty.</small>\n }\n </p>\n </div>\n}\n@if (configSnapshot?.binary && showBinary()) {\n <div class=\"flex-grow d-flex d-col\">\n <c8y-source-code-preview\n class=\"d-contents\"\n [text]=\"configSnapshot.binary\"\n [binaryType]=\"configSnapshot.binaryType\"\n [isDisabled]=\"true\"\n ></c8y-source-code-preview>\n @if (canSaveSnapshot) {\n <div class=\"p-t-16\">\n <button\n class=\"btn btn-primary btn-sm pull-right m-l-8\"\n title=\"{{ 'Download' | translate }}\"\n type=\"button\"\n (click)=\"download()\"\n >\n {{ 'Download' | translate }}\n </button>\n @if (hasPermission()) {\n <button\n class=\"btn btn-default btn-sm pull-right\"\n title=\"{{ 'Save to repository' | translate }}\"\n type=\"button\"\n (click)=\"saveToRepository()\"\n >\n {{ 'Save to repository' | translate }}\n </button>\n }\n </div>\n }\n </div>\n}\n@if (showOperation()) {\n <div>\n <c8y-operation-details [operation]=\"operation\"></c8y-operation-details>\n </div>\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport {\n DeviceConfigurationListEmptyState,\n SupportedConfigurationItem\n} from '@c8y/ngx-components/repository/shared';\nimport { NgIf, NgFor } from '@angular/common';\nimport { FilterInputComponent, IconDirective, C8yTranslatePipe } from '@c8y/ngx-components';\nimport { ConfigurationFilterPipe } from './configuration-filter.pipe';\n\n@Component({\n selector: 'c8y-device-configuration-list',\n templateUrl: './device-configuration-list.component.html',\n imports: [\n NgIf,\n FilterInputComponent,\n IconDirective,\n NgFor,\n C8yTranslatePipe,\n ConfigurationFilterPipe\n ]\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 = '';\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","<div class=\"p-l-16 m-b-8\" *ngIf=\"isFilterEnabled\">\n <c8y-filter [icon]=\"'search'\" (onSearch)=\"updatePipe($event)\"></c8y-filter>\n</div>\n\n<!-- EMPTY STATE -->\n<div class=\"c8y-empty-state text-left\" *ngIf=\"items?.length === 0\">\n <h1 [c8yIcon]=\"emptyState.icon\"></h1>\n <p>\n <strong>{{ emptyState.title | translate }}</strong>\n <br />\n <small>{{ emptyState.text | translate }}</small>\n </p>\n</div>\n\n<!-- CONFIGURATIONS AVAILABLE -->\n<div class=\"c8y-nav-stacked\">\n <button\n type=\"button\"\n class=\"c8y-stacked-item d-flex\"\n [class.active]=\"config === selectedConfig\"\n *ngFor=\"let config of items | configurationFilterPipe: filterTerm\"\n (click)=\"showConfigurationTypePreview(config)\"\n >\n <div class=\"list-item-icon\">\n <i [c8yIcon]=\"itemIcon\"></i>\n </div>\n <div class=\"list-item-body text-truncate\">\n <div class=\"d-flex\">\n <span class=\"text-truncate\" title=\"{{ config.name }}\">{{ config.name }}</span>\n <span class=\"text-label-small m-l-auto m-t-auto m-b-auto\">{{ config.deviceType }}</span>\n </div>\n </div>\n </button>\n</div>\n\n<!-- for Carlos: config.configurationType to differentiate whether a config matches configuration type. -->\n","import { NgClass } from '@angular/common';\nimport { Component, OnInit, ViewChild } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { IManagedObject } from '@c8y/client';\nimport {\n ActionBarItemComponent,\n C8yTranslateDirective,\n C8yTranslatePipe,\n EmptyStateComponent,\n IconDirective,\n TabsetAriaDirective\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n ConfigurationSnapshot,\n DeviceConfigurationListEmptyState,\n DeviceConfigurationOperation,\n RepositoryService,\n SupportedConfigurationItem\n} from '@c8y/ngx-components/repository/shared';\nimport { has } from 'lodash-es';\nimport { TabDirective, TabsetComponent } from 'ngx-bootstrap/tabs';\nimport { ConfigurationDetailComponent } from '../list/configuration-detail.component';\nimport { ConfigurationPreviewComponent } from './configuration-preview.component';\nimport { DeviceConfigurationListComponent } from './device-configuration-list.component';\nimport { DeviceConfigurationService } from './device-configuration.service';\nimport { TextBasedConfigurationComponent } from './text-based-configuration.component';\n\n@Component({\n selector: 'c8y-device-configuration',\n templateUrl: './device-configuration.component.html',\n imports: [\n ActionBarItemComponent,\n IconDirective,\n NgClass,\n TabsetAriaDirective,\n TabsetComponent,\n TabDirective,\n C8yTranslateDirective,\n DeviceConfigurationListComponent,\n EmptyStateComponent,\n ConfigurationPreviewComponent,\n TextBasedConfigurationComponent,\n C8yTranslatePipe\n ]\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 selectedRepositoryMo: IManagedObject;\n repositorySnapshotsEmptyState: DeviceConfigurationListEmptyState;\n device: IManagedObject;\n isLegacy: boolean;\n showTextBasedConfig: boolean;\n reloading = false;\n\n @ViewChild(TextBasedConfigurationComponent)\n textBasedConfigurationComponent: TextBasedConfigurationComponent;\n\n constructor(\n private route: ActivatedRoute,\n private deviceConfigurationService: DeviceConfigurationService,\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 =\n this.deviceConfigurationService.hasAnySupportedOperation(this.device, [\n DeviceConfigurationOperation.CONFIG,\n DeviceConfigurationOperation.SEND_CONFIG\n ]) || has(this.device, 'c8y_Configuration');\n }\n\n async onConfigTypeSelected(config) {\n this.configurationType = config.name;\n this.isLegacy = config.isLegacy;\n this.selectedRepositoryMo = undefined;\n this.updateSnapshots();\n }\n\n async onRepositoryConfigSelected(config) {\n this.selectedRepositoryMo = 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 this.repositorySnapshot.binaryType = binary.type || undefined;\n }\n } catch {\n // do nothing\n }\n }\n }\n\n async updateSnapshots(repositorySnapsOnly?: boolean) {\n this.reloading = true;\n this.repositorySnapshot = undefined;\n this.selectedRepositoryMo = 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 async openEditInRepository(mo: IManagedObject): Promise<void> {\n let fileBinary: File | null = null;\n try {\n fileBinary = await this.repositoryService.getBinaryFile(mo.url, { allowExternal: false });\n } catch {\n // Binary unavailable — drawer still opens; editor will be empty\n }\n const saved = await this.deviceConfigurationService.openConfigurationDrawer(\n ConfigurationDetailComponent,\n {\n version: mo.name,\n deviceType: mo.deviceType,\n description: mo.description,\n binary: { file: fileBinary, url: mo.url },\n mo\n }\n );\n if (saved) {\n this.updateSnapshots(true);\n }\n }\n}\n","<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"updateSnapshots()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reloading }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage card-has-tabs\">\n <tabset>\n @if (showBinaryBasedConfig && !showTextBasedConfig) {\n <div class=\"card-header separator\">\n <div class=\"card-title\">{{ 'Configurations' | translate }}</div>\n </div>\n }\n @if (!showBinaryBasedConfig && showTextBasedConfig) {\n <div class=\"card-header separator\">\n <div class=\"card-title\">{{ 'Text-based configuration' | translate }}</div>\n </div>\n }\n @if (showBinaryBasedConfig) {\n <tab heading=\"{{ 'Configurations' | translate }}\">\n <div class=\"card--grid card grid__col--4-8--md grid__row--6-6--md m-b-0\">\n <!-- DEVICE SUPPORTED CONFIGURATIONS -->\n <div class=\"card--grid__inner-scroll bg-level-1\">\n <div class=\"p-l-16 p-r-16\">\n <h5 class=\"legend form-block\">\n <span translate>Device-supported configurations</span>\n </h5>\n </div>\n <c8y-device-configuration-list\n [itemIcon]=\"'gears'\"\n [items]=\"supportedConfigurations\"\n (configSelected)=\"onConfigTypeSelected($event)\"\n ></c8y-device-configuration-list>\n </div>\n <!-- CONFIGURATION PREVIEW -->\n <div class=\"card--grid__inner-scroll d-flex d-col flex-grow\">\n <div class=\"card-block d-flex d-col flex-grow\">\n <h5 class=\"legend form-block\"><span translate>Preview</span></h5>\n <!-- EMPTY STATE -->\n @if (!configurationType) {\n <c8y-ui-empty-state\n [icon]=\"'file-text'\"\n [title]=\"'No configuration selected.' | translate\"\n [subtitle]=\"'Select a configuration to preview.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\n <!-- PREVIEW AVAILABLE STATE -->\n @if (configurationType) {\n <c8y-device-configuration-preview\n class=\"d-flex d-col flex-grow\"\n [actionButtonIcon]=\"'download'\"\n [device]=\"device\"\n [configurationType]=\"configurationType\"\n [configSnapshot]=\"configSnapshot\"\n [canSaveSnapshot]=\"true\"\n [operationToTrigger]=\"'c8y_UploadConfigFile'\"\n [actionButtonText]=\"'Get snapshot from device' | translate\"\n [isLegacy]=\"isLegacy\"\n ></c8y-device-configuration-preview>\n }\n </div>\n </div>\n <!-- AVAILABLE SUPPORTED CONFIGURATIONS -->\n <div class=\"card--grid__inner-scroll bg-level-1\">\n <div class=\"p-l-16 p-r-16\">\n <h5\n class=\"legend form-block\"\n translate\n >\n Available supported configurations\n </h5>\n </div>\n <!-- EMPTY STATE -->\n @if (!configurationType) {\n <c8y-ui-empty-state\n [icon]=\"'gears'\"\n [title]=\"'No selection.' | translate\"\n [subtitle]=\"\n 'Select a configuration from the device-supported configuration list.' | translate\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\n @if (configurationType) {\n <div class=\"p-r-16\">\n <c8y-device-configuration-list\n [itemIcon]=\"'file-text'\"\n [items]=\"repositorySnapshots\"\n [emptyState]=\"repositorySnapshotsEmptyState\"\n [isFilterEnabled]=\"true\"\n (configSelected)=\"onRepositoryConfigSelected($event)\"\n ></c8y-device-configuration-list>\n </div>\n }\n </div>\n <!-- CONFIGURATION PREVIEW -->\n <div class=\"card--grid__inner-scroll d-flex d-col flex-grow\">\n <div class=\"card-block flex-grow d-flex d-col\">\n <h5\n class=\"legend form-block\"\n translate\n >\n Preview\n </h5>\n <!-- EMPTY STATE -->\n @if (!repositorySnapshot) {\n <c8y-ui-empty-state\n [icon]=\"'file-text'\"\n [title]=\"'No configuration selected.' | translate\"\n [subtitle]=\"'Select a configuration to preview.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\n <!-- CONFIGURATION SELECTED STATE -->\n @if (repositorySnapshot) {\n <c8y-device-configuration-preview\n class=\"d-flex d-col flex-grow\"\n [actionButtonIcon]=\"'upload'\"\n [device]=\"device\"\n [configurationType]=\"configurationType\"\n [configSnapshot]=\"repositorySnapshot\"\n [operationToTrigger]=\"'c8y_DownloadConfigFile'\"\n [actionButtonText]=\"'Send configuration to device' | translate\"\n [isLegacy]=\"isLegacy\"\n [editableRepositoryMo]=\"selectedRepositoryMo\"\n (editInRepository)=\"openEditInRepository($event)\"\n ></c8y-device-configuration-preview>\n }\n </div>\n </div>\n </div>\n </tab>\n }\n @if (showTextBasedConfig) {\n <tab heading=\"{{ 'Text-based configuration' | translate }}\">\n <c8y-text-based-configuration></c8y-text-based-configuration>\n </tab>\n }\n </tabset>\n</div>\n","import { Component } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n IconDirective,\n C8yTranslateDirective,\n FormGroupComponent,\n RequiredInputPlaceholderDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport {\n ConfigurationSnapshot,\n RepositoryService,\n RepositoryType\n} from '@c8y/ngx-components/repository/shared';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { FormsModule } from '@angular/forms';\n\n@Component({\n selector: 'c8y-save-config-to-configuration-repository',\n templateUrl: 'save-to-repository.component.html',\n imports: [\n IconDirective,\n C8yTranslateDirective,\n FormsModule,\n FormGroupComponent,\n RequiredInputPlaceholderDirective,\n C8yTranslatePipe\n ]\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.create(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","<div class=\"modal-header dialog-header\">\n <i c8yIcon=\"gears\"></i>\n <h4 id=\"modal-title\" translate>\n Save configuration\n </h4>\n</div>\n<div class=\"modal-body\" id=\"modal-body\">\n <form #saveConfigurationSnapshot=\"ngForm\" class=\"p-t-24\">\n <c8y-form-group>\n <label translate for=\"name\">Name</label>\n <input\n id=\"name\"\n type=\"text\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"name\"\n [(ngModel)]=\"configSnapshot.name\"\n required\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"deviceType\">Device type</label>\n <input\n id=\"deviceType\"\n class=\"form-control\"\n rows=\"6\"\n name=\"deviceType\"\n [(ngModel)]=\"configSnapshot.deviceType\"\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"description\">Description</label>\n <input\n type=\"text\"\n id=\"description\"\n class=\"form-control\"\n maxlength=\"254\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"configSnapshot.description\"\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"configurationType\">Configuration type</label>\n <input\n id=\"configurationType\"\n class=\"form-control\"\n rows=\"6\"\n name=\"configurationType\"\n [(ngModel)]=\"configSnapshot.configurationType\"\n />\n </c8y-form-group>\n </form>\n</div>\n<div class=\"modal-footer\">\n <button title=\"{{ 'Cancel' | translate }}\" class=\"btn btn-default\" (click)=\"close()\" translate>\n Cancel\n </button>\n\n <button\n title=\"{{ 'Save configuration to repository' | translate }}\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"saveConfigurationSnapshot.form.invalid\"\n translate\n >\n Save\n </button>\n</div>\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { ViewContext, hookRoute } from '@c8y/ngx-components';\nimport { DeviceConfigurationGuard } from './device-configuration.guard';\nimport { DeviceConfigurationComponent } from './device-configuration.component';\nimport { ConfigurationPreviewComponent } from './configuration-preview.component';\nimport { ConfigurationFilterPipe } from './configuration-filter.pipe';\nimport { DeviceConfigurationService } from './device-configuration.service';\nimport { DeviceConfigurationListComponent } from './device-configuration-list.component';\nimport { TextBasedConfigurationComponent } from './text-based-configuration.component';\nimport { SaveToRepositoryComponent } from './save-to-repository.component';\nimport { SourceCodePreviewComponent } from './source-code-preview.component';\nimport { TabsModule } from 'ngx-bootstrap/tabs';\nimport { OperationDetailsModule } from '@c8y/ngx-components/operations/operation-details';\nimport { SharedRepositoryModule } from '@c8y/ngx-components/repository/shared';\n\n@NgModule({\n imports: [\n SharedRepositoryModule,\n OperationDetailsModule,\n TabsModule.forRoot(),\n DeviceConfigurationComponent,\n DeviceConfigurationListComponent,\n ConfigurationPreviewComponent,\n ConfigurationFilterPipe,\n SaveToRepositoryComponent,\n SourceCodePreviewComponent,\n TextBasedConfigurationComponent\n ],\n providers: [DeviceConfigurationService]\n})\nexport class ConfigurationRepositoryDeviceTabModule {\n static forRoot(): ModuleWithProviders<ConfigurationRepositoryDeviceTabModule> {\n return {\n ngModule: ConfigurationRepositoryDeviceTabModule,\n providers: [\n DeviceConfigurationGuard,\n hookRoute({\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 ]\n };\n }\n}\n","import { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, EventEmitter, inject, OnInit } from '@angular/core';\nimport { IManagedObject, InventoryBinaryService, IResultList } from '@c8y/client';\nimport {\n ActionBarItemComponent,\n ActionControl,\n AlertService,\n BottomDrawerService,\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n BuiltInActionType,\n C8yTranslateDirective,\n C8yTranslatePipe,\n Column,\n DataGridComponent,\n DataGridService,\n DataSourceModifier,\n EmptyStateComponent,\n EmptyStateContextDirective,\n GuideDocsComponent,\n GuideHrefDirective,\n HelpComponent,\n IconDirective,\n ModalService,\n ServerSideDataCallback,\n ServerSideDataResult,\n Status,\n TitleComponent\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n DescriptionGridColumn,\n DeviceTypeGridColumn,\n FileGridColumn,\n RepositoryItemNameGridColumn,\n RepositoryService,\n RepositoryType,\n TypeGridColumn\n} from '@c8y/ngx-components/repository/shared';\nimport { TranslateService } from '@ngx-translate/core';\nimport { saveAs } from 'file-saver';\nimport { ConfigurationDetailComponent } from './configuration-detail.component';\n\n@Component({\n selector: 'c8y-configuration-list',\n templateUrl: './configuration-list.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n TitleComponent,\n C8yTranslateDirective,\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n ActionBarItemComponent,\n IconDirective,\n HelpComponent,\n DataGridComponent,\n EmptyStateContextDirective,\n EmptyStateComponent,\n GuideDocsComponent,\n GuideHrefDirective,\n AsyncPipe,\n C8yTranslatePipe\n ]\n})\nexport class ConfigurationListComponent implements OnInit {\n private readonly alert = inject(AlertService);\n private readonly gridService = inject(DataGridService);\n private readonly repositoryService = inject(RepositoryService);\n private readonly bottomDrawerService = inject(BottomDrawerService);\n private readonly modalService = inject(ModalService);\n private readonly translateService = inject(TranslateService);\n private readonly inventoryBinaryService = inject(InventoryBinaryService);\n\n readonly refresh$: EventEmitter<void> = new EventEmitter();\n readonly pagination = {\n pageSize: 50,\n currentPage: 1\n };\n readonly noResultsMessage = gettext('No results to display.');\n readonly noDataMessage = gettext('There are no configuration snapshots defined.');\n readonly noResultsSubtitle = gettext('Refine your search terms or check your spelling.');\n readonly noDataSubtitle = gettext('Add a configuration snapshot first.');\n actionControls: ActionControl[] = [];\n columns: Column[] = [\n new RepositoryItemNameGridColumn({\n filterLabel: gettext('Filter configurations by name'),\n placeholder: gettext('SSH'),\n callback: this.edit.bind(this)\n }),\n new DescriptionGridColumn({\n filterLabel: gettext('Filter configurations by description'),\n placeholder: gettext('SSH configuration')\n }),\n new FileGridColumn(),\n new DeviceTypeGridColumn({\n path: 'deviceType',\n filterLabel: gettext('Filter configurations by device type')\n }),\n new TypeGridColumn({\n header: gettext('Configuration type'),\n filterLabel: gettext('Filter by configuration type'),\n example: 'ssh',\n path: 'configurationType',\n repositoryType: RepositoryType.CONFIGURATION\n })\n ];\n size$: Promise<number>;\n sizeRequestDone = false;\n serverSideDataCallback: ServerSideDataCallback;\n\n private readonly DELETED_SUCCESS_MSG = gettext('Configuration deleted.');\n\n constructor() {\n this.serverSideDataCallback = this.onDataSourceModifier.bind(this);\n }\n\n ngOnInit() {\n this.actionControls.push({\n type: BuiltInActionType.Edit,\n callback: this.edit.bind(this)\n });\n this.actionControls.push({\n type: BuiltInActionType.Delete,\n callback: this.delete.bind(this)\n });\n this.actionControls.push({\n type: 'download',\n icon: 'download',\n text: gettext('Download'),\n showIf: row => this.isBinaryFile(row as unknown as IManagedObject),\n callback: this.download.bind(this)\n });\n }\n\n async onDataSourceModifier(\n dataSourceModifier: DataSourceModifier\n ): Promise<ServerSideDataResult> {\n const dataRequest: Promise<IResultList<IManagedObject>> =\n this.repositoryService.listRepositoryEntries(RepositoryType.CONFIGURATION, {\n query: this.gridService.getQueryObj(dataSourceModifier.columns),\n skipDefaultOrder: true,\n params: {\n pageSize: dataSourceModifier.pagination.pageSize,\n currentPage: dataSourceModifier.pagination.currentPage,\n withTotalPages: true\n }\n });\n\n const filtererdSizeRequest: Promise<number> = this.repositoryService\n .listRepositoryEntries(RepositoryType.CONFIGURATION, {\n query: this.gridService.getQueryObj(dataSourceModifier.columns),\n skipDefaultOrder: true,\n params: { pageSize: 1 }\n })\n .then(response => response?.paging?.totalPages);\n\n this.size$ = this.repositoryService\n .listRepositoryEntries(RepositoryType.CONFIGURATION, {\n skipDefaultOrder: true,\n params: { pageSize: 1 }\n })\n .then(response => {\n this.sizeRequestDone = true;\n return response?.paging?.totalPages;\n });\n\n const [dataResponse, size, filteredSize] = await Promise.all([\n dataRequest,\n this.size$,\n filtererdSizeRequest\n ]);\n\n const { res, data, paging } = dataResponse;\n\n const serverSideDataResult: ServerSideDataResult = {\n res,\n data,\n paging,\n filteredSize,\n size\n };\n\n return serverSideDataResult;\n }\n\n async add() {\n try {\n const drawer = this.bottomDrawerService.openDrawer(ConfigurationDetailComponent, {\n disableClickOutside: true,\n closeOnNavigation: true\n });\n await drawer.instance.result;\n this.refresh$.next();\n } catch (ex) {\n // intended empty — user canceled or save failed (error displayed by detail component)\n }\n }\n\n async edit(configuration: IManagedObject) {\n let fileBinary: File | null = null;\n try {\n fileBinary = await this.repositoryService.getBinaryFile(configuration.url, {\n allowExternal: false\n });\n } catch {\n // Binary unavailable — drawer still opens; editor will be empty\n }\n try {\n const drawer = this.bottomDrawerService.openDrawer(ConfigurationDetailComponent, {\n disableClickOutside: true,\n closeOnNavigation: true,\n initialState: {\n version: configuration.name,\n deviceType: configuration.deviceType,\n description: configuration.description,\n binary: { file: fileBinary, url: configuration.url },\n mo: configuration\n }\n });\n await drawer.instance.result;\n this.refresh$.next();\n } catch (ex) {\n // intended empty — user canceled or save failed (error displayed by detail component)\n }\n }\n\n isBinaryFile(configuration: IManagedObject) {\n return configuration.url\n ? !!this.inventoryBinaryService.getIdFromUrl(configuration.url)\n : false;\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 this.refresh$.next();\n } catch (ex) {\n if (ex) {\n this.alert.addServerFailure(ex);\n }\n }\n }\n\n trackByName(_index, column: Column): string {\n return column.name;\n }\n}\n","<c8y-title>\n <span\n class=\"m-r-4\"\n translate\n >\n Configuration repository\n </span>\n <small>\n {{ size$ | async }}\n <span translate>snapshots</span>\n </small>\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n icon=\"c8y-management\"\n label=\"{{ 'Management' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n icon=\"gears\"\n label=\"{{ 'Configuration repository' | translate }}\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add configuration snapshot' | translate }}\"\n type=\"button\"\n (click)=\"add()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add configuration snapshot' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help\n src=\"/docs/device-management-application/managing-device-data/#managing-configurations\"\n></c8y-help>\n\n<div class=\"content-fullpage border-top border-bottom\">\n <c8y-data-grid\n [title]=\"'Configurations' | translate\"\n [refresh]=\"refresh$\"\n [pagination]=\"pagination\"\n [columns]=\"columns\"\n [actionControls]=\"actionControls\"\n [infiniteScroll]=\"'auto'\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n >\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'gears'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"stats?.size > 0\"\n >\n @if (stats?.size === 0) {\n <p>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add configuration snapshot' | translate }}\"\n type=\"button\"\n (click)=\"add()\"\n >\n {{ 'Add configuration snapshot' | translate }}\n </button>\n </p>\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a\n c8y-guide-href=\"/docs/device-management-application/managing-device-data/#managing-configurations\"\n >\n user documentation</a\n >.\n </small>\n </p>\n }\n </c8y-ui-empty-state>\n </c8y-data-grid>\n</div>\n","import { Injectable } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { NavigatorNode, NavigatorNodeFactory } from '@c8y/ngx-components';\n\n@Injectable()\nexport class ConfigurationRepositoryNavigationFactory implements NavigatorNodeFactory {\n node: NavigatorNode;\n\n constructor() {\n this.node = new NavigatorNode({\n label: gettext('Configuration repository'),\n path: 'configuration',\n icon: 'gears',\n parent: gettext('Management'),\n priority: 800\n });\n }\n\n get(): NavigatorNode {\n return this.node;\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { ConfigurationListComponent } from './configuration-list.component';\nimport { ConfigurationDetailComponent } from './configuration-detail.component';\nimport { hookNavigator, hookRoute } from '@c8y/ngx-components';\nimport { ConfigurationRepositoryNavigationFactory } from './configuration-repository-navigation-factory';\nimport { SharedRepositoryModule } from '@c8y/ngx-components/repository/shared';\n\n@NgModule({\n imports: [SharedRepositoryModule, ConfigurationListComponent, ConfigurationDetailComponent]\n})\nexport class ConfigurationRepositoryListModule {\n static forRoot(): ModuleWithProviders<ConfigurationRepositoryListModule> {\n return {\n ngModule: ConfigurationRepositoryListModule,\n providers: [\n hookNavigator(ConfigurationRepositoryNavigationFactory),\n hookRoute({\n path: 'configuration',\n component: ConfigurationListComponent\n })\n ]\n };\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CoreModule, FormsModule } from '@c8y/ngx-components';\nimport { ConfigurationRepositoryDeviceTabModule } from './device-tab/configuration-repository-device-tab.module';\nimport { ConfigurationRepositoryListModule } from './list/configuration-repository-list.module';\n\n@NgModule({\n imports: [\n CoreModule,\n FormsModule,\n ConfigurationRepositoryListModule.forRoot(),\n ConfigurationRepositoryDeviceTabModule.forRoot()\n ]\n})\nexport class ConfigurationRepositoryModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i4.DeviceConfigurationService","i5","i6","i1.DeviceConfigurationService","i3","i4","i2.DeviceConfigurationService","FormsModule","i1.ConfigurationRepositoryListModule","i2.ConfigurationRepositoryDeviceTabModule"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-repository-configuration.mjs","sources":["../../repository/configuration/device-tab/device-configuration.service.ts","../../repository/configuration/editor-languages.ts","../../repository/configuration/device-tab/text-based-configuration.component.ts","../../repository/configuration/device-tab/text-based-configuration.component.html","../../repository/configuration/device-tab/device-configuration.guard.ts","../../repository/configuration/device-tab/configuration-filter.pipe.ts","../../repository/configuration/list/configuration-detail.component.ts","../../repository/configuration/list/configuration-detail.component.html","../../repository/configuration/device-tab/source-code-preview.component.ts","../../repository/configuration/device-tab/source-code-preview.component.html","../../repository/configuration/device-tab/configuration-preview.component.ts","../../repository/configuration/device-tab/configuration-preview.component.html","../../repository/configuration/device-tab/device-configuration-list.component.ts","../../repository/configuration/device-tab/device-configuration-list.component.html","../../repository/configuration/device-tab/device-configuration.component.ts","../../repository/configuration/device-tab/device-configuration.component.html","../../repository/configuration/device-tab/save-to-repository.component.ts","../../repository/configuration/device-tab/save-to-repository.component.html","../../repository/configuration/device-tab/configuration-repository-device-tab.module.ts","../../repository/configuration/list/configuration-list.component.ts","../../repository/configuration/list/configuration-list.component.html","../../repository/configuration/list/configuration-repository-navigation-factory.ts","../../repository/configuration/list/configuration-repository-list.module.ts","../../repository/configuration/configuration-repository.module.ts","../../repository/configuration/c8y-ngx-components-repository-configuration.ts"],"sourcesContent":["import { EventEmitter, Injectable, Type } from '@angular/core';\nimport { BottomDrawerService } from '@c8y/ngx-components';\nimport { DeviceConfigurationOperation } from '@c8y/ngx-components/repository/shared';\nimport { IManagedObject } from '@c8y/client';\n\n@Injectable()\nexport class DeviceConfigurationService {\n configurationsUpdated = new EventEmitter<any>();\n\n constructor(private bottomDrawerService: BottomDrawerService) {}\n\n updateConfigurations(repositorySnapsOnly?: boolean) {\n this.configurationsUpdated.emit(repositorySnapsOnly);\n }\n\n /**\n * Opens a component in a bottom drawer prefilled with `initialState` and resolves once the\n * user saves (the drawer's `result` promise settles), or `false` if they cancel. Shared by\n * the \"Save to repository\" and \"Edit in repository\" flows, which differ only in the payload.\n */\n async openConfigurationDrawer<C extends { result: Promise<unknown> }>(\n component: Type<C>,\n initialState: Partial<C>\n ): Promise<boolean> {\n try {\n const drawer = this.bottomDrawerService.openDrawer(component, {\n disableClickOutside: true,\n closeOnNavigation: true,\n initialState\n });\n await drawer.instance.result;\n return true;\n } catch {\n return false;\n }\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 { gettext } from '@c8y/ngx-components/gettext';\n\nexport interface EditorLanguageOption {\n value: string;\n label: string;\n}\n\n/** Shared language list for Monaco-based configuration editors (no \"Auto\" option). */\nexport const EDITOR_LANGUAGES: EditorLanguageOption[] = [\n { value: 'json', label: gettext('JSON') },\n { value: 'javascript', label: gettext('JavaScript') },\n { value: 'typescript', label: gettext('TypeScript') },\n { value: 'css', label: gettext('CSS') },\n { value: 'html', label: gettext('HTML') },\n { value: 'yaml', label: gettext('YAML') },\n { value: 'markdown', label: gettext('Markdown') },\n { value: 'xml', label: gettext('XML') },\n { value: 'ini', label: gettext('INI / TOML / Properties') },\n { value: 'shell', label: gettext('Shell') },\n { value: 'plaintext', label: gettext('Plain text') }\n];\n","import { Component, DestroyRef, OnInit, computed, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute } from '@angular/router';\nimport { IManagedObject, IOperation, InventoryService, OperationStatus } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n IconDirective,\n C8yTranslatePipe,\n SelectComponent\n} from '@c8y/ngx-components';\nimport { EditorComponent } from '@c8y/ngx-components/editor';\nimport {\n DeviceConfigurationOperation,\n RepositoryService\n} from '@c8y/ngx-components/repository/shared';\nimport { DeviceConfigurationService } from './device-configuration.service';\nimport { NgClass } from '@angular/common';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { OperationDetailsComponent } from '@c8y/ngx-components/operations/operation-details';\nimport type * as Monaco from 'monaco-editor';\nimport { EDITOR_LANGUAGES, EditorLanguageOption } from '../editor-languages';\n\n// Device text configs are plain text by default — put plaintext first in the picker.\nconst PLAINTEXT_OPTION = EDITOR_LANGUAGES[EDITOR_LANGUAGES.length - 1];\nconst TEXT_EDITOR_LANGUAGES: EditorLanguageOption[] = [\n PLAINTEXT_OPTION,\n ...EDITOR_LANGUAGES.slice(0, -1)\n];\n\n@Component({\n selector: 'c8y-text-based-configuration',\n templateUrl: './text-based-configuration.component.html',\n imports: [\n IconDirective,\n NgClass,\n ReactiveFormsModule,\n EditorComponent,\n OperationDetailsComponent,\n C8yTranslatePipe,\n SelectComponent\n ]\n})\nexport class TextBasedConfigurationComponent implements OnInit {\n device: IManagedObject;\n showTextBasedConfigReload: boolean;\n showTextBasedConfigSave: boolean;\n\n readonly reloadingConfig = signal(false);\n readonly latestOperation = signal<IOperation>(undefined);\n\n readonly form = new FormGroup({\n config: new FormControl(''),\n language: new FormControl<EditorLanguageOption>(PLAINTEXT_OPTION)\n });\n\n readonly editorLanguages = TEXT_EDITOR_LANGUAGES;\n\n private readonly editorLanguageValue = toSignal(this.form.controls.language.valueChanges, {\n initialValue: PLAINTEXT_OPTION\n });\n readonly editorLanguage = computed(() => this.editorLanguageValue()?.value ?? 'plaintext');\n\n readonly savingConfig = computed(() => {\n const operation = this.latestOperation();\n return operation\n ? !!operation.c8y_Configuration &&\n (operation.status === OperationStatus.PENDING ||\n operation.status === OperationStatus.EXECUTING)\n : false;\n });\n\n // Read-only is driven through editorOptions (not the form control's disabled state) because\n // the editor only applies the disabled state at creation time. computed() keeps the reference\n // stable until read-only actually changes, so the editor does not re-run updateOptions() needlessly.\n readonly editorOptions = computed<Monaco.editor.IStandaloneEditorConstructionOptions>(() => ({\n language: this.editorLanguage(),\n readOnly: this.reloadingConfig() || this.savingConfig(),\n minimap: { enabled: false },\n scrollBeyondLastLine: false\n }));\n\n private readonly destroyRef = inject(DestroyRef);\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 get configControl(): FormControl<string> {\n return this.form.controls.config;\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.configControl.setValue(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.reloadingConfig.set(\n !!operation.c8y_SendConfiguration &&\n (operation.status === OperationStatus.PENDING ||\n operation.status === OperationStatus.EXECUTING)\n );\n this.repositoryService\n .observeOperation(operation)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(operationUpdate => {\n if (\n operationUpdate.status === OperationStatus.PENDING ||\n operationUpdate.status === OperationStatus.EXECUTING\n ) {\n this.latestOperation.set(operationUpdate);\n } else this.latestOperation.set(null);\n });\n }\n }\n\n async reloadConfiguration() {\n this.reloadingConfig.set(true);\n const operationCfg = await this.repositoryService.createTextBasedConfigurationReloadOperation(\n this.device\n );\n try {\n this.repositoryService.createObservedOperation(operationCfg).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.createObservedOperation(operationCfg).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.set(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.set(operationUpdate);\n this.reloadingConfig.set(false);\n }\n\n private async onOperationReloadComplete() {\n await this.loadDevice();\n this.configControl.setValue(this.device.c8y_Configuration.config);\n this.reloadingConfig.set(false);\n }\n\n private onOperationUpdateSuccess(operationUpdate) {\n this.latestOperation.set(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.set(operationUpdate);\n }\n\n private onOperationUpdateComplete() {\n this.device.c8y_Configuration.config = this.configControl.value;\n }\n\n private async loadDevice() {\n this.device = (\n await this.inventoryService.detail(this.device.id, {\n withChildren: false\n })\n ).data;\n }\n}\n","<div\n class=\"d-flex d-col fit-h min-height-0\"\n [formGroup]=\"form\"\n>\n <fieldset class=\"card-block bg-level-1 fit-w\">\n <div class=\"content-flex-50 d-flex a-i-center\">\n <label\n class=\"m-r-8 flex-no-shrink\"\n for=\"textCfgEditorLanguage\"\n translate\n >\n Language\n </label>\n <c8y-select\n aria-label=\"{{ 'Editor language' | translate }}\"\n id=\"textCfgEditorLanguage\"\n [items]=\"editorLanguages\"\n formControlName=\"language\"\n ></c8y-select>\n <div class=\"m-l-auto d-flex\">\n @if (showTextBasedConfigReload) {\n <button\n class=\"btn btn-default btn-sm a-s-center m-t-8 m-b-8\"\n title=\"{{ 'Get configuration from device' | translate }}\"\n type=\"button\"\n (click)=\"reloadConfiguration()\"\n [disabled]=\"reloadingConfig() || savingConfig()\"\n >\n @if (reloadingConfig()) {\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reloadingConfig() }\"\n ></i>\n }\n @if (!reloadingConfig()) {\n <i\n class=\"m-r-4\"\n c8yIcon=\"download\"\n ></i>\n }\n\n {{ 'Get configuration from device' | translate }}\n </button>\n }\n </div>\n </div>\n </fieldset>\n <div class=\"p-relative flex-grow min-height-0\">\n <c8y-editor\n class=\"p-absolute top-0 left-0 fit-w fit-h\"\n formControlName=\"config\"\n [editorOptions]=\"editorOptions()\"\n ></c8y-editor>\n </div>\n @if (latestOperation() !== undefined) {\n <c8y-operation-details\n class=\"bg-level-2 p-0\"\n [operation]=\"latestOperation()\"\n ></c8y-operation-details>\n }\n @if (showTextBasedConfigSave) {\n <div class=\"card-footer flex-no-shrink fit-w separator\">\n <button\n class=\"btn btn-primary\"\n id=\"send-config-btn\"\n type=\"button\"\n (click)=\"updateConfiguration(configControl.value)\"\n [disabled]=\"reloadingConfig() || savingConfig() || !configControl.value\"\n [ngClass]=\"{ 'btn-pending': savingConfig() }\"\n >\n @if (!savingConfig()) {\n <span title=\"{{ 'Send' | translate }}\">\n {{ 'Send configuration to device' | translate }}\n </span>\n }\n @if (savingConfig()) {\n <span title=\"{{ 'Sending…' | translate }}\">\n {{ 'Sending…' | translate }}\n </span>\n }\n </button>\n </div>\n }\n</div>\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot } from '@angular/router';\nimport { DeviceConfigurationOperation } from '@c8y/ngx-components/repository/shared';\nimport { has } from 'lodash-es';\nimport { DeviceConfigurationService } from './device-configuration.service';\n\n@Injectable()\nexport class DeviceConfigurationGuard {\n constructor(private deviceConfigurationService: DeviceConfigurationService) {}\n\n canActivate(route: ActivatedRouteSnapshot) {\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 has(contextData, 'c8y_Configuration')\n );\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { SupportedConfigurationItem } from '@c8y/ngx-components/repository/shared';\n\n@Pipe({ name: 'configurationFilterPipe' })\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 { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnInit,\n computed,\n inject,\n signal\n} from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport {\n FormControl,\n FormGroup,\n FormsModule,\n ReactiveFormsModule,\n Validators\n} from '@angular/forms';\nimport { IManagedObject, IResultList, InventoryBinaryService } from '@c8y/client';\nimport {\n AlertService,\n BottomDrawerRef,\n C8yTranslateDirective,\n C8yTranslatePipe,\n FilePickerComponent,\n ForOfDirective,\n ForOfFilterPipe,\n FormGroupComponent,\n HighlightComponent,\n IconDirective,\n ListItemComponent,\n MessagesComponent,\n RequiredInputPlaceholderDirective,\n SelectComponent,\n TextFilePicked,\n TypeaheadComponent,\n ValidationPattern,\n isBinaryFile\n} from '@c8y/ngx-components';\nimport { EditorComponent, MonacoEditorMarkerValidatorDirective } from '@c8y/ngx-components/editor';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n ModalModel,\n RepositoryService,\n RepositoryType\n} from '@c8y/ngx-components/repository/shared';\nimport { EDITOR_LANGUAGES, EditorLanguageOption } from '../editor-languages';\nimport { uniqBy } from 'lodash-es';\nimport { pipe } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\nconst EXT_LANGUAGE_MAP: Record<string, string> = {\n json: 'json',\n yaml: 'yaml',\n yml: 'yaml',\n xml: 'xml',\n html: 'html',\n css: 'css',\n ts: 'typescript',\n js: 'javascript',\n md: 'markdown',\n toml: 'ini',\n properties: 'ini',\n ini: 'ini',\n conf: 'ini',\n cfg: 'ini',\n sh: 'shell'\n};\n\nexport function detectLanguage(filename: string): string {\n const ext = (filename.split('.').pop() ?? '').toLowerCase();\n return EXT_LANGUAGE_MAP[ext] ?? 'plaintext';\n}\n\nconst EXT_MIME_MAP: Record<string, string> = {\n json: 'application/json',\n xml: 'application/xml',\n yaml: 'application/yaml',\n yml: 'application/yaml',\n js: 'application/javascript',\n ts: 'application/typescript',\n html: 'text/html',\n css: 'text/css',\n md: 'text/markdown',\n sh: 'application/x-sh',\n toml: 'application/toml'\n};\n\nfunction mimeForFilename(filename: string): string {\n const ext = (filename.split('.').pop() ?? '').toLowerCase();\n return EXT_MIME_MAP[ext] ?? 'text/plain';\n}\n\ntype UploadChoice = 'uploadBinary' | 'uploadUrl' | 'editInline';\n\n/** Sentinel value meaning \"derive language from filename\". */\nconst AUTO_LANGUAGE = 'auto';\nconst AUTO_LANGUAGE_OPTION: EditorLanguageOption = {\n value: AUTO_LANGUAGE,\n label: gettext('Auto (from filename)')\n};\n\n@Component({\n selector: 'c8y-configuration-detail',\n templateUrl: './configuration-detail.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'd-contents' },\n imports: [\n ReactiveFormsModule,\n FormsModule,\n IconDirective,\n C8yTranslateDirective,\n FormGroupComponent,\n TypeaheadComponent,\n ForOfDirective,\n ListItemComponent,\n HighlightComponent,\n FilePickerComponent,\n NgClass,\n C8yTranslatePipe,\n EditorComponent,\n MonacoEditorMarkerValidatorDirective,\n MessagesComponent,\n RequiredInputPlaceholderDirective,\n SelectComponent\n ]\n})\nexport class ConfigurationDetailComponent implements ModalModel, OnInit {\n private readonly repositoryService = inject(RepositoryService);\n private readonly bottomDrawerRef = inject(BottomDrawerRef);\n private readonly alert = inject(AlertService);\n private readonly inventoryBinaryService = inject(InventoryBinaryService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n /** Set via BottomDrawerService initialState before ngOnInit */\n @Input() version: string;\n @Input() description: string;\n @Input() binary: { file?: File | null; url?: string } = { file: undefined, url: undefined };\n @Input() deviceType: string;\n @Input() mo: Partial<IManagedObject> = {};\n\n readonly form = new FormGroup({\n version: new FormControl('', [\n Validators.required,\n Validators.maxLength(254),\n Validators.pattern(ValidationPattern.rules.noWhiteSpaceOnly.pattern)\n ]),\n deviceType: new FormControl('', [\n Validators.maxLength(254),\n Validators.pattern(ValidationPattern.rules.noWhiteSpaceOnly.pattern)\n ]),\n description: new FormControl('', [\n Validators.maxLength(254),\n Validators.pattern(ValidationPattern.rules.noWhiteSpaceOnly.pattern)\n ]),\n uploadChoice: new FormControl<UploadChoice>('uploadBinary'),\n editorFilename: new FormControl('', [\n Validators.pattern(ValidationPattern.rules.noWhiteSpaceOnly.pattern)\n ]),\n editorLanguage: new FormControl<EditorLanguageOption>(AUTO_LANGUAGE_OPTION),\n editorContent: new FormControl('')\n });\n\n configs: IResultList<Partial<IManagedObject>>;\n filterPipe: ForOfFilterPipe;\n existingBinary: File | undefined;\n configurationTypeMO: Partial<IManagedObject> = {};\n\n readonly saving = signal(false);\n readonly pattern = signal('');\n readonly isExternalUrl = signal(false);\n\n readonly ValidationPattern = ValidationPattern;\n readonly textForConfigurationUrlPopover: string =\n gettext(`Path for binaries can vary depending on device agent implementation, for example:\n /configuration/binaries/configuration1.bin\n https://configuration/binary/123\n ftp://configuration/binary/123.tar.gz\n Configurations with external URLs only work with the configuration typed devices (file-based configuration), not with devices with a legacy configuration.\n `);\n\n result: Promise<void> = new Promise((resolve, reject) => {\n this._save = resolve;\n this._cancel = reject;\n });\n\n private settled = false;\n\n private readonly editorFilenameValue = toSignal(this.form.controls.editorFilename.valueChanges, {\n initialValue: ''\n });\n private readonly editorLanguageValue = toSignal(this.form.controls.editorLanguage.valueChanges, {\n initialValue: AUTO_LANGUAGE_OPTION\n });\n /** User's manual pick (when not \"auto\") wins over auto-detection from filename. */\n readonly editorLanguage = computed(() => {\n const picked = this.editorLanguageValue()?.value;\n return !picked || picked === AUTO_LANGUAGE\n ? detectLanguage(this.editorFilenameValue() ?? '')\n : picked;\n });\n readonly editorLanguages = [AUTO_LANGUAGE_OPTION, ...EDITOR_LANGUAGES];\n readonly submitButtonTitle = computed(() =>\n this.mo?.id ? gettext('Update configuration') : gettext('Add configuration')\n );\n\n private _save: () => void;\n private _cancel: (reason?: unknown) => void;\n\n constructor() {\n this.form.controls.uploadChoice.valueChanges.pipe(takeUntilDestroyed()).subscribe(choice => {\n const ctrl = this.form.controls.editorFilename;\n if (choice === 'editInline') {\n ctrl.addValidators(Validators.required);\n } else {\n ctrl.removeValidators(Validators.required);\n }\n ctrl.updateValueAndValidity();\n });\n\n // Drawer can be closed externally (Escape, navigation, programmatic close).\n // Make sure the result promise is always settled, otherwise callers awaiting it hang.\n this.bottomDrawerRef.onClosed$.pipe(takeUntilDestroyed()).subscribe(() => {\n if (!this.settled) {\n this.settled = true;\n this._cancel('Drawer closed');\n }\n });\n }\n\n async ngOnInit(): Promise<void> {\n this.configs = await this.repositoryService.listRepositoryEntries(RepositoryType.CONFIGURATION);\n this.setPipe('');\n\n // Prefill when editing an existing entry (mo.id) or when the caller supplies\n // content to seed a new entry — e.g. saving a device snapshot to the repository.\n const shouldPrefill = !!(this.mo?.id || this.binary?.file || this.version);\n if (shouldPrefill) {\n this.configurationTypeMO = this.mo;\n const hasExternalUrl =\n !!this.binary?.url && !this.inventoryBinaryService.getIdFromUrl(this.binary.url);\n\n if (hasExternalUrl) {\n this.isExternalUrl.set(true);\n this.form.patchValue({\n version: this.version ?? '',\n deviceType: this.deviceType ?? '',\n description: this.description ?? '',\n uploadChoice: 'uploadUrl'\n });\n } else {\n const patchValues: {\n version: string;\n deviceType: string;\n description: string;\n uploadChoice: UploadChoice;\n editorContent?: string;\n editorFilename?: string;\n } = {\n version: this.version ?? '',\n deviceType: this.deviceType ?? '',\n description: this.description ?? '',\n uploadChoice: 'editInline'\n };\n\n if (this.binary?.file) {\n this.existingBinary = this.binary.file;\n // Decide from the content, not the declared MIME type: platform-served binaries\n // are often labelled text/plain, and their bytes must never open in the editor.\n if (await isBinaryFile(this.binary.file, { ignoreMimeType: true })) {\n patchValues.uploadChoice = 'uploadBinary';\n } else {\n patchValues.editorContent = await this.binary.file.text();\n patchValues.editorFilename = this.binary.file.name;\n }\n }\n\n this.form.patchValue(patchValues);\n }\n this.form.markAsDirty();\n }\n\n this.cdr.markForCheck();\n }\n\n cancel(): void {\n this.settled = true;\n this._cancel('User canceled');\n this.bottomDrawerRef.close();\n }\n\n setPipe(filterStr: string): void {\n this.pattern.set(filterStr);\n this.filterPipe = pipe(\n map(data => uniqBy(data as Partial<IManagedObject>[], 'configurationType')),\n map(data =>\n (data as Partial<IManagedObject>[]).filter(\n mo =>\n mo.configurationType &&\n mo.configurationType.toLowerCase().indexOf(filterStr.toLowerCase()) > -1\n )\n )\n );\n }\n\n onUploadChoiceChange(choice: UploadChoice): void {\n this.form.controls.uploadChoice.setValue(choice);\n this.form.markAsDirty();\n }\n\n onFileBinaryChange(file: File | undefined): void {\n this.binary = { ...this.binary, file };\n this.form.markAsDirty();\n this.cdr.markForCheck();\n }\n\n onFileUrlChange(url: string | undefined): void {\n this.binary = { ...this.binary, url };\n this.form.markAsDirty();\n this.cdr.markForCheck();\n }\n\n onTextFilePicked({ name, content }: TextFilePicked): void {\n this.form.patchValue({\n uploadChoice: 'editInline',\n editorFilename: name,\n editorContent: content\n });\n this.form.markAsDirty();\n this.cdr.markForCheck();\n }\n\n get isSaveDisabled(): boolean {\n if (this.saving() || !this.form.valid || this.form.pristine) {\n return true;\n }\n const { uploadChoice, editorFilename, editorContent } = this.form.value;\n if (uploadChoice === 'uploadBinary') {\n return !this.binary?.file;\n }\n if (uploadChoice === 'uploadUrl') {\n return !this.binary?.url?.trim();\n }\n if (uploadChoice === 'editInline') {\n return !editorFilename?.trim() || !editorContent;\n }\n return false;\n }\n\n async save(): Promise<void> {\n if (this.isSaveDisabled) {\n return;\n }\n try {\n this.saving.set(true);\n const { version, deviceType, description, uploadChoice, editorFilename, editorContent } =\n this.form.value;\n let binary = { ...this.binary };\n\n if (uploadChoice === 'uploadUrl') {\n binary = { url: this.binary?.url };\n } else if (uploadChoice === 'editInline') {\n binary = {\n file: new File([editorContent], editorFilename, { type: mimeForFilename(editorFilename) })\n };\n } else if (this.existingBinary === this.binary?.file && this.binary?.url) {\n // Editing an entry whose binary is unchanged: reuse the persisted url instead of\n // re-uploading. Only valid when a url exists — a new entry (e.g. from a device\n // snapshot) has no persisted binary, so its file must still be uploaded.\n binary = { ...this.binary, file: undefined };\n }\n\n await this.repositoryService.create(\n {\n version,\n description,\n binary,\n deviceType,\n configurationType: this.configurationTypeMO?.configurationType\n },\n RepositoryType.CONFIGURATION,\n this.mo\n );\n this.alert.success(\n this.mo?.id ? gettext('Configuration updated.') : gettext('Configuration created.')\n );\n this.settled = true;\n this._save();\n this.bottomDrawerRef.close();\n } catch (ex) {\n // Keep the drawer open so the user can fix and retry.\n // Do NOT settle the result promise here.\n this.alert.addServerFailure(ex);\n } finally {\n this.saving.set(false);\n }\n }\n}\n","<div class=\"card-header j-c-center separator flex-no-shrink p-24\">\n <i\n class=\"m-r-8\"\n [c8yIcon]=\"'cogs'\"\n aria-hidden=\"true\"\n ></i>\n <h4 id=\"drawerTitle\">\n @if (mo?.id) {\n {{ 'Update configuration' | translate }}\n } @else {\n {{ 'Add configuration' | translate }}\n }\n </h4>\n</div>\n\n<form\n class=\"d-contents\"\n [formGroup]=\"form\"\n (ngSubmit)=\"save()\"\n>\n <div\n class=\"card-body inner-scroll p-24\"\n [class.d-col]=\"form.value.uploadChoice === 'editInline'\"\n >\n <div class=\"row\">\n <c8y-form-group class=\"col-sm-3\">\n <label\n for=\"confVersion\"\n translate\n >\n Name\n </label>\n <input\n class=\"form-control\"\n id=\"confVersion\"\n placeholder=\"{{ 'e.g.' | translate }} hosts\"\n aria-required=\"true\"\n type=\"text\"\n autocomplete=\"off\"\n formControlName=\"version\"\n />\n </c8y-form-group>\n\n <c8y-form-group class=\"col-sm-3\">\n <label\n for=\"confDeviceType\"\n translate\n >\n Device type\n </label>\n <input\n class=\"form-control\"\n id=\"confDeviceType\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n type=\"text\"\n autocomplete=\"off\"\n formControlName=\"deviceType\"\n />\n </c8y-form-group>\n\n <c8y-form-group class=\"col-sm-3\">\n <label\n for=\"confDescription\"\n translate\n >\n Description\n </label>\n <input\n class=\"form-control\"\n id=\"confDescription\"\n placeholder=\"{{ 'e.g.' | translate }} Host configuration\"\n type=\"text\"\n autocomplete=\"off\"\n formControlName=\"description\"\n />\n </c8y-form-group>\n\n <c8y-form-group class=\"col-sm-3\">\n <label translate>Configuration type</label>\n <c8y-typeahead\n placeholder=\"{{ 'e.g.' | translate }} ssh\"\n name=\"confType\"\n data-cy=\"conf-detail--configuration-type\"\n [ngModel]=\"configurationTypeMO\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"configurationTypeMO = $event\"\n maxlength=\"254\"\n (onSearch)=\"setPipe($event)\"\n displayProperty=\"configurationType\"\n >\n @let patternStr = pattern();\n <c8y-li\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n *c8yFor=\"let config of configs; pipe: filterPipe; notFound: notFoundTemplate\"\n (click)=\"configurationTypeMO = config; setPipe('')\"\n [active]=\"configurationTypeMO === config\"\n >\n <c8y-highlight\n [text]=\"config.configurationType || '--'\"\n [pattern]=\"patternStr\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n @if (patternStr.length > 0) {\n <c8y-li class=\"bg-level-2 p-8\">\n <span translate>No match found.</span>\n <button\n class=\"btn btn-primary btn-xs m-l-8\"\n title=\"{{ 'Add new`configuration type`' | translate }}\"\n type=\"button\"\n translate\n >\n Add new`configuration type`\n </button>\n </c8y-li>\n }\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n </div>\n\n <fieldset\n class=\"d-col\"\n [class.flex-grow]=\"form.value.uploadChoice === 'editInline'\"\n [class.min-height-0]=\"form.value.uploadChoice === 'editInline'\"\n >\n <legend\n class=\"legend form-block m-t-40\"\n translate\n >\n Configuration file\n </legend>\n\n @if (isExternalUrl()) {\n <p\n class=\"text-muted m-b-8\"\n translate\n >\n Content is sourced from a remote URL and cannot be edited inline.\n </p>\n <c8y-form-group>\n <label\n for=\"confFileUrl\"\n translate\n >\n File URL\n </label>\n <input\n class=\"form-control\"\n id=\"confFileUrl\"\n placeholder=\"https://...\"\n type=\"url\"\n autocomplete=\"off\"\n [ngModel]=\"binary.url\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"binary = { url: $event }; form.markAsDirty()\"\n />\n </c8y-form-group>\n } @else {\n <c8y-file-picker\n [maxAllowedFiles]=\"1\"\n [allowedUploadChoices]=\"['uploadBinary', 'uploadUrl', 'editInline']\"\n [uploadChoice]=\"form.controls.uploadChoice.value\"\n (uploadChoiceChange)=\"onUploadChoiceChange($event)\"\n [fileUrl]=\"binary.url\"\n (fileUrlChange)=\"onFileUrlChange($event)\"\n [fileBinary]=\"binary.file\"\n (fileBinaryChange)=\"onFileBinaryChange($event)\"\n (textFilePicked)=\"onTextFilePicked($event)\"\n [fileUrlPopover]=\"textForConfigurationUrlPopover\"\n >\n <ng-container c8yInlineEditor>\n <div class=\"row\">\n <c8y-form-group class=\"col-sm-9\">\n <label\n for=\"confEditorFilename\"\n translate\n >\n Filename\n </label>\n <input\n class=\"form-control\"\n id=\"confEditorFilename\"\n placeholder=\"config.json\"\n aria-required=\"true\"\n type=\"text\"\n autocomplete=\"off\"\n formControlName=\"editorFilename\"\n />\n </c8y-form-group>\n <c8y-form-group class=\"col-sm-3\">\n <label\n for=\"confEditorLanguage\"\n translate\n >\n Language\n </label>\n <c8y-select\n aria-label=\"{{ 'Editor language' | translate }}\"\n id=\"confEditorLanguage\"\n [items]=\"editorLanguages\"\n formControlName=\"editorLanguage\"\n ></c8y-select>\n </c8y-form-group>\n </div>\n <c8y-form-group class=\"d-col flex-grow min-height-0 m-b-0\">\n <label\n for=\"confEditorContent\"\n translate\n >\n Content\n </label>\n <c8y-editor\n class=\"flex-grow\"\n style=\"min-height: 95px\"\n id=\"confEditorContent\"\n formControlName=\"editorContent\"\n monacoEditorMarkerValidator\n [editorOptions]=\"{ language: editorLanguage() }\"\n ></c8y-editor>\n <c8y-messages></c8y-messages>\n </c8y-form-group>\n </ng-container>\n </c8y-file-picker>\n }\n </fieldset>\n </div>\n\n <div class=\"card-footer j-c-between separator flex-no-shrink p-24\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving()\"\n >\n <span translate>Cancel</span>\n </button>\n <button\n class=\"btn btn-primary\"\n [class.btn-pending]=\"saving()\"\n [title]=\"submitButtonTitle() | translate\"\n type=\"submit\"\n [disabled]=\"isSaveDisabled\"\n >\n {{ submitButtonTitle() | translate }}\n </button>\n </div>\n</form>\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnChanges,\n SimpleChanges,\n inject\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { EditorComponent } from '@c8y/ngx-components/editor';\nimport { mimeTypeToEditorLanguage } from '@c8y/ngx-components/repository/shared';\nimport type * as Monaco from 'monaco-editor';\n\n@Component({\n selector: 'c8y-source-code-preview',\n templateUrl: './source-code-preview.component.html',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [EditorComponent, FormsModule]\n})\nexport class SourceCodePreviewComponent implements OnChanges {\n @Input() isDisabled: boolean;\n @Input() text: string;\n @Input() binaryType: string;\n\n // Kept as a stable reference — a fresh object every change detection cycle would make the\n // editor re-run updateOptions() needlessly. Only rebuilt when the relevant inputs change.\n editorOptions: Monaco.editor.IStandaloneEditorConstructionOptions = this.buildEditorOptions();\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.isDisabled || changes.binaryType) {\n this.editorOptions = this.buildEditorOptions();\n }\n }\n\n onEditorInit(): void {\n this.cdr.detectChanges();\n }\n\n private buildEditorOptions(): Monaco.editor.IStandaloneEditorConstructionOptions {\n return {\n readOnly: this.isDisabled,\n language: mimeTypeToEditorLanguage(this.binaryType),\n minimap: { enabled: false },\n scrollBeyondLastLine: false\n };\n }\n}\n","<c8y-editor\n class=\"flex-grow\"\n [ngModel]=\"text\"\n [editorOptions]=\"editorOptions\"\n (editorInit)=\"onEditorInit()\"\n></c8y-editor>\n","import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport {\n IManagedObject,\n IOperation,\n OperationService,\n OperationStatus,\n UserService\n} from '@c8y/client';\nimport {\n AlertService,\n AppStateService,\n C8yTranslateDirective,\n C8yTranslatePipe,\n DatePipe,\n IconDirective,\n OperationRealtimeService,\n Permissions\n} from '@c8y/ngx-components';\nimport {\n ConfigurationSnapshot,\n DeviceConfigurationOperation,\n RepositoryService\n} from '@c8y/ngx-components/repository/shared';\nimport { saveAs } from 'file-saver';\nimport { Subscription } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { ConfigurationDetailComponent } from '../list/configuration-detail.component';\nimport { DeviceConfigurationService } from './device-configuration.service';\n\nimport { OperationDetailsComponent } from '@c8y/ngx-components/operations/operation-details';\nimport { SourceCodePreviewComponent } from './source-code-preview.component';\n\n@Component({\n selector: 'c8y-device-configuration-preview',\n templateUrl: './configuration-preview.component.html',\n imports: [\n C8yTranslateDirective,\n IconDirective,\n SourceCodePreviewComponent,\n OperationDetailsComponent,\n C8yTranslatePipe,\n DatePipe\n ]\n})\nexport class ConfigurationPreviewComponent implements OnInit, OnDestroy {\n @Input() device: IManagedObject;\n\n @Input() set configurationType(type: string) {\n this._configurationType = type;\n this.setOperation(type);\n }\n\n get configurationType(): string {\n return this._configurationType;\n }\n\n @Input() configSnapshot: ConfigurationSnapshot;\n @Input() canSaveSnapshot: boolean;\n @Input() actionButtonText: string;\n @Input() actionButtonIcon: string;\n @Input() isLegacy = false;\n @Input() operationToTrigger:\n | DeviceConfigurationOperation.UPLOAD_CONFIG\n | DeviceConfigurationOperation.DOWNLOAD_CONFIG;\n @Input() editableRepositoryMo: IManagedObject;\n @Output() editInRepository = new EventEmitter<IManagedObject>();\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 operationRealtime: OperationRealtimeService,\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.setCanCallAction();\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 }\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 setCanCallAction(): void {\n this.canCallAction = this.deviceConfigurationService.hasAnySupportedOperation(\n this.device,\n this.operationToTrigger\n );\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].includes(this.operation.status)\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(): Promise<void> {\n const snapshot = this.configSnapshot;\n // Prefer the original binary (real bytes + filename) so the drawer can tell text\n // from binary: text opens in the inline editor, binary in the upload-binary option.\n const file =\n snapshot.binaryFile ??\n new File([snapshot.binary ?? ''], snapshot.name, { type: snapshot.binaryType });\n const saved = await this.deviceConfigurationService.openConfigurationDrawer(\n ConfigurationDetailComponent,\n {\n version: snapshot.name,\n deviceType: snapshot.deviceType,\n description: snapshot.description,\n binary: { file },\n // No id — the drawer treats this as a new entry, but carries the\n // configuration type so the user can review and edit before saving.\n mo: { configurationType: snapshot.configurationType }\n }\n );\n if (saved) {\n this.deviceConfigurationService.updateConfigurations(true);\n }\n }\n\n hasPermission(): boolean {\n return (\n this.user.hasAnyRole(this.appState.currentUser.value, [\n Permissions.ROLE_INVENTORY_ADMIN,\n Permissions.ROLE_INVENTORY_CREATE\n ]) ||\n (this.user.hasAnyRole(this.appState.currentUser.value, [\n Permissions.ROLE_MANAGED_OBJECT_ADMIN,\n Permissions.ROLE_MANAGED_OBJECT_CREATE\n ]) &&\n this.user.hasAnyRole(this.appState.currentUser.value, [\n Permissions.ROLE_BINARY_ADMIN,\n Permissions.ROLE_BINARY_CREATE\n ]))\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","<div class=\"content-flex-55 p-b-16\">\n <div class=\"col-7 p-t-4\">\n <p>\n <span\n class=\"text-label-small text-uppercase m-r-4\"\n translate\n >Configuration</span\n >\n @if (configSnapshot?.name) {\n <span>\n <strong>{{ configSnapshot.name }}</strong>\n </span>\n } @else {\n ---\n }\n </p>\n <p>\n <span\n class=\"text-label-small text-uppercase m-r-4\"\n translate\n >Last updated</span\n >\n @if (configSnapshot?.time) {\n <small>\n {{ configSnapshot.time | c8yDate }}\n </small>\n } @else {\n ---\n }\n </p>\n </div>\n <div class=\"col-5 d-flex j-c-end gap-4\">\n @if (editableRepositoryMo) {\n <button\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Edit in repository' | translate }}\"\n type=\"button\"\n (click)=\"editInRepository.emit(editableRepositoryMo)\"\n >\n <i\n [c8yIcon]=\"'pencil'\"\n aria-hidden=\"true\"\n ></i>\n {{ 'Edit in repository' | translate }}\n </button>\n }\n @if (canCallAction) {\n <button\n class=\"btn btn-default btn-sm\"\n title=\"{{ actionButtonText | translate }}\"\n id=\"action-btn\"\n type=\"button\"\n (click)=\"createDeviceOperation()\"\n [disabled]=\"isCreateOperationDisabled()\"\n >\n <i [c8yIcon]=\"actionButtonIcon\"></i>\n {{ actionButtonText | translate }}\n </button>\n }\n </div>\n</div>\n@if (!configSnapshot?.binary && showBinary()) {\n <div class=\"c8y-empty-state text-left\">\n <h1 [c8yIcon]=\"'file-image-o'\"></h1>\n <p>\n <strong translate>No preview available.</strong>\n <br />\n @if (configSnapshot?.binary !== '') {\n <small translate> The file is not available. </small>\n } @else {\n <small translate>The file is empty.</small>\n }\n </p>\n </div>\n}\n@if (configSnapshot?.binary && showBinary()) {\n <div class=\"flex-grow d-flex d-col\">\n <c8y-source-code-preview\n class=\"d-contents\"\n [text]=\"configSnapshot.binary\"\n [binaryType]=\"configSnapshot.binaryType\"\n [isDisabled]=\"true\"\n ></c8y-source-code-preview>\n @if (canSaveSnapshot) {\n <div class=\"p-t-16\">\n <button\n class=\"btn btn-primary btn-sm pull-right m-l-8\"\n title=\"{{ 'Download' | translate }}\"\n type=\"button\"\n (click)=\"download()\"\n >\n {{ 'Download' | translate }}\n </button>\n @if (hasPermission()) {\n <button\n class=\"btn btn-default btn-sm pull-right\"\n title=\"{{ 'Save to repository' | translate }}\"\n type=\"button\"\n (click)=\"saveToRepository()\"\n >\n {{ 'Save to repository' | translate }}\n </button>\n }\n </div>\n }\n </div>\n}\n@if (showOperation()) {\n <div>\n <c8y-operation-details [operation]=\"operation\"></c8y-operation-details>\n </div>\n}\n","import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport {\n DeviceConfigurationListEmptyState,\n SupportedConfigurationItem\n} from '@c8y/ngx-components/repository/shared';\nimport { NgIf, NgFor } from '@angular/common';\nimport { FilterInputComponent, IconDirective, C8yTranslatePipe } from '@c8y/ngx-components';\nimport { ConfigurationFilterPipe } from './configuration-filter.pipe';\n\n@Component({\n selector: 'c8y-device-configuration-list',\n templateUrl: './device-configuration-list.component.html',\n imports: [\n NgIf,\n FilterInputComponent,\n IconDirective,\n NgFor,\n C8yTranslatePipe,\n ConfigurationFilterPipe\n ]\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 = '';\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","<div class=\"p-l-16 m-b-8\" *ngIf=\"isFilterEnabled\">\n <c8y-filter [icon]=\"'search'\" (onSearch)=\"updatePipe($event)\"></c8y-filter>\n</div>\n\n<!-- EMPTY STATE -->\n<div class=\"c8y-empty-state text-left\" *ngIf=\"items?.length === 0\">\n <h1 [c8yIcon]=\"emptyState.icon\"></h1>\n <p>\n <strong>{{ emptyState.title | translate }}</strong>\n <br />\n <small>{{ emptyState.text | translate }}</small>\n </p>\n</div>\n\n<!-- CONFIGURATIONS AVAILABLE -->\n<div class=\"c8y-nav-stacked\">\n <button\n type=\"button\"\n class=\"c8y-stacked-item d-flex\"\n [class.active]=\"config === selectedConfig\"\n *ngFor=\"let config of items | configurationFilterPipe: filterTerm\"\n (click)=\"showConfigurationTypePreview(config)\"\n >\n <div class=\"list-item-icon\">\n <i [c8yIcon]=\"itemIcon\"></i>\n </div>\n <div class=\"list-item-body text-truncate\">\n <div class=\"d-flex\">\n <span class=\"text-truncate\" title=\"{{ config.name }}\">{{ config.name }}</span>\n <span class=\"text-label-small m-l-auto m-t-auto m-b-auto\">{{ config.deviceType }}</span>\n </div>\n </div>\n </button>\n</div>\n\n<!-- for Carlos: config.configurationType to differentiate whether a config matches configuration type. -->\n","import { NgClass } from '@angular/common';\nimport { Component, OnInit, ViewChild } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { IManagedObject } from '@c8y/client';\nimport {\n ActionBarItemComponent,\n C8yTranslateDirective,\n C8yTranslatePipe,\n EmptyStateComponent,\n IconDirective,\n TabsetAriaDirective\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n ConfigurationSnapshot,\n DeviceConfigurationListEmptyState,\n DeviceConfigurationOperation,\n RepositoryService,\n SupportedConfigurationItem\n} from '@c8y/ngx-components/repository/shared';\nimport { has } from 'lodash-es';\nimport { TabDirective, TabsetComponent } from 'ngx-bootstrap/tabs';\nimport { ConfigurationDetailComponent } from '../list/configuration-detail.component';\nimport { ConfigurationPreviewComponent } from './configuration-preview.component';\nimport { DeviceConfigurationListComponent } from './device-configuration-list.component';\nimport { DeviceConfigurationService } from './device-configuration.service';\nimport { TextBasedConfigurationComponent } from './text-based-configuration.component';\n\n@Component({\n selector: 'c8y-device-configuration',\n templateUrl: './device-configuration.component.html',\n imports: [\n ActionBarItemComponent,\n IconDirective,\n NgClass,\n TabsetAriaDirective,\n TabsetComponent,\n TabDirective,\n C8yTranslateDirective,\n DeviceConfigurationListComponent,\n EmptyStateComponent,\n ConfigurationPreviewComponent,\n TextBasedConfigurationComponent,\n C8yTranslatePipe\n ]\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 selectedRepositoryMo: IManagedObject;\n repositorySnapshotsEmptyState: DeviceConfigurationListEmptyState;\n device: IManagedObject;\n isLegacy: boolean;\n showTextBasedConfig: boolean;\n reloading = false;\n\n @ViewChild(TextBasedConfigurationComponent)\n textBasedConfigurationComponent: TextBasedConfigurationComponent;\n\n constructor(\n private route: ActivatedRoute,\n private deviceConfigurationService: DeviceConfigurationService,\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 =\n this.deviceConfigurationService.hasAnySupportedOperation(this.device, [\n DeviceConfigurationOperation.CONFIG,\n DeviceConfigurationOperation.SEND_CONFIG\n ]) || has(this.device, 'c8y_Configuration');\n }\n\n async onConfigTypeSelected(config) {\n this.configurationType = config.name;\n this.isLegacy = config.isLegacy;\n this.selectedRepositoryMo = undefined;\n this.updateSnapshots();\n }\n\n async onRepositoryConfigSelected(config) {\n this.selectedRepositoryMo = 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 this.repositorySnapshot.binaryType = binary.type || undefined;\n }\n } catch {\n // do nothing\n }\n }\n }\n\n async updateSnapshots(repositorySnapsOnly?: boolean) {\n this.reloading = true;\n this.repositorySnapshot = undefined;\n this.selectedRepositoryMo = 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 async openEditInRepository(mo: IManagedObject): Promise<void> {\n let fileBinary: File | null = null;\n try {\n fileBinary = await this.repositoryService.getBinaryFile(mo.url, { allowExternal: false });\n } catch {\n // Binary unavailable — drawer still opens; editor will be empty\n }\n const saved = await this.deviceConfigurationService.openConfigurationDrawer(\n ConfigurationDetailComponent,\n {\n version: mo.name,\n deviceType: mo.deviceType,\n description: mo.description,\n binary: { file: fileBinary, url: mo.url },\n mo\n }\n );\n if (saved) {\n this.updateSnapshots(true);\n }\n }\n}\n","<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n (click)=\"updateSnapshots()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reloading }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage card-has-tabs\">\n <tabset>\n @if (showBinaryBasedConfig && !showTextBasedConfig) {\n <div class=\"card-header separator\">\n <div class=\"card-title\">{{ 'Configurations' | translate }}</div>\n </div>\n }\n @if (!showBinaryBasedConfig && showTextBasedConfig) {\n <div class=\"card-header separator\">\n <div class=\"card-title\">{{ 'Text-based configuration' | translate }}</div>\n </div>\n }\n @if (showBinaryBasedConfig) {\n <tab heading=\"{{ 'Configurations' | translate }}\">\n <div class=\"card--grid card grid__col--4-8--md grid__row--6-6--md m-b-0\">\n <!-- DEVICE SUPPORTED CONFIGURATIONS -->\n <div class=\"card--grid__inner-scroll bg-level-1\">\n <div class=\"p-l-16 p-r-16\">\n <h5 class=\"legend form-block\">\n <span translate>Device-supported configurations</span>\n </h5>\n </div>\n <c8y-device-configuration-list\n [itemIcon]=\"'gears'\"\n [items]=\"supportedConfigurations\"\n (configSelected)=\"onConfigTypeSelected($event)\"\n ></c8y-device-configuration-list>\n </div>\n <!-- CONFIGURATION PREVIEW -->\n <div class=\"card--grid__inner-scroll d-flex d-col flex-grow\">\n <div class=\"card-block d-flex d-col flex-grow\">\n <h5 class=\"legend form-block\"><span translate>Preview</span></h5>\n <!-- EMPTY STATE -->\n @if (!configurationType) {\n <c8y-ui-empty-state\n [icon]=\"'file-text'\"\n [title]=\"'No configuration selected.' | translate\"\n [subtitle]=\"'Select a configuration to preview.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\n <!-- PREVIEW AVAILABLE STATE -->\n @if (configurationType) {\n <c8y-device-configuration-preview\n class=\"d-flex d-col flex-grow\"\n [actionButtonIcon]=\"'download'\"\n [device]=\"device\"\n [configurationType]=\"configurationType\"\n [configSnapshot]=\"configSnapshot\"\n [canSaveSnapshot]=\"true\"\n [operationToTrigger]=\"'c8y_UploadConfigFile'\"\n [actionButtonText]=\"'Get snapshot from device' | translate\"\n [isLegacy]=\"isLegacy\"\n ></c8y-device-configuration-preview>\n }\n </div>\n </div>\n <!-- AVAILABLE SUPPORTED CONFIGURATIONS -->\n <div class=\"card--grid__inner-scroll bg-level-1\">\n <div class=\"p-l-16 p-r-16\">\n <h5\n class=\"legend form-block\"\n translate\n >\n Available supported configurations\n </h5>\n </div>\n <!-- EMPTY STATE -->\n @if (!configurationType) {\n <c8y-ui-empty-state\n [icon]=\"'gears'\"\n [title]=\"'No selection.' | translate\"\n [subtitle]=\"\n 'Select a configuration from the device-supported configuration list.' | translate\n \"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\n @if (configurationType) {\n <div class=\"p-r-16\">\n <c8y-device-configuration-list\n [itemIcon]=\"'file-text'\"\n [items]=\"repositorySnapshots\"\n [emptyState]=\"repositorySnapshotsEmptyState\"\n [isFilterEnabled]=\"true\"\n (configSelected)=\"onRepositoryConfigSelected($event)\"\n ></c8y-device-configuration-list>\n </div>\n }\n </div>\n <!-- CONFIGURATION PREVIEW -->\n <div class=\"card--grid__inner-scroll d-flex d-col flex-grow\">\n <div class=\"card-block flex-grow d-flex d-col\">\n <h5\n class=\"legend form-block\"\n translate\n >\n Preview\n </h5>\n <!-- EMPTY STATE -->\n @if (!repositorySnapshot) {\n <c8y-ui-empty-state\n [icon]=\"'file-text'\"\n [title]=\"'No configuration selected.' | translate\"\n [subtitle]=\"'Select a configuration to preview.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n }\n <!-- CONFIGURATION SELECTED STATE -->\n @if (repositorySnapshot) {\n <c8y-device-configuration-preview\n class=\"d-flex d-col flex-grow\"\n [actionButtonIcon]=\"'upload'\"\n [device]=\"device\"\n [configurationType]=\"configurationType\"\n [configSnapshot]=\"repositorySnapshot\"\n [operationToTrigger]=\"'c8y_DownloadConfigFile'\"\n [actionButtonText]=\"'Send configuration to device' | translate\"\n [isLegacy]=\"isLegacy\"\n [editableRepositoryMo]=\"selectedRepositoryMo\"\n (editInRepository)=\"openEditInRepository($event)\"\n ></c8y-device-configuration-preview>\n }\n </div>\n </div>\n </div>\n </tab>\n }\n @if (showTextBasedConfig) {\n <tab heading=\"{{ 'Text-based configuration' | translate }}\">\n <c8y-text-based-configuration></c8y-text-based-configuration>\n </tab>\n }\n </tabset>\n</div>\n","import { Component } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n AlertService,\n IconDirective,\n C8yTranslateDirective,\n FormGroupComponent,\n RequiredInputPlaceholderDirective,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport {\n ConfigurationSnapshot,\n RepositoryService,\n RepositoryType\n} from '@c8y/ngx-components/repository/shared';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { FormsModule } from '@angular/forms';\n\n@Component({\n selector: 'c8y-save-config-to-configuration-repository',\n templateUrl: 'save-to-repository.component.html',\n imports: [\n IconDirective,\n C8yTranslateDirective,\n FormsModule,\n FormGroupComponent,\n RequiredInputPlaceholderDirective,\n C8yTranslatePipe\n ]\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.create(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","<div class=\"modal-header dialog-header\">\n <i c8yIcon=\"gears\"></i>\n <h4 id=\"modal-title\" translate>\n Save configuration\n </h4>\n</div>\n<div class=\"modal-body\" id=\"modal-body\">\n <form #saveConfigurationSnapshot=\"ngForm\" class=\"p-t-24\">\n <c8y-form-group>\n <label translate for=\"name\">Name</label>\n <input\n id=\"name\"\n type=\"text\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"name\"\n [(ngModel)]=\"configSnapshot.name\"\n required\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"deviceType\">Device type</label>\n <input\n id=\"deviceType\"\n class=\"form-control\"\n rows=\"6\"\n name=\"deviceType\"\n [(ngModel)]=\"configSnapshot.deviceType\"\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"description\">Description</label>\n <input\n type=\"text\"\n id=\"description\"\n class=\"form-control\"\n maxlength=\"254\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"configSnapshot.description\"\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"configurationType\">Configuration type</label>\n <input\n id=\"configurationType\"\n class=\"form-control\"\n rows=\"6\"\n name=\"configurationType\"\n [(ngModel)]=\"configSnapshot.configurationType\"\n />\n </c8y-form-group>\n </form>\n</div>\n<div class=\"modal-footer\">\n <button title=\"{{ 'Cancel' | translate }}\" class=\"btn btn-default\" (click)=\"close()\" translate>\n Cancel\n </button>\n\n <button\n title=\"{{ 'Save configuration to repository' | translate }}\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"saveConfigurationSnapshot.form.invalid\"\n translate\n >\n Save\n </button>\n</div>\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { ViewContext, hookRoute } from '@c8y/ngx-components';\nimport { DeviceConfigurationGuard } from './device-configuration.guard';\nimport { DeviceConfigurationComponent } from './device-configuration.component';\nimport { ConfigurationPreviewComponent } from './configuration-preview.component';\nimport { ConfigurationFilterPipe } from './configuration-filter.pipe';\nimport { DeviceConfigurationService } from './device-configuration.service';\nimport { DeviceConfigurationListComponent } from './device-configuration-list.component';\nimport { TextBasedConfigurationComponent } from './text-based-configuration.component';\nimport { SaveToRepositoryComponent } from './save-to-repository.component';\nimport { SourceCodePreviewComponent } from './source-code-preview.component';\nimport { TabsModule } from 'ngx-bootstrap/tabs';\nimport { OperationDetailsModule } from '@c8y/ngx-components/operations/operation-details';\nimport { SharedRepositoryModule } from '@c8y/ngx-components/repository/shared';\n\n@NgModule({\n imports: [\n SharedRepositoryModule,\n OperationDetailsModule,\n TabsModule.forRoot(),\n DeviceConfigurationComponent,\n DeviceConfigurationListComponent,\n ConfigurationPreviewComponent,\n ConfigurationFilterPipe,\n SaveToRepositoryComponent,\n SourceCodePreviewComponent,\n TextBasedConfigurationComponent\n ],\n providers: [DeviceConfigurationService]\n})\nexport class ConfigurationRepositoryDeviceTabModule {\n static forRoot(): ModuleWithProviders<ConfigurationRepositoryDeviceTabModule> {\n return {\n ngModule: ConfigurationRepositoryDeviceTabModule,\n providers: [\n DeviceConfigurationGuard,\n hookRoute({\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 ]\n };\n }\n}\n","import { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, EventEmitter, inject, OnInit } from '@angular/core';\nimport { IManagedObject, InventoryBinaryService, IResultList } from '@c8y/client';\nimport {\n ActionBarItemComponent,\n ActionControl,\n AlertService,\n BottomDrawerService,\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n BuiltInActionType,\n C8yTranslateDirective,\n C8yTranslatePipe,\n Column,\n DataGridComponent,\n DataGridService,\n DataSourceModifier,\n EmptyStateComponent,\n EmptyStateContextDirective,\n GuideDocsComponent,\n GuideHrefDirective,\n HelpComponent,\n IconDirective,\n ModalService,\n ServerSideDataCallback,\n ServerSideDataResult,\n Status,\n TitleComponent\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n DescriptionGridColumn,\n DeviceTypeGridColumn,\n FileGridColumn,\n RepositoryItemNameGridColumn,\n RepositoryService,\n RepositoryType,\n TypeGridColumn\n} from '@c8y/ngx-components/repository/shared';\nimport { TranslateService } from '@ngx-translate/core';\nimport { saveAs } from 'file-saver';\nimport { ConfigurationDetailComponent } from './configuration-detail.component';\n\n@Component({\n selector: 'c8y-configuration-list',\n templateUrl: './configuration-list.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n TitleComponent,\n C8yTranslateDirective,\n BreadcrumbComponent,\n BreadcrumbItemComponent,\n ActionBarItemComponent,\n IconDirective,\n HelpComponent,\n DataGridComponent,\n EmptyStateContextDirective,\n EmptyStateComponent,\n GuideDocsComponent,\n GuideHrefDirective,\n AsyncPipe,\n C8yTranslatePipe\n ]\n})\nexport class ConfigurationListComponent implements OnInit {\n private readonly alert = inject(AlertService);\n private readonly gridService = inject(DataGridService);\n private readonly repositoryService = inject(RepositoryService);\n private readonly bottomDrawerService = inject(BottomDrawerService);\n private readonly modalService = inject(ModalService);\n private readonly translateService = inject(TranslateService);\n private readonly inventoryBinaryService = inject(InventoryBinaryService);\n\n readonly refresh$: EventEmitter<void> = new EventEmitter();\n readonly pagination = {\n pageSize: 50,\n currentPage: 1\n };\n readonly noResultsMessage = gettext('No results to display.');\n readonly noDataMessage = gettext('There are no configuration snapshots defined.');\n readonly noResultsSubtitle = gettext('Refine your search terms or check your spelling.');\n readonly noDataSubtitle = gettext('Add a configuration snapshot first.');\n actionControls: ActionControl[] = [];\n columns: Column[] = [\n new RepositoryItemNameGridColumn({\n filterLabel: gettext('Filter configurations by name'),\n placeholder: gettext('SSH'),\n callback: this.edit.bind(this)\n }),\n new DescriptionGridColumn({\n filterLabel: gettext('Filter configurations by description'),\n placeholder: gettext('SSH configuration')\n }),\n new FileGridColumn(),\n new DeviceTypeGridColumn({\n path: 'deviceType',\n filterLabel: gettext('Filter configurations by device type')\n }),\n new TypeGridColumn({\n header: gettext('Configuration type'),\n filterLabel: gettext('Filter by configuration type'),\n example: 'ssh',\n path: 'configurationType',\n repositoryType: RepositoryType.CONFIGURATION\n })\n ];\n size$: Promise<number>;\n sizeRequestDone = false;\n serverSideDataCallback: ServerSideDataCallback;\n\n private readonly DELETED_SUCCESS_MSG = gettext('Configuration deleted.');\n\n constructor() {\n this.serverSideDataCallback = this.onDataSourceModifier.bind(this);\n }\n\n ngOnInit() {\n this.actionControls.push({\n type: BuiltInActionType.Edit,\n callback: this.edit.bind(this)\n });\n this.actionControls.push({\n type: BuiltInActionType.Delete,\n callback: this.delete.bind(this)\n });\n this.actionControls.push({\n type: 'download',\n icon: 'download',\n text: gettext('Download'),\n showIf: row => this.isBinaryFile(row as unknown as IManagedObject),\n callback: this.download.bind(this)\n });\n }\n\n async onDataSourceModifier(\n dataSourceModifier: DataSourceModifier\n ): Promise<ServerSideDataResult> {\n const dataRequest: Promise<IResultList<IManagedObject>> =\n this.repositoryService.listRepositoryEntries(RepositoryType.CONFIGURATION, {\n query: this.gridService.getQueryObj(dataSourceModifier.columns),\n skipDefaultOrder: true,\n params: {\n pageSize: dataSourceModifier.pagination.pageSize,\n currentPage: dataSourceModifier.pagination.currentPage,\n withTotalPages: true\n }\n });\n\n const filtererdSizeRequest: Promise<number> = this.repositoryService\n .listRepositoryEntries(RepositoryType.CONFIGURATION, {\n query: this.gridService.getQueryObj(dataSourceModifier.columns),\n skipDefaultOrder: true,\n params: { pageSize: 1 }\n })\n .then(response => response?.paging?.totalPages);\n\n this.size$ = this.repositoryService\n .listRepositoryEntries(RepositoryType.CONFIGURATION, {\n skipDefaultOrder: true,\n params: { pageSize: 1 }\n })\n .then(response => {\n this.sizeRequestDone = true;\n return response?.paging?.totalPages;\n });\n\n const [dataResponse, size, filteredSize] = await Promise.all([\n dataRequest,\n this.size$,\n filtererdSizeRequest\n ]);\n\n const { res, data, paging } = dataResponse;\n\n const serverSideDataResult: ServerSideDataResult = {\n res,\n data,\n paging,\n filteredSize,\n size\n };\n\n return serverSideDataResult;\n }\n\n async add() {\n try {\n const drawer = this.bottomDrawerService.openDrawer(ConfigurationDetailComponent, {\n disableClickOutside: true,\n closeOnNavigation: true\n });\n await drawer.instance.result;\n this.refresh$.next();\n } catch (ex) {\n // intended empty — user canceled or save failed (error displayed by detail component)\n }\n }\n\n async edit(configuration: IManagedObject) {\n let fileBinary: File | null = null;\n try {\n fileBinary = await this.repositoryService.getBinaryFile(configuration.url, {\n allowExternal: false\n });\n } catch {\n // Binary unavailable — drawer still opens; editor will be empty\n }\n try {\n const drawer = this.bottomDrawerService.openDrawer(ConfigurationDetailComponent, {\n disableClickOutside: true,\n closeOnNavigation: true,\n initialState: {\n version: configuration.name,\n deviceType: configuration.deviceType,\n description: configuration.description,\n binary: { file: fileBinary, url: configuration.url },\n mo: configuration\n }\n });\n await drawer.instance.result;\n this.refresh$.next();\n } catch (ex) {\n // intended empty — user canceled or save failed (error displayed by detail component)\n }\n }\n\n isBinaryFile(configuration: IManagedObject) {\n return configuration.url\n ? !!this.inventoryBinaryService.getIdFromUrl(configuration.url)\n : false;\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 this.refresh$.next();\n } catch (ex) {\n if (ex) {\n this.alert.addServerFailure(ex);\n }\n }\n }\n\n trackByName(_index, column: Column): string {\n return column.name;\n }\n}\n","<c8y-title>\n <span\n class=\"m-r-4\"\n translate\n >\n Configuration repository\n </span>\n <small>\n {{ size$ | async }}\n <span translate>snapshots</span>\n </small>\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n icon=\"c8y-management\"\n label=\"{{ 'Management' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n icon=\"gears\"\n label=\"{{ 'Configuration repository' | translate }}\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add configuration snapshot' | translate }}\"\n type=\"button\"\n (click)=\"add()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add configuration snapshot' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help\n src=\"/docs/device-management-application/managing-device-data/#managing-configurations\"\n></c8y-help>\n\n<div class=\"content-fullpage border-top border-bottom\">\n <c8y-data-grid\n [title]=\"'Configurations' | translate\"\n [refresh]=\"refresh$\"\n [pagination]=\"pagination\"\n [columns]=\"columns\"\n [actionControls]=\"actionControls\"\n [infiniteScroll]=\"'auto'\"\n [serverSideDataCallback]=\"serverSideDataCallback\"\n >\n <c8y-ui-empty-state\n [icon]=\"stats?.size > 0 ? 'search' : 'gears'\"\n [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\"\n *emptyStateContext=\"let stats\"\n [horizontal]=\"stats?.size > 0\"\n >\n @if (stats?.size === 0) {\n <p>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add configuration snapshot' | translate }}\"\n type=\"button\"\n (click)=\"add()\"\n >\n {{ 'Add configuration snapshot' | translate }}\n </button>\n </p>\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a\n c8y-guide-href=\"/docs/device-management-application/managing-device-data/#managing-configurations\"\n >\n user documentation</a\n >.\n </small>\n </p>\n }\n </c8y-ui-empty-state>\n </c8y-data-grid>\n</div>\n","import { Injectable } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { NavigatorNode, NavigatorNodeFactory } from '@c8y/ngx-components';\n\n@Injectable()\nexport class ConfigurationRepositoryNavigationFactory implements NavigatorNodeFactory {\n node: NavigatorNode;\n\n constructor() {\n this.node = new NavigatorNode({\n label: gettext('Configuration repository'),\n path: 'configuration',\n icon: 'gears',\n parent: gettext('Management'),\n priority: 800\n });\n }\n\n get(): NavigatorNode {\n return this.node;\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { ConfigurationListComponent } from './configuration-list.component';\nimport { ConfigurationDetailComponent } from './configuration-detail.component';\nimport { hookNavigator, hookRoute } from '@c8y/ngx-components';\nimport { ConfigurationRepositoryNavigationFactory } from './configuration-repository-navigation-factory';\nimport { SharedRepositoryModule } from '@c8y/ngx-components/repository/shared';\n\n@NgModule({\n imports: [SharedRepositoryModule, ConfigurationListComponent, ConfigurationDetailComponent]\n})\nexport class ConfigurationRepositoryListModule {\n static forRoot(): ModuleWithProviders<ConfigurationRepositoryListModule> {\n return {\n ngModule: ConfigurationRepositoryListModule,\n providers: [\n hookNavigator(ConfigurationRepositoryNavigationFactory),\n hookRoute({\n path: 'configuration',\n component: ConfigurationListComponent\n })\n ]\n };\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CoreModule, FormsModule } from '@c8y/ngx-components';\nimport { ConfigurationRepositoryDeviceTabModule } from './device-tab/configuration-repository-device-tab.module';\nimport { ConfigurationRepositoryListModule } from './list/configuration-repository-list.module';\n\n@NgModule({\n imports: [\n CoreModule,\n FormsModule,\n ConfigurationRepositoryListModule.forRoot(),\n ConfigurationRepositoryDeviceTabModule.forRoot()\n ]\n})\nexport class ConfigurationRepositoryModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i4.DeviceConfigurationService","i5","i6","i1.DeviceConfigurationService","i3","i4","i2.DeviceConfigurationService","FormsModule","i1.ConfigurationRepositoryListModule","i2.ConfigurationRepositoryDeviceTabModule"],"mappings":"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"}
|