@c8y/ngx-components 1024.2.4 → 1024.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/fesm2022/c8y-ngx-components-bookmarks.mjs +33 -23
  2. package/fesm2022/c8y-ngx-components-bookmarks.mjs.map +1 -1
  3. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +2 -2
  4. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  5. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +3 -2
  6. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  7. package/fesm2022/c8y-ngx-components-device-profile.mjs +27 -9
  8. package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
  9. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +9 -11
  10. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
  11. package/fesm2022/c8y-ngx-components-remote-access-data.mjs +43 -0
  12. package/fesm2022/c8y-ngx-components-remote-access-data.mjs.map +1 -1
  13. package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs +17 -3
  14. package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs.map +1 -1
  15. package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs +179 -41
  16. package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs.map +1 -1
  17. package/fesm2022/c8y-ngx-components-repository-firmware.mjs +5 -4
  18. package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
  19. package/fesm2022/c8y-ngx-components-repository-software.mjs +10 -4
  20. package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
  21. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +5 -4
  22. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
  23. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs +6 -5
  24. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs.map +1 -1
  25. package/fesm2022/c8y-ngx-components.mjs +9 -4
  26. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  27. package/locales/de.po +61 -5
  28. package/locales/es.po +61 -5
  29. package/locales/fr.po +61 -5
  30. package/locales/ja_JP.po +60 -6
  31. package/locales/ko.po +61 -5
  32. package/locales/locales.pot +60 -4
  33. package/locales/nl.po +61 -5
  34. package/locales/pl.po +61 -5
  35. package/locales/pt_BR.po +61 -5
  36. package/locales/zh_CN.po +61 -5
  37. package/locales/zh_TW.po +61 -5
  38. package/package.json +1 -1
  39. package/types/c8y-ngx-components-bookmarks.d.ts +7 -7
  40. package/types/c8y-ngx-components-bookmarks.d.ts.map +1 -1
  41. package/types/c8y-ngx-components-device-profile.d.ts +5 -2
  42. package/types/c8y-ngx-components-device-profile.d.ts.map +1 -1
  43. package/types/c8y-ngx-components-protocol-opcua.d.ts.map +1 -1
  44. package/types/c8y-ngx-components-remote-access-data.d.ts +19 -0
  45. package/types/c8y-ngx-components-remote-access-data.d.ts.map +1 -1
  46. package/types/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.d.ts +10 -3
  47. package/types/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.d.ts.map +1 -1
  48. package/types/c8y-ngx-components-remote-access-terminal-viewer.d.ts +20 -2
  49. package/types/c8y-ngx-components-remote-access-terminal-viewer.d.ts.map +1 -1
  50. package/types/c8y-ngx-components-repository-firmware.d.ts.map +1 -1
  51. package/types/c8y-ngx-components-repository-software.d.ts +2 -0
  52. package/types/c8y-ngx-components-repository-software.d.ts.map +1 -1
  53. package/types/c8y-ngx-components-trusted-certificates.d.ts.map +1 -1
  54. package/types/c8y-ngx-components-widgets-implementations-asset-table.d.ts.map +1 -1
  55. package/types/c8y-ngx-components.d.ts +5 -1
  56. package/types/c8y-ngx-components.d.ts.map +1 -1
@@ -3,7 +3,7 @@ import { EventEmitter, Output, ViewChild, Component, Injectable, NgModule, Input
3
3
  import * as i1$2 from '@angular/router';
4
4
  import { gettext } from '@c8y/ngx-components/gettext';
5
5
  import * as i2 from '@c8y/ngx-components';
6
- import { ValidationPattern, IconDirective, C8yTranslateDirective, FormGroupComponent, TypeaheadComponent, ForOfDirective, ListItemComponent, HighlightComponent, RequiredInputPlaceholderDirective, FilePickerComponent, ProductExperienceDirective, C8yTranslatePipe, BuiltInActionType, Status, TitleComponent, BreadcrumbComponent, BreadcrumbItemComponent, ActionBarItemComponent, HelpComponent, DataGridComponent, EmptyStateContextDirective, EmptyStateComponent, ListGroupComponent, ListItemIconComponent, ListItemBodyComponent, memoize, NavigatorNode, hookNavigator, hookRoute, ModalSelectionMode, ViewContext } from '@c8y/ngx-components';
6
+ import { ValidationPattern, IconDirective, C8yTranslateDirective, FormGroupComponent, TypeaheadComponent, ForOfDirective, ListItemComponent, HighlightComponent, RequiredInputPlaceholderDirective, FilePickerComponent, ProductExperienceDirective, C8yTranslatePipe, BuiltInActionType, Status, TitleComponent, BreadcrumbComponent, BreadcrumbItemComponent, ActionBarItemComponent, HelpComponent, DataGridComponent, EmptyStateContextDirective, EmptyStateComponent, InputGroupEditableComponent, ListGroupComponent, ListItemIconComponent, ListItemBodyComponent, memoize, NavigatorNode, hookNavigator, hookRoute, ModalSelectionMode, ViewContext } from '@c8y/ngx-components';
7
7
  import * as i1$1 from '@c8y/ngx-components/repository/shared';
8
8
  import { PRODUCT_EXPERIENCE_REPOSITORY_SHARED, RepositoryType, SoftwareTypeComponent, RepositoryItemNameGridColumn, DescriptionGridColumn, DeviceTypeGridColumn, TypeGridColumn, VersionsGridColumn, FileDownloadComponent, SharedRepositoryModule, RepositorySelectModalComponent } from '@c8y/ngx-components/repository/shared';
9
9
  import * as i4$1 from '@ngx-translate/core';
@@ -346,6 +346,7 @@ class SoftwareDetailsComponent {
346
346
  .subscribe();
347
347
  this.software$.pipe(takeUntil(this.destroy$)).subscribe(software => {
348
348
  this.softwareTypeObject = software;
349
+ this.committedSoftwareTypeObject = software;
349
350
  });
350
351
  }
351
352
  getBinaryName$(binaryUrl) {
@@ -406,15 +407,19 @@ class SoftwareDetailsComponent {
406
407
  }
407
408
  }
408
409
  onSelectSoftwareType(software) {
409
- this.isSoftwareTypeChanged = !(this.softwareTypeObject?.softwareType === software?.softwareType);
410
+ this.isSoftwareTypeChanged = !(this.committedSoftwareTypeObject?.softwareType === software?.softwareType);
410
411
  this.softwareTypeObject = software;
411
412
  }
413
+ cancelSoftwareTypeChange() {
414
+ this.softwareTypeObject = this.committedSoftwareTypeObject;
415
+ this.isSoftwareTypeChanged = false;
416
+ }
412
417
  ngOnDestroy() {
413
418
  this.destroy$.next(true);
414
419
  this.destroy$.unsubscribe();
415
420
  }
416
421
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: SoftwareDetailsComponent, deps: [{ token: i1$2.ActivatedRoute }, { token: i2$1.InventoryService }, { token: i1$1.RepositoryService }, { token: i2.AlertService }, { token: i4$1.TranslateService }, { token: i2.ModalService }, { token: i1.BsModalService }, { token: i2.GainsightService }, { token: i1$2.Router }], target: i0.ɵɵFactoryTarget.Component }); }
417
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: SoftwareDetailsComponent, isStandalone: true, selector: "c8y-software-details", viewQueries: [{ propertyName: "softwareType", first: true, predicate: SoftwareTypeComponent, descendants: true, static: true }], ngImport: i0, template: "<c8y-title>\n {{ (software$ | async)?.name }}\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=\"c8y-tools\"\n path=\"#/software\"\n label=\"{{ 'Software repository' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n icon=\"c8y-tools\"\n label=\"{{ (software$ | async)?.name }}\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n @if (!(isLegacy$ | async)) {\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add software' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-software-details--add-software-btn\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add software' | translate }}\n </button>\n }\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"reload$.next()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reloading$ | async }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"row\">\n <div class=\"col-lg-12 col-lg-max\">\n <div class=\"card card--fullpage\">\n <div class=\"card-block bg-level-1 flex-no-shrink p-t-24 p-b-24 overflow-visible\">\n <div class=\"content-flex-70\">\n <div class=\"text-center\">\n <i class=\"c8y-icon-duocolor icon-48 c8y-icon c8y-icon-tools\"></i>\n <p>\n <small class=\"label label-info\">Software</small>\n </p>\n </div>\n <div class=\"flex-grow col-10\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n [ngStyle]=\"{ 'width.ch': (software$ | async)?.name?.length + 2 || 31 }\"\n placeholder=\"{{ 'e.g. My software' | translate }}\"\n type=\"text\"\n required\n #nameInput\n [ngModel]=\"(software$ | async)?.name\"\n #nameModel=\"ngModel\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n (click)=\"updateSoftware$.next({ name: nameInput.value }); nameModel.reset()\"\n [disabled]=\"nameInput.value.length === 0\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Description' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n [ngStyle]=\"{ 'width.ch': (software$ | async)?.description?.length + 2 || 31 }\"\n placeholder=\"{{ 'e.g. Cloud connectivity software' | translate }}\"\n type=\"text\"\n #descriptionInput\n [ngModel]=\"(software$ | async)?.description\"\n #descriptionModel=\"ngModel\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n (click)=\"\n updateSoftware$.next({ description: descriptionInput.value });\n descriptionModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Device type' | translate }}\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'If the filter is set, the software will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n [ngStyle]=\"{ 'width.ch': (software$ | async)?.type?.length + 2 || 31 }\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n type=\"text\"\n #deviceTypeInput\n [ngModel]=\"(software$ | async)?.c8y_Filter?.type\"\n #deviceTypeModel=\"ngModel\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n (click)=\"\n updateSoftware$.next({ c8y_Filter: { type: deviceTypeInput.value } });\n deviceTypeModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Software type' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <c8y-software-type\n [style]=\"{ 'width.ch': softwareTypeObject?.softwareType?.length + 2 || 31 }\"\n [softwareTypeMO]=\"softwareTypeObject\"\n (onSelectSoftware)=\"onSelectSoftwareType($event)\"\n ></c8y-software-type>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n [ngClass]=\"isSoftwareTypeChanged ? '' : 'hidden'\"\n [disabled]=\"softwareTypeObject?.softwareType === ''\"\n (click)=\"\n updateSoftware$.next({ softwareType: softwareTypeObject.softwareType });\n softwareType.resetInput();\n isSoftwareTypeChanged = false\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"inner-scroll\">\n <div class=\"card-header separator-top-bottom sticky-top bg-component\">\n <div\n class=\"card-title\"\n translate\n >\n Versions\n </div>\n </div>\n\n <div class=\"card-block p-t-0 p-b-24\">\n @if ((baseVersions$ | async)?.data.length === 0) {\n <c8y-ui-empty-state\n [icon]=\"'c8y-tools'\"\n [title]=\"'No versions to display.' | translate\"\n [subtitle]=\"'Add a new version by clicking below.' | translate\"\n >\n <p>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add software' | translate }}\"\n type=\"button\"\n (click)=\"addBaseVersion()\"\n >\n {{ 'Add software' | translate }}\n </button>\n </p>\n </c8y-ui-empty-state>\n }\n\n @if ((baseVersions$ | async)?.data.length > 0) {\n <c8y-list-group>\n <c8y-li\n *c8yFor=\"let baseVersion of baseVersions$ | async; let i = index; loadMore: 'auto'\"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-tools\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n <p\n class=\"text-truncate-wrap\"\n title=\"{{ baseVersion.c8y_Software.version }}\"\n >\n {{ baseVersion.c8y_Software.version }}\n </p>\n </div>\n <div class=\"col-5\">\n <p class=\"text-truncate-wrap\">\n <span\n class=\"text-label-small m-r-8\"\n translate\n >\n File\n </span>\n @if (baseVersion?.c8y_Software?.url === '') {\n <span title=\"{{ 'Provided by device' | translate }}\">\n {{ 'Provided by device' | translate }}\n </span>\n } @else {\n <span title=\"{{ getBinaryName$(baseVersion.c8y_Software.url) | async }}\">\n <c8y-file-download\n [url]=\"baseVersion.c8y_Software.url\"\n ></c8y-file-download>\n </span>\n }\n </p>\n </div>\n <div class=\"col-2 d-flex a-i-start\">\n @if (isLegacy$ | async) {\n <span class=\"label label-warning m-l-auto-sm\">\n {{ 'Legacy' | translate }}\n </span>\n }\n @if (!(isLegacy$ | async)) {\n <div class=\"fit-h-20\">\n <button\n class=\"btn btn-danger btn-xs visible-xs m-l-auto m-r-8 m-t-8\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n </div>\n }\n </div>\n @if (!(isLegacy$ | async)) {\n <div class=\"m-l-auto fit-h-20 hidden-xs\">\n <button\n class=\"btn btn-dot text-danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n data-cy=\"software-details-component--Delete-button\"\n [delay]=\"500\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n }\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "component", type: BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: SoftwareTypeComponent, selector: "c8y-software-type", inputs: ["softwareTypeMO", "disabled", "style", "required", "placeholder", "emitResultsOnly", "showBtnInNotFoundMessage", "allowFreeEntries", "showClearSelectionOption", "clearSelectionOptionLabel", "presetSoftwareTypes"], outputs: ["onSelectSoftware"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "component", type: ListGroupComponent, selector: "c8y-list-group" }, { kind: "directive", type: ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: FileDownloadComponent, selector: "c8y-file-download", inputs: ["url"] }, { kind: "directive", type: TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
422
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: SoftwareDetailsComponent, isStandalone: true, selector: "c8y-software-details", viewQueries: [{ propertyName: "softwareType", first: true, predicate: SoftwareTypeComponent, descendants: true, static: true }], ngImport: i0, template: "<c8y-title>\n {{ (software$ | async)?.name }}\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=\"c8y-tools\"\n path=\"#/software\"\n label=\"{{ 'Software repository' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n icon=\"c8y-tools\"\n label=\"{{ (software$ | async)?.name }}\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n @if (!(isLegacy$ | async)) {\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add software' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-software-details--add-software-btn\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add software' | translate }}\n </button>\n }\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"reload$.next()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reloading$ | async }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"row\">\n <div class=\"col-lg-12 col-lg-max\">\n <div class=\"card card--fullpage\">\n <div class=\"card-block bg-level-1 flex-no-shrink p-t-24 p-b-24 overflow-visible\">\n <div class=\"content-flex-70\">\n <div class=\"text-center\">\n <i class=\"c8y-icon-duocolor icon-48 c8y-icon c8y-icon-tools\"></i>\n <p>\n <small class=\"label label-info\">Software</small>\n </p>\n </div>\n <div class=\"flex-grow col-10\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Name' | translate }}\n </label>\n <c8y-input-group-editable\n required\n formGroupClass=\"m-b-0\"\n [ariaLabel]=\"'Software name' | translate\"\n [placeholder]=\"'e.g. My software' | translate\"\n [ngModel]=\"(software$ | async)?.name\"\n (save)=\"updateSoftware$.next({ name: $event })\"\n ></c8y-input-group-editable>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Description' | translate }}\n </label>\n <c8y-input-group-editable\n formGroupClass=\"m-b-0\"\n [ariaLabel]=\"'Software description' | translate\"\n [placeholder]=\"'e.g. Cloud connectivity software' | translate\"\n [ngModel]=\"(software$ | async)?.description\"\n (save)=\"updateSoftware$.next({ description: $event })\"\n ></c8y-input-group-editable>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Device type' | translate }}\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'If the filter is set, the software will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n </label>\n <c8y-input-group-editable\n formGroupClass=\"m-b-0\"\n [ariaLabel]=\"'Device type' | translate\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Linux' }\"\n [ngModel]=\"(software$ | async)?.c8y_Filter?.type\"\n (save)=\"updateSoftware$.next({ c8y_Filter: { type: $event } })\"\n ></c8y-input-group-editable>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Software type' | translate }}\n </label>\n <div class=\"input-group\">\n <c8y-software-type\n [class.ng-dirty]=\"isSoftwareTypeChanged\"\n [softwareTypeMO]=\"softwareTypeObject\"\n (onSelectSoftware)=\"onSelectSoftwareType($event)\"\n ></c8y-software-type>\n @if (isSoftwareTypeChanged) {\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Cancel' | translate\"\n [attr.aria-label]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"cancelSoftwareTypeChange()\"\n >\n <i\n c8yIcon=\"times\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <button\n class=\"m-l-0 btn btn-primary\"\n [title]=\"'Save' | translate\"\n [attr.aria-label]=\"'Save' | translate\"\n type=\"button\"\n [disabled]=\"softwareTypeObject?.softwareType === ''\"\n (click)=\"\n updateSoftware$.next({ softwareType: softwareTypeObject.softwareType });\n isSoftwareTypeChanged = false\n \"\n >\n <i\n c8yIcon=\"check\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"inner-scroll\">\n <div class=\"card-header separator-top-bottom sticky-top bg-component\">\n <div\n class=\"card-title\"\n translate\n >\n Versions\n </div>\n </div>\n\n <div class=\"card-block p-t-0 p-b-24\">\n @if ((baseVersions$ | async)?.data.length === 0) {\n <c8y-ui-empty-state\n [icon]=\"'c8y-tools'\"\n [title]=\"'No versions to display.' | translate\"\n [subtitle]=\"'Add a new version by clicking below.' | translate\"\n >\n <p>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add software' | translate }}\"\n type=\"button\"\n (click)=\"addBaseVersion()\"\n >\n {{ 'Add software' | translate }}\n </button>\n </p>\n </c8y-ui-empty-state>\n }\n\n @if ((baseVersions$ | async)?.data.length > 0) {\n <c8y-list-group>\n <c8y-li\n *c8yFor=\"let baseVersion of baseVersions$ | async; let i = index; loadMore: 'auto'\"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-tools\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n <p\n class=\"text-truncate-wrap\"\n title=\"{{ baseVersion.c8y_Software.version }}\"\n >\n {{ baseVersion.c8y_Software.version }}\n </p>\n </div>\n <div class=\"col-5\">\n <p class=\"text-truncate-wrap\">\n <span\n class=\"text-label-small m-r-8\"\n translate\n >\n File\n </span>\n @if (baseVersion?.c8y_Software?.url === '') {\n <span title=\"{{ 'Provided by device' | translate }}\">\n {{ 'Provided by device' | translate }}\n </span>\n } @else {\n <span title=\"{{ getBinaryName$(baseVersion.c8y_Software.url) | async }}\">\n <c8y-file-download\n [url]=\"baseVersion.c8y_Software.url\"\n ></c8y-file-download>\n </span>\n }\n </p>\n </div>\n <div class=\"col-2 d-flex a-i-start\">\n @if (isLegacy$ | async) {\n <span class=\"label label-warning m-l-auto-sm\">\n {{ 'Legacy' | translate }}\n </span>\n }\n @if (!(isLegacy$ | async)) {\n <div class=\"fit-h-20\">\n <button\n class=\"btn btn-danger btn-xs visible-xs m-l-auto m-r-8 m-t-8\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n </div>\n }\n </div>\n @if (!(isLegacy$ | async)) {\n <div class=\"m-l-auto fit-h-20 hidden-xs\">\n <button\n class=\"btn btn-dot text-danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n data-cy=\"software-details-component--Delete-button\"\n [delay]=\"500\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n }\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "component", type: BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: InputGroupEditableComponent, selector: "c8y-input-group-editable", inputs: ["ariaLabel", "name", "size", "placeholder", "multiline", "maxHeight", "maxLength", "noSaveButton", "formGroupClass", "validators", "asyncValidators", "autocomplete"], outputs: ["save", "cancel"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: SoftwareTypeComponent, selector: "c8y-software-type", inputs: ["softwareTypeMO", "disabled", "style", "required", "placeholder", "emitResultsOnly", "showBtnInNotFoundMessage", "allowFreeEntries", "showClearSelectionOption", "clearSelectionOptionLabel", "presetSoftwareTypes"], outputs: ["onSelectSoftware"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "component", type: ListGroupComponent, selector: "c8y-list-group" }, { kind: "directive", type: ForOfDirective, selector: "[c8yFor]", inputs: ["c8yForOf", "c8yForLoadMore", "c8yForPipe", "c8yForNotFound", "c8yForMaxIterations", "c8yForLoadingTemplate", "c8yForLoadNextLabel", "c8yForLoadingLabel", "c8yForRealtime", "c8yForRealtimeOptions", "c8yForComparator", "c8yForEnableVirtualScroll", "c8yForVirtualScrollElementSize", "c8yForVirtualScrollStrategy", "c8yForVirtualScrollContainerHeight"], outputs: ["c8yForCount", "c8yForChange", "c8yForLoadMoreComponent"] }, { kind: "component", type: ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: FileDownloadComponent, selector: "c8y-file-download", inputs: ["url"] }, { kind: "directive", type: TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
418
423
  }
419
424
  __decorate([
420
425
  memoize(),
@@ -432,6 +437,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
432
437
  IconDirective,
433
438
  NgClass,
434
439
  FormGroupComponent,
440
+ InputGroupEditableComponent,
435
441
  RequiredInputPlaceholderDirective,
436
442
  FormsModule,
437
443
  NgStyle,
@@ -448,7 +454,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
448
454
  TooltipDirective,
449
455
  AsyncPipe,
450
456
  C8yTranslatePipe
451
- ], template: "<c8y-title>\n {{ (software$ | async)?.name }}\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=\"c8y-tools\"\n path=\"#/software\"\n label=\"{{ 'Software repository' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n icon=\"c8y-tools\"\n label=\"{{ (software$ | async)?.name }}\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n @if (!(isLegacy$ | async)) {\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add software' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-software-details--add-software-btn\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add software' | translate }}\n </button>\n }\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"reload$.next()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reloading$ | async }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"row\">\n <div class=\"col-lg-12 col-lg-max\">\n <div class=\"card card--fullpage\">\n <div class=\"card-block bg-level-1 flex-no-shrink p-t-24 p-b-24 overflow-visible\">\n <div class=\"content-flex-70\">\n <div class=\"text-center\">\n <i class=\"c8y-icon-duocolor icon-48 c8y-icon c8y-icon-tools\"></i>\n <p>\n <small class=\"label label-info\">Software</small>\n </p>\n </div>\n <div class=\"flex-grow col-10\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n [ngStyle]=\"{ 'width.ch': (software$ | async)?.name?.length + 2 || 31 }\"\n placeholder=\"{{ 'e.g. My software' | translate }}\"\n type=\"text\"\n required\n #nameInput\n [ngModel]=\"(software$ | async)?.name\"\n #nameModel=\"ngModel\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n (click)=\"updateSoftware$.next({ name: nameInput.value }); nameModel.reset()\"\n [disabled]=\"nameInput.value.length === 0\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Description' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n [ngStyle]=\"{ 'width.ch': (software$ | async)?.description?.length + 2 || 31 }\"\n placeholder=\"{{ 'e.g. Cloud connectivity software' | translate }}\"\n type=\"text\"\n #descriptionInput\n [ngModel]=\"(software$ | async)?.description\"\n #descriptionModel=\"ngModel\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n (click)=\"\n updateSoftware$.next({ description: descriptionInput.value });\n descriptionModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Device type' | translate }}\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'If the filter is set, the software will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n [ngStyle]=\"{ 'width.ch': (software$ | async)?.type?.length + 2 || 31 }\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n type=\"text\"\n #deviceTypeInput\n [ngModel]=\"(software$ | async)?.c8y_Filter?.type\"\n #deviceTypeModel=\"ngModel\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n (click)=\"\n updateSoftware$.next({ c8y_Filter: { type: deviceTypeInput.value } });\n deviceTypeModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Software type' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <c8y-software-type\n [style]=\"{ 'width.ch': softwareTypeObject?.softwareType?.length + 2 || 31 }\"\n [softwareTypeMO]=\"softwareTypeObject\"\n (onSelectSoftware)=\"onSelectSoftwareType($event)\"\n ></c8y-software-type>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n [ngClass]=\"isSoftwareTypeChanged ? '' : 'hidden'\"\n [disabled]=\"softwareTypeObject?.softwareType === ''\"\n (click)=\"\n updateSoftware$.next({ softwareType: softwareTypeObject.softwareType });\n softwareType.resetInput();\n isSoftwareTypeChanged = false\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"inner-scroll\">\n <div class=\"card-header separator-top-bottom sticky-top bg-component\">\n <div\n class=\"card-title\"\n translate\n >\n Versions\n </div>\n </div>\n\n <div class=\"card-block p-t-0 p-b-24\">\n @if ((baseVersions$ | async)?.data.length === 0) {\n <c8y-ui-empty-state\n [icon]=\"'c8y-tools'\"\n [title]=\"'No versions to display.' | translate\"\n [subtitle]=\"'Add a new version by clicking below.' | translate\"\n >\n <p>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add software' | translate }}\"\n type=\"button\"\n (click)=\"addBaseVersion()\"\n >\n {{ 'Add software' | translate }}\n </button>\n </p>\n </c8y-ui-empty-state>\n }\n\n @if ((baseVersions$ | async)?.data.length > 0) {\n <c8y-list-group>\n <c8y-li\n *c8yFor=\"let baseVersion of baseVersions$ | async; let i = index; loadMore: 'auto'\"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-tools\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n <p\n class=\"text-truncate-wrap\"\n title=\"{{ baseVersion.c8y_Software.version }}\"\n >\n {{ baseVersion.c8y_Software.version }}\n </p>\n </div>\n <div class=\"col-5\">\n <p class=\"text-truncate-wrap\">\n <span\n class=\"text-label-small m-r-8\"\n translate\n >\n File\n </span>\n @if (baseVersion?.c8y_Software?.url === '') {\n <span title=\"{{ 'Provided by device' | translate }}\">\n {{ 'Provided by device' | translate }}\n </span>\n } @else {\n <span title=\"{{ getBinaryName$(baseVersion.c8y_Software.url) | async }}\">\n <c8y-file-download\n [url]=\"baseVersion.c8y_Software.url\"\n ></c8y-file-download>\n </span>\n }\n </p>\n </div>\n <div class=\"col-2 d-flex a-i-start\">\n @if (isLegacy$ | async) {\n <span class=\"label label-warning m-l-auto-sm\">\n {{ 'Legacy' | translate }}\n </span>\n }\n @if (!(isLegacy$ | async)) {\n <div class=\"fit-h-20\">\n <button\n class=\"btn btn-danger btn-xs visible-xs m-l-auto m-r-8 m-t-8\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n </div>\n }\n </div>\n @if (!(isLegacy$ | async)) {\n <div class=\"m-l-auto fit-h-20 hidden-xs\">\n <button\n class=\"btn btn-dot text-danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n data-cy=\"software-details-component--Delete-button\"\n [delay]=\"500\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n }\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
457
+ ], template: "<c8y-title>\n {{ (software$ | async)?.name }}\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=\"c8y-tools\"\n path=\"#/software\"\n label=\"{{ 'Software repository' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n icon=\"c8y-tools\"\n label=\"{{ (software$ | async)?.name }}\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n @if (!(isLegacy$ | async)) {\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add software' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-software-details--add-software-btn\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add software' | translate }}\n </button>\n }\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"reload$.next()\"\n >\n <i\n c8yIcon=\"refresh\"\n [ngClass]=\"{ 'icon-spin': reloading$ | async }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<div class=\"row\">\n <div class=\"col-lg-12 col-lg-max\">\n <div class=\"card card--fullpage\">\n <div class=\"card-block bg-level-1 flex-no-shrink p-t-24 p-b-24 overflow-visible\">\n <div class=\"content-flex-70\">\n <div class=\"text-center\">\n <i class=\"c8y-icon-duocolor icon-48 c8y-icon c8y-icon-tools\"></i>\n <p>\n <small class=\"label label-info\">Software</small>\n </p>\n </div>\n <div class=\"flex-grow col-10\">\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Name' | translate }}\n </label>\n <c8y-input-group-editable\n required\n formGroupClass=\"m-b-0\"\n [ariaLabel]=\"'Software name' | translate\"\n [placeholder]=\"'e.g. My software' | translate\"\n [ngModel]=\"(software$ | async)?.name\"\n (save)=\"updateSoftware$.next({ name: $event })\"\n ></c8y-input-group-editable>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Description' | translate }}\n </label>\n <c8y-input-group-editable\n formGroupClass=\"m-b-0\"\n [ariaLabel]=\"'Software description' | translate\"\n [placeholder]=\"'e.g. Cloud connectivity software' | translate\"\n [ngModel]=\"(software$ | async)?.description\"\n (save)=\"updateSoftware$.next({ description: $event })\"\n ></c8y-input-group-editable>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Device type' | translate }}\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'If the filter is set, the software will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n </label>\n <c8y-input-group-editable\n formGroupClass=\"m-b-0\"\n [ariaLabel]=\"'Device type' | translate\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Linux' }\"\n [ngModel]=\"(software$ | async)?.c8y_Filter?.type\"\n (save)=\"updateSoftware$.next({ c8y_Filter: { type: $event } })\"\n ></c8y-input-group-editable>\n </c8y-form-group>\n </div>\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Software type' | translate }}\n </label>\n <div class=\"input-group\">\n <c8y-software-type\n [class.ng-dirty]=\"isSoftwareTypeChanged\"\n [softwareTypeMO]=\"softwareTypeObject\"\n (onSelectSoftware)=\"onSelectSoftwareType($event)\"\n ></c8y-software-type>\n @if (isSoftwareTypeChanged) {\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [title]=\"'Cancel' | translate\"\n [attr.aria-label]=\"'Cancel' | translate\"\n type=\"button\"\n (click)=\"cancelSoftwareTypeChange()\"\n >\n <i\n c8yIcon=\"times\"\n aria-hidden=\"true\"\n ></i>\n </button>\n <button\n class=\"m-l-0 btn btn-primary\"\n [title]=\"'Save' | translate\"\n [attr.aria-label]=\"'Save' | translate\"\n type=\"button\"\n [disabled]=\"softwareTypeObject?.softwareType === ''\"\n (click)=\"\n updateSoftware$.next({ softwareType: softwareTypeObject.softwareType });\n isSoftwareTypeChanged = false\n \"\n >\n <i\n c8yIcon=\"check\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"inner-scroll\">\n <div class=\"card-header separator-top-bottom sticky-top bg-component\">\n <div\n class=\"card-title\"\n translate\n >\n Versions\n </div>\n </div>\n\n <div class=\"card-block p-t-0 p-b-24\">\n @if ((baseVersions$ | async)?.data.length === 0) {\n <c8y-ui-empty-state\n [icon]=\"'c8y-tools'\"\n [title]=\"'No versions to display.' | translate\"\n [subtitle]=\"'Add a new version by clicking below.' | translate\"\n >\n <p>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add software' | translate }}\"\n type=\"button\"\n (click)=\"addBaseVersion()\"\n >\n {{ 'Add software' | translate }}\n </button>\n </p>\n </c8y-ui-empty-state>\n }\n\n @if ((baseVersions$ | async)?.data.length > 0) {\n <c8y-list-group>\n <c8y-li\n *c8yFor=\"let baseVersion of baseVersions$ | async; let i = index; loadMore: 'auto'\"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-tools\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n <p\n class=\"text-truncate-wrap\"\n title=\"{{ baseVersion.c8y_Software.version }}\"\n >\n {{ baseVersion.c8y_Software.version }}\n </p>\n </div>\n <div class=\"col-5\">\n <p class=\"text-truncate-wrap\">\n <span\n class=\"text-label-small m-r-8\"\n translate\n >\n File\n </span>\n @if (baseVersion?.c8y_Software?.url === '') {\n <span title=\"{{ 'Provided by device' | translate }}\">\n {{ 'Provided by device' | translate }}\n </span>\n } @else {\n <span title=\"{{ getBinaryName$(baseVersion.c8y_Software.url) | async }}\">\n <c8y-file-download\n [url]=\"baseVersion.c8y_Software.url\"\n ></c8y-file-download>\n </span>\n }\n </p>\n </div>\n <div class=\"col-2 d-flex a-i-start\">\n @if (isLegacy$ | async) {\n <span class=\"label label-warning m-l-auto-sm\">\n {{ 'Legacy' | translate }}\n </span>\n }\n @if (!(isLegacy$ | async)) {\n <div class=\"fit-h-20\">\n <button\n class=\"btn btn-danger btn-xs visible-xs m-l-auto m-r-8 m-t-8\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n </div>\n }\n </div>\n @if (!(isLegacy$ | async)) {\n <div class=\"m-l-auto fit-h-20 hidden-xs\">\n <button\n class=\"btn btn-dot text-danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n data-cy=\"software-details-component--Delete-button\"\n [delay]=\"500\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n }\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
452
458
  }], ctorParameters: () => [{ type: i1$2.ActivatedRoute }, { type: i2$1.InventoryService }, { type: i1$1.RepositoryService }, { type: i2.AlertService }, { type: i4$1.TranslateService }, { type: i2.ModalService }, { type: i1.BsModalService }, { type: i2.GainsightService }, { type: i1$2.Router }], propDecorators: { softwareType: [{
453
459
  type: ViewChild,
454
460
  args: [SoftwareTypeComponent, { static: true }]