@c8y/ngx-components 1024.1.8 → 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 (87) 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 +65 -25
  6. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  7. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +363 -38
  8. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  9. package/fesm2022/c8y-ngx-components-device-profile.mjs +27 -9
  10. package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
  11. package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -1
  12. package/fesm2022/c8y-ngx-components-echart.mjs +796 -123
  13. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  14. package/fesm2022/c8y-ngx-components-global-context.mjs +391 -54
  15. package/fesm2022/c8y-ngx-components-global-context.mjs.map +1 -1
  16. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +9 -11
  17. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
  18. package/fesm2022/c8y-ngx-components-remote-access-data.mjs +43 -0
  19. package/fesm2022/c8y-ngx-components-remote-access-data.mjs.map +1 -1
  20. package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs +17 -3
  21. package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs.map +1 -1
  22. package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs +179 -41
  23. package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs.map +1 -1
  24. package/fesm2022/c8y-ngx-components-repository-firmware.mjs +5 -4
  25. package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
  26. package/fesm2022/c8y-ngx-components-repository-software.mjs +10 -4
  27. package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
  28. package/fesm2022/c8y-ngx-components-time-context.mjs +146 -20
  29. package/fesm2022/c8y-ngx-components-time-context.mjs.map +1 -1
  30. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +5 -4
  31. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
  32. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs +6 -5
  33. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs.map +1 -1
  34. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +198 -24
  35. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  36. package/fesm2022/c8y-ngx-components.mjs +109 -36
  37. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  38. package/locales/de.po +141 -13
  39. package/locales/es.po +141 -13
  40. package/locales/fr.po +141 -13
  41. package/locales/ja_JP.po +140 -14
  42. package/locales/ko.po +141 -13
  43. package/locales/locales.pot +139 -11
  44. package/locales/nl.po +141 -13
  45. package/locales/pl.po +141 -13
  46. package/locales/pt_BR.po +141 -13
  47. package/locales/zh_CN.po +141 -13
  48. package/locales/zh_TW.po +141 -13
  49. package/package.json +1 -1
  50. package/types/c8y-ngx-components-bookmarks.d.ts +7 -7
  51. package/types/c8y-ngx-components-bookmarks.d.ts.map +1 -1
  52. package/types/c8y-ngx-components-datapoint-explorer-view.d.ts +4 -1
  53. package/types/c8y-ngx-components-datapoint-explorer-view.d.ts.map +1 -1
  54. package/types/c8y-ngx-components-datapoint-selector.d.ts +93 -5
  55. package/types/c8y-ngx-components-datapoint-selector.d.ts.map +1 -1
  56. package/types/c8y-ngx-components-device-profile.d.ts +5 -2
  57. package/types/c8y-ngx-components-device-profile.d.ts.map +1 -1
  58. package/types/c8y-ngx-components-echart-models.d.ts +25 -3
  59. package/types/c8y-ngx-components-echart-models.d.ts.map +1 -1
  60. package/types/c8y-ngx-components-echart.d.ts +65 -5
  61. package/types/c8y-ngx-components-echart.d.ts.map +1 -1
  62. package/types/c8y-ngx-components-global-context.d.ts +187 -7
  63. package/types/c8y-ngx-components-global-context.d.ts.map +1 -1
  64. package/types/c8y-ngx-components-protocol-opcua.d.ts.map +1 -1
  65. package/types/c8y-ngx-components-remote-access-data.d.ts +19 -0
  66. package/types/c8y-ngx-components-remote-access-data.d.ts.map +1 -1
  67. package/types/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.d.ts +10 -3
  68. package/types/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.d.ts.map +1 -1
  69. package/types/c8y-ngx-components-remote-access-terminal-viewer.d.ts +20 -2
  70. package/types/c8y-ngx-components-remote-access-terminal-viewer.d.ts.map +1 -1
  71. package/types/c8y-ngx-components-repository-firmware.d.ts.map +1 -1
  72. package/types/c8y-ngx-components-repository-software.d.ts +2 -0
  73. package/types/c8y-ngx-components-repository-software.d.ts.map +1 -1
  74. package/types/c8y-ngx-components-time-context.d.ts +50 -8
  75. package/types/c8y-ngx-components-time-context.d.ts.map +1 -1
  76. package/types/c8y-ngx-components-trusted-certificates.d.ts.map +1 -1
  77. package/types/c8y-ngx-components-widgets-implementations-alarms.d.ts +1 -0
  78. package/types/c8y-ngx-components-widgets-implementations-alarms.d.ts.map +1 -1
  79. package/types/c8y-ngx-components-widgets-implementations-asset-table.d.ts.map +1 -1
  80. package/types/c8y-ngx-components-widgets-implementations-datapoints-graph.d.ts +25 -0
  81. package/types/c8y-ngx-components-widgets-implementations-datapoints-graph.d.ts.map +1 -1
  82. package/types/c8y-ngx-components-widgets-implementations-datapoints-list.d.ts +1 -0
  83. package/types/c8y-ngx-components-widgets-implementations-datapoints-list.d.ts.map +1 -1
  84. package/types/c8y-ngx-components-widgets-implementations-scada.d.ts +2 -0
  85. package/types/c8y-ngx-components-widgets-implementations-scada.d.ts.map +1 -1
  86. package/types/c8y-ngx-components.d.ts +55 -12
  87. package/types/c8y-ngx-components.d.ts.map +1 -1
@@ -5,14 +5,14 @@ import * as i3 from '@c8y/client';
5
5
  import { OperationStatus } from '@c8y/client';
6
6
  import { gettext } from '@c8y/ngx-components/gettext';
7
7
  import * as i4 from '@c8y/ngx-components';
8
- import { ModalSelectionMode, C8yTranslateDirective, IconDirective, ListGroupComponent, ListItemComponent, ListItemIconComponent, ListItemBodyComponent, ProductExperienceDirective, C8yTranslatePipe, hookRoute, ViewContext, FormGroupComponent, TypeaheadComponent, ForOfDirective, HighlightComponent, MessagesComponent, MessageDirective, RequiredInputPlaceholderDirective, FilePickerComponent, ValidationPattern, Status, TitleComponent, BreadcrumbComponent, BreadcrumbItemComponent, ActionBarItemComponent, EmptyStateComponent, ListItemCollapseComponent, memoize, BuiltInActionType, HelpComponent, DataGridComponent, EmptyStateContextDirective, NavigatorNode, hookNavigator } from '@c8y/ngx-components';
8
+ import { ModalSelectionMode, C8yTranslateDirective, IconDirective, ListGroupComponent, ListItemComponent, ListItemIconComponent, ListItemBodyComponent, ProductExperienceDirective, C8yTranslatePipe, hookRoute, ViewContext, FormGroupComponent, TypeaheadComponent, ForOfDirective, HighlightComponent, MessagesComponent, MessageDirective, RequiredInputPlaceholderDirective, FilePickerComponent, ValidationPattern, Status, TitleComponent, BreadcrumbComponent, BreadcrumbItemComponent, ActionBarItemComponent, InputGroupEditableComponent, EmptyStateComponent, ListItemCollapseComponent, memoize, BuiltInActionType, HelpComponent, DataGridComponent, EmptyStateContextDirective, NavigatorNode, hookNavigator } from '@c8y/ngx-components';
9
9
  import * as i2 from '@c8y/ngx-components/repository/shared';
10
10
  import { PRODUCT_EXPERIENCE_REPOSITORY_SHARED, RepositoryType, RepositorySelectModalComponent, SharedRepositoryModule, FileDownloadComponent, RepositoryItemNameGridColumn, DescriptionGridColumn, DeviceTypeGridColumn, VersionsGridColumn } from '@c8y/ngx-components/repository/shared';
11
11
  import { isEmpty, get, assign, indexOf, has, isUndefined, property } from 'lodash-es';
12
12
  import * as i1$1 from 'ngx-bootstrap/modal';
13
13
  import { BehaviorSubject, from, combineLatest, of, merge, pipe, Subject, defer, firstValueFrom, map as map$1 } from 'rxjs';
14
14
  import { map, filter, switchMap, shareReplay, take, distinctUntilChanged, debounceTime, tap, distinctUntilKeyChanged, withLatestFrom, takeUntil } from 'rxjs/operators';
15
- import { AsyncPipe, NgClass, NgStyle, NgPlural, NgPluralCase } from '@angular/common';
15
+ import { AsyncPipe, NgClass, NgPlural, NgPluralCase, NgStyle } from '@angular/common';
16
16
  import { OperationDetailsComponent, OperationDetailsModule } from '@c8y/ngx-components/operations/operation-details';
17
17
  import * as i4$1 from '@angular/forms';
18
18
  import { FormsModule } from '@angular/forms';
@@ -652,7 +652,7 @@ class FirmwareDetailsComponent {
652
652
  this.destroy$.unsubscribe();
653
653
  }
654
654
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: FirmwareDetailsComponent, deps: [{ token: i1.ActivatedRoute }, { token: i3.InventoryService }, { token: i2.RepositoryService }, { token: i4.AlertService }, { token: i5.TranslateService }, { token: i4.ModalService }, { token: i1$1.BsModalService }, { token: i4.GainsightService }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Component }); }
655
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: FirmwareDetailsComponent, isStandalone: true, selector: "c8y-firmware-details", ngImport: i0, template: "<c8y-title>\n {{ (firmware$ | 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-firmware\"\n path=\"#/firmware\"\n label=\"{{ 'Firmware repository' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n icon=\"c8y-firmware\"\n label=\"{{ (firmware$ | 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 firmware' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--add-firmware-btn\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware' | translate }}\n </button>\n }\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n @if (canAddPatchVersions$ | async) {\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add firmware patch' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--add-firmware-patch-btn\"\n (click)=\"addPatchVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware patch' | 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\">\n <div class=\"content-flex-70\">\n <div class=\"text-center\">\n <i class=\"c8y-icon-duocolor icon-48 c8y-icon c8y-icon-firmware\"></i>\n <p>\n <small class=\"label label-info\">Firmware</small>\n </p>\n </div>\n <div class=\"flex-grow col-10\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.name?.length + 2 || 36 }\"\n placeholder=\"{{ 'e.g. My firmware' | translate }}\"\n type=\"text\"\n required\n #nameInput\n [ngModel]=\"(firmware$ | async)?.name\"\n #nameModel=\"ngModel\"\n data-cy=\"firmware-details--name-input\"\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 data-cy=\"firmware-details--name-save-btn\"\n (click)=\"updateFirmware$.next({ name: nameInput.value }); nameModel.reset()\"\n [disabled]=\"nameInput.value.length == 0\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Description' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.description?.length || 36 }\"\n placeholder=\"{{ 'e.g. Firmware for hardware revision B' | translate }}\"\n type=\"text\"\n #descriptionInput\n [ngModel]=\"(firmware$ | async)?.description\"\n #descriptionModel=\"ngModel\"\n data-cy=\"firmware-details--description-input\"\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 data-cy=\"firmware-details--description-save-btn\"\n (click)=\"\n updateFirmware$.next({ description: descriptionInput.value });\n descriptionModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Device type filter' | translate }}\n\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n placement=\"right\"\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': (firmware$ | async)?.type?.length || 36 }\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n type=\"text\"\n #deviceTypeInput\n [ngModel]=\"(firmware$ | async)?.c8y_Filter?.type\"\n #deviceTypeModel=\"ngModel\"\n data-cy=\"firmware-details--device-type-filter-input\"\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 data-cy=\"firmware-details--device-type-filter-save-btn\"\n (click)=\"\n updateFirmware$.next({ c8y_Filter: { type: deviceTypeInput.value } });\n deviceTypeModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"inner-scroll\">\n <div class=\"card-header separator-top-bottom bg-component sticky-top\">\n <div\n class=\"card-title\"\n translate\n >\n Versions and patches\n </div>\n </div>\n\n <div class=\"card-block p-t-0 p-b-24\">\n @if ((baseVersions$ | async)?.data.length === 0) {\n <div>\n <c8y-ui-empty-state\n [icon]=\"'c8y-firmware'\"\n [title]=\"'No versions to display.' | translate\"\n [subtitle]=\"'Add a new version by clicking below.' | translate\"\n [horizontal]=\"true\"\n >\n <button\n class=\"btn btn-sm btn-default m-t-8\"\n title=\"{{ 'Add firmware' | translate }}\"\n type=\"button\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware' | translate }}\n </button>\n </c8y-ui-empty-state>\n </div>\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 [emptyActions]=\"!(getPatchVersions$(baseVersion) | async)?.data.length\"\n [collapsed]=\"!expanded[baseVersion.id]\"\n (collapsedChange)=\"expanded[baseVersion.id] = !$event\"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n <p\n class=\"text-truncate\"\n title=\"{{ baseVersion.c8y_Firmware.version }}\"\n >\n {{ baseVersion.c8y_Firmware.version }}\n </p>\n </div>\n <div class=\"col-5\">\n <p class=\"text-truncate\">\n <span\n class=\"text-label-small m-r-8\"\n translate\n >\n File\n </span>\n @if (baseVersion.c8y_Firmware.url === '') {\n <span title=\"{{ 'Provided by device' | translate }}\">\n {{ 'Provided by device' | translate }}\n </span>\n } @else {\n <span title=\"{{ getBinaryName$(baseVersion.c8y_Firmware.url) | async }}\">\n <c8y-file-download\n url=\"{{ baseVersion.c8y_Firmware.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 <span>\n @if ((getPatchVersionsCount$(baseVersion) | async) === null) {\n <span>\n <span class=\"label label-info\">\n <i\n class=\"icon-spin\"\n c8yIcon=\"circle-o-notch\"\n ></i>\n </span>\n </span>\n }\n @if ((getPatchVersionsCount$(baseVersion) | async) !== null) {\n <span>\n <span [ngPlural]=\"getPatchVersionsCount$(baseVersion) | async\">\n <ng-template ngPluralCase=\"=0\">\n <span class=\"label label-default m-l-auto-sm\">\n <span translate>No patches</span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"=1\">\n <span class=\"label label-info\">\n <span translate>1 patch</span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span class=\"label label-info\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{\n count: getPatchVersionsCount$(baseVersion) | async\n }\"\n >\n {{ count }} patches\n </span>\n </span>\n </ng-template>\n </span>\n </span>\n }\n </span>\n }\n </div>\n @if (!(isLegacy$ | async)) {\n <div class=\"fit-h-20 visible-xs\">\n <button\n class=\"btn btn-default btn-sm 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 @if (!(isLegacy$ | async)) {\n <div class=\"m-l-auto fit-h-20 p-r-8 hidden-xs\">\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--delete-base-version\"\n [delay]=\"500\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n }\n </c8y-li-body>\n @if ((getPatchVersions$(baseVersion) | async)?.data.length) {\n <c8y-li-collapse>\n <c8y-list-group class=\"separator-top\">\n <c8y-li\n *c8yFor=\"\n let patchVersion of getPatchVersions$(baseVersion) | async;\n let i = index;\n loadMore: 'auto'\n \"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n {{ patchVersion.c8y_Firmware.version }}\n </div>\n <div class=\"col-5\">\n <div class=\"text-truncate\">\n <span\n class=\"text-label-small m-r-8\"\n translate\n >\n File\n </span>\n @if (patchVersion?.c8y_Firmware?.url === '') {\n <span title=\"{{ 'Provided by device' | translate }}\">\n {{ 'Provided by device' | translate }}\n </span>\n } @else {\n <span title=\"patchVersion.c8y_Firmware.url\">\n <c8y-file-download\n [url]=\"patchVersion.c8y_Firmware.url\"\n ></c8y-file-download>\n </span>\n }\n </div>\n </div>\n <div class=\"visible-xs m-t-8\">\n <button\n class=\"btn btn-danger btn-xs\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--delete-patch-version\"\n (click)=\"deletePatchVersion(patchVersion)\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n </div>\n <div class=\"m-l-auto p-r-8 hidden-xs fit-h-20\">\n <button\n class=\"btn btn-dot text-danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n placement=\"right\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"deletePatchVersion(patchVersion)\"\n >\n <i\n c8yIcon=\"delete\"\n data-cy=\"firmware-details--Remove-icon\"\n ></i>\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </c8y-li-collapse>\n }\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$1.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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4$1.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: "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: NgPlural, selector: "[ngPlural]", inputs: ["ngPlural"] }, { kind: "directive", type: NgPluralCase, selector: "[ngPluralCase]" }, { 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: "component", type: ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
655
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: FirmwareDetailsComponent, isStandalone: true, selector: "c8y-firmware-details", ngImport: i0, template: "<c8y-title>\n {{ (firmware$ | 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-firmware\"\n path=\"#/firmware\"\n label=\"{{ 'Firmware repository' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n icon=\"c8y-firmware\"\n label=\"{{ (firmware$ | 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 firmware' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--add-firmware-btn\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware' | translate }}\n </button>\n }\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n @if (canAddPatchVersions$ | async) {\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add firmware patch' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--add-firmware-patch-btn\"\n (click)=\"addPatchVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware patch' | 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\">\n <div class=\"content-flex-70\">\n <div class=\"text-center\">\n <i class=\"c8y-icon-duocolor icon-48 c8y-icon c8y-icon-firmware\"></i>\n <p>\n <small class=\"label label-info\">Firmware</small>\n </p>\n </div>\n <div class=\"flex-grow col-10\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Name' | translate }}\n </label>\n <c8y-input-group-editable\n required\n formGroupClass=\"m-b-0\"\n [ariaLabel]=\"'Firmware name' | translate\"\n [placeholder]=\"'e.g. My firmware' | translate\"\n data-cy=\"firmware-details--name-input\"\n [ngModel]=\"(firmware$ | async)?.name\"\n (save)=\"updateFirmware$.next({ name: $event })\"\n ></c8y-input-group-editable>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Description' | translate }}\n </label>\n <c8y-input-group-editable\n formGroupClass=\"m-b-0\"\n [ariaLabel]=\"'Firmware description' | translate\"\n [placeholder]=\"'e.g. Firmware for hardware revision B' | translate\"\n data-cy=\"firmware-details--description-input\"\n [ngModel]=\"(firmware$ | async)?.description\"\n (save)=\"updateFirmware$.next({ description: $event })\"\n ></c8y-input-group-editable>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Device type filter' | translate }}\n\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n placement=\"right\"\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 filter' | translate\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Linux' }\"\n data-cy=\"firmware-details--device-type-filter-input\"\n [ngModel]=\"(firmware$ | async)?.c8y_Filter?.type\"\n (save)=\"updateFirmware$.next({ c8y_Filter: { type: $event } })\"\n ></c8y-input-group-editable>\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 bg-component sticky-top\">\n <div\n class=\"card-title\"\n translate\n >\n Versions and patches\n </div>\n </div>\n\n <div class=\"card-block p-t-0 p-b-24\">\n @if ((baseVersions$ | async)?.data.length === 0) {\n <div>\n <c8y-ui-empty-state\n [icon]=\"'c8y-firmware'\"\n [title]=\"'No versions to display.' | translate\"\n [subtitle]=\"'Add a new version by clicking below.' | translate\"\n [horizontal]=\"true\"\n >\n <button\n class=\"btn btn-sm btn-default m-t-8\"\n title=\"{{ 'Add firmware' | translate }}\"\n type=\"button\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware' | translate }}\n </button>\n </c8y-ui-empty-state>\n </div>\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 [emptyActions]=\"!(getPatchVersions$(baseVersion) | async)?.data.length\"\n [collapsed]=\"!expanded[baseVersion.id]\"\n (collapsedChange)=\"expanded[baseVersion.id] = !$event\"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n <p\n class=\"text-truncate\"\n title=\"{{ baseVersion.c8y_Firmware.version }}\"\n >\n {{ baseVersion.c8y_Firmware.version }}\n </p>\n </div>\n <div class=\"col-5\">\n <p class=\"text-truncate\">\n <span\n class=\"text-label-small m-r-8\"\n translate\n >\n File\n </span>\n @if (baseVersion.c8y_Firmware.url === '') {\n <span title=\"{{ 'Provided by device' | translate }}\">\n {{ 'Provided by device' | translate }}\n </span>\n } @else {\n <span title=\"{{ getBinaryName$(baseVersion.c8y_Firmware.url) | async }}\">\n <c8y-file-download\n url=\"{{ baseVersion.c8y_Firmware.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 <span>\n @if ((getPatchVersionsCount$(baseVersion) | async) === null) {\n <span>\n <span class=\"label label-info\">\n <i\n class=\"icon-spin\"\n c8yIcon=\"circle-o-notch\"\n ></i>\n </span>\n </span>\n }\n @if ((getPatchVersionsCount$(baseVersion) | async) !== null) {\n <span>\n <span [ngPlural]=\"getPatchVersionsCount$(baseVersion) | async\">\n <ng-template ngPluralCase=\"=0\">\n <span class=\"label label-default m-l-auto-sm\">\n <span translate>No patches</span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"=1\">\n <span class=\"label label-info\">\n <span translate>1 patch</span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span class=\"label label-info\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{\n count: getPatchVersionsCount$(baseVersion) | async\n }\"\n >\n {{ count }} patches\n </span>\n </span>\n </ng-template>\n </span>\n </span>\n }\n </span>\n }\n </div>\n @if (!(isLegacy$ | async)) {\n <div class=\"fit-h-20 visible-xs\">\n <button\n class=\"btn btn-default btn-sm 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 @if (!(isLegacy$ | async)) {\n <div class=\"m-l-auto fit-h-20 p-r-8 hidden-xs\">\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--delete-base-version\"\n [delay]=\"500\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n }\n </c8y-li-body>\n @if ((getPatchVersions$(baseVersion) | async)?.data.length) {\n <c8y-li-collapse>\n <c8y-list-group class=\"separator-top\">\n <c8y-li\n *c8yFor=\"\n let patchVersion of getPatchVersions$(baseVersion) | async;\n let i = index;\n loadMore: 'auto'\n \"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n {{ patchVersion.c8y_Firmware.version }}\n </div>\n <div class=\"col-5\">\n <div class=\"text-truncate\">\n <span\n class=\"text-label-small m-r-8\"\n translate\n >\n File\n </span>\n @if (patchVersion?.c8y_Firmware?.url === '') {\n <span title=\"{{ 'Provided by device' | translate }}\">\n {{ 'Provided by device' | translate }}\n </span>\n } @else {\n <span title=\"patchVersion.c8y_Firmware.url\">\n <c8y-file-download\n [url]=\"patchVersion.c8y_Firmware.url\"\n ></c8y-file-download>\n </span>\n }\n </div>\n </div>\n <div class=\"visible-xs m-t-8\">\n <button\n class=\"btn btn-danger btn-xs\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--delete-patch-version\"\n (click)=\"deletePatchVersion(patchVersion)\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n </div>\n <div class=\"m-l-auto p-r-8 hidden-xs fit-h-20\">\n <button\n class=\"btn btn-dot text-danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n placement=\"right\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"deletePatchVersion(patchVersion)\"\n >\n <i\n c8yIcon=\"delete\"\n data-cy=\"firmware-details--Remove-icon\"\n ></i>\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </c8y-li-collapse>\n }\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$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4$1.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: "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: NgPlural, selector: "[ngPlural]", inputs: ["ngPlural"] }, { kind: "directive", type: NgPluralCase, selector: "[ngPluralCase]" }, { 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: "component", type: ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
656
656
  }
657
657
  __decorate([
658
658
  memoize(property('id')),
@@ -682,6 +682,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
682
682
  IconDirective,
683
683
  NgClass,
684
684
  FormGroupComponent,
685
+ InputGroupEditableComponent,
685
686
  RequiredInputPlaceholderDirective,
686
687
  FormsModule,
687
688
  NgStyle,
@@ -700,7 +701,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
700
701
  ListItemCollapseComponent,
701
702
  AsyncPipe,
702
703
  C8yTranslatePipe
703
- ], template: "<c8y-title>\n {{ (firmware$ | 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-firmware\"\n path=\"#/firmware\"\n label=\"{{ 'Firmware repository' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n icon=\"c8y-firmware\"\n label=\"{{ (firmware$ | 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 firmware' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--add-firmware-btn\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware' | translate }}\n </button>\n }\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n @if (canAddPatchVersions$ | async) {\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add firmware patch' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--add-firmware-patch-btn\"\n (click)=\"addPatchVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware patch' | 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\">\n <div class=\"content-flex-70\">\n <div class=\"text-center\">\n <i class=\"c8y-icon-duocolor icon-48 c8y-icon c8y-icon-firmware\"></i>\n <p>\n <small class=\"label label-info\">Firmware</small>\n </p>\n </div>\n <div class=\"flex-grow col-10\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.name?.length + 2 || 36 }\"\n placeholder=\"{{ 'e.g. My firmware' | translate }}\"\n type=\"text\"\n required\n #nameInput\n [ngModel]=\"(firmware$ | async)?.name\"\n #nameModel=\"ngModel\"\n data-cy=\"firmware-details--name-input\"\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 data-cy=\"firmware-details--name-save-btn\"\n (click)=\"updateFirmware$.next({ name: nameInput.value }); nameModel.reset()\"\n [disabled]=\"nameInput.value.length == 0\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Description' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.description?.length || 36 }\"\n placeholder=\"{{ 'e.g. Firmware for hardware revision B' | translate }}\"\n type=\"text\"\n #descriptionInput\n [ngModel]=\"(firmware$ | async)?.description\"\n #descriptionModel=\"ngModel\"\n data-cy=\"firmware-details--description-input\"\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 data-cy=\"firmware-details--description-save-btn\"\n (click)=\"\n updateFirmware$.next({ description: descriptionInput.value });\n descriptionModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Device type filter' | translate }}\n\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n placement=\"right\"\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': (firmware$ | async)?.type?.length || 36 }\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n type=\"text\"\n #deviceTypeInput\n [ngModel]=\"(firmware$ | async)?.c8y_Filter?.type\"\n #deviceTypeModel=\"ngModel\"\n data-cy=\"firmware-details--device-type-filter-input\"\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 data-cy=\"firmware-details--device-type-filter-save-btn\"\n (click)=\"\n updateFirmware$.next({ c8y_Filter: { type: deviceTypeInput.value } });\n deviceTypeModel.reset()\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"inner-scroll\">\n <div class=\"card-header separator-top-bottom bg-component sticky-top\">\n <div\n class=\"card-title\"\n translate\n >\n Versions and patches\n </div>\n </div>\n\n <div class=\"card-block p-t-0 p-b-24\">\n @if ((baseVersions$ | async)?.data.length === 0) {\n <div>\n <c8y-ui-empty-state\n [icon]=\"'c8y-firmware'\"\n [title]=\"'No versions to display.' | translate\"\n [subtitle]=\"'Add a new version by clicking below.' | translate\"\n [horizontal]=\"true\"\n >\n <button\n class=\"btn btn-sm btn-default m-t-8\"\n title=\"{{ 'Add firmware' | translate }}\"\n type=\"button\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware' | translate }}\n </button>\n </c8y-ui-empty-state>\n </div>\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 [emptyActions]=\"!(getPatchVersions$(baseVersion) | async)?.data.length\"\n [collapsed]=\"!expanded[baseVersion.id]\"\n (collapsedChange)=\"expanded[baseVersion.id] = !$event\"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n <p\n class=\"text-truncate\"\n title=\"{{ baseVersion.c8y_Firmware.version }}\"\n >\n {{ baseVersion.c8y_Firmware.version }}\n </p>\n </div>\n <div class=\"col-5\">\n <p class=\"text-truncate\">\n <span\n class=\"text-label-small m-r-8\"\n translate\n >\n File\n </span>\n @if (baseVersion.c8y_Firmware.url === '') {\n <span title=\"{{ 'Provided by device' | translate }}\">\n {{ 'Provided by device' | translate }}\n </span>\n } @else {\n <span title=\"{{ getBinaryName$(baseVersion.c8y_Firmware.url) | async }}\">\n <c8y-file-download\n url=\"{{ baseVersion.c8y_Firmware.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 <span>\n @if ((getPatchVersionsCount$(baseVersion) | async) === null) {\n <span>\n <span class=\"label label-info\">\n <i\n class=\"icon-spin\"\n c8yIcon=\"circle-o-notch\"\n ></i>\n </span>\n </span>\n }\n @if ((getPatchVersionsCount$(baseVersion) | async) !== null) {\n <span>\n <span [ngPlural]=\"getPatchVersionsCount$(baseVersion) | async\">\n <ng-template ngPluralCase=\"=0\">\n <span class=\"label label-default m-l-auto-sm\">\n <span translate>No patches</span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"=1\">\n <span class=\"label label-info\">\n <span translate>1 patch</span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span class=\"label label-info\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{\n count: getPatchVersionsCount$(baseVersion) | async\n }\"\n >\n {{ count }} patches\n </span>\n </span>\n </ng-template>\n </span>\n </span>\n }\n </span>\n }\n </div>\n @if (!(isLegacy$ | async)) {\n <div class=\"fit-h-20 visible-xs\">\n <button\n class=\"btn btn-default btn-sm 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 @if (!(isLegacy$ | async)) {\n <div class=\"m-l-auto fit-h-20 p-r-8 hidden-xs\">\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--delete-base-version\"\n [delay]=\"500\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n }\n </c8y-li-body>\n @if ((getPatchVersions$(baseVersion) | async)?.data.length) {\n <c8y-li-collapse>\n <c8y-list-group class=\"separator-top\">\n <c8y-li\n *c8yFor=\"\n let patchVersion of getPatchVersions$(baseVersion) | async;\n let i = index;\n loadMore: 'auto'\n \"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n {{ patchVersion.c8y_Firmware.version }}\n </div>\n <div class=\"col-5\">\n <div class=\"text-truncate\">\n <span\n class=\"text-label-small m-r-8\"\n translate\n >\n File\n </span>\n @if (patchVersion?.c8y_Firmware?.url === '') {\n <span title=\"{{ 'Provided by device' | translate }}\">\n {{ 'Provided by device' | translate }}\n </span>\n } @else {\n <span title=\"patchVersion.c8y_Firmware.url\">\n <c8y-file-download\n [url]=\"patchVersion.c8y_Firmware.url\"\n ></c8y-file-download>\n </span>\n }\n </div>\n </div>\n <div class=\"visible-xs m-t-8\">\n <button\n class=\"btn btn-danger btn-xs\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--delete-patch-version\"\n (click)=\"deletePatchVersion(patchVersion)\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n </div>\n <div class=\"m-l-auto p-r-8 hidden-xs fit-h-20\">\n <button\n class=\"btn btn-dot text-danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n placement=\"right\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"deletePatchVersion(patchVersion)\"\n >\n <i\n c8yIcon=\"delete\"\n data-cy=\"firmware-details--Remove-icon\"\n ></i>\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </c8y-li-collapse>\n }\n </c8y-li>\n </c8y-list-group>\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
704
+ ], template: "<c8y-title>\n {{ (firmware$ | 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-firmware\"\n path=\"#/firmware\"\n label=\"{{ 'Firmware repository' | translate }}\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n icon=\"c8y-firmware\"\n label=\"{{ (firmware$ | 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 firmware' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--add-firmware-btn\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware' | translate }}\n </button>\n }\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n @if (canAddPatchVersions$ | async) {\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add firmware patch' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--add-firmware-patch-btn\"\n (click)=\"addPatchVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware patch' | 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\">\n <div class=\"content-flex-70\">\n <div class=\"text-center\">\n <i class=\"c8y-icon-duocolor icon-48 c8y-icon c8y-icon-firmware\"></i>\n <p>\n <small class=\"label label-info\">Firmware</small>\n </p>\n </div>\n <div class=\"flex-grow col-10\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Name' | translate }}\n </label>\n <c8y-input-group-editable\n required\n formGroupClass=\"m-b-0\"\n [ariaLabel]=\"'Firmware name' | translate\"\n [placeholder]=\"'e.g. My firmware' | translate\"\n data-cy=\"firmware-details--name-input\"\n [ngModel]=\"(firmware$ | async)?.name\"\n (save)=\"updateFirmware$.next({ name: $event })\"\n ></c8y-input-group-editable>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Description' | translate }}\n </label>\n <c8y-input-group-editable\n formGroupClass=\"m-b-0\"\n [ariaLabel]=\"'Firmware description' | translate\"\n [placeholder]=\"'e.g. Firmware for hardware revision B' | translate\"\n data-cy=\"firmware-details--description-input\"\n [ngModel]=\"(firmware$ | async)?.description\"\n (save)=\"updateFirmware$.next({ description: $event })\"\n ></c8y-input-group-editable>\n </c8y-form-group>\n </div>\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Device type filter' | translate }}\n\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n placement=\"right\"\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 filter' | translate\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Linux' }\"\n data-cy=\"firmware-details--device-type-filter-input\"\n [ngModel]=\"(firmware$ | async)?.c8y_Filter?.type\"\n (save)=\"updateFirmware$.next({ c8y_Filter: { type: $event } })\"\n ></c8y-input-group-editable>\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 bg-component sticky-top\">\n <div\n class=\"card-title\"\n translate\n >\n Versions and patches\n </div>\n </div>\n\n <div class=\"card-block p-t-0 p-b-24\">\n @if ((baseVersions$ | async)?.data.length === 0) {\n <div>\n <c8y-ui-empty-state\n [icon]=\"'c8y-firmware'\"\n [title]=\"'No versions to display.' | translate\"\n [subtitle]=\"'Add a new version by clicking below.' | translate\"\n [horizontal]=\"true\"\n >\n <button\n class=\"btn btn-sm btn-default m-t-8\"\n title=\"{{ 'Add firmware' | translate }}\"\n type=\"button\"\n (click)=\"addBaseVersion()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add firmware' | translate }}\n </button>\n </c8y-ui-empty-state>\n </div>\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 [emptyActions]=\"!(getPatchVersions$(baseVersion) | async)?.data.length\"\n [collapsed]=\"!expanded[baseVersion.id]\"\n (collapsedChange)=\"expanded[baseVersion.id] = !$event\"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n <p\n class=\"text-truncate\"\n title=\"{{ baseVersion.c8y_Firmware.version }}\"\n >\n {{ baseVersion.c8y_Firmware.version }}\n </p>\n </div>\n <div class=\"col-5\">\n <p class=\"text-truncate\">\n <span\n class=\"text-label-small m-r-8\"\n translate\n >\n File\n </span>\n @if (baseVersion.c8y_Firmware.url === '') {\n <span title=\"{{ 'Provided by device' | translate }}\">\n {{ 'Provided by device' | translate }}\n </span>\n } @else {\n <span title=\"{{ getBinaryName$(baseVersion.c8y_Firmware.url) | async }}\">\n <c8y-file-download\n url=\"{{ baseVersion.c8y_Firmware.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 <span>\n @if ((getPatchVersionsCount$(baseVersion) | async) === null) {\n <span>\n <span class=\"label label-info\">\n <i\n class=\"icon-spin\"\n c8yIcon=\"circle-o-notch\"\n ></i>\n </span>\n </span>\n }\n @if ((getPatchVersionsCount$(baseVersion) | async) !== null) {\n <span>\n <span [ngPlural]=\"getPatchVersionsCount$(baseVersion) | async\">\n <ng-template ngPluralCase=\"=0\">\n <span class=\"label label-default m-l-auto-sm\">\n <span translate>No patches</span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"=1\">\n <span class=\"label label-info\">\n <span translate>1 patch</span>\n </span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span class=\"label label-info\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{\n count: getPatchVersionsCount$(baseVersion) | async\n }\"\n >\n {{ count }} patches\n </span>\n </span>\n </ng-template>\n </span>\n </span>\n }\n </span>\n }\n </div>\n @if (!(isLegacy$ | async)) {\n <div class=\"fit-h-20 visible-xs\">\n <button\n class=\"btn btn-default btn-sm 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 @if (!(isLegacy$ | async)) {\n <div class=\"m-l-auto fit-h-20 p-r-8 hidden-xs\">\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--delete-base-version\"\n [delay]=\"500\"\n (click)=\"deleteBaseVersion(baseVersion)\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n }\n </c8y-li-body>\n @if ((getPatchVersions$(baseVersion) | async)?.data.length) {\n <c8y-li-collapse>\n <c8y-list-group class=\"separator-top\">\n <c8y-li\n *c8yFor=\"\n let patchVersion of getPatchVersions$(baseVersion) | async;\n let i = index;\n loadMore: 'auto'\n \"\n >\n <c8y-li-icon>\n <i c8yIcon=\"c8y-firmware\"></i>\n </c8y-li-icon>\n <c8y-li-body class=\"content-flex-50\">\n <div class=\"col-4\">\n {{ patchVersion.c8y_Firmware.version }}\n </div>\n <div class=\"col-5\">\n <div class=\"text-truncate\">\n <span\n class=\"text-label-small m-r-8\"\n translate\n >\n File\n </span>\n @if (patchVersion?.c8y_Firmware?.url === '') {\n <span title=\"{{ 'Provided by device' | translate }}\">\n {{ 'Provided by device' | translate }}\n </span>\n } @else {\n <span title=\"patchVersion.c8y_Firmware.url\">\n <c8y-file-download\n [url]=\"patchVersion.c8y_Firmware.url\"\n ></c8y-file-download>\n </span>\n }\n </div>\n </div>\n <div class=\"visible-xs m-t-8\">\n <button\n class=\"btn btn-danger btn-xs\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n data-cy=\"firmware-details--delete-patch-version\"\n (click)=\"deletePatchVersion(patchVersion)\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n </div>\n <div class=\"m-l-auto p-r-8 hidden-xs fit-h-20\">\n <button\n class=\"btn btn-dot text-danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n placement=\"right\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"deletePatchVersion(patchVersion)\"\n >\n <i\n c8yIcon=\"delete\"\n data-cy=\"firmware-details--Remove-icon\"\n ></i>\n </button>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </c8y-li-collapse>\n }\n </c8y-li>\n </c8y-list-group>\n }\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
704
705
  }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i3.InventoryService }, { type: i2.RepositoryService }, { type: i4.AlertService }, { type: i5.TranslateService }, { type: i4.ModalService }, { type: i1$1.BsModalService }, { type: i4.GainsightService }, { type: i1.Router }], propDecorators: { getPatchVersionsCount$: [], getBinaryName$: [], getPatchVersions$: [] } });
705
706
 
706
707
  class FirmwareListComponent {