@c8y/ngx-components 1022.13.0 → 1022.16.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/alarms/alarms.helper.d.ts.map +1 -1
- package/auth-configuration/sso-configuration/templates/template.component.d.ts +1 -1
- package/core/asset-property/asset-property.model.d.ts +2 -0
- package/core/asset-property/asset-property.model.d.ts.map +1 -1
- package/core/authentication/authentication.module.d.ts.map +1 -1
- package/core/dashboard/widget-auto-refresh-context/auto-refresh-control.component.d.ts.map +1 -1
- package/core/drop-area/drop-area.component.d.ts +2 -0
- package/core/drop-area/drop-area.component.d.ts.map +1 -1
- package/core/dynamic-forms/file/file.type.component.d.ts.map +1 -1
- package/core/modal/modal.module.d.ts.map +1 -1
- package/core/plugins/plugins.module.d.ts.map +1 -1
- package/core/plugins/plugins.service.d.ts +1 -2
- package/core/plugins/plugins.service.d.ts.map +1 -1
- package/core/select/select.component.d.ts.map +1 -1
- package/device-list/devices.breadcrumb-factory.d.ts +1 -0
- package/device-list/devices.breadcrumb-factory.d.ts.map +1 -1
- package/device-parameters/device-parameter-details.component.d.ts +22 -0
- package/device-parameters/device-parameter-details.component.d.ts.map +1 -0
- package/device-parameters/device-parameter-value.component.d.ts +12 -0
- package/device-parameters/device-parameter-value.component.d.ts.map +1 -0
- package/device-parameters/device-parameters-list.component.d.ts +2 -1
- package/device-parameters/device-parameters-list.component.d.ts.map +1 -1
- package/device-parameters/index.d.ts +5 -0
- package/device-parameters/index.d.ts.map +1 -1
- package/device-parameters/parameter-type-cell-renderer.components.d.ts +8 -0
- package/device-parameters/parameter-type-cell-renderer.components.d.ts.map +1 -0
- package/device-profile/add-device-profile.component.d.ts +1 -1
- package/device-profile/add-device-profile.component.d.ts.map +1 -1
- package/device-profile/device-profile-list.component.d.ts +1 -1
- package/device-profile/device-profile-list.component.d.ts.map +1 -1
- package/device-profile/device-profile.component.d.ts +1 -1
- package/device-profile/device-profile.component.d.ts.map +1 -1
- package/device-profile/device-profile.module.d.ts +17 -17
- package/device-profile/device-profile.module.d.ts.map +1 -1
- package/device-profile/device-tab-profile/device-profile-item-list.component.d.ts +1 -1
- package/device-profile/device-tab-profile/device-profile-item-list.component.d.ts.map +1 -1
- package/device-profile/device-tab-profile/device-tab-profile-detail.component.d.ts +1 -1
- package/device-profile/device-tab-profile/device-tab-profile-detail.component.d.ts.map +1 -1
- package/device-profile/device-tab-profile/device-tab-profile.component.d.ts +1 -1
- package/device-profile/device-tab-profile/device-tab-profile.component.d.ts.map +1 -1
- package/device-profile/select-configuration-modal.component.d.ts +1 -1
- package/device-profile/select-configuration-modal.component.d.ts.map +1 -1
- package/device-provisioned-certificates/device-tab-provisioned-certificates.component.d.ts +4 -2
- package/device-provisioned-certificates/device-tab-provisioned-certificates.component.d.ts.map +1 -1
- package/device-shell/command-templates/command-templates.component.d.ts +1 -1
- package/device-shell/command-templates/command-templates.component.d.ts.map +1 -1
- package/device-shell/command-templates/command-templates.directive.d.ts +1 -1
- package/device-shell/command-templates/command-templates.directive.d.ts.map +1 -1
- package/device-shell/command-templates/command-templates.module.d.ts +1 -1
- package/device-shell/shell/shell.component.d.ts +1 -1
- package/device-shell/shell/shell.component.d.ts.map +1 -1
- package/device-shell/shell/shell.module.d.ts +7 -7
- package/diagnostics/diagnostics.component.d.ts +1 -1
- package/diagnostics/diagnostics.component.d.ts.map +1 -1
- package/diagnostics/diagnostics.module.d.ts +8 -8
- package/diagnostics/diagnostics.module.d.ts.map +1 -1
- package/events/c8y-ngx-components-events.d.ts.map +1 -0
- package/events/events-timeline/c8y-ngx-components-events-events-timeline.d.ts.map +1 -0
- package/events/events-timeline/events-timeline.component.d.ts +19 -0
- package/events/events-timeline/events-timeline.component.d.ts.map +1 -0
- package/events/events-timeline/index.d.ts +2 -0
- package/events/events-timeline/index.d.ts.map +1 -0
- package/events/events.model.d.ts +6 -0
- package/events/events.model.d.ts.map +1 -0
- package/events/events.service.d.ts +10 -0
- package/events/events.service.d.ts.map +1 -0
- package/events/index.d.ts +3 -0
- package/events/index.d.ts.map +1 -0
- package/fesm2022/c8y-ngx-components-alarms.mjs +2 -1
- package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-auth-configuration.mjs +2 -2
- package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-list.mjs +10 -3
- package/fesm2022/c8y-ngx-components-device-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-parameters.mjs +110 -13
- package/fesm2022/c8y-ngx-components-device-parameters.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-profile.mjs +126 -49
- package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs +44 -12
- package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-shell.mjs +31 -22
- package/fesm2022/c8y-ngx-components-device-shell.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-diagnostics.mjs +36 -19
- package/fesm2022/c8y-ngx-components-diagnostics.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-events-events-timeline.mjs +45 -0
- package/fesm2022/c8y-ngx-components-events-events-timeline.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-events.mjs +44 -0
- package/fesm2022/c8y-ngx-components-events.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-from-single.mjs +8 -14
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-from-single.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs +49 -49
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-list-item.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs +27 -14
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-scheduler.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-stepper.mjs +27 -33
- package/fesm2022/c8y-ngx-components-operations-bulk-operation-stepper.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs +51 -39
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-stepper-container.mjs +10 -8
- package/fesm2022/c8y-ngx-components-operations-bulk-operations-stepper-container.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-create-bulk-operation-details.mjs +16 -11
- package/fesm2022/c8y-ngx-components-operations-create-bulk-operation-details.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-device-selector.mjs +8 -11
- package/fesm2022/c8y-ngx-components-operations-device-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operation-details.mjs +25 -21
- package/fesm2022/c8y-ngx-components-operations-operation-details.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operation-summary.mjs +7 -9
- package/fesm2022/c8y-ngx-components-operations-operation-summary.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-list-item-details.mjs +31 -31
- package/fesm2022/c8y-ngx-components-operations-operations-list-item-details.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-list.mjs +3 -3
- package/fesm2022/c8y-ngx-components-operations-operations-list.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs +33 -13
- package/fesm2022/c8y-ngx-components-operations-operations-timeline.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-status-filter.mjs +19 -13
- package/fesm2022/c8y-ngx-components-operations-status-filter.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-configuration.mjs +40 -36
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs +60 -41
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-device-profile.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs +122 -109
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-firmware.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs +66 -41
- package/fesm2022/c8y-ngx-components-operations-stepper-bulk-type-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-operations-stepper-frames.mjs +11 -16
- package/fesm2022/c8y-ngx-components-operations-stepper-frames.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +212 -83
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs +113 -54
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs +130 -62
- package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-shared.mjs +37 -28
- package/fesm2022/c8y-ngx-components-repository-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-software.mjs +156 -83
- package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-services.mjs +32 -19
- package/fesm2022/c8y-ngx-components-services.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +66 -29
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-upgrade-upgraded-services.mjs +16 -3
- package/fesm2022/c8y-ngx-components-upgrade-upgraded-services.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-upgrade.mjs +1 -14
- package/fesm2022/c8y-ngx-components-upgrade.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-user-roles.mjs +8 -3
- package/fesm2022/c8y-ngx-components-user-roles.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +864 -859
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/de.po +34 -17
- package/locales/es.po +20 -2
- package/locales/fr.po +20 -2
- package/locales/ja_JP.po +22 -4
- package/locales/ko.po +20 -2
- package/locales/locales.pot +19 -1
- package/locales/nl.po +20 -2
- package/locales/pl.po +20 -2
- package/locales/pt_BR.po +20 -2
- package/locales/zh_CN.po +21 -3
- package/locales/zh_TW.po +20 -2
- package/operations/bulk-operation-from-single/bulk-operation-from-single.component.d.ts +1 -1
- package/operations/bulk-operation-from-single/bulk-operation-from-single.component.d.ts.map +1 -1
- package/operations/bulk-operation-from-single/bulk-operation-from-single.module.d.ts +3 -5
- package/operations/bulk-operation-from-single/bulk-operation-from-single.module.d.ts.map +1 -1
- package/operations/bulk-operation-list-item/bulk-operation-list-item.component.d.ts +1 -1
- package/operations/bulk-operation-list-item/bulk-operation-list-item.component.d.ts.map +1 -1
- package/operations/bulk-operation-list-item/bulk-operation-list-item.module.d.ts +1 -7
- package/operations/bulk-operation-list-item/bulk-operation-list-item.module.d.ts.map +1 -1
- package/operations/bulk-operation-list-item/bulk-operation-wrapper.component.d.ts +1 -1
- package/operations/bulk-operation-list-item/bulk-operation-wrapper.component.d.ts.map +1 -1
- package/operations/bulk-operation-list-item/modal-body-host.directive.d.ts +1 -1
- package/operations/bulk-operation-list-item/modal-body-host.directive.d.ts.map +1 -1
- package/operations/bulk-operation-list-item/modals/bulk-operations-reschedule-modal.component.d.ts +1 -1
- package/operations/bulk-operation-list-item/modals/bulk-operations-reschedule-modal.component.d.ts.map +1 -1
- package/operations/bulk-operation-scheduler/bulk-operation-scheduler.module.d.ts +6 -6
- package/operations/bulk-operation-scheduler/operation-scheduler.component.d.ts +1 -1
- package/operations/bulk-operation-scheduler/operation-scheduler.component.d.ts.map +1 -1
- package/operations/bulk-operation-stepper/base-stepper.component.d.ts +1 -1
- package/operations/bulk-operation-stepper/bulk-operation-stepper.component.d.ts +1 -1
- package/operations/bulk-operation-stepper/bulk-operation-stepper.component.d.ts.map +1 -1
- package/operations/bulk-operation-stepper/bulk-operation-stepper.module.d.ts +1 -5
- package/operations/bulk-operation-stepper/bulk-operation-stepper.module.d.ts.map +1 -1
- package/operations/bulk-operation-stepper/custom-step.directive.d.ts +1 -1
- package/operations/bulk-operation-stepper/custom-step.directive.d.ts.map +1 -1
- package/operations/bulk-operations-list/bulk-operations-list.component.d.ts +1 -1
- package/operations/bulk-operations-list/bulk-operations-list.component.d.ts.map +1 -1
- package/operations/bulk-operations-list/bulk-operations-list.module.d.ts +4 -10
- package/operations/bulk-operations-list/bulk-operations-list.module.d.ts.map +1 -1
- package/operations/bulk-operations-list/modals/bulk-operations-modal.component.d.ts +1 -1
- package/operations/bulk-operations-list/modals/bulk-operations-modal.component.d.ts.map +1 -1
- package/operations/bulk-operations-stepper-container/bulk-operations-stepper-container.component.d.ts +1 -1
- package/operations/bulk-operations-stepper-container/bulk-operations-stepper-container.component.d.ts.map +1 -1
- package/operations/bulk-operations-stepper-container/bulk-operations-stepper-container.module.d.ts +3 -4
- package/operations/bulk-operations-stepper-container/bulk-operations-stepper-container.module.d.ts.map +1 -1
- package/operations/create-bulk-operation-details/create-bulk-operation-details.component.d.ts +1 -1
- package/operations/create-bulk-operation-details/create-bulk-operation-details.component.d.ts.map +1 -1
- package/operations/create-bulk-operation-details/create-bulk-operation-details.module.d.ts +1 -4
- package/operations/create-bulk-operation-details/create-bulk-operation-details.module.d.ts.map +1 -1
- package/operations/device-selector/device-selector.component.d.ts +1 -1
- package/operations/device-selector/device-selector.component.d.ts.map +1 -1
- package/operations/device-selector/device-selector.module.d.ts +1 -3
- package/operations/device-selector/device-selector.module.d.ts.map +1 -1
- package/operations/operation-details/operation-details-modal.component.d.ts +1 -1
- package/operations/operation-details/operation-details-modal.component.d.ts.map +1 -1
- package/operations/operation-details/operation-details.component.d.ts +1 -1
- package/operations/operation-details/operation-details.component.d.ts.map +1 -1
- package/operations/operation-details/operation-details.module.d.ts +1 -7
- package/operations/operation-details/operation-details.module.d.ts.map +1 -1
- package/operations/operation-details/operation-details.service.d.ts.map +1 -1
- package/operations/operation-summary/operation-summary.component.d.ts +1 -1
- package/operations/operation-summary/operation-summary.component.d.ts.map +1 -1
- package/operations/operation-summary/operation-summary.module.d.ts +1 -2
- package/operations/operation-summary/operation-summary.module.d.ts.map +1 -1
- package/operations/operations-list/operations-list-item.component.d.ts.map +1 -1
- package/operations/operations-list/operations-list.component.d.ts.map +1 -1
- package/operations/operations-list/operations-list.service.d.ts +1 -1
- package/operations/operations-list/operations-list.service.d.ts.map +1 -1
- package/operations/operations-list-item-details/operation-details-tabs.component.d.ts +1 -1
- package/operations/operations-list-item-details/operation-details-tabs.component.d.ts.map +1 -1
- package/operations/operations-list-item-details/operation-details.component.d.ts +1 -1
- package/operations/operations-list-item-details/operation-details.component.d.ts.map +1 -1
- package/operations/operations-list-item-details/operations-list-item-details.module.d.ts +1 -6
- package/operations/operations-list-item-details/operations-list-item-details.module.d.ts.map +1 -1
- package/operations/operations-timeline/operations-timeline.component.d.ts +5 -5
- package/operations/operations-timeline/operations-timeline.component.d.ts.map +1 -1
- package/operations/operations-timeline/operations-timeline.module.d.ts +4 -6
- package/operations/operations-timeline/operations-timeline.module.d.ts.map +1 -1
- package/operations/status-filter/status-filter.component.d.ts +1 -1
- package/operations/status-filter/status-filter.component.d.ts.map +1 -1
- package/operations/status-filter/status-filter.module.d.ts +1 -4
- package/operations/status-filter/status-filter.module.d.ts.map +1 -1
- package/operations/stepper-bulk-type-configuration/stepper-bulk-type-configuration.component.d.ts +1 -1
- package/operations/stepper-bulk-type-configuration/stepper-bulk-type-configuration.component.d.ts.map +1 -1
- package/operations/stepper-bulk-type-configuration/stepper-bulk-type-configuration.module.d.ts +1 -6
- package/operations/stepper-bulk-type-configuration/stepper-bulk-type-configuration.module.d.ts.map +1 -1
- package/operations/stepper-bulk-type-device-profile/confirm-device-profile-selection-step.component.d.ts +1 -1
- package/operations/stepper-bulk-type-device-profile/confirm-device-profile-selection-step.component.d.ts.map +1 -1
- package/operations/stepper-bulk-type-device-profile/select-device-profile-step.component.d.ts +1 -1
- package/operations/stepper-bulk-type-device-profile/select-device-profile-step.component.d.ts.map +1 -1
- package/operations/stepper-bulk-type-device-profile/stepper-bulk-type-device-profile.component.d.ts +1 -1
- package/operations/stepper-bulk-type-device-profile/stepper-bulk-type-device-profile.component.d.ts.map +1 -1
- package/operations/stepper-bulk-type-device-profile/stepper-bulk-type-device-profile.module.d.ts +1 -6
- package/operations/stepper-bulk-type-device-profile/stepper-bulk-type-device-profile.module.d.ts.map +1 -1
- package/operations/stepper-bulk-type-firmware/select-firmware.component.d.ts +1 -1
- package/operations/stepper-bulk-type-firmware/select-firmware.component.d.ts.map +1 -1
- package/operations/stepper-bulk-type-firmware/stepper-bulk-type-firmware.component.d.ts +1 -1
- package/operations/stepper-bulk-type-firmware/stepper-bulk-type-firmware.component.d.ts.map +1 -1
- package/operations/stepper-bulk-type-firmware/stepper-bulk-type-firmware.module.d.ts +1 -6
- package/operations/stepper-bulk-type-firmware/stepper-bulk-type-firmware.module.d.ts.map +1 -1
- package/operations/stepper-bulk-type-firmware/version-or-patch.component.d.ts +1 -1
- package/operations/stepper-bulk-type-firmware/version-or-patch.component.d.ts.map +1 -1
- package/operations/stepper-bulk-type-software/confirm-software-selection-step.component.d.ts +1 -1
- package/operations/stepper-bulk-type-software/confirm-software-selection-step.component.d.ts.map +1 -1
- package/operations/stepper-bulk-type-software/select-software-step.component.d.ts +1 -1
- package/operations/stepper-bulk-type-software/select-software-step.component.d.ts.map +1 -1
- package/operations/stepper-bulk-type-software/stepper-bulk-type-software.component.d.ts +1 -1
- package/operations/stepper-bulk-type-software/stepper-bulk-type-software.component.d.ts.map +1 -1
- package/operations/stepper-bulk-type-software/stepper-bulk-type-software.module.d.ts +1 -6
- package/operations/stepper-bulk-type-software/stepper-bulk-type-software.module.d.ts.map +1 -1
- package/operations/stepper-frames/preview-block.directive.d.ts +1 -1
- package/operations/stepper-frames/preview-block.directive.d.ts.map +1 -1
- package/operations/stepper-frames/preview-selection-frame.component.d.ts +1 -1
- package/operations/stepper-frames/preview-selection-frame.component.d.ts.map +1 -1
- package/operations/stepper-frames/select-step-frame.component.d.ts +1 -1
- package/operations/stepper-frames/select-step-frame.component.d.ts.map +1 -1
- package/operations/stepper-frames/stepper-frames.modules.d.ts +1 -2
- package/operations/stepper-frames/stepper-frames.modules.d.ts.map +1 -1
- package/package.json +1 -1
- package/protocol-opcua/opcua-address-space-detail.component.d.ts +1 -1
- package/protocol-opcua/opcua-address-space-detail.component.d.ts.map +1 -1
- package/protocol-opcua/opcua-address-space-tree.component.d.ts +1 -1
- package/protocol-opcua/opcua-address-space-tree.component.d.ts.map +1 -1
- package/protocol-opcua/opcua-address-space.component.d.ts +1 -1
- package/protocol-opcua/opcua-address-space.component.d.ts.map +1 -1
- package/protocol-opcua/opcua-auto-apply-settings.component.d.ts +1 -1
- package/protocol-opcua/opcua-auto-apply-settings.component.d.ts.map +1 -1
- package/protocol-opcua/opcua-device-protocol-browse-path-validation.directive.d.ts +1 -1
- package/protocol-opcua/opcua-device-protocol-browse-path-validation.directive.d.ts.map +1 -1
- package/protocol-opcua/opcua-device-protocol-data-reporting.component.d.ts +1 -1
- package/protocol-opcua/opcua-device-protocol-data-reporting.component.d.ts.map +1 -1
- package/protocol-opcua/opcua-device-protocol-description.component.d.ts +1 -1
- package/protocol-opcua/opcua-device-protocol-description.component.d.ts.map +1 -1
- package/protocol-opcua/opcua-device-protocol-detail.component.d.ts +1 -1
- package/protocol-opcua/opcua-device-protocol-detail.component.d.ts.map +1 -1
- package/protocol-opcua/opcua-device-protocol-mapping.component.d.ts +1 -1
- package/protocol-opcua/opcua-device-protocol-mapping.component.d.ts.map +1 -1
- package/protocol-opcua/opcua-device-protocol-object-mapping-status-icon.component.d.ts +1 -1
- package/protocol-opcua/opcua-device-protocol-object-mapping-status-icon.component.d.ts.map +1 -1
- package/protocol-opcua/opcua-protocol.module.d.ts +26 -26
- package/protocol-opcua/opcua-protocol.module.d.ts.map +1 -1
- package/protocol-opcua/opcua-server-config.component.d.ts +1 -1
- package/protocol-opcua/opcua-server-config.component.d.ts.map +1 -1
- package/protocol-opcua/opcua-server-list.component.d.ts +1 -1
- package/protocol-opcua/opcua-server-list.component.d.ts.map +1 -1
- package/protocol-opcua/opcua-servers.component.d.ts +1 -1
- package/protocol-opcua/opcua-servers.component.d.ts.map +1 -1
- package/repository/configuration/device-tab/configuration-filter.pipe.d.ts +1 -1
- package/repository/configuration/device-tab/configuration-filter.pipe.d.ts.map +1 -1
- package/repository/configuration/device-tab/configuration-preview.component.d.ts +1 -1
- package/repository/configuration/device-tab/configuration-preview.component.d.ts.map +1 -1
- package/repository/configuration/device-tab/configuration-repository-device-tab.module.d.ts +11 -13
- package/repository/configuration/device-tab/configuration-repository-device-tab.module.d.ts.map +1 -1
- package/repository/configuration/device-tab/device-configuration-list.component.d.ts +1 -1
- package/repository/configuration/device-tab/device-configuration-list.component.d.ts.map +1 -1
- package/repository/configuration/device-tab/device-configuration.component.d.ts +1 -1
- package/repository/configuration/device-tab/device-configuration.component.d.ts.map +1 -1
- package/repository/configuration/device-tab/save-to-repository.component.d.ts +1 -1
- package/repository/configuration/device-tab/save-to-repository.component.d.ts.map +1 -1
- package/repository/configuration/device-tab/source-code-preview.component.d.ts +1 -1
- package/repository/configuration/device-tab/source-code-preview.component.d.ts.map +1 -1
- package/repository/configuration/device-tab/text-based-configuration.component.d.ts +1 -1
- package/repository/configuration/device-tab/text-based-configuration.component.d.ts.map +1 -1
- package/repository/configuration/list/configuration-detail.component.d.ts +1 -1
- package/repository/configuration/list/configuration-detail.component.d.ts.map +1 -1
- package/repository/configuration/list/configuration-list.component.d.ts +1 -1
- package/repository/configuration/list/configuration-list.component.d.ts.map +1 -1
- package/repository/configuration/list/configuration-repository-list.module.d.ts +4 -7
- package/repository/configuration/list/configuration-repository-list.module.d.ts.map +1 -1
- package/repository/firmware/device-tab/firmware-device-tab.component.d.ts +1 -1
- package/repository/firmware/device-tab/firmware-device-tab.component.d.ts.map +1 -1
- package/repository/firmware/device-tab/firmware-repository-device-tab.module.d.ts +4 -6
- package/repository/firmware/device-tab/firmware-repository-device-tab.module.d.ts.map +1 -1
- package/repository/firmware/list/add-firmware-modal.component.d.ts +1 -1
- package/repository/firmware/list/add-firmware-modal.component.d.ts.map +1 -1
- package/repository/firmware/list/add-firmware-patch-modal.component.d.ts +1 -1
- package/repository/firmware/list/add-firmware-patch-modal.component.d.ts.map +1 -1
- package/repository/firmware/list/firmware-details.component.d.ts +1 -1
- package/repository/firmware/list/firmware-details.component.d.ts.map +1 -1
- package/repository/firmware/list/firmware-list.component.d.ts +1 -1
- package/repository/firmware/list/firmware-list.component.d.ts.map +1 -1
- package/repository/firmware/list/firmware-repository-list.module.d.ts +6 -11
- package/repository/firmware/list/firmware-repository-list.module.d.ts.map +1 -1
- package/repository/shared/file-download/file-download.component.d.ts +1 -1
- package/repository/shared/file-download/file-download.component.d.ts.map +1 -1
- package/repository/shared/select-modal/repository-select-modal.component.d.ts +1 -1
- package/repository/shared/select-modal/repository-select-modal.component.d.ts.map +1 -1
- package/repository/shared/shared-repository.module.d.ts +1 -4
- package/repository/shared/shared-repository.module.d.ts.map +1 -1
- package/repository/shared/software-type/software-type.component.d.ts +1 -1
- package/repository/shared/software-type/software-type.component.d.ts.map +1 -1
- package/repository/software/device-tab/device-software-changes.component.d.ts +1 -1
- package/repository/software/device-tab/device-software-changes.component.d.ts.map +1 -1
- package/repository/software/device-tab/device-software-list.component.d.ts +1 -1
- package/repository/software/device-tab/device-software-list.component.d.ts.map +1 -1
- package/repository/software/device-tab/installed-software.component.d.ts +1 -1
- package/repository/software/device-tab/installed-software.component.d.ts.map +1 -1
- package/repository/software/device-tab/software-device-tab.component.d.ts +1 -1
- package/repository/software/device-tab/software-device-tab.component.d.ts.map +1 -1
- package/repository/software/device-tab/software-repository-device-tab.module.d.ts +7 -11
- package/repository/software/device-tab/software-repository-device-tab.module.d.ts.map +1 -1
- package/repository/software/list/add-software-modal.component.d.ts +1 -1
- package/repository/software/list/add-software-modal.component.d.ts.map +1 -1
- package/repository/software/list/software-details.component.d.ts +1 -1
- package/repository/software/list/software-details.component.d.ts.map +1 -1
- package/repository/software/list/software-list.component.d.ts +1 -1
- package/repository/software/list/software-list.component.d.ts.map +1 -1
- package/repository/software/list/software-repository-list.module.d.ts +5 -11
- package/repository/software/list/software-repository-list.module.d.ts.map +1 -1
- package/services/services-device-tab/columns/last-updated-date.cell-renderer.component.d.ts +1 -1
- package/services/services-device-tab/columns/last-updated-date.cell-renderer.component.d.ts.map +1 -1
- package/services/services-device-tab/columns/name.cell-renderer.component.d.ts +1 -1
- package/services/services-device-tab/columns/name.cell-renderer.component.d.ts.map +1 -1
- package/services/services-device-tab/columns/status.cell-renderer.component.d.ts +1 -1
- package/services/services-device-tab/columns/status.cell-renderer.component.d.ts.map +1 -1
- package/services/services-device-tab/services-device-tab.component.d.ts +1 -1
- package/services/services-device-tab/services-device-tab.component.d.ts.map +1 -1
- package/services/services-device-tab/services-device-tab.module.d.ts +1 -4
- package/services/services-device-tab/services-device-tab.module.d.ts.map +1 -1
- package/trusted-certificates/crl/crl-settings.component.d.ts +5 -1
- package/trusted-certificates/crl/crl-settings.component.d.ts.map +1 -1
- package/trusted-certificates/factories/tabs.factory.d.ts +3 -2
- package/trusted-certificates/factories/tabs.factory.d.ts.map +1 -1
- package/trusted-certificates/factories/trusted-certificates-navigation.factory.d.ts +2 -0
- package/trusted-certificates/factories/trusted-certificates-navigation.factory.d.ts.map +1 -1
- package/trusted-certificates/list/trusted-certificate-list.component.d.ts +5 -1
- package/trusted-certificates/list/trusted-certificate-list.component.d.ts.map +1 -1
- package/trusted-certificates/trusted-certificates.guard.d.ts +11 -0
- package/trusted-certificates/trusted-certificates.guard.d.ts.map +1 -0
- package/upgrade/index.d.ts +0 -1
- package/upgrade/index.d.ts.map +1 -1
- package/upgrade/upgrade.module.d.ts.map +1 -1
- package/upgrade/upgraded-services/index.d.ts +1 -0
- package/upgrade/upgraded-services/index.d.ts.map +1 -1
- package/upgrade/upgraded-services/smart-rules.service.d.ts.map +1 -0
- package/upgrade/upgraded-services/upgraded-services.module.d.ts.map +1 -1
- package/user-roles/inventory-role-selector/inventory-role-selector.component.d.ts +2 -1
- package/user-roles/inventory-role-selector/inventory-role-selector.component.d.ts.map +1 -1
- package/user-roles/roles-asset-tree/roles-asset-tree.component.d.ts +2 -1
- package/user-roles/roles-asset-tree/roles-asset-tree.component.d.ts.map +1 -1
- package/upgrade/smart-rules.service.d.ts.map +0 -1
- /package/upgrade/{smart-rules.service.d.ts → upgraded-services/smart-rules.service.d.ts} +0 -0
|
@@ -1,32 +1,60 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Injectable, Component, NgModule } from '@angular/core';
|
|
2
|
+
import { inject, Injectable, Component, NgModule } from '@angular/core';
|
|
3
3
|
import * as i1 from '@angular/router';
|
|
4
|
-
import { RouterModule } from '@angular/router';
|
|
4
|
+
import { Router, RouterModule } from '@angular/router';
|
|
5
5
|
import * as i2 from '@c8y/ngx-components';
|
|
6
|
-
import { NavigatorNode, gettext, ActionBarItemComponent, IconDirective, C8yTranslateDirective, C8yTranslatePipe, Status, TitleComponent, BreadcrumbComponent, BreadcrumbItemComponent, HelpComponent, FormGroupComponent, RequiredInputPlaceholderDirective, DefaultValidationDirective, DropAreaComponent, CoreModule, CommonModule, EmptyStateComponent, ListGroupComponent, ForOfDirective, ListItemComponent, ListItemIconComponent, ListItemBodyComponent, ListItemCollapseComponent, ProductExperienceDirective, DatePipe, hookNavigator, hookPatternMessages, hookTab } from '@c8y/ngx-components';
|
|
6
|
+
import { Permissions, NavigatorNode, gettext, ActionBarItemComponent, IconDirective, C8yTranslateDirective, C8yTranslatePipe, Status, TitleComponent, BreadcrumbComponent, BreadcrumbItemComponent, HelpComponent, FormGroupComponent, RequiredInputPlaceholderDirective, DefaultValidationDirective, DropAreaComponent, CoreModule, CommonModule, EmptyStateComponent, ListGroupComponent, ForOfDirective, ListItemComponent, ListItemIconComponent, ListItemBodyComponent, ListItemCollapseComponent, ProductExperienceDirective, DatePipe, hookNavigator, hookPatternMessages, hookTab } from '@c8y/ngx-components';
|
|
7
7
|
import { BsDatepickerInputDirective, BsDatepickerDirective, BsDatepickerModule } from 'ngx-bootstrap/datepicker';
|
|
8
8
|
import { pull, isEmpty, assign } from 'lodash-es';
|
|
9
9
|
import * as i2$1 from '@c8y/client';
|
|
10
10
|
import { saveAs } from 'file-saver';
|
|
11
11
|
import * as i2$2 from 'ngx-bootstrap/dropdown';
|
|
12
12
|
import { BsDropdownDirective, BsDropdownToggleDirective, BsDropdownMenuDirective, BsDropdownModule } from 'ngx-bootstrap/dropdown';
|
|
13
|
-
import { NgTemplateOutlet, NgFor, NgIf,
|
|
14
|
-
import * as
|
|
13
|
+
import { NgTemplateOutlet, NgFor, NgIf, AsyncPipe, NgClass } from '@angular/common';
|
|
14
|
+
import * as i4 from '@angular/forms';
|
|
15
15
|
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
16
16
|
import { PopoverDirective, PopoverModule } from 'ngx-bootstrap/popover';
|
|
17
|
+
import { from, shareReplay, BehaviorSubject, pipe, firstValueFrom } from 'rxjs';
|
|
17
18
|
import * as i1$1 from 'ngx-bootstrap/modal';
|
|
18
19
|
import { ButtonCheckboxDirective, ButtonsModule } from 'ngx-bootstrap/buttons';
|
|
19
|
-
import * as i4 from '@ngx-translate/core';
|
|
20
|
-
import { tap, switchMap, shareReplay } from 'rxjs/operators';
|
|
21
|
-
import { BehaviorSubject, pipe, firstValueFrom } from 'rxjs';
|
|
20
|
+
import * as i4$1 from '@ngx-translate/core';
|
|
21
|
+
import { tap, switchMap, shareReplay as shareReplay$1 } from 'rxjs/operators';
|
|
22
22
|
import { TooltipDirective, TooltipModule } from 'ngx-bootstrap/tooltip';
|
|
23
23
|
|
|
24
|
+
class TrustedCertificatesGuard {
|
|
25
|
+
constructor() {
|
|
26
|
+
this.permissions = inject(Permissions);
|
|
27
|
+
}
|
|
28
|
+
async canActivate() {
|
|
29
|
+
const hasReadRole = await this.hasReadRole();
|
|
30
|
+
const hasAdminRole = await this.hasAdminRole();
|
|
31
|
+
return hasReadRole || hasAdminRole;
|
|
32
|
+
}
|
|
33
|
+
async hasReadRole() {
|
|
34
|
+
return this.permissions.hasAnyRole([Permissions.ROLE_TENANT_MANAGEMENT_READ]);
|
|
35
|
+
}
|
|
36
|
+
async hasAdminRole() {
|
|
37
|
+
return this.permissions.hasAnyRole([
|
|
38
|
+
Permissions.ROLE_TENANT_ADMIN,
|
|
39
|
+
Permissions.ROLE_TENANT_MANAGEMENT_ADMIN
|
|
40
|
+
]);
|
|
41
|
+
}
|
|
42
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TrustedCertificatesGuard, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
43
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TrustedCertificatesGuard, providedIn: 'root' }); }
|
|
44
|
+
}
|
|
45
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TrustedCertificatesGuard, decorators: [{
|
|
46
|
+
type: Injectable,
|
|
47
|
+
args: [{ providedIn: 'root' }]
|
|
48
|
+
}] });
|
|
49
|
+
|
|
24
50
|
class TrustedCertificatesNavigationFactory {
|
|
25
51
|
constructor() {
|
|
52
|
+
this.guard = inject(TrustedCertificatesGuard);
|
|
26
53
|
this.navs = [];
|
|
27
54
|
}
|
|
28
55
|
async get() {
|
|
29
|
-
|
|
56
|
+
const canActivate = await this.guard.canActivate();
|
|
57
|
+
if (canActivate && this.navs.length === 0) {
|
|
30
58
|
this.navs.push(new NavigatorNode({
|
|
31
59
|
label: gettext('Trusted certificates'),
|
|
32
60
|
icon: 'certificate',
|
|
@@ -75,12 +103,14 @@ const MESSAGES_TRUSTED_CERTIFICATES = {
|
|
|
75
103
|
};
|
|
76
104
|
|
|
77
105
|
class TabsFactory {
|
|
78
|
-
constructor(
|
|
79
|
-
this.router =
|
|
106
|
+
constructor() {
|
|
107
|
+
this.router = inject(Router);
|
|
108
|
+
this.guard = inject(TrustedCertificatesGuard);
|
|
80
109
|
}
|
|
81
|
-
get() {
|
|
110
|
+
async get() {
|
|
82
111
|
const tabs = [];
|
|
83
|
-
|
|
112
|
+
const canActivate = await this.guard.canActivate();
|
|
113
|
+
if (canActivate && this.router.url.match(/trusted-certificates/g)) {
|
|
84
114
|
tabs.push({
|
|
85
115
|
icon: 'certificate',
|
|
86
116
|
priority: 1000,
|
|
@@ -98,12 +128,12 @@ class TabsFactory {
|
|
|
98
128
|
}
|
|
99
129
|
return tabs;
|
|
100
130
|
}
|
|
101
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TabsFactory, deps: [
|
|
131
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TabsFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
102
132
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TabsFactory }); }
|
|
103
133
|
}
|
|
104
134
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TabsFactory, decorators: [{
|
|
105
135
|
type: Injectable
|
|
106
|
-
}]
|
|
136
|
+
}] });
|
|
107
137
|
|
|
108
138
|
class CrlCheckSettingsComponent {
|
|
109
139
|
constructor(optionsService, tenantOptionsService, alertService) {
|
|
@@ -128,7 +158,7 @@ class CrlCheckSettingsComponent {
|
|
|
128
158
|
}
|
|
129
159
|
}
|
|
130
160
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: CrlCheckSettingsComponent, deps: [{ token: i2.OptionsService }, { token: i2$1.TenantOptionsService }, { token: i2.AlertService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
131
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: CrlCheckSettingsComponent, isStandalone: true, selector: "c8y-crl-check-settings", ngImport: i0, template: "<c8y-action-bar-item [placement]=\"'right'\">\n <div\n class=\"dropdown\"\n dropdown\n [insideClick]=\"true\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown d-flex a-i-center\"\n title=\"{{ 'CRL check' | translate }}\"\n aria-haspopup=\"true\"\n type=\"button\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"'check-document'\"\n ></i>\n <span\n class=\"text-truncate\"\n translate\n >\n CRL check\n </span>\n <i\n class=\"m-l-4 text-primary\"\n [c8yIcon]=\"'caret-down'\"\n ></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right hidden-xs\"\n data-cy=\"register-device--dropdown\"\n *dropdownMenu\n >\n <ng-container *ngTemplateOutlet=\"dropdown\"></ng-container>\n </ul>\n\n <ul class=\"dropdown-menu dropdown-menu-right visible-xs\">\n <ng-container *ngTemplateOutlet=\"dropdown\"></ng-container>\n </ul>\n\n <ng-template #dropdown>\n <li>\n <label\n class=\"c8y-checkbox d-flex a-i-center\"\n title=\"{{ 'Online`type of checking`' | translate }}\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"crlCheck.online\"\n (ngModelChange)=\"\n updateTenantOption({\n category: 'configuration',\n key: 'crl.online.check.enabled',\n value: $event\n })\n \"\n />\n <span class=\"m-r-4\"></span>\n {{ 'Online`type of checking`' | translate }}\n </label>\n </li>\n <li>\n <label\n class=\"c8y-checkbox d-flex a-i-center\"\n title=\"{{ 'Offline`type of checking`' | translate }}\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"crlCheck.offline\"\n (ngModelChange)=\"\n updateTenantOption({\n category: 'configuration',\n key: 'crl.offline.check.enabled',\n value: $event\n })\n \"\n />\n <span class=\"m-r-4\"></span>\n {{ 'Offline`type of checking`' | translate }}\n </label>\n </li>\n </ng-template>\n </div>\n</c8y-action-bar-item>\n", dependencies: [{ kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type:
|
|
161
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: CrlCheckSettingsComponent, isStandalone: true, selector: "c8y-crl-check-settings", ngImport: i0, template: "<c8y-action-bar-item [placement]=\"'right'\">\n <div\n class=\"dropdown\"\n dropdown\n [insideClick]=\"true\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown d-flex a-i-center\"\n title=\"{{ 'CRL check' | translate }}\"\n aria-haspopup=\"true\"\n type=\"button\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"'check-document'\"\n ></i>\n <span\n class=\"text-truncate\"\n translate\n >\n CRL check\n </span>\n <i\n class=\"m-l-4 text-primary\"\n [c8yIcon]=\"'caret-down'\"\n ></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right hidden-xs\"\n data-cy=\"register-device--dropdown\"\n *dropdownMenu\n >\n <ng-container *ngTemplateOutlet=\"dropdown\"></ng-container>\n </ul>\n\n <ul class=\"dropdown-menu dropdown-menu-right visible-xs\">\n <ng-container *ngTemplateOutlet=\"dropdown\"></ng-container>\n </ul>\n\n <ng-template #dropdown>\n <li>\n <label\n class=\"c8y-checkbox d-flex a-i-center\"\n title=\"{{ 'Online`type of checking`' | translate }}\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"crlCheck.online\"\n (ngModelChange)=\"\n updateTenantOption({\n category: 'configuration',\n key: 'crl.online.check.enabled',\n value: $event\n })\n \"\n />\n <span class=\"m-r-4\"></span>\n {{ 'Online`type of checking`' | translate }}\n </label>\n </li>\n <li>\n <label\n class=\"c8y-checkbox d-flex a-i-center\"\n title=\"{{ 'Offline`type of checking`' | translate }}\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"crlCheck.offline\"\n (ngModelChange)=\"\n updateTenantOption({\n category: 'configuration',\n key: 'crl.offline.check.enabled',\n value: $event\n })\n \"\n />\n <span class=\"m-r-4\"></span>\n {{ 'Offline`type of checking`' | translate }}\n </label>\n </li>\n </ng-template>\n </div>\n</c8y-action-bar-item>\n", dependencies: [{ kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "directive", type: BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
|
|
132
162
|
}
|
|
133
163
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: CrlCheckSettingsComponent, decorators: [{
|
|
134
164
|
type: Component,
|
|
@@ -146,13 +176,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
146
176
|
}], ctorParameters: () => [{ type: i2.OptionsService }, { type: i2$1.TenantOptionsService }, { type: i2.AlertService }] });
|
|
147
177
|
|
|
148
178
|
class CrlSettingsComponent {
|
|
149
|
-
constructor(crlService, alertService, modalService) {
|
|
179
|
+
constructor(crlService, alertService, modalService, guard) {
|
|
150
180
|
this.crlService = crlService;
|
|
151
181
|
this.alertService = alertService;
|
|
152
182
|
this.modalService = modalService;
|
|
183
|
+
this.guard = guard;
|
|
153
184
|
this.crls = [this.getEmptyCertificateRevocation()];
|
|
154
185
|
this.droppedFiles = [];
|
|
155
186
|
this.today = new Date();
|
|
187
|
+
this.hasReadRole$ = from(this.guard.hasReadRole()).pipe(shareReplay(1));
|
|
188
|
+
this.hasAdminRole$ = from(this.guard.hasAdminRole()).pipe(shareReplay(1));
|
|
156
189
|
this.MANUAL_ENTRY_POPOVER = gettext('In this section, you can override or add individual entries to the CRL. Providing the serial number is mandatory. In case the revocation date is not set, it will be configured to the current date.');
|
|
157
190
|
this.FILE_UPLOAD_POPOVER = gettext('In this section, you can upload a file with the list of certificates to be revoked. The file must be in CSV format, and it should include the serial number and revocation date. If the revocation date is empty, it will be set to the current date.');
|
|
158
191
|
}
|
|
@@ -233,8 +266,8 @@ class CrlSettingsComponent {
|
|
|
233
266
|
serialNumberInHex: ''
|
|
234
267
|
};
|
|
235
268
|
}
|
|
236
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: CrlSettingsComponent, deps: [{ token: i2$1.CrlService }, { token: i2.AlertService }, { token: i2.ModalService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
237
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: CrlSettingsComponent, isStandalone: true, selector: "c8y-crl-settings", ngImport: i0, template: "<c8y-title>{{ 'Trusted certificates' | translate }}</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=\"certificate\"\n label=\"{{ 'Trusted certificates' | translate }}\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-crl-check-settings></c8y-crl-check-settings>\n\n<c8y-help\n [icon]=\"'settings'\"\n src=\"/docs/device-certificate-authentication/managing-trusted-certificate-settings/#managing-trusted-certificate-settings\"\n></c8y-help>\n\n<form\n class=\"card card--fullpage\"\n #crlManualForm=\"ngForm\"\n novalidate\n>\n <div class=\"card-header separator\">\n <div class=\"card-title\">\n {{ 'Offline configuration of Certificate Revocation List (CRL)' | translate }}\n </div>\n </div>\n <div class=\"inner-scroll\">\n <div class=\"card-block\">\n <div class=\"legend form-block\">\n {{ 'Manual' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ MANUAL_ENTRY_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n\n <div\n class=\"row tight-grid\"\n data-cy=\"c8y-row-grid--new-row\"\n *ngFor=\"let certificateRevocation of crls; index as index; last as isLast\"\n >\n <div class=\"col-sm-5\">\n <c8y-form-group>\n <label\n [for]=\"'serialNumber' + index\"\n translate\n >\n Serial number\n </label>\n <input\n class=\"form-control\"\n required\n [name]=\"'serialNumber' + index\"\n [id]=\"'serialNumber' + index\"\n [(ngModel)]=\"certificateRevocation.serialNumberInHex\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '8ab34fe5476' }\"\n c8yDefaultValidation=\"colonedHexNumber\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-5\">\n <c8y-form-group class=\"datepicker\">\n <label [for]=\"'validTillPicker' + index\">\n {{ 'Valid till' | translate }}\n </label>\n <input\n class=\"form-control\"\n [attr.aria-label]=\"'Date to' | translate\"\n placeholder=\"{{ 'Date to' | translate }}\"\n [name]=\"'validTillPicker' + index\"\n [id]=\"'validTillPicker' + index\"\n [(ngModel)]=\"certificateRevocation.revocationDate\"\n [bsConfig]=\"{ customTodayClass: 'today' }\"\n bsDatepicker\n [maxDate]=\"today\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-2\">\n <c8y-form-group>\n <div class=\"p-t-24\">\n <button\n class=\"btn btn-link hidden-xs hidden-sm\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n *ngIf=\"crls.length > 1\"\n (click)=\"removeCertificateRevocation(certificateRevocation)\"\n >\n <i\n class=\"text-danger\"\n c8yIcon=\"minus-circle\"\n ></i>\n </button>\n <button\n class=\"btn btn-link hidden-xs hidden-sm\"\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n (click)=\"addCertificateRevocation()\"\n *ngIf=\"isLast\"\n >\n <i\n class=\"text-primary\"\n c8yIcon=\"plus-circle\"\n ></i>\n </button>\n\n <button\n class=\"btn btn-danger btn-block btn-sm visible-xs visible-sm\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n *ngIf=\"crls.length > 1\"\n (click)=\"removeCertificateRevocation(certificateRevocation)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n {{ 'Remove' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-block btn-sm visible-xs visible-sm\"\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n (click)=\"addCertificateRevocation()\"\n *ngIf=\"isLast\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add' | translate }}\n </button>\n </div>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"legend form-block center\">\n {{ 'or' | translate }}\n </div>\n <div class=\"legend form-block\">\n {{ 'File upload' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ FILE_UPLOAD_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n\n <c8y-drop-area\n class=\"drop-area-sm\"\n [title]=\"'Upload CRL file (.csv format)' | translate\"\n name=\"uploadCrlDropArea\"\n [(ngModel)]=\"droppedFiles\"\n [message]=\"'Upload CRL file (.csv format)' | translate\"\n [loadingMessage]=\"'Uploading\u2026' | translate\"\n [accept]=\"'.csv'\"\n [maxAllowedFiles]=\"1\"\n ></c8y-drop-area>\n <p class=\"help-block has-info text-muted m-t-4\">\n {{ 'CRL file content will override manual entries.' | translate }}\n </p>\n\n <button\n class=\"btn btn-sm btn-default m-t-16\"\n title=\"{{ 'Download template' | translate }}\"\n type=\"button\"\n (click)=\"downloadCrlTemplate()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"template\"\n ></i>\n {{ 'Download template' | translate }}\n </button>\n </div>\n </div>\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Download CRL file' | translate }}\"\n type=\"button\"\n (click)=\"downloadCrl()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"download\"\n ></i>\n {{ 'Download CRL file' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n (click)=\"save()\"\n [disabled]=\"!(crlManualForm.form.valid || isListEmpty) || (isListEmpty && !isFileDropped)\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\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: CrlCheckSettingsComponent, selector: "c8y-crl-check-settings" }, { kind: "component", type: HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { 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: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: DefaultValidationDirective, selector: "[c8yDefaultValidation]", inputs: ["c8yDefaultValidation"] }, { kind: "directive", type: BsDatepickerInputDirective, selector: "input[bsDatepicker]" }, { kind: "directive", type: BsDatepickerDirective, selector: "[bsDatepicker]", inputs: ["placement", "triggers", "outsideClick", "container", "outsideEsc", "isDisabled", "minDate", "maxDate", "ignoreMinMaxErrors", "minMode", "daysDisabled", "datesDisabled", "datesEnabled", "dateCustomClasses", "dateTooltipTexts", "isOpen", "bsValue", "bsConfig"], outputs: ["onShown", "onHidden", "bsValueChange"], exportAs: ["bsDatepicker"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: DropAreaComponent, selector: "c8y-drop-area", inputs: ["formControl", "title", "message", "icon", "loadingMessage", "forceHideList", "alwaysShow", "clickToOpen", "loading", "progress", "maxAllowedFiles", "files", "maxFileSizeInMegaBytes", "accept"], outputs: ["dropped"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
|
|
269
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: CrlSettingsComponent, deps: [{ token: i2$1.CrlService }, { token: i2.AlertService }, { token: i2.ModalService }, { token: TrustedCertificatesGuard }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
270
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: CrlSettingsComponent, isStandalone: true, selector: "c8y-crl-settings", ngImport: i0, template: "<div *ngIf=\"(hasReadRole$ | async) || (hasAdminRole$ | async)\">\n <c8y-title>{{ 'Trusted certificates' | translate }}</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=\"certificate\"\n label=\"{{ 'Trusted certificates' | translate }}\"\n ></c8y-breadcrumb-item>\n </c8y-breadcrumb>\n\n <c8y-crl-check-settings></c8y-crl-check-settings>\n\n <c8y-help\n [icon]=\"'settings'\"\n src=\"/docs/device-certificate-authentication/managing-trusted-certificate-settings/#managing-trusted-certificate-settings\"\n ></c8y-help>\n\n <form\n class=\"card card--fullpage\"\n #crlManualForm=\"ngForm\"\n novalidate\n >\n <div class=\"card-header separator\">\n <div class=\"card-title\">\n {{ 'Offline configuration of Certificate Revocation List (CRL)' | translate }}\n </div>\n </div>\n <div class=\"inner-scroll\">\n <div class=\"card-block\">\n <div class=\"legend form-block\">\n {{ 'Manual' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ MANUAL_ENTRY_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n\n <div\n class=\"row tight-grid\"\n data-cy=\"c8y-row-grid--new-row\"\n *ngFor=\"let certificateRevocation of crls; index as index; last as isLast\"\n >\n <div class=\"col-sm-5\">\n <c8y-form-group>\n <label\n [for]=\"'serialNumber' + index\"\n translate\n >\n Serial number\n </label>\n <input\n class=\"form-control\"\n required\n [name]=\"'serialNumber' + index\"\n [id]=\"'serialNumber' + index\"\n [(ngModel)]=\"certificateRevocation.serialNumberInHex\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '8ab34fe5476' }\"\n c8yDefaultValidation=\"colonedHexNumber\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-5\">\n <c8y-form-group class=\"datepicker\">\n <label [for]=\"'validTillPicker' + index\">\n {{ 'Valid till' | translate }}\n </label>\n <input\n class=\"form-control\"\n [attr.aria-label]=\"'Date to' | translate\"\n placeholder=\"{{ 'Date to' | translate }}\"\n [name]=\"'validTillPicker' + index\"\n [id]=\"'validTillPicker' + index\"\n [(ngModel)]=\"certificateRevocation.revocationDate\"\n [bsConfig]=\"{ customTodayClass: 'today' }\"\n bsDatepicker\n [maxDate]=\"today\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-2\">\n <c8y-form-group>\n <div class=\"p-t-24\">\n <button\n class=\"btn btn-link hidden-xs hidden-sm\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n *ngIf=\"crls.length > 1\"\n (click)=\"removeCertificateRevocation(certificateRevocation)\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n <i\n class=\"text-danger\"\n c8yIcon=\"minus-circle\"\n ></i>\n </button>\n <button\n class=\"btn btn-link hidden-xs hidden-sm\"\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n (click)=\"addCertificateRevocation()\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n *ngIf=\"isLast\"\n >\n <i\n class=\"text-primary\"\n c8yIcon=\"plus-circle\"\n ></i>\n </button>\n\n <button\n class=\"btn btn-danger btn-block btn-sm visible-xs visible-sm\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n *ngIf=\"crls.length > 1\"\n (click)=\"removeCertificateRevocation(certificateRevocation)\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n {{ 'Remove' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-block btn-sm visible-xs visible-sm\"\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n (click)=\"addCertificateRevocation()\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n *ngIf=\"isLast\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add' | translate }}\n </button>\n </div>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"legend form-block center\">\n {{ 'or' | translate }}\n </div>\n <div class=\"legend form-block\">\n {{ 'File upload' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ FILE_UPLOAD_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n\n <c8y-drop-area\n class=\"drop-area-sm\"\n [title]=\"'Upload CRL file (.csv format)' | translate\"\n name=\"uploadCrlDropArea\"\n [(ngModel)]=\"droppedFiles\"\n [message]=\"'Upload CRL file (.csv format)' | translate\"\n [loadingMessage]=\"'Uploading\u2026' | translate\"\n [accept]=\"'.csv'\"\n [maxAllowedFiles]=\"1\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n ></c8y-drop-area>\n <p class=\"help-block has-info text-muted m-t-4\">\n {{ 'CRL file content will override manual entries.' | translate }}\n </p>\n\n <button\n class=\"btn btn-sm btn-default m-t-16\"\n title=\"{{ 'Download template' | translate }}\"\n type=\"button\"\n (click)=\"downloadCrlTemplate()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"template\"\n ></i>\n {{ 'Download template' | translate }}\n </button>\n </div>\n </div>\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Download CRL file' | translate }}\"\n type=\"button\"\n (click)=\"downloadCrl()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"download\"\n ></i>\n {{ 'Download CRL file' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n (click)=\"save()\"\n [disabled]=\"\n !(hasAdminRole$ | async) ||\n !(crlManualForm.form.valid || isListEmpty) ||\n (isListEmpty && !isFileDropped)\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </form>\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: CrlCheckSettingsComponent, selector: "c8y-crl-check-settings" }, { kind: "component", type: HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { 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: i4.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { 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: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: DefaultValidationDirective, selector: "[c8yDefaultValidation]", inputs: ["c8yDefaultValidation"] }, { kind: "directive", type: BsDatepickerInputDirective, selector: "input[bsDatepicker]" }, { kind: "directive", type: BsDatepickerDirective, selector: "[bsDatepicker]", inputs: ["placement", "triggers", "outsideClick", "container", "outsideEsc", "isDisabled", "minDate", "maxDate", "ignoreMinMaxErrors", "minMode", "daysDisabled", "datesDisabled", "datesEnabled", "dateCustomClasses", "dateTooltipTexts", "isOpen", "bsValue", "bsConfig"], outputs: ["onShown", "onHidden", "bsValueChange"], exportAs: ["bsDatepicker"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "component", type: DropAreaComponent, selector: "c8y-drop-area", inputs: ["formControl", "title", "message", "icon", "loadingMessage", "forceHideList", "alwaysShow", "clickToOpen", "loading", "progress", "maxAllowedFiles", "files", "maxFileSizeInMegaBytes", "accept"], outputs: ["dropped"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
|
|
238
271
|
}
|
|
239
272
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: CrlSettingsComponent, decorators: [{
|
|
240
273
|
type: Component,
|
|
@@ -256,9 +289,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
256
289
|
NgIf,
|
|
257
290
|
IconDirective,
|
|
258
291
|
DropAreaComponent,
|
|
259
|
-
C8yTranslatePipe
|
|
260
|
-
|
|
261
|
-
|
|
292
|
+
C8yTranslatePipe,
|
|
293
|
+
AsyncPipe
|
|
294
|
+
], template: "<div *ngIf=\"(hasReadRole$ | async) || (hasAdminRole$ | async)\">\n <c8y-title>{{ 'Trusted certificates' | translate }}</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=\"certificate\"\n label=\"{{ 'Trusted certificates' | translate }}\"\n ></c8y-breadcrumb-item>\n </c8y-breadcrumb>\n\n <c8y-crl-check-settings></c8y-crl-check-settings>\n\n <c8y-help\n [icon]=\"'settings'\"\n src=\"/docs/device-certificate-authentication/managing-trusted-certificate-settings/#managing-trusted-certificate-settings\"\n ></c8y-help>\n\n <form\n class=\"card card--fullpage\"\n #crlManualForm=\"ngForm\"\n novalidate\n >\n <div class=\"card-header separator\">\n <div class=\"card-title\">\n {{ 'Offline configuration of Certificate Revocation List (CRL)' | translate }}\n </div>\n </div>\n <div class=\"inner-scroll\">\n <div class=\"card-block\">\n <div class=\"legend form-block\">\n {{ 'Manual' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ MANUAL_ENTRY_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n\n <div\n class=\"row tight-grid\"\n data-cy=\"c8y-row-grid--new-row\"\n *ngFor=\"let certificateRevocation of crls; index as index; last as isLast\"\n >\n <div class=\"col-sm-5\">\n <c8y-form-group>\n <label\n [for]=\"'serialNumber' + index\"\n translate\n >\n Serial number\n </label>\n <input\n class=\"form-control\"\n required\n [name]=\"'serialNumber' + index\"\n [id]=\"'serialNumber' + index\"\n [(ngModel)]=\"certificateRevocation.serialNumberInHex\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '8ab34fe5476' }\"\n c8yDefaultValidation=\"colonedHexNumber\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-5\">\n <c8y-form-group class=\"datepicker\">\n <label [for]=\"'validTillPicker' + index\">\n {{ 'Valid till' | translate }}\n </label>\n <input\n class=\"form-control\"\n [attr.aria-label]=\"'Date to' | translate\"\n placeholder=\"{{ 'Date to' | translate }}\"\n [name]=\"'validTillPicker' + index\"\n [id]=\"'validTillPicker' + index\"\n [(ngModel)]=\"certificateRevocation.revocationDate\"\n [bsConfig]=\"{ customTodayClass: 'today' }\"\n bsDatepicker\n [maxDate]=\"today\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n />\n </c8y-form-group>\n </div>\n <div class=\"col-sm-2\">\n <c8y-form-group>\n <div class=\"p-t-24\">\n <button\n class=\"btn btn-link hidden-xs hidden-sm\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n *ngIf=\"crls.length > 1\"\n (click)=\"removeCertificateRevocation(certificateRevocation)\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n <i\n class=\"text-danger\"\n c8yIcon=\"minus-circle\"\n ></i>\n </button>\n <button\n class=\"btn btn-link hidden-xs hidden-sm\"\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n (click)=\"addCertificateRevocation()\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n *ngIf=\"isLast\"\n >\n <i\n class=\"text-primary\"\n c8yIcon=\"plus-circle\"\n ></i>\n </button>\n\n <button\n class=\"btn btn-danger btn-block btn-sm visible-xs visible-sm\"\n title=\"{{ 'Remove' | translate }}\"\n type=\"button\"\n *ngIf=\"crls.length > 1\"\n (click)=\"removeCertificateRevocation(certificateRevocation)\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n <i c8yIcon=\"minus-circle\"></i>\n {{ 'Remove' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-block btn-sm visible-xs visible-sm\"\n title=\"{{ 'Add' | translate }}\"\n type=\"button\"\n (click)=\"addCertificateRevocation()\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n *ngIf=\"isLast\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add' | translate }}\n </button>\n </div>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"legend form-block center\">\n {{ 'or' | translate }}\n </div>\n <div class=\"legend form-block\">\n {{ 'File upload' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ FILE_UPLOAD_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n\n <c8y-drop-area\n class=\"drop-area-sm\"\n [title]=\"'Upload CRL file (.csv format)' | translate\"\n name=\"uploadCrlDropArea\"\n [(ngModel)]=\"droppedFiles\"\n [message]=\"'Upload CRL file (.csv format)' | translate\"\n [loadingMessage]=\"'Uploading\u2026' | translate\"\n [accept]=\"'.csv'\"\n [maxAllowedFiles]=\"1\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n ></c8y-drop-area>\n <p class=\"help-block has-info text-muted m-t-4\">\n {{ 'CRL file content will override manual entries.' | translate }}\n </p>\n\n <button\n class=\"btn btn-sm btn-default m-t-16\"\n title=\"{{ 'Download template' | translate }}\"\n type=\"button\"\n (click)=\"downloadCrlTemplate()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"template\"\n ></i>\n {{ 'Download template' | translate }}\n </button>\n </div>\n </div>\n <div class=\"card-footer separator\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Download CRL file' | translate }}\"\n type=\"button\"\n (click)=\"downloadCrl()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"download\"\n ></i>\n {{ 'Download CRL file' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Save' | translate }}\"\n type=\"submit\"\n (click)=\"save()\"\n [disabled]=\"\n !(hasAdminRole$ | async) ||\n !(crlManualForm.form.valid || isListEmpty) ||\n (isListEmpty && !isFileDropped)\n \"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </form>\n</div>\n" }]
|
|
295
|
+
}], ctorParameters: () => [{ type: i2$1.CrlService }, { type: i2.AlertService }, { type: i2.ModalService }, { type: TrustedCertificatesGuard }] });
|
|
262
296
|
|
|
263
297
|
const trustedCertificatesSettingsRoutes = [
|
|
264
298
|
{
|
|
@@ -387,7 +421,7 @@ class AddTrustedCertificateComponent {
|
|
|
387
421
|
this.modal.hide();
|
|
388
422
|
}
|
|
389
423
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: AddTrustedCertificateComponent, deps: [{ token: i1$1.BsModalRef }, { token: i2$1.TrustedCertificateService }, { token: i2.AlertService }, { token: i2.GainsightService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
390
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: AddTrustedCertificateComponent, isStandalone: true, selector: "c8y-add-trusted-certificate", ngImport: i0, template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i c8yIcon=\"certificate\"></i>\n <div\n class=\"modal-title\"\n id=\"addCertificateModalTitle\"\n translate\n >\n Add trusted certificate\n </div>\n </div>\n <form\n #addTrustedCertificateForm=\"ngForm\"\n (ngSubmit)=\"addTrustedCertificateForm.form.valid && fileIsUploaded && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div\n class=\"modal-body\"\n id=\"addCertificateModalDescription\"\n >\n <c8y-form-group>\n <label\n for=\"certificateName\"\n translate\n >\n Certificate name\n </label>\n <input\n class=\"form-control\"\n id=\"certificateName\"\n placeholder=\"{{ 'e.g. My certificate' | translate }}\"\n name=\"certificateName\"\n type=\"text\"\n autocomplete=\"off\"\n required\n [(ngModel)]=\"trustedCertificate.name\"\n />\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"certificate\"\n translate\n >\n Certificate\n </label>\n <c8y-drop-area\n class=\"drop-area-sm\"\n [title]=\"'Paste the certificate in PEM format.' | translate\"\n (dropped)=\"uploadFile($event)\"\n [loadingMessage]=\"'Importing, please wait.' | translate\"\n [maxAllowedFiles]=\"maxAllowedFiles\"\n ></c8y-drop-area>\n </c8y-form-group>\n <c8y-form-group>\n <label\n class=\"c8y-checkbox\"\n title=\"{{ 'Auto registration' | translate }}\"\n >\n <input\n id=\"autoRegistration\"\n name=\"autoRegistration\"\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n </c8y-form-group>\n <button\n class=\"btn\"\n name=\"certificateStatus\"\n type=\"button\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n >\n <span\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </span>\n <span\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </span>\n </button>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"close()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add certificate' | translate }}\"\n type=\"submit\"\n [disabled]=\"\n addTrustedCertificateForm.form.invalid ||\n addTrustedCertificateForm.form.pristine ||\n !fileIsUploaded\n \"\n >\n {{ 'Add certificate' | translate }}\n </button>\n </div>\n </form>\n</div>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type:
|
|
424
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: AddTrustedCertificateComponent, isStandalone: true, selector: "c8y-add-trusted-certificate", ngImport: i0, template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i c8yIcon=\"certificate\"></i>\n <div\n class=\"modal-title\"\n id=\"addCertificateModalTitle\"\n translate\n >\n Add trusted certificate\n </div>\n </div>\n <form\n #addTrustedCertificateForm=\"ngForm\"\n (ngSubmit)=\"addTrustedCertificateForm.form.valid && fileIsUploaded && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div\n class=\"modal-body\"\n id=\"addCertificateModalDescription\"\n >\n <c8y-form-group>\n <label\n for=\"certificateName\"\n translate\n >\n Certificate name\n </label>\n <input\n class=\"form-control\"\n id=\"certificateName\"\n placeholder=\"{{ 'e.g. My certificate' | translate }}\"\n name=\"certificateName\"\n type=\"text\"\n autocomplete=\"off\"\n required\n [(ngModel)]=\"trustedCertificate.name\"\n />\n </c8y-form-group>\n <c8y-form-group>\n <label\n for=\"certificate\"\n translate\n >\n Certificate\n </label>\n <c8y-drop-area\n class=\"drop-area-sm\"\n [title]=\"'Paste the certificate in PEM format.' | translate\"\n (dropped)=\"uploadFile($event)\"\n [loadingMessage]=\"'Importing, please wait.' | translate\"\n [maxAllowedFiles]=\"maxAllowedFiles\"\n ></c8y-drop-area>\n </c8y-form-group>\n <c8y-form-group>\n <label\n class=\"c8y-checkbox\"\n title=\"{{ 'Auto registration' | translate }}\"\n >\n <input\n id=\"autoRegistration\"\n name=\"autoRegistration\"\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </label>\n </c8y-form-group>\n <button\n class=\"btn\"\n name=\"certificateStatus\"\n type=\"button\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n >\n <span\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </span>\n <span\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </span>\n </button>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"close()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add certificate' | translate }}\"\n type=\"submit\"\n [disabled]=\"\n addTrustedCertificateForm.form.invalid ||\n addTrustedCertificateForm.form.pristine ||\n !fileIsUploaded\n \"\n >\n {{ 'Add certificate' | translate }}\n </button>\n </div>\n </form>\n</div>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { 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: i4.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: DropAreaComponent, selector: "c8y-drop-area", inputs: ["formControl", "title", "message", "icon", "loadingMessage", "forceHideList", "alwaysShow", "clickToOpen", "loading", "progress", "maxAllowedFiles", "files", "maxFileSizeInMegaBytes", "accept"], outputs: ["dropped"] }, { 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: ButtonCheckboxDirective, selector: "[btnCheckbox]", inputs: ["btnCheckboxTrue", "btnCheckboxFalse"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
|
|
391
425
|
}
|
|
392
426
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: AddTrustedCertificateComponent, decorators: [{
|
|
393
427
|
type: Component,
|
|
@@ -405,7 +439,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
405
439
|
}], ctorParameters: () => [{ type: i1$1.BsModalRef }, { type: i2$1.TrustedCertificateService }, { type: i2.AlertService }, { type: i2.GainsightService }] });
|
|
406
440
|
|
|
407
441
|
class TrustedCertificateListComponent {
|
|
408
|
-
constructor(bsModal, alertService, trustedCertificateService, modalService, translateService, clipboardService, gainsightService, systemOptionsService, featureCacheService) {
|
|
442
|
+
constructor(bsModal, alertService, trustedCertificateService, modalService, translateService, clipboardService, gainsightService, systemOptionsService, featureCacheService, guard) {
|
|
409
443
|
this.bsModal = bsModal;
|
|
410
444
|
this.alertService = alertService;
|
|
411
445
|
this.trustedCertificateService = trustedCertificateService;
|
|
@@ -415,6 +449,7 @@ class TrustedCertificateListComponent {
|
|
|
415
449
|
this.gainsightService = gainsightService;
|
|
416
450
|
this.systemOptionsService = systemOptionsService;
|
|
417
451
|
this.featureCacheService = featureCacheService;
|
|
452
|
+
this.guard = guard;
|
|
418
453
|
this.PROOF_OF_POSSESSION_POPOVER = gettext('"Proof of possession" is a security method used to prove that whoever sends a message is also in the possession of the particular cryptographic key.');
|
|
419
454
|
this.SIGNED_VERIFICATION_CODE_POPOVER = gettext('Use the following openssl command to create the signed verification code: openssl dgst -sha256 -sign <private.key> <verification_code.txt> | openssl base64 -A');
|
|
420
455
|
this.AUTO_REGISTRATION_POPOVER = gettext('Devices using the MQTT protocol with credentials signed by this certificate will be able to communicate with the platform without prior registration. The option does not support devices using the LWM2M protocol.');
|
|
@@ -422,7 +457,7 @@ class TrustedCertificateListComponent {
|
|
|
422
457
|
this.reload = new BehaviorSubject(null);
|
|
423
458
|
this.trustedCertificates = this.reload.pipe(tap(() => this.reloading.next(true)), switchMap(() => this.getTrustedCertificates()), tap(response => {
|
|
424
459
|
this.certificateAuthorityExists = response.data.some(value => value.tenantCertificateAuthority);
|
|
425
|
-
}), tap(() => this.reloading.next(false)), shareReplay(1));
|
|
460
|
+
}), tap(() => this.reloading.next(false)), shareReplay$1(1));
|
|
426
461
|
this.sortByExpirationDateAsc = pipe(tap(results => {
|
|
427
462
|
return results.sort((n1, n2) => {
|
|
428
463
|
if (n1.tenantCertificateAuthority !== n2.tenantCertificateAuthority) {
|
|
@@ -431,6 +466,8 @@ class TrustedCertificateListComponent {
|
|
|
431
466
|
return n1.notAfter.localeCompare(n2.notAfter);
|
|
432
467
|
});
|
|
433
468
|
}));
|
|
469
|
+
this.hasReadRole$ = from(this.guard.hasReadRole()).pipe(shareReplay$1(1));
|
|
470
|
+
this.hasAdminRole$ = from(this.guard.hasAdminRole()).pipe(shareReplay$1(1));
|
|
434
471
|
this.certificateAuthorityExists = false;
|
|
435
472
|
this.PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_TRUSTED_CERTIFICATES;
|
|
436
473
|
this.certificateAuthorityFeatureEnabled = false;
|
|
@@ -637,8 +674,8 @@ class TrustedCertificateListComponent {
|
|
|
637
674
|
async checkCertificateAuthorityFeature() {
|
|
638
675
|
this.certificateAuthorityFeatureEnabled = await firstValueFrom(this.featureCacheService.getFeatureState('certificate-authority'));
|
|
639
676
|
}
|
|
640
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TrustedCertificateListComponent, deps: [{ token: i1$1.BsModalService }, { token: i2.AlertService }, { token: i2$1.TrustedCertificateService }, { token: i2.ModalService }, { token: i4.TranslateService }, { token: i2.ClipboardService }, { token: i2.GainsightService }, { token: i2$1.SystemOptionsService }, { token: i2.FeatureCacheService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
641
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: TrustedCertificateListComponent, isStandalone: true, selector: "c8y-trusted-certificates", ngImport: i0, template: "<c8y-title>{{ 'Trusted certificates' | translate }}</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=\"certificate\"\n label=\"{{ 'Trusted certificates' | translate }}\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"certificateAuthorityFeatureEnabled\"\n>\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add CA certificate' | translate }}\"\n type=\"button\"\n [disabled]=\"certificateAuthorityExists\"\n (click)=\"addCACertificate()\"\n >\n <i c8yIcon=\"contract\"></i>\n {{ 'Add CA certificate' | translate }}\n </button>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Adding a CA certificate lets the app trust certificates from the specified authority, ensuring secure connections. Only one certificate is allowed, which is why the button is disabled.'\n | translate\n }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"certificateAuthorityExists\"\n ></button>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Adding a CA certificate lets the app trust certificates from the specified authority, ensuring secure connections.'\n | translate\n }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"!certificateAuthorityExists\"\n ></button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add trusted certificate' | translate }}\"\n type=\"button\"\n (click)=\"addTrustedCertificate()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add trusted certificate' | translate }}\n </button>\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)=\"loadTrustedCertificates()\"\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<c8y-help\n src=\"/docs/device-certificate-authentication/managing-trusted-certificates/#managing-trusted-certificates\"\n></c8y-help>\n\n<c8y-ui-empty-state\n [icon]=\"'certificate'\"\n [title]=\"'No trusted certificates to display.' | translate\"\n [subtitle]=\"'Add your first certificate by clicking below.' | translate\"\n *ngIf=\"(trustedCertificates | async)?.data.length === 0\"\n>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add trusted certificate' | translate }}\"\n type=\"button\"\n (click)=\"addTrustedCertificate()\"\n >\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-ui-empty-state>\n\n<c8y-list-group class=\"m-b-24\">\n <div\n class=\"page-sticky-header hidden-xs c8y-list__item c8y-list__item--empty-actions\"\n *ngIf=\"(trustedCertificates | async)?.data.length > 0\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i\n class=\"invisible\"\n c8yIcon=\"certificate\"\n ></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-60\">\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Certificate' | translate }} \"\n >\n {{ 'Certificate' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Status' | translate }}\"\n >\n {{ 'Status' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}\"\n >\n {{ 'Algorithm' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}\"\n >\n {{ 'Expiration date' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Auto registration' | translate }}\"\n >\n {{ 'Auto registration' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Proof of possession' | translate }}\"\n >\n {{ 'Proof of possession' | translate }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n\n <c8y-li\n *c8yFor=\"\n let trustedCertificate of trustedCertificates | async;\n let i = index;\n pipe: sortByExpirationDateAsc;\n loadMore: 'none'\n \"\n #listItem\n data-cy=\"c8y-trusted-certificates-list--item-block\"\n >\n <c8y-li-icon>\n <button\n class=\"btn-clean\"\n attr.aria-label=\"{{ 'Certificate' | translate }}\"\n tooltip=\"{{ 'Certificate' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n *ngIf=\"!trustedCertificate.tenantCertificateAuthority\"\n >\n <i c8yIcon=\"certificate\"></i>\n </button>\n <button\n class=\"btn-clean\"\n attr.aria-label=\"{{ 'CA certificate' | translate }}\"\n tooltip=\"{{ 'CA certificate' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n *ngIf=\"trustedCertificate.tenantCertificateAuthority\"\n >\n <i c8yIcon=\"contract\"></i>\n </button>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-2\">\n <button\n class=\"btn-clean text-truncate\"\n title=\"{{ trustedCertificate.name }}\"\n type=\"button\"\n (click)=\"listItem.toggleCollapsed()\"\n >\n {{ trustedCertificate.name }}\n </button>\n </div>\n <div class=\"col-2\">\n <div class=\"visible-xs p-8\"></div>\n <button\n class=\"btn c8y-btn-checkbox--inline\"\n name=\"certificateStatus\"\n type=\"button\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n (ngModelChange)=\"updateCertificate(trustedCertificate, { status: $event })\"\n >\n <small\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </small>\n <small\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </small>\n </button>\n <div class=\"visible-xs p-8\"></div>\n </div>\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}: {{ trustedCertificate.algorithmName }}\"\n >\n <span\n class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\"\n translate\n >\n Algorithm\n </span>\n {{ trustedCertificate.algorithmName }}\n </div>\n </div>\n\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}: {{ trustedCertificate.notAfter | c8yDate }}\"\n >\n <span\n class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\"\n translate\n >\n Expiration date\n </span>\n @let expirationHighlight = getExpirationHighlight(trustedCertificate);\n <span>\n <small\n [attr.title]=\"expirationHighlight?.tooltipText\"\n [ngClass]=\"expirationHighlight?.textClass\"\n >\n <ng-container *ngIf=\"expirationHighlight?.expired; else notExpiredYet\">\n <del>\n <ng-container *ngTemplateOutlet=\"expirationDateTpl\"></ng-container>\n </del>\n </ng-container>\n <ng-template #notExpiredYet>\n <ng-container *ngTemplateOutlet=\"expirationDateTpl\"></ng-container>\n </ng-template>\n <ng-template #expirationDateTpl>\n <i\n class=\"m-r-4\"\n c8yIcon=\"{{ expirationHighlight?.icon }}\"\n *ngIf=\"expirationHighlight?.icon\"\n ></i>\n <span>{{ trustedCertificate.notAfter | c8yDate }}</span>\n </ng-template>\n </small>\n <button\n class=\"btn btn-link btn-icon\"\n title=\"{{ 'Renew certificate' | translate }}\"\n type=\"button\"\n *ngIf=\"expirationHighlight?.renewable\"\n (click)=\"renewCertificate()\"\n >\n <i c8yIcon=\"refresh\"></i>\n </button>\n </span>\n </div>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Auto registration' | translate }}\n </span>\n <span\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Enabled`auto registration`' | translate\n }}\"\n *ngIf=\"trustedCertificate.autoRegistrationEnabled\"\n >\n {{ 'Enabled`auto registration`' | translate }}\n </span>\n <span\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Disabled`auto registration`' | translate\n }}\"\n *ngIf=\"!trustedCertificate.autoRegistrationEnabled\"\n >\n {{ 'Disabled`auto registration`' | translate }}\n </span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </div>\n </div>\n <div class=\"col-2 d-flex\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Proof of possession' | translate }}\n </span>\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{ 'N/A' | translate }}\"\n *ngIf=\"trustedCertificate.tenantCertificateAuthority\"\n >\n {{ 'N/A' | translate }}\n </span>\n <span *ngIf=\"!trustedCertificate.tenantCertificateAuthority\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n *ngIf=\"trustedCertificate.proofOfPossessionValid\"\n >\n <div class=\"icon-flex\">\n <i\n class=\"text-success\"\n c8yIcon=\"success\"\n ></i>\n {{ 'Complete`proof of possession`' | translate }}\n </div>\n </span>\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n *ngIf=\"!trustedCertificate.proofOfPossessionValid\"\n >\n <div class=\"icon-flex\">\n <i\n class=\"text-warning\"\n c8yIcon=\"warning\"\n ></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </div>\n </span>\n </span>\n </div>\n <button\n class=\"m-l-auto btn-dot btn-dot--danger btn showOnHover m-r-8\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n placement=\"right\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificate--delete\"\n [delay]=\"500\"\n (click)=\"deleteTrustedCertificate(trustedCertificate)\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse>\n <div class=\"p-t-16 p-b-16\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Certificate name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n type=\"text\"\n required\n data-cy=\"c8y-trusted-certificates--edit-certificate-name\"\n [(ngModel)]=\"trustedCertificate.name\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Update certificate name' | translate }}\"\n type=\"button\"\n (click)=\"\n updateCertificate(trustedCertificate, { name: trustedCertificate.name })\n \"\n [disabled]=\"!trustedCertificate.name\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"certInPemFormat\"\n translate\n >\n Certificate\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"certInPemFormat\"\n name=\"certInPemFormat\"\n type=\"text\"\n rows=\"7\"\n readonly\n [(ngModel)]=\"trustedCertificate.certInPemFormat\"\n ></textarea>\n </c8y-form-group>\n <c8y-form-group>\n <label\n class=\"c8y-checkbox\"\n title=\"{{ 'Auto registration' | translate }}\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n (ngModelChange)=\"\n updateCertificate(trustedCertificate, { autoRegistrationEnabled: $event })\n \"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4\">\n <div\n class=\"legend form-block\"\n translate\n >\n Additional properties\n </div>\n <ul class=\"list-unstyled\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Algorithm' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.algorithmName }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Version' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.version }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Valid from' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notBefore | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Issuer' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.issuer }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Expiration date' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notAfter | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Serial number' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.serialNumber }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Subject`of a certificate`' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.subject }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"col-md-1\"></div>\n <div\n class=\"col-md-7\"\n *ngIf=\"!trustedCertificate.tenantCertificateAuthority\"\n >\n <div class=\"legend form-block\">\n {{ 'Proof of possession' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ PROOF_OF_POSSESSION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </div>\n <div *ngIf=\"trustedCertificate.proofOfPossessionValid\">\n <span\n class=\"icon-flex\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n >\n <i\n class=\"text-success\"\n c8yIcon=\"success\"\n ></i>\n {{ 'Complete`proof of possession`' | translate }}\n </span>\n </div>\n <div *ngIf=\"!trustedCertificate.proofOfPossessionValid\">\n <div class=\"row m-b-16\">\n <div class=\"col-md-6\">\n <span\n class=\"icon-flex\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"warning\"\n ></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </span>\n </div>\n <div class=\"col-md-6 col-lg-6 text-right-md\">\n <span class=\"text-label-small m-r-4\">\n {{ 'Verification code expires/expired on' | translate }}\n </span>\n {{\n (trustedCertificate.proofOfPossessionVerificationCodeUsableUntil | c8yDate) ||\n '---'\n }}\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"unsignedVerificationCode\"\n translate\n >\n Verification code\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"unsignedVerificationCode\"\n name=\"unsignedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n readonly\n [(ngModel)]=\"trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Regenerate verification code' | translate }}\"\n type=\"button\"\n (click)=\"regenerateUnsignedVerificationCode(trustedCertificate)\"\n >\n {{ 'Regenerate`verification code`' | translate }}\n </button>\n\n <button\n class=\"btn btn-sm btn-default m-l-auto m-r-0\"\n [attr.aria-label]=\"'Copy to clipboard' | translate\"\n tooltip=\"{{ 'Copy to clipboard' | translate }}\"\n placement=\"right\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--copy-to-clipboard\"\n [delay]=\"500\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"copyUnsignedVerificationCodeToClipboard(trustedCertificate)\"\n >\n <i c8yIcon=\"clipboard\"></i>\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n [attr.aria-label]=\"'Download as file' | translate\"\n tooltip=\"{{ 'Download as file' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--download-as-file\"\n [delay]=\"500\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"downloadUnsignedVerificationCode(trustedCertificate)\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.EVENT\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.VERIFICATION_CODE.COMPONENTS.DOWNLOAD_CODE,\n action: PRODUCT_EXPERIENCE.VERIFICATION_CODE.ACTIONS.DOWNLOAD\n }\"\n >\n <i c8yIcon=\"download\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"signedVerificationCode\"\n >\n {{ 'Signed verification code' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ SIGNED_VERIFICATION_CODE_POPOVER | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--signed-verification-code-popup\"\n [outsideClick]=\"true\"\n ></button>\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"signedVerificationCode\"\n name=\"signedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"trustedCertificate.signedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Verify signed verification code' | translate }}\"\n type=\"button\"\n (click)=\"verifySignedVerificationCode(trustedCertificate)\"\n [disabled]=\"!trustedCertificate.signedVerificationCode\"\n >\n {{ 'Verify`signed verification code`' | translate }}\n </button>\n <button\n class=\"btn btn-sm btn-default m-l-auto\"\n [attr.aria-label]=\"'Upload file' | translate\"\n tooltip=\"{{ 'Upload file' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"fileInput.click()\"\n >\n <i c8yIcon=\"upload\"></i>\n </button>\n <input\n class=\"hidden\"\n type=\"file\"\n #fileInput\n (change)=\"onFileInput($event, trustedCertificate)\"\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </c8y-li-collapse>\n </c8y-li>\n</c8y-list-group>\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: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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: 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: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { 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: "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: ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "directive", type: ButtonCheckboxDirective, selector: "[btnCheckbox]", inputs: ["btnCheckboxTrue", "btnCheckboxFalse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.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: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: DatePipe, name: "c8yDate" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
|
|
677
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TrustedCertificateListComponent, deps: [{ token: i1$1.BsModalService }, { token: i2.AlertService }, { token: i2$1.TrustedCertificateService }, { token: i2.ModalService }, { token: i4$1.TranslateService }, { token: i2.ClipboardService }, { token: i2.GainsightService }, { token: i2$1.SystemOptionsService }, { token: i2.FeatureCacheService }, { token: TrustedCertificatesGuard }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
678
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: TrustedCertificateListComponent, isStandalone: true, selector: "c8y-trusted-certificates", ngImport: i0, template: "<div *ngIf=\"(hasReadRole$ | async) || (hasAdminRole$ | async)\">\n <c8y-title>{{ 'Trusted certificates' | translate }}</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=\"certificate\"\n label=\"{{ 'Trusted certificates' | translate }}\"\n ></c8y-breadcrumb-item>\n </c8y-breadcrumb>\n\n <c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"certificateAuthorityFeatureEnabled\"\n >\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add CA certificate' | translate }}\"\n type=\"button\"\n [disabled]=\"!(hasAdminRole$ | async) || certificateAuthorityExists\"\n (click)=\"addCACertificate()\"\n >\n <i c8yIcon=\"contract\"></i>\n {{ 'Add CA certificate' | translate }}\n </button>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Adding a CA certificate lets the app trust certificates from the specified authority, ensuring secure connections. Only one certificate is allowed, which is why the button is disabled.'\n | translate\n }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"certificateAuthorityExists\"\n ></button>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Adding a CA certificate lets the app trust certificates from the specified authority, ensuring secure connections.'\n | translate\n }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"!certificateAuthorityExists\"\n ></button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add trusted certificate' | translate }}\"\n type=\"button\"\n (click)=\"addTrustedCertificate()\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add trusted certificate' | translate }}\n </button>\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)=\"loadTrustedCertificates()\"\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 <c8y-help\n src=\"/docs/device-certificate-authentication/managing-trusted-certificates/#managing-trusted-certificates\"\n ></c8y-help>\n\n <c8y-ui-empty-state\n [icon]=\"'certificate'\"\n [title]=\"'No trusted certificates to display.' | translate\"\n [subtitle]=\"'Add your first certificate by clicking below.' | translate\"\n *ngIf=\"(trustedCertificates | async)?.data.length === 0\"\n >\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add trusted certificate' | translate }}\"\n type=\"button\"\n (click)=\"addTrustedCertificate()\"\n >\n {{ 'Add trusted certificate' | translate }}\n </button>\n </c8y-ui-empty-state>\n\n <c8y-list-group class=\"m-b-24\">\n <div\n class=\"page-sticky-header hidden-xs c8y-list__item c8y-list__item--empty-actions\"\n *ngIf=\"(trustedCertificates | async)?.data.length > 0\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i\n class=\"invisible\"\n c8yIcon=\"certificate\"\n ></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-60\">\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Certificate' | translate }} \"\n >\n {{ 'Certificate' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Status' | translate }}\"\n >\n {{ 'Status' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}\"\n >\n {{ 'Algorithm' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}\"\n >\n {{ 'Expiration date' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Auto registration' | translate }}\"\n >\n {{ 'Auto registration' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Proof of possession' | translate }}\"\n >\n {{ 'Proof of possession' | translate }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n\n <c8y-li\n *c8yFor=\"\n let trustedCertificate of trustedCertificates | async;\n let i = index;\n pipe: sortByExpirationDateAsc;\n loadMore: 'none'\n \"\n #listItem\n data-cy=\"c8y-trusted-certificates-list--item-block\"\n >\n <c8y-li-icon>\n <button\n class=\"btn-clean\"\n attr.aria-label=\"{{ 'Certificate' | translate }}\"\n tooltip=\"{{ 'Certificate' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n *ngIf=\"!trustedCertificate.tenantCertificateAuthority\"\n >\n <i c8yIcon=\"certificate\"></i>\n </button>\n <button\n class=\"btn-clean\"\n attr.aria-label=\"{{ 'CA certificate' | translate }}\"\n tooltip=\"{{ 'CA certificate' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n *ngIf=\"trustedCertificate.tenantCertificateAuthority\"\n >\n <i c8yIcon=\"contract\"></i>\n </button>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-2\">\n <button\n class=\"btn-clean text-truncate\"\n title=\"{{ trustedCertificate.name }}\"\n type=\"button\"\n (click)=\"listItem.toggleCollapsed()\"\n >\n {{ trustedCertificate.name }}\n </button>\n </div>\n <div class=\"col-2\">\n <div class=\"visible-xs p-8\"></div>\n <button\n class=\"btn c8y-btn-checkbox--inline\"\n name=\"certificateStatus\"\n type=\"button\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n (ngModelChange)=\"updateCertificate(trustedCertificate, { status: $event })\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n [ngClass]=\"{\n disabled: !(hasAdminRole$ | async)\n }\"\n >\n <small\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </small>\n <small\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </small>\n </button>\n <div class=\"visible-xs p-8\"></div>\n </div>\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}: {{ trustedCertificate.algorithmName }}\"\n >\n <span\n class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\"\n translate\n >\n Algorithm\n </span>\n {{ trustedCertificate.algorithmName }}\n </div>\n </div>\n\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}: {{ trustedCertificate.notAfter | c8yDate }}\"\n >\n <span\n class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\"\n translate\n >\n Expiration date\n </span>\n @let expirationHighlight = getExpirationHighlight(trustedCertificate);\n <span>\n <small\n [attr.title]=\"expirationHighlight?.tooltipText\"\n [ngClass]=\"expirationHighlight?.textClass\"\n >\n <ng-container *ngIf=\"expirationHighlight?.expired; else notExpiredYet\">\n <del>\n <ng-container *ngTemplateOutlet=\"expirationDateTpl\"></ng-container>\n </del>\n </ng-container>\n <ng-template #notExpiredYet>\n <ng-container *ngTemplateOutlet=\"expirationDateTpl\"></ng-container>\n </ng-template>\n <ng-template #expirationDateTpl>\n <i\n class=\"m-r-4\"\n c8yIcon=\"{{ expirationHighlight?.icon }}\"\n *ngIf=\"expirationHighlight?.icon\"\n ></i>\n <span>{{ trustedCertificate.notAfter | c8yDate }}</span>\n </ng-template>\n </small>\n <button\n class=\"btn btn-link btn-icon\"\n title=\"{{ 'Renew certificate' | translate }}\"\n type=\"button\"\n *ngIf=\"expirationHighlight?.renewable\"\n (click)=\"renewCertificate()\"\n >\n <i c8yIcon=\"refresh\"></i>\n </button>\n </span>\n </div>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Auto registration' | translate }}\n </span>\n <span\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Enabled`auto registration`' | translate\n }}\"\n *ngIf=\"trustedCertificate.autoRegistrationEnabled\"\n >\n {{ 'Enabled`auto registration`' | translate }}\n </span>\n <span\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Disabled`auto registration`' | translate\n }}\"\n *ngIf=\"!trustedCertificate.autoRegistrationEnabled\"\n >\n {{ 'Disabled`auto registration`' | translate }}\n </span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </div>\n </div>\n <div class=\"col-2 d-flex\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Proof of possession' | translate }}\n </span>\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{ 'N/A' | translate }}\"\n *ngIf=\"trustedCertificate.tenantCertificateAuthority\"\n >\n {{ 'N/A' | translate }}\n </span>\n <span *ngIf=\"!trustedCertificate.tenantCertificateAuthority\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n *ngIf=\"trustedCertificate.proofOfPossessionValid\"\n >\n <div class=\"icon-flex\">\n <i\n class=\"text-success\"\n c8yIcon=\"success\"\n ></i>\n {{ 'Complete`proof of possession`' | translate }}\n </div>\n </span>\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n *ngIf=\"!trustedCertificate.proofOfPossessionValid\"\n >\n <div class=\"icon-flex\">\n <i\n class=\"text-warning\"\n c8yIcon=\"warning\"\n ></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </div>\n </span>\n </span>\n </div>\n <button\n class=\"m-l-auto btn-dot btn-dot--danger btn showOnHover m-r-8\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n placement=\"right\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificate--delete\"\n [delay]=\"500\"\n (click)=\"deleteTrustedCertificate(trustedCertificate)\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse>\n <div class=\"p-t-16 p-b-16\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Certificate name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n type=\"text\"\n required\n data-cy=\"c8y-trusted-certificates--edit-certificate-name\"\n [(ngModel)]=\"trustedCertificate.name\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Update certificate name' | translate }}\"\n type=\"button\"\n (click)=\"\n updateCertificate(trustedCertificate, { name: trustedCertificate.name })\n \"\n [disabled]=\"!trustedCertificate.name\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"certInPemFormat\"\n translate\n >\n Certificate\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"certInPemFormat\"\n name=\"certInPemFormat\"\n type=\"text\"\n rows=\"7\"\n readonly\n [(ngModel)]=\"trustedCertificate.certInPemFormat\"\n ></textarea>\n </c8y-form-group>\n <c8y-form-group>\n <label\n class=\"c8y-checkbox\"\n title=\"{{ 'Auto registration' | translate }}\"\n [ngClass]=\"{\n disabled: !(hasAdminRole$ | async)\n }\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n (ngModelChange)=\"\n updateCertificate(trustedCertificate, { autoRegistrationEnabled: $event })\n \"\n [disabled]=\"!(hasAdminRole$ | async)\"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4\">\n <div\n class=\"legend form-block\"\n translate\n >\n Additional properties\n </div>\n <ul class=\"list-unstyled\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Algorithm' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.algorithmName }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Version' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.version }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Valid from' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notBefore | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Issuer' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.issuer }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Expiration date' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notAfter | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Serial number' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.serialNumber }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Subject`of a certificate`' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.subject }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"col-md-1\"></div>\n <div\n class=\"col-md-7\"\n *ngIf=\"!trustedCertificate.tenantCertificateAuthority\"\n >\n <div class=\"legend form-block\">\n {{ 'Proof of possession' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ PROOF_OF_POSSESSION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </div>\n <div *ngIf=\"trustedCertificate.proofOfPossessionValid\">\n <span\n class=\"icon-flex\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n >\n <i\n class=\"text-success\"\n c8yIcon=\"success\"\n ></i>\n {{ 'Complete`proof of possession`' | translate }}\n </span>\n </div>\n <div *ngIf=\"!trustedCertificate.proofOfPossessionValid\">\n <div class=\"row m-b-16\">\n <div class=\"col-md-6\">\n <span\n class=\"icon-flex\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"warning\"\n ></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </span>\n </div>\n <div class=\"col-md-6 col-lg-6 text-right-md\">\n <span class=\"text-label-small m-r-4\">\n {{ 'Verification code expires/expired on' | translate }}\n </span>\n {{\n (trustedCertificate.proofOfPossessionVerificationCodeUsableUntil | c8yDate) ||\n '---'\n }}\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"unsignedVerificationCode\"\n translate\n >\n Verification code\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"unsignedVerificationCode\"\n name=\"unsignedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n readonly\n [(ngModel)]=\"trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Regenerate verification code' | translate }}\"\n type=\"button\"\n (click)=\"regenerateUnsignedVerificationCode(trustedCertificate)\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n {{ 'Regenerate`verification code`' | translate }}\n </button>\n\n <button\n class=\"btn btn-sm btn-default m-l-auto m-r-0\"\n [attr.aria-label]=\"'Copy to clipboard' | translate\"\n tooltip=\"{{ 'Copy to clipboard' | translate }}\"\n placement=\"right\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--copy-to-clipboard\"\n [delay]=\"500\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"copyUnsignedVerificationCodeToClipboard(trustedCertificate)\"\n >\n <i c8yIcon=\"clipboard\"></i>\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n [attr.aria-label]=\"'Download as file' | translate\"\n tooltip=\"{{ 'Download as file' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--download-as-file\"\n [delay]=\"500\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"downloadUnsignedVerificationCode(trustedCertificate)\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.EVENT\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.VERIFICATION_CODE.COMPONENTS.DOWNLOAD_CODE,\n action: PRODUCT_EXPERIENCE.VERIFICATION_CODE.ACTIONS.DOWNLOAD\n }\"\n >\n <i c8yIcon=\"download\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"signedVerificationCode\"\n >\n {{ 'Signed verification code' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ SIGNED_VERIFICATION_CODE_POPOVER | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--signed-verification-code-popup\"\n [outsideClick]=\"true\"\n ></button>\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"signedVerificationCode\"\n name=\"signedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"trustedCertificate.signedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Verify signed verification code' | translate }}\"\n type=\"button\"\n (click)=\"verifySignedVerificationCode(trustedCertificate)\"\n [disabled]=\"!trustedCertificate.signedVerificationCode\"\n >\n {{ 'Verify`signed verification code`' | translate }}\n </button>\n <button\n class=\"btn btn-sm btn-default m-l-auto\"\n [attr.aria-label]=\"'Upload file' | translate\"\n tooltip=\"{{ 'Upload file' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"fileInput.click()\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n <i c8yIcon=\"upload\"></i>\n </button>\n <input\n class=\"hidden\"\n type=\"file\"\n #fileInput\n (change)=\"onFileInput($event, trustedCertificate)\"\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </c8y-li-collapse>\n </c8y-li>\n </c8y-list-group>\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: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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: 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: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { 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: "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: ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "directive", type: ButtonCheckboxDirective, selector: "[btnCheckbox]", inputs: ["btnCheckboxTrue", "btnCheckboxFalse"] }, { 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.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { 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: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "component", type: FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: DatePipe, name: "c8yDate" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
|
|
642
679
|
}
|
|
643
680
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: TrustedCertificateListComponent, decorators: [{
|
|
644
681
|
type: Component,
|
|
@@ -670,8 +707,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
670
707
|
AsyncPipe,
|
|
671
708
|
DatePipe,
|
|
672
709
|
NgTemplateOutlet
|
|
673
|
-
], template: "<c8y-title>{{ 'Trusted certificates' | translate }}</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=\"certificate\"\n label=\"{{ 'Trusted certificates' | translate }}\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"certificateAuthorityFeatureEnabled\"\n>\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add CA certificate' | translate }}\"\n type=\"button\"\n [disabled]=\"certificateAuthorityExists\"\n (click)=\"addCACertificate()\"\n >\n <i c8yIcon=\"contract\"></i>\n {{ 'Add CA certificate' | translate }}\n </button>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Adding a CA certificate lets the app trust certificates from the specified authority, ensuring secure connections. Only one certificate is allowed, which is why the button is disabled.'\n | translate\n }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"certificateAuthorityExists\"\n ></button>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Adding a CA certificate lets the app trust certificates from the specified authority, ensuring secure connections.'\n | translate\n }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"!certificateAuthorityExists\"\n ></button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add trusted certificate' | translate }}\"\n type=\"button\"\n (click)=\"addTrustedCertificate()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add trusted certificate' | translate }}\n </button>\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)=\"loadTrustedCertificates()\"\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<c8y-help\n src=\"/docs/device-certificate-authentication/managing-trusted-certificates/#managing-trusted-certificates\"\n></c8y-help>\n\n<c8y-ui-empty-state\n [icon]=\"'certificate'\"\n [title]=\"'No trusted certificates to display.' | translate\"\n [subtitle]=\"'Add your first certificate by clicking below.' | translate\"\n *ngIf=\"(trustedCertificates | async)?.data.length === 0\"\n>\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add trusted certificate' | translate }}\"\n type=\"button\"\n (click)=\"addTrustedCertificate()\"\n >\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-ui-empty-state>\n\n<c8y-list-group class=\"m-b-24\">\n <div\n class=\"page-sticky-header hidden-xs c8y-list__item c8y-list__item--empty-actions\"\n *ngIf=\"(trustedCertificates | async)?.data.length > 0\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i\n class=\"invisible\"\n c8yIcon=\"certificate\"\n ></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-60\">\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Certificate' | translate }} \"\n >\n {{ 'Certificate' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Status' | translate }}\"\n >\n {{ 'Status' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}\"\n >\n {{ 'Algorithm' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}\"\n >\n {{ 'Expiration date' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Auto registration' | translate }}\"\n >\n {{ 'Auto registration' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Proof of possession' | translate }}\"\n >\n {{ 'Proof of possession' | translate }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n\n <c8y-li\n *c8yFor=\"\n let trustedCertificate of trustedCertificates | async;\n let i = index;\n pipe: sortByExpirationDateAsc;\n loadMore: 'none'\n \"\n #listItem\n data-cy=\"c8y-trusted-certificates-list--item-block\"\n >\n <c8y-li-icon>\n <button\n class=\"btn-clean\"\n attr.aria-label=\"{{ 'Certificate' | translate }}\"\n tooltip=\"{{ 'Certificate' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n *ngIf=\"!trustedCertificate.tenantCertificateAuthority\"\n >\n <i c8yIcon=\"certificate\"></i>\n </button>\n <button\n class=\"btn-clean\"\n attr.aria-label=\"{{ 'CA certificate' | translate }}\"\n tooltip=\"{{ 'CA certificate' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n *ngIf=\"trustedCertificate.tenantCertificateAuthority\"\n >\n <i c8yIcon=\"contract\"></i>\n </button>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-2\">\n <button\n class=\"btn-clean text-truncate\"\n title=\"{{ trustedCertificate.name }}\"\n type=\"button\"\n (click)=\"listItem.toggleCollapsed()\"\n >\n {{ trustedCertificate.name }}\n </button>\n </div>\n <div class=\"col-2\">\n <div class=\"visible-xs p-8\"></div>\n <button\n class=\"btn c8y-btn-checkbox--inline\"\n name=\"certificateStatus\"\n type=\"button\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n (ngModelChange)=\"updateCertificate(trustedCertificate, { status: $event })\"\n >\n <small\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </small>\n <small\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </small>\n </button>\n <div class=\"visible-xs p-8\"></div>\n </div>\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}: {{ trustedCertificate.algorithmName }}\"\n >\n <span\n class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\"\n translate\n >\n Algorithm\n </span>\n {{ trustedCertificate.algorithmName }}\n </div>\n </div>\n\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}: {{ trustedCertificate.notAfter | c8yDate }}\"\n >\n <span\n class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\"\n translate\n >\n Expiration date\n </span>\n @let expirationHighlight = getExpirationHighlight(trustedCertificate);\n <span>\n <small\n [attr.title]=\"expirationHighlight?.tooltipText\"\n [ngClass]=\"expirationHighlight?.textClass\"\n >\n <ng-container *ngIf=\"expirationHighlight?.expired; else notExpiredYet\">\n <del>\n <ng-container *ngTemplateOutlet=\"expirationDateTpl\"></ng-container>\n </del>\n </ng-container>\n <ng-template #notExpiredYet>\n <ng-container *ngTemplateOutlet=\"expirationDateTpl\"></ng-container>\n </ng-template>\n <ng-template #expirationDateTpl>\n <i\n class=\"m-r-4\"\n c8yIcon=\"{{ expirationHighlight?.icon }}\"\n *ngIf=\"expirationHighlight?.icon\"\n ></i>\n <span>{{ trustedCertificate.notAfter | c8yDate }}</span>\n </ng-template>\n </small>\n <button\n class=\"btn btn-link btn-icon\"\n title=\"{{ 'Renew certificate' | translate }}\"\n type=\"button\"\n *ngIf=\"expirationHighlight?.renewable\"\n (click)=\"renewCertificate()\"\n >\n <i c8yIcon=\"refresh\"></i>\n </button>\n </span>\n </div>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Auto registration' | translate }}\n </span>\n <span\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Enabled`auto registration`' | translate\n }}\"\n *ngIf=\"trustedCertificate.autoRegistrationEnabled\"\n >\n {{ 'Enabled`auto registration`' | translate }}\n </span>\n <span\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Disabled`auto registration`' | translate\n }}\"\n *ngIf=\"!trustedCertificate.autoRegistrationEnabled\"\n >\n {{ 'Disabled`auto registration`' | translate }}\n </span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </div>\n </div>\n <div class=\"col-2 d-flex\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Proof of possession' | translate }}\n </span>\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{ 'N/A' | translate }}\"\n *ngIf=\"trustedCertificate.tenantCertificateAuthority\"\n >\n {{ 'N/A' | translate }}\n </span>\n <span *ngIf=\"!trustedCertificate.tenantCertificateAuthority\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n *ngIf=\"trustedCertificate.proofOfPossessionValid\"\n >\n <div class=\"icon-flex\">\n <i\n class=\"text-success\"\n c8yIcon=\"success\"\n ></i>\n {{ 'Complete`proof of possession`' | translate }}\n </div>\n </span>\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n *ngIf=\"!trustedCertificate.proofOfPossessionValid\"\n >\n <div class=\"icon-flex\">\n <i\n class=\"text-warning\"\n c8yIcon=\"warning\"\n ></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </div>\n </span>\n </span>\n </div>\n <button\n class=\"m-l-auto btn-dot btn-dot--danger btn showOnHover m-r-8\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n placement=\"right\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificate--delete\"\n [delay]=\"500\"\n (click)=\"deleteTrustedCertificate(trustedCertificate)\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse>\n <div class=\"p-t-16 p-b-16\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Certificate name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n type=\"text\"\n required\n data-cy=\"c8y-trusted-certificates--edit-certificate-name\"\n [(ngModel)]=\"trustedCertificate.name\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Update certificate name' | translate }}\"\n type=\"button\"\n (click)=\"\n updateCertificate(trustedCertificate, { name: trustedCertificate.name })\n \"\n [disabled]=\"!trustedCertificate.name\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"certInPemFormat\"\n translate\n >\n Certificate\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"certInPemFormat\"\n name=\"certInPemFormat\"\n type=\"text\"\n rows=\"7\"\n readonly\n [(ngModel)]=\"trustedCertificate.certInPemFormat\"\n ></textarea>\n </c8y-form-group>\n <c8y-form-group>\n <label\n class=\"c8y-checkbox\"\n title=\"{{ 'Auto registration' | translate }}\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n (ngModelChange)=\"\n updateCertificate(trustedCertificate, { autoRegistrationEnabled: $event })\n \"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4\">\n <div\n class=\"legend form-block\"\n translate\n >\n Additional properties\n </div>\n <ul class=\"list-unstyled\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Algorithm' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.algorithmName }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Version' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.version }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Valid from' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notBefore | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Issuer' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.issuer }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Expiration date' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notAfter | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Serial number' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.serialNumber }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Subject`of a certificate`' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.subject }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"col-md-1\"></div>\n <div\n class=\"col-md-7\"\n *ngIf=\"!trustedCertificate.tenantCertificateAuthority\"\n >\n <div class=\"legend form-block\">\n {{ 'Proof of possession' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ PROOF_OF_POSSESSION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </div>\n <div *ngIf=\"trustedCertificate.proofOfPossessionValid\">\n <span\n class=\"icon-flex\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n >\n <i\n class=\"text-success\"\n c8yIcon=\"success\"\n ></i>\n {{ 'Complete`proof of possession`' | translate }}\n </span>\n </div>\n <div *ngIf=\"!trustedCertificate.proofOfPossessionValid\">\n <div class=\"row m-b-16\">\n <div class=\"col-md-6\">\n <span\n class=\"icon-flex\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"warning\"\n ></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </span>\n </div>\n <div class=\"col-md-6 col-lg-6 text-right-md\">\n <span class=\"text-label-small m-r-4\">\n {{ 'Verification code expires/expired on' | translate }}\n </span>\n {{\n (trustedCertificate.proofOfPossessionVerificationCodeUsableUntil | c8yDate) ||\n '---'\n }}\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"unsignedVerificationCode\"\n translate\n >\n Verification code\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"unsignedVerificationCode\"\n name=\"unsignedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n readonly\n [(ngModel)]=\"trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Regenerate verification code' | translate }}\"\n type=\"button\"\n (click)=\"regenerateUnsignedVerificationCode(trustedCertificate)\"\n >\n {{ 'Regenerate`verification code`' | translate }}\n </button>\n\n <button\n class=\"btn btn-sm btn-default m-l-auto m-r-0\"\n [attr.aria-label]=\"'Copy to clipboard' | translate\"\n tooltip=\"{{ 'Copy to clipboard' | translate }}\"\n placement=\"right\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--copy-to-clipboard\"\n [delay]=\"500\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"copyUnsignedVerificationCodeToClipboard(trustedCertificate)\"\n >\n <i c8yIcon=\"clipboard\"></i>\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n [attr.aria-label]=\"'Download as file' | translate\"\n tooltip=\"{{ 'Download as file' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--download-as-file\"\n [delay]=\"500\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"downloadUnsignedVerificationCode(trustedCertificate)\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.EVENT\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.VERIFICATION_CODE.COMPONENTS.DOWNLOAD_CODE,\n action: PRODUCT_EXPERIENCE.VERIFICATION_CODE.ACTIONS.DOWNLOAD\n }\"\n >\n <i c8yIcon=\"download\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"signedVerificationCode\"\n >\n {{ 'Signed verification code' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ SIGNED_VERIFICATION_CODE_POPOVER | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--signed-verification-code-popup\"\n [outsideClick]=\"true\"\n ></button>\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"signedVerificationCode\"\n name=\"signedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"trustedCertificate.signedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Verify signed verification code' | translate }}\"\n type=\"button\"\n (click)=\"verifySignedVerificationCode(trustedCertificate)\"\n [disabled]=\"!trustedCertificate.signedVerificationCode\"\n >\n {{ 'Verify`signed verification code`' | translate }}\n </button>\n <button\n class=\"btn btn-sm btn-default m-l-auto\"\n [attr.aria-label]=\"'Upload file' | translate\"\n tooltip=\"{{ 'Upload file' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"fileInput.click()\"\n >\n <i c8yIcon=\"upload\"></i>\n </button>\n <input\n class=\"hidden\"\n type=\"file\"\n #fileInput\n (change)=\"onFileInput($event, trustedCertificate)\"\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </c8y-li-collapse>\n </c8y-li>\n</c8y-list-group>\n" }]
|
|
674
|
-
}], ctorParameters: () => [{ type: i1$1.BsModalService }, { type: i2.AlertService }, { type: i2$1.TrustedCertificateService }, { type: i2.ModalService }, { type: i4.TranslateService }, { type: i2.ClipboardService }, { type: i2.GainsightService }, { type: i2$1.SystemOptionsService }, { type: i2.FeatureCacheService }] });
|
|
710
|
+
], template: "<div *ngIf=\"(hasReadRole$ | async) || (hasAdminRole$ | async)\">\n <c8y-title>{{ 'Trusted certificates' | translate }}</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=\"certificate\"\n label=\"{{ 'Trusted certificates' | translate }}\"\n ></c8y-breadcrumb-item>\n </c8y-breadcrumb>\n\n <c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"certificateAuthorityFeatureEnabled\"\n >\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add CA certificate' | translate }}\"\n type=\"button\"\n [disabled]=\"!(hasAdminRole$ | async) || certificateAuthorityExists\"\n (click)=\"addCACertificate()\"\n >\n <i c8yIcon=\"contract\"></i>\n {{ 'Add CA certificate' | translate }}\n </button>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Adding a CA certificate lets the app trust certificates from the specified authority, ensuring secure connections. Only one certificate is allowed, which is why the button is disabled.'\n | translate\n }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"certificateAuthorityExists\"\n ></button>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Adding a CA certificate lets the app trust certificates from the specified authority, ensuring secure connections.'\n | translate\n }}\"\n placement=\"bottom\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"!certificateAuthorityExists\"\n ></button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item [placement]=\"'right'\">\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Add trusted certificate' | translate }}\"\n type=\"button\"\n (click)=\"addTrustedCertificate()\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add trusted certificate' | translate }}\n </button>\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)=\"loadTrustedCertificates()\"\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 <c8y-help\n src=\"/docs/device-certificate-authentication/managing-trusted-certificates/#managing-trusted-certificates\"\n ></c8y-help>\n\n <c8y-ui-empty-state\n [icon]=\"'certificate'\"\n [title]=\"'No trusted certificates to display.' | translate\"\n [subtitle]=\"'Add your first certificate by clicking below.' | translate\"\n *ngIf=\"(trustedCertificates | async)?.data.length === 0\"\n >\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Add trusted certificate' | translate }}\"\n type=\"button\"\n (click)=\"addTrustedCertificate()\"\n >\n {{ 'Add trusted certificate' | translate }}\n </button>\n </c8y-ui-empty-state>\n\n <c8y-list-group class=\"m-b-24\">\n <div\n class=\"page-sticky-header hidden-xs c8y-list__item c8y-list__item--empty-actions\"\n *ngIf=\"(trustedCertificates | async)?.data.length > 0\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i\n class=\"invisible\"\n c8yIcon=\"certificate\"\n ></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-60\">\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Certificate' | translate }} \"\n >\n {{ 'Certificate' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Status' | translate }}\"\n >\n {{ 'Status' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}\"\n >\n {{ 'Algorithm' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}\"\n >\n {{ 'Expiration date' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Auto registration' | translate }}\"\n >\n {{ 'Auto registration' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span\n class=\"text-truncate\"\n title=\" {{ 'Proof of possession' | translate }}\"\n >\n {{ 'Proof of possession' | translate }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n\n <c8y-li\n *c8yFor=\"\n let trustedCertificate of trustedCertificates | async;\n let i = index;\n pipe: sortByExpirationDateAsc;\n loadMore: 'none'\n \"\n #listItem\n data-cy=\"c8y-trusted-certificates-list--item-block\"\n >\n <c8y-li-icon>\n <button\n class=\"btn-clean\"\n attr.aria-label=\"{{ 'Certificate' | translate }}\"\n tooltip=\"{{ 'Certificate' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n *ngIf=\"!trustedCertificate.tenantCertificateAuthority\"\n >\n <i c8yIcon=\"certificate\"></i>\n </button>\n <button\n class=\"btn-clean\"\n attr.aria-label=\"{{ 'CA certificate' | translate }}\"\n tooltip=\"{{ 'CA certificate' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n *ngIf=\"trustedCertificate.tenantCertificateAuthority\"\n >\n <i c8yIcon=\"contract\"></i>\n </button>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-2\">\n <button\n class=\"btn-clean text-truncate\"\n title=\"{{ trustedCertificate.name }}\"\n type=\"button\"\n (click)=\"listItem.toggleCollapsed()\"\n >\n {{ trustedCertificate.name }}\n </button>\n </div>\n <div class=\"col-2\">\n <div class=\"visible-xs p-8\"></div>\n <button\n class=\"btn c8y-btn-checkbox--inline\"\n name=\"certificateStatus\"\n type=\"button\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n (ngModelChange)=\"updateCertificate(trustedCertificate, { status: $event })\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n [ngClass]=\"{\n disabled: !(hasAdminRole$ | async)\n }\"\n >\n <small\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </small>\n <small\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </small>\n </button>\n <div class=\"visible-xs p-8\"></div>\n </div>\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}: {{ trustedCertificate.algorithmName }}\"\n >\n <span\n class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\"\n translate\n >\n Algorithm\n </span>\n {{ trustedCertificate.algorithmName }}\n </div>\n </div>\n\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}: {{ trustedCertificate.notAfter | c8yDate }}\"\n >\n <span\n class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\"\n translate\n >\n Expiration date\n </span>\n @let expirationHighlight = getExpirationHighlight(trustedCertificate);\n <span>\n <small\n [attr.title]=\"expirationHighlight?.tooltipText\"\n [ngClass]=\"expirationHighlight?.textClass\"\n >\n <ng-container *ngIf=\"expirationHighlight?.expired; else notExpiredYet\">\n <del>\n <ng-container *ngTemplateOutlet=\"expirationDateTpl\"></ng-container>\n </del>\n </ng-container>\n <ng-template #notExpiredYet>\n <ng-container *ngTemplateOutlet=\"expirationDateTpl\"></ng-container>\n </ng-template>\n <ng-template #expirationDateTpl>\n <i\n class=\"m-r-4\"\n c8yIcon=\"{{ expirationHighlight?.icon }}\"\n *ngIf=\"expirationHighlight?.icon\"\n ></i>\n <span>{{ trustedCertificate.notAfter | c8yDate }}</span>\n </ng-template>\n </small>\n <button\n class=\"btn btn-link btn-icon\"\n title=\"{{ 'Renew certificate' | translate }}\"\n type=\"button\"\n *ngIf=\"expirationHighlight?.renewable\"\n (click)=\"renewCertificate()\"\n >\n <i c8yIcon=\"refresh\"></i>\n </button>\n </span>\n </div>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Auto registration' | translate }}\n </span>\n <span\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Enabled`auto registration`' | translate\n }}\"\n *ngIf=\"trustedCertificate.autoRegistrationEnabled\"\n >\n {{ 'Enabled`auto registration`' | translate }}\n </span>\n <span\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Disabled`auto registration`' | translate\n }}\"\n *ngIf=\"!trustedCertificate.autoRegistrationEnabled\"\n >\n {{ 'Disabled`auto registration`' | translate }}\n </span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </div>\n </div>\n <div class=\"col-2 d-flex\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Proof of possession' | translate }}\n </span>\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{ 'N/A' | translate }}\"\n *ngIf=\"trustedCertificate.tenantCertificateAuthority\"\n >\n {{ 'N/A' | translate }}\n </span>\n <span *ngIf=\"!trustedCertificate.tenantCertificateAuthority\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n *ngIf=\"trustedCertificate.proofOfPossessionValid\"\n >\n <div class=\"icon-flex\">\n <i\n class=\"text-success\"\n c8yIcon=\"success\"\n ></i>\n {{ 'Complete`proof of possession`' | translate }}\n </div>\n </span>\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n *ngIf=\"!trustedCertificate.proofOfPossessionValid\"\n >\n <div class=\"icon-flex\">\n <i\n class=\"text-warning\"\n c8yIcon=\"warning\"\n ></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </div>\n </span>\n </span>\n </div>\n <button\n class=\"m-l-auto btn-dot btn-dot--danger btn showOnHover m-r-8\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n placement=\"right\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificate--delete\"\n [delay]=\"500\"\n (click)=\"deleteTrustedCertificate(trustedCertificate)\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse>\n <div class=\"p-t-16 p-b-16\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Certificate name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n class=\"form-control\"\n type=\"text\"\n required\n data-cy=\"c8y-trusted-certificates--edit-certificate-name\"\n [(ngModel)]=\"trustedCertificate.name\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-primary\"\n title=\"{{ 'Update certificate name' | translate }}\"\n type=\"button\"\n (click)=\"\n updateCertificate(trustedCertificate, { name: trustedCertificate.name })\n \"\n [disabled]=\"!trustedCertificate.name\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"certInPemFormat\"\n translate\n >\n Certificate\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"certInPemFormat\"\n name=\"certInPemFormat\"\n type=\"text\"\n rows=\"7\"\n readonly\n [(ngModel)]=\"trustedCertificate.certInPemFormat\"\n ></textarea>\n </c8y-form-group>\n <c8y-form-group>\n <label\n class=\"c8y-checkbox\"\n title=\"{{ 'Auto registration' | translate }}\"\n [ngClass]=\"{\n disabled: !(hasAdminRole$ | async)\n }\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n (ngModelChange)=\"\n updateCertificate(trustedCertificate, { autoRegistrationEnabled: $event })\n \"\n [disabled]=\"!(hasAdminRole$ | async)\"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4\">\n <div\n class=\"legend form-block\"\n translate\n >\n Additional properties\n </div>\n <ul class=\"list-unstyled\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Algorithm' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.algorithmName }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Version' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.version }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Valid from' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notBefore | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Issuer' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.issuer }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Expiration date' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notAfter | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Serial number' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.serialNumber }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Subject`of a certificate`' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.subject }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"col-md-1\"></div>\n <div\n class=\"col-md-7\"\n *ngIf=\"!trustedCertificate.tenantCertificateAuthority\"\n >\n <div class=\"legend form-block\">\n {{ 'Proof of possession' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ PROOF_OF_POSSESSION_POPOVER | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n type=\"button\"\n ></button>\n </div>\n <div *ngIf=\"trustedCertificate.proofOfPossessionValid\">\n <span\n class=\"icon-flex\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n >\n <i\n class=\"text-success\"\n c8yIcon=\"success\"\n ></i>\n {{ 'Complete`proof of possession`' | translate }}\n </span>\n </div>\n <div *ngIf=\"!trustedCertificate.proofOfPossessionValid\">\n <div class=\"row m-b-16\">\n <div class=\"col-md-6\">\n <span\n class=\"icon-flex\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n >\n <i\n class=\"text-warning\"\n c8yIcon=\"warning\"\n ></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </span>\n </div>\n <div class=\"col-md-6 col-lg-6 text-right-md\">\n <span class=\"text-label-small m-r-4\">\n {{ 'Verification code expires/expired on' | translate }}\n </span>\n {{\n (trustedCertificate.proofOfPossessionVerificationCodeUsableUntil | c8yDate) ||\n '---'\n }}\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"unsignedVerificationCode\"\n translate\n >\n Verification code\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"unsignedVerificationCode\"\n name=\"unsignedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n readonly\n [(ngModel)]=\"trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Regenerate verification code' | translate }}\"\n type=\"button\"\n (click)=\"regenerateUnsignedVerificationCode(trustedCertificate)\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n {{ 'Regenerate`verification code`' | translate }}\n </button>\n\n <button\n class=\"btn btn-sm btn-default m-l-auto m-r-0\"\n [attr.aria-label]=\"'Copy to clipboard' | translate\"\n tooltip=\"{{ 'Copy to clipboard' | translate }}\"\n placement=\"right\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--copy-to-clipboard\"\n [delay]=\"500\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"copyUnsignedVerificationCodeToClipboard(trustedCertificate)\"\n >\n <i c8yIcon=\"clipboard\"></i>\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n [attr.aria-label]=\"'Download as file' | translate\"\n tooltip=\"{{ 'Download as file' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--download-as-file\"\n [delay]=\"500\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"downloadUnsignedVerificationCode(trustedCertificate)\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.EVENT\"\n [actionData]=\"{\n component: PRODUCT_EXPERIENCE.VERIFICATION_CODE.COMPONENTS.DOWNLOAD_CODE,\n action: PRODUCT_EXPERIENCE.VERIFICATION_CODE.ACTIONS.DOWNLOAD\n }\"\n >\n <i c8yIcon=\"download\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label\n class=\"control-label\"\n for=\"signedVerificationCode\"\n >\n {{ 'Signed verification code' | translate }}\n <button\n class=\"btn-help btn-help--sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ SIGNED_VERIFICATION_CODE_POPOVER | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n data-cy=\"c8y-trusted-certificates--signed-verification-code-popup\"\n [outsideClick]=\"true\"\n ></button>\n </label>\n <textarea\n class=\"form-control no-resize\"\n id=\"signedVerificationCode\"\n name=\"signedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"trustedCertificate.signedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Verify signed verification code' | translate }}\"\n type=\"button\"\n (click)=\"verifySignedVerificationCode(trustedCertificate)\"\n [disabled]=\"!trustedCertificate.signedVerificationCode\"\n >\n {{ 'Verify`signed verification code`' | translate }}\n </button>\n <button\n class=\"btn btn-sm btn-default m-l-auto\"\n [attr.aria-label]=\"'Upload file' | translate\"\n tooltip=\"{{ 'Upload file' | translate }}\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"fileInput.click()\"\n [disabled]=\"!(hasAdminRole$ | async)\"\n >\n <i c8yIcon=\"upload\"></i>\n </button>\n <input\n class=\"hidden\"\n type=\"file\"\n #fileInput\n (change)=\"onFileInput($event, trustedCertificate)\"\n />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </c8y-li-collapse>\n </c8y-li>\n </c8y-list-group>\n</div>\n" }]
|
|
711
|
+
}], ctorParameters: () => [{ type: i1$1.BsModalService }, { type: i2.AlertService }, { type: i2$1.TrustedCertificateService }, { type: i2.ModalService }, { type: i4$1.TranslateService }, { type: i2.ClipboardService }, { type: i2.GainsightService }, { type: i2$1.SystemOptionsService }, { type: i2.FeatureCacheService }, { type: TrustedCertificatesGuard }] });
|
|
675
712
|
|
|
676
713
|
const trustedCertificatesRoutes = [
|
|
677
714
|
{
|