@c8y/ngx-components 1021.38.1 → 1021.49.4
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/api/services.d.ts +1 -1
- package/api/services.d.ts.map +1 -1
- package/auth-configuration/sso-configuration/template-parts/access-mapping/access-mapping.component.d.ts.map +1 -1
- package/connectivity/abstract-connectivity-tab.factory.d.ts +1 -1
- package/context-dashboard/add-dashboard.component.d.ts.map +1 -1
- package/context-dashboard/context-dashboard.model.d.ts +4 -2
- package/context-dashboard/context-dashboard.model.d.ts.map +1 -1
- package/context-dashboard/dashboard-detail.component.d.ts.map +1 -1
- package/context-dashboard/dashboard-manager/dashboard-manager.model.d.ts +1 -0
- package/context-dashboard/dashboard-manager/dashboard-manager.model.d.ts.map +1 -1
- package/context-dashboard/dashboard-manager/dashboard-manager.service.d.ts +0 -1
- package/context-dashboard/dashboard-manager/dashboard-manager.service.d.ts.map +1 -1
- package/context-dashboard/dashboard-manager/type-dashboards-list/type-dashboards-list.component.d.ts.map +1 -1
- package/context-dashboard/new-dashboard.guard.d.ts +1 -1
- package/context-dashboard/new-dashboard.guard.d.ts.map +1 -1
- package/core/action/action.component.d.ts +2 -1
- package/core/action/action.component.d.ts.map +1 -1
- package/core/action/action.model.d.ts +3 -2
- package/core/action/action.model.d.ts.map +1 -1
- package/core/breadcrumb/breadcrumb-item.component.d.ts +2 -1
- package/core/breadcrumb/breadcrumb-item.component.d.ts.map +1 -1
- package/core/breadcrumb/breadcrumb.model.d.ts +2 -1
- package/core/breadcrumb/breadcrumb.model.d.ts.map +1 -1
- package/core/common/ApplicationOptions.d.ts +1 -0
- package/core/common/ApplicationOptions.d.ts.map +1 -1
- package/core/common/empty-state/empty-state.component.d.ts +2 -1
- package/core/common/empty-state/empty-state.component.d.ts.map +1 -1
- package/core/common/get-group-icon.pipe.d.ts +2 -1
- package/core/common/get-group-icon.pipe.d.ts.map +1 -1
- package/core/common/group.service.d.ts +22 -7
- package/core/common/group.service.d.ts.map +1 -1
- package/core/common/icon.directive.d.ts +5 -5
- package/core/common/icon.directive.d.ts.map +1 -1
- package/core/common/service-registry.model.d.ts +2 -1
- package/core/common/service-registry.model.d.ts.map +1 -1
- package/core/data-grid/data-grid.model.d.ts +2 -1
- package/core/data-grid/data-grid.model.d.ts.map +1 -1
- package/core/docs/docs.models.d.ts +2 -1
- package/core/docs/docs.models.d.ts.map +1 -1
- package/core/docs/help-and-support-outlet/help-and-support-outlet.component.d.ts +5 -1
- package/core/docs/help-and-support-outlet/help-and-support-outlet.component.d.ts.map +1 -1
- package/core/docs/legal-notices-outlet/legal-notices-outlet.component.d.ts +5 -1
- package/core/docs/legal-notices-outlet/legal-notices-outlet.component.d.ts.map +1 -1
- package/core/docs/support-outlet/support-outlet.component.d.ts +5 -1
- package/core/docs/support-outlet/support-outlet.component.d.ts.map +1 -1
- package/core/forms/filter-input.component.d.ts +8 -3
- package/core/forms/filter-input.component.d.ts.map +1 -1
- package/core/i18n/translate.service.d.ts.map +1 -1
- package/core/list-group/list-item-action.component.d.ts +2 -1
- package/core/list-group/list-item-action.component.d.ts.map +1 -1
- package/core/list-group/list-item-icon.component.d.ts +2 -1
- package/core/list-group/list-item-icon.component.d.ts.map +1 -1
- package/core/login/login.service.d.ts.map +1 -1
- package/core/navigator/navigator-icon.component.d.ts +1 -1
- package/core/navigator/navigator-icon.component.d.ts.map +1 -1
- package/core/navigator/navigator-node-data.d.ts +2 -1
- package/core/navigator/navigator-node-data.d.ts.map +1 -1
- package/core/navigator/navigator-node.component.d.ts.map +1 -1
- package/core/navigator/navigator-node.d.ts +2 -1
- package/core/navigator/navigator-node.d.ts.map +1 -1
- package/core/plugins/plugins.model.d.ts +7 -2
- package/core/plugins/plugins.model.d.ts.map +1 -1
- package/core/plugins/plugins.service.d.ts.map +1 -1
- package/core/properties-list/properties-list.component.d.ts +2 -1
- package/core/properties-list/properties-list.component.d.ts.map +1 -1
- package/core/provider-configuration/model/dynamic-provider-config.model.d.ts +2 -2
- package/core/provider-configuration/model/dynamic-provider-config.model.d.ts.map +1 -1
- package/core/router/context-route.service.d.ts.map +1 -1
- package/core/router/router.model.d.ts +1 -1
- package/core/router/router.model.d.ts.map +1 -1
- package/core/router/scoped-context-route.service.d.ts.map +1 -1
- package/core/search/search.model.d.ts +2 -1
- package/core/search/search.model.d.ts.map +1 -1
- package/core/select/select-keyboard.service.d.ts +4 -0
- package/core/select/select-keyboard.service.d.ts.map +1 -1
- package/core/select/select.component.d.ts +14 -3
- package/core/select/select.component.d.ts.map +1 -1
- package/core/select-modal/select-modal.component.d.ts +2 -1
- package/core/select-modal/select-modal.component.d.ts.map +1 -1
- package/core/shared/core.model.d.ts +5 -1
- package/core/shared/core.model.d.ts.map +1 -1
- package/core/tabs/conditional-tabs-outlet.component.d.ts.map +1 -1
- package/core/tabs/tab.component.d.ts +3 -2
- package/core/tabs/tab.component.d.ts.map +1 -1
- package/core/tabs/tab.model.d.ts +10 -5
- package/core/tabs/tab.model.d.ts.map +1 -1
- package/core/tabs/tabs-outlet.component.d.ts +7 -4
- package/core/tabs/tabs-outlet.component.d.ts.map +1 -1
- package/core/user/user-menu-item.component.d.ts +2 -1
- package/core/user/user-menu-item.component.d.ts.map +1 -1
- package/core/user/user.model.d.ts +2 -1
- package/core/user/user.model.d.ts.map +1 -1
- package/core/wizard/wizard.model.d.ts +4 -3
- package/core/wizard/wizard.model.d.ts.map +1 -1
- package/data-grid-columns/asset-type/asset-type.cell-renderer.component.d.ts.map +1 -1
- package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts +15 -46
- package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts.map +1 -1
- package/datapoint-selector/datapoint-attributes-form/datapoint-attributes.model.d.ts +3 -0
- package/datapoint-selector/datapoint-attributes-form/datapoint-attributes.model.d.ts.map +1 -1
- package/datapoint-selector/datapoint-selection.model.d.ts +6 -7
- package/datapoint-selector/datapoint-selection.model.d.ts.map +1 -1
- package/datapoints-export-selector/datapoints-export-selector.model.d.ts +2 -1
- package/datapoints-export-selector/datapoints-export-selector.model.d.ts.map +1 -1
- package/device-grid/columns/icon.cell-renderer.component.d.ts +14 -0
- package/device-grid/columns/icon.cell-renderer.component.d.ts.map +1 -0
- package/device-grid/columns/index.d.ts +1 -0
- package/device-grid/columns/index.d.ts.map +1 -1
- package/device-grid/device-grid.component.d.ts.map +1 -1
- package/device-grid/device-grid.service.d.ts +0 -2
- package/device-grid/device-grid.service.d.ts.map +1 -1
- package/device-provisioned-certificates/c8y-ngx-components-device-provisioned-certificates.d.ts.map +1 -0
- package/device-provisioned-certificates/device-provisioned-certificates.guard.d.ts +11 -0
- package/device-provisioned-certificates/device-provisioned-certificates.guard.d.ts.map +1 -0
- package/device-provisioned-certificates/device-provisioned-certificates.module.d.ts +13 -0
- package/device-provisioned-certificates/device-provisioned-certificates.module.d.ts.map +1 -0
- package/device-provisioned-certificates/device-provisioned-certificates.service.d.ts +13 -0
- package/device-provisioned-certificates/device-provisioned-certificates.service.d.ts.map +1 -0
- package/device-provisioned-certificates/device-tab-provisioned-certificates.component.d.ts +57 -0
- package/device-provisioned-certificates/device-tab-provisioned-certificates.component.d.ts.map +1 -0
- package/device-provisioned-certificates/index.d.ts +2 -0
- package/device-provisioned-certificates/index.d.ts.map +1 -0
- package/ecosystem/application-plugins/application-plugins.component.d.ts +4 -0
- package/ecosystem/application-plugins/application-plugins.component.d.ts.map +1 -1
- package/ecosystem/application-plugins/application-plugins.module.d.ts +2 -2
- package/ecosystem/application-plugins/application-plugins.module.d.ts.map +1 -1
- package/ecosystem/application-plugins/index.d.ts +1 -0
- package/ecosystem/application-plugins/index.d.ts.map +1 -1
- package/ecosystem/application-plugins/install-plugin.component.d.ts +9 -11
- package/ecosystem/application-plugins/install-plugin.component.d.ts.map +1 -1
- package/ecosystem/application-plugins/only-latest-filter/only-latest-filter.component.d.ts +12 -0
- package/ecosystem/application-plugins/only-latest-filter/only-latest-filter.component.d.ts.map +1 -0
- package/ecosystem/application-plugins/plugin-list-item.component.d.ts +8 -3
- package/ecosystem/application-plugins/plugin-list-item.component.d.ts.map +1 -1
- package/ecosystem/application-plugins/plugin-list.component.d.ts.map +1 -1
- package/ecosystem/application-plugins/update-plugin-of-app/update-plugin-of-app.component.d.ts.map +1 -1
- package/ecosystem/applications/application-list/application-list.component.d.ts +2 -2
- package/ecosystem/applications/application-list/application-list.component.d.ts.map +1 -1
- package/ecosystem/applications/install-from-package/install-from-package.component.d.ts.map +1 -1
- package/ecosystem/archived-confirm/archived-confirm-modal.component.d.ts +11 -0
- package/ecosystem/archived-confirm/archived-confirm-modal.component.d.ts.map +1 -0
- package/ecosystem/archived-confirm/archived-confirm.module.d.ts +10 -0
- package/ecosystem/archived-confirm/archived-confirm.module.d.ts.map +1 -0
- package/ecosystem/archived-confirm/c8y-ngx-components-ecosystem-archived-confirm.d.ts.map +1 -0
- package/ecosystem/archived-confirm/index.d.ts +3 -0
- package/ecosystem/archived-confirm/index.d.ts.map +1 -0
- package/ecosystem/ecosystem.module.d.ts +2 -1
- package/ecosystem/ecosystem.module.d.ts.map +1 -1
- package/ecosystem/features/feature-list.component.d.ts +2 -2
- package/ecosystem/features/feature-list.component.d.ts.map +1 -1
- package/ecosystem/microservices/microservice-list.component.d.ts +2 -2
- package/ecosystem/microservices/microservice-list.component.d.ts.map +1 -1
- package/ecosystem/packages/deploy-application/deploy-application.component.d.ts.map +1 -1
- package/ecosystem/packages/package-details/package-details.component.d.ts +7 -2
- package/ecosystem/packages/package-details/package-details.component.d.ts.map +1 -1
- package/ecosystem/packages/package-list/packages-list.component.d.ts +2 -2
- package/ecosystem/packages/package-list/packages-list.component.d.ts.map +1 -1
- package/ecosystem/shared/add-application.component.d.ts +2 -1
- package/ecosystem/shared/add-application.component.d.ts.map +1 -1
- package/ecosystem/shared/application-card.component.d.ts +4 -0
- package/ecosystem/shared/application-card.component.d.ts.map +1 -1
- package/ecosystem/shared/archived-filter/archived-filter.component.d.ts +12 -0
- package/ecosystem/shared/archived-filter/archived-filter.component.d.ts.map +1 -0
- package/ecosystem/shared/ecosystem.constants.d.ts +4 -0
- package/ecosystem/shared/ecosystem.constants.d.ts.map +1 -1
- package/ecosystem/shared/ecosystem.model.d.ts +5 -1
- package/ecosystem/shared/ecosystem.model.d.ts.map +1 -1
- package/ecosystem/shared/ecosystem.service.d.ts +7 -0
- package/ecosystem/shared/ecosystem.service.d.ts.map +1 -1
- package/ecosystem/shared/index.d.ts +1 -0
- package/ecosystem/shared/index.d.ts.map +1 -1
- package/ecosystem/shared/list-filters/list-filters.component.d.ts +14 -4
- package/ecosystem/shared/list-filters/list-filters.component.d.ts.map +1 -1
- package/ecosystem/shared/list-filters/list-filters.model.d.ts +8 -2
- package/ecosystem/shared/list-filters/list-filters.model.d.ts.map +1 -1
- package/ecosystem/shared/shared-ecosystem.module.d.ts +9 -8
- package/ecosystem/shared/shared-ecosystem.module.d.ts.map +1 -1
- package/ecosystem/shared/translate-package-label.pipe.d.ts +1 -1
- package/ecosystem/shared/translate-package-label.pipe.d.ts.map +1 -1
- package/esm2022/alarms/alarm-info.component.mjs +1 -1
- package/esm2022/api/services.mjs +2 -2
- package/esm2022/auth-configuration/sso-configuration/template-parts/access-mapping/access-mapping.component.mjs +10 -5
- package/esm2022/auth-configuration/sso-configuration/template-parts/user-data-mapping.component.mjs +4 -4
- package/esm2022/branding/shared/lazy/branding-form/branding-form.component.mjs +3 -3
- package/esm2022/context-dashboard/add-dashboard.component.mjs +4 -2
- package/esm2022/context-dashboard/context-dashboard.model.mjs +3 -2
- package/esm2022/context-dashboard/context-dashboard.service.mjs +2 -2
- package/esm2022/context-dashboard/dashboard-detail.component.mjs +5 -3
- package/esm2022/context-dashboard/dashboard-manager/dashboard-manager.model.mjs +1 -1
- package/esm2022/context-dashboard/dashboard-manager/dashboard-manager.service.mjs +5 -15
- package/esm2022/context-dashboard/dashboard-manager/type-dashboards-list/type-dashboards-list.component.mjs +2 -2
- package/esm2022/context-dashboard/new-dashboard.guard.mjs +1 -1
- package/esm2022/core/action/action.component.mjs +1 -1
- package/esm2022/core/action/action.model.mjs +1 -1
- package/esm2022/core/bootstrap/bootstrap.component.mjs +1 -1
- package/esm2022/core/breadcrumb/breadcrumb-item.component.mjs +1 -1
- package/esm2022/core/breadcrumb/breadcrumb.model.mjs +1 -1
- package/esm2022/core/common/ApplicationOptions.mjs +1 -1
- package/esm2022/core/common/empty-state/empty-state.component.mjs +1 -1
- package/esm2022/core/common/get-group-icon.pipe.mjs +1 -1
- package/esm2022/core/common/group.service.mjs +2 -2
- package/esm2022/core/common/icon.directive.mjs +1 -1
- package/esm2022/core/common/service-registry.model.mjs +1 -1
- package/esm2022/core/data-grid/data-grid.model.mjs +1 -1
- package/esm2022/core/docs/docs.models.mjs +1 -1
- package/esm2022/core/docs/support-outlet/support-outlet.component.mjs +3 -3
- package/esm2022/core/forms/filter-input.component.mjs +22 -7
- package/esm2022/core/i18n/translate.service.mjs +7 -5
- package/esm2022/core/list-group/list-item-action.component.mjs +1 -1
- package/esm2022/core/list-group/list-item-icon.component.mjs +1 -1
- package/esm2022/core/login/credentials.component.mjs +2 -2
- package/esm2022/core/login/login.service.mjs +18 -7
- package/esm2022/core/navigator/navigator-node-data.mjs +1 -1
- package/esm2022/core/navigator/navigator-node.component.mjs +11 -2
- package/esm2022/core/navigator/navigator-node.mjs +1 -1
- package/esm2022/core/plugins/plugins.model.mjs +5 -1
- package/esm2022/core/plugins/plugins.service.mjs +6 -2
- package/esm2022/core/properties-list/properties-list.component.mjs +1 -1
- package/esm2022/core/provider-configuration/model/dynamic-provider-config.model.mjs +1 -1
- package/esm2022/core/router/context-route.service.mjs +4 -2
- package/esm2022/core/router/router.model.mjs +1 -1
- package/esm2022/core/router/scoped-context-route.service.mjs +4 -2
- package/esm2022/core/search/search.model.mjs +1 -1
- package/esm2022/core/select/select-keyboard.service.mjs +7 -3
- package/esm2022/core/select/select.component.mjs +36 -8
- package/esm2022/core/select-modal/select-modal.component.mjs +2 -2
- package/esm2022/core/shared/core.model.mjs +6 -2
- package/esm2022/core/tabs/conditional-tabs-outlet.component.mjs +4 -2
- package/esm2022/core/tabs/tab.component.mjs +1 -1
- package/esm2022/core/tabs/tab.model.mjs +1 -1
- package/esm2022/core/tabs/tabs-outlet.component.mjs +41 -12
- package/esm2022/core/user/user-menu-item.component.mjs +1 -1
- package/esm2022/core/user/user.model.mjs +1 -1
- package/esm2022/core/wizard/wizard.model.mjs +1 -1
- package/esm2022/data-grid-columns/asset-type/asset-type.cell-renderer.component.mjs +1 -1
- package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.mjs +47 -22
- package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes.model.mjs +1 -1
- package/esm2022/datapoint-selector/datapoint-selection.model.mjs +1 -1
- package/esm2022/datapoint-selector/datapoint-selector-list-item/datapoint-selector-list-item.component.mjs +3 -3
- package/esm2022/datapoints-export-selector/datapoints-export-selector.model.mjs +1 -1
- package/esm2022/device-grid/columns/icon.cell-renderer.component.mjs +42 -0
- package/esm2022/device-grid/columns/index.mjs +2 -1
- package/esm2022/device-grid/device-grid.component.mjs +3 -3
- package/esm2022/device-grid/device-grid.service.mjs +7 -25
- package/esm2022/device-provisioned-certificates/c8y-ngx-components-device-provisioned-certificates.mjs +5 -0
- package/esm2022/device-provisioned-certificates/device-provisioned-certificates.guard.mjs +28 -0
- package/esm2022/device-provisioned-certificates/device-provisioned-certificates.module.mjs +51 -0
- package/esm2022/device-provisioned-certificates/device-provisioned-certificates.service.mjs +31 -0
- package/esm2022/device-provisioned-certificates/device-tab-provisioned-certificates.component.mjs +76 -0
- package/esm2022/device-provisioned-certificates/index.mjs +2 -0
- package/esm2022/ecosystem/application-plugins/application-plugins.component.mjs +41 -39
- package/esm2022/ecosystem/application-plugins/application-plugins.module.mjs +8 -6
- package/esm2022/ecosystem/application-plugins/apps-to-update-remotes-select.component.mjs +1 -1
- package/esm2022/ecosystem/application-plugins/index.mjs +2 -1
- package/esm2022/ecosystem/application-plugins/install-plugin.component.mjs +18 -21
- package/esm2022/ecosystem/application-plugins/only-latest-filter/only-latest-filter.component.mjs +26 -0
- package/esm2022/ecosystem/application-plugins/plugin-list-item.component.mjs +14 -6
- package/esm2022/ecosystem/application-plugins/plugin-list.component.mjs +14 -12
- package/esm2022/ecosystem/application-plugins/update-plugin-of-app/update-plugin-of-app.component.mjs +7 -1
- package/esm2022/ecosystem/applications/application-list/application-list.component.mjs +1 -1
- package/esm2022/ecosystem/applications/install-from-package/install-from-package.component.mjs +6 -1
- package/esm2022/ecosystem/archived-confirm/archived-confirm-modal.component.mjs +22 -0
- package/esm2022/ecosystem/archived-confirm/archived-confirm.module.mjs +32 -0
- package/esm2022/ecosystem/archived-confirm/c8y-ngx-components-ecosystem-archived-confirm.mjs +5 -0
- package/esm2022/ecosystem/archived-confirm/index.mjs +3 -0
- package/esm2022/ecosystem/ecosystem.module.mjs +20 -16
- package/esm2022/ecosystem/features/feature-list.component.mjs +1 -1
- package/esm2022/ecosystem/microservices/microservice-list.component.mjs +1 -1
- package/esm2022/ecosystem/packages/deploy-application/deploy-application.component.mjs +6 -1
- package/esm2022/ecosystem/packages/package-details/package-details.component.mjs +13 -8
- package/esm2022/ecosystem/packages/package-list/packages-list.component.mjs +4 -4
- package/esm2022/ecosystem/shared/add-application.component.mjs +1 -1
- package/esm2022/ecosystem/shared/application-card.component.mjs +3 -3
- package/esm2022/ecosystem/shared/archived-filter/archived-filter.component.mjs +27 -0
- package/esm2022/ecosystem/shared/ecosystem.constants.mjs +5 -1
- package/esm2022/ecosystem/shared/ecosystem.model.mjs +7 -3
- package/esm2022/ecosystem/shared/ecosystem.service.mjs +26 -1
- package/esm2022/ecosystem/shared/index.mjs +2 -1
- package/esm2022/ecosystem/shared/list-filters/list-filters.component.mjs +75 -13
- package/esm2022/ecosystem/shared/list-filters/list-filters.model.mjs +1 -1
- package/esm2022/ecosystem/shared/shared-ecosystem.module.mjs +10 -5
- package/esm2022/ecosystem/shared/translate-package-label.pipe.mjs +3 -3
- package/esm2022/files-repository/files-repository.component.mjs +2 -2
- package/esm2022/files-repository/files-repository.service.mjs +5 -16
- package/esm2022/icon-selector/icon-selector.component.mjs +1 -1
- package/esm2022/icon-selector/icons/index.mjs +1 -1
- package/esm2022/operations/shared/status-option.model.mjs +1 -1
- package/esm2022/protocol-lwm2m/components/configuration/lwm2m-configuration.component.mjs +2 -2
- package/esm2022/protocol-opcua/opcua-auto-apply-settings.component.mjs +1 -1
- package/esm2022/register-device/bulk/bulk-device-registration-modal.component.mjs +17 -9
- package/esm2022/register-device/general/general-device-registration-button.component.mjs +3 -3
- package/esm2022/register-device/general/general-device-registration.component.mjs +109 -33
- package/esm2022/remote-access/configurations/c8y-ngx-components-remote-access-configurations.mjs +5 -0
- package/esm2022/remote-access/configurations/index.mjs +16 -0
- package/esm2022/remote-access/configurations/remote-access-configuration-list/remote-access-configuration-list.component.mjs +218 -0
- package/esm2022/remote-access/configurations/remote-access-configuration-list/remote-access-connect-button/remote-access-connect-button.component.mjs +60 -0
- package/esm2022/remote-access/configurations/remote-access-pick-protocol-modal/remote-access-pick-protocol-modal.component.mjs +36 -0
- package/esm2022/remote-access/data/c8y-ngx-components-remote-access-data.mjs +5 -0
- package/esm2022/remote-access/data/index.mjs +3 -0
- package/esm2022/remote-access/data/remote-access-protocol-provider.mjs +2 -0
- package/esm2022/remote-access/data/remote-access.service.mjs +200 -0
- package/esm2022/remote-access/passthrough/c8y-ngx-components-remote-access-passthrough.mjs +5 -0
- package/esm2022/remote-access/passthrough/index.mjs +36 -0
- package/esm2022/remote-access/shared/c8y-ngx-components-remote-access-shared.mjs +5 -0
- package/esm2022/remote-access/shared/index.mjs +3 -0
- package/esm2022/remote-access/shared/remote-access-basic-endpoint-modal/remote-access-basic-endpoint-modal.component.mjs +49 -0
- package/esm2022/remote-access/shared/ssh-key-input/ssh-key-input.component.mjs +87 -0
- package/esm2022/remote-access/ssh/c8y-ngx-components-remote-access-ssh.mjs +5 -0
- package/esm2022/remote-access/ssh/index.mjs +73 -0
- package/esm2022/remote-access/ssh/remote-access-ssh-endpoint-modal/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs +5 -0
- package/esm2022/remote-access/ssh/remote-access-ssh-endpoint-modal/index.mjs +2 -0
- package/esm2022/remote-access/ssh/remote-access-ssh-endpoint-modal/remote-access-ssh-endpoint-modal.component.mjs +104 -0
- package/esm2022/remote-access/telnet/c8y-ngx-components-remote-access-telnet.mjs +5 -0
- package/esm2022/remote-access/telnet/index.mjs +43 -0
- package/esm2022/remote-access/terminal-viewer/c8y-ngx-components-remote-access-terminal-viewer.mjs +5 -0
- package/esm2022/remote-access/terminal-viewer/index.mjs +2 -0
- package/esm2022/remote-access/terminal-viewer/shell-adapter.mjs +36 -0
- package/esm2022/remote-access/terminal-viewer/telnet-negotiator.mjs +96 -0
- package/esm2022/remote-access/terminal-viewer/terminal-viewer.component.mjs +101 -0
- package/esm2022/remote-access/vnc/c8y-ngx-components-remote-access-vnc.mjs +5 -0
- package/esm2022/remote-access/vnc/index.mjs +73 -0
- package/esm2022/remote-access/vnc/remote-access-vnc-endpoint-modal/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.mjs +5 -0
- package/esm2022/remote-access/vnc/remote-access-vnc-endpoint-modal/index.mjs +2 -0
- package/esm2022/remote-access/vnc/remote-access-vnc-endpoint-modal/remote-access-vnc-endpoint-modal.component.mjs +59 -0
- package/esm2022/remote-access/vnc/vnc-viewer/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs +5 -0
- package/esm2022/remote-access/vnc/vnc-viewer/index.mjs +2 -0
- package/esm2022/remote-access/vnc/vnc-viewer/vnc-credentials-prompt/vnc-credentials-prompt.component.mjs +57 -0
- package/esm2022/remote-access/vnc/vnc-viewer/vnc-viewer.component.mjs +158 -0
- package/esm2022/replace-device/replace-device-wizard/replace-device-wizard.model.mjs +1 -1
- package/esm2022/report-dashboard/report-dashboard-list.component.mjs +4 -3
- package/esm2022/repository/configuration/device-tab/device-configuration-list.component.mjs +1 -1
- package/esm2022/repository/shared/repository.model.mjs +1 -1
- package/esm2022/repository/shared/repository.service.mjs +3 -3
- package/esm2022/services/status-options/status-options.model.mjs +1 -1
- package/esm2022/sub-assets/group-info.component.mjs +1 -1
- package/esm2022/translation-editor/data/translation-store.service.mjs +4 -3
- package/esm2022/trusted-certificates/list/trusted-certificate-list.component.mjs +35 -9
- package/esm2022/upgrade/bridge.service.mjs +16 -2
- package/esm2022/widgets/implementations/alarms/severity-icon.pipe.mjs +1 -1
- package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.mjs +3 -2
- package/esm2022/widgets/implementations/kpi/kpi-widget.model.mjs +1 -1
- package/fesm2022/c8y-ngx-components-alarms.mjs +1 -1
- package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-api.mjs +3 -2
- package/fesm2022/c8y-ngx-components-api.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-auth-configuration.mjs +12 -7
- package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +2 -2
- package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +15 -20
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-data-grid-columns-asset-type.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-data-grid-columns.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +48 -23
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-grid.mjs +48 -28
- package/fesm2022/c8y-ngx-components-device-grid.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs +174 -0
- package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs +125 -105
- package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem-archived-confirm.mjs +57 -0
- package/fesm2022/c8y-ngx-components-ecosystem-archived-confirm.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +147 -31
- package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-ecosystem.mjs +1452 -1414
- package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-files-repository.mjs +5 -16
- package/fesm2022/c8y-ngx-components-files-repository.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector-icons.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-icon-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-lwm2m-components-configuration.mjs +1 -1
- package/fesm2022/c8y-ngx-components-protocol-lwm2m-components-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-register-device.mjs +269 -188
- package/fesm2022/c8y-ngx-components-register-device.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs +314 -0
- package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-remote-access-data.mjs +206 -0
- package/fesm2022/c8y-ngx-components-remote-access-data.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-remote-access-passthrough.mjs +42 -0
- package/fesm2022/c8y-ngx-components-remote-access-passthrough.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-remote-access-shared.mjs +138 -0
- package/fesm2022/c8y-ngx-components-remote-access-shared.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs +111 -0
- package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-remote-access-ssh.mjs +79 -0
- package/fesm2022/c8y-ngx-components-remote-access-ssh.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-remote-access-telnet.mjs +50 -0
- package/fesm2022/c8y-ngx-components-remote-access-telnet.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs +235 -0
- package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.mjs +66 -0
- package/fesm2022/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs +211 -0
- package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-remote-access-vnc.mjs +79 -0
- package/fesm2022/c8y-ngx-components-remote-access-vnc.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-replace-device-replace-device-wizard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-report-dashboard.mjs +3 -2
- package/fesm2022/c8y-ngx-components-report-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs +1 -1
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-shared.mjs +2 -2
- package/fesm2022/c8y-ngx-components-repository-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-services.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-sub-assets.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-translation-editor-data.mjs +3 -2
- package/fesm2022/c8y-ngx-components-translation-editor-data.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +43 -17
- package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-upgrade.mjs +16 -2
- package/fesm2022/c8y-ngx-components-upgrade.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +2 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +157 -42
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/files-repository/files-repository.component.d.ts.map +1 -1
- package/files-repository/files-repository.service.d.ts +0 -2
- package/files-repository/files-repository.service.d.ts.map +1 -1
- package/icon-selector/icon-selector.component.d.ts +3 -2
- package/icon-selector/icon-selector.component.d.ts.map +1 -1
- package/icon-selector/icons/index.d.ts +1 -0
- package/icon-selector/icons/index.d.ts.map +1 -1
- package/locales/de.po +157 -5
- package/locales/es.po +157 -5
- package/locales/fr.po +157 -5
- package/locales/ja_JP.po +156 -5
- package/locales/ko.po +156 -5
- package/locales/locales.pot +156 -4
- package/locales/nl.po +157 -5
- package/locales/pl.po +157 -5
- package/locales/pt_BR.po +157 -5
- package/locales/zh_CN.po +156 -5
- package/locales/zh_TW.po +156 -5
- package/operations/shared/status-option.model.d.ts +2 -1
- package/operations/shared/status-option.model.d.ts.map +1 -1
- package/package.json +1 -1
- package/register-device/bulk/bulk-device-registration-modal.component.d.ts +6 -2
- package/register-device/bulk/bulk-device-registration-modal.component.d.ts.map +1 -1
- package/register-device/general/general-device-registration-button.component.d.ts +1 -1
- package/register-device/general/general-device-registration-button.component.d.ts.map +1 -1
- package/register-device/general/general-device-registration.component.d.ts +21 -7
- package/register-device/general/general-device-registration.component.d.ts.map +1 -1
- package/remote-access/configurations/c8y-ngx-components-remote-access-configurations.d.ts.map +1 -0
- package/remote-access/configurations/index.d.ts +3 -0
- package/remote-access/configurations/index.d.ts.map +1 -0
- package/remote-access/configurations/remote-access-configuration-list/remote-access-configuration-list.component.d.ts +34 -0
- package/remote-access/configurations/remote-access-configuration-list/remote-access-configuration-list.component.d.ts.map +1 -0
- package/remote-access/configurations/remote-access-configuration-list/remote-access-connect-button/remote-access-connect-button.component.d.ts +17 -0
- package/remote-access/configurations/remote-access-configuration-list/remote-access-connect-button/remote-access-connect-button.component.d.ts.map +1 -0
- package/remote-access/configurations/remote-access-pick-protocol-modal/remote-access-pick-protocol-modal.component.d.ts +18 -0
- package/remote-access/configurations/remote-access-pick-protocol-modal/remote-access-pick-protocol-modal.component.d.ts.map +1 -0
- package/remote-access/data/c8y-ngx-components-remote-access-data.d.ts.map +1 -0
- package/remote-access/data/index.d.ts +3 -0
- package/remote-access/data/index.d.ts.map +1 -0
- package/remote-access/data/remote-access-protocol-provider.d.ts +21 -0
- package/remote-access/data/remote-access-protocol-provider.d.ts.map +1 -0
- package/remote-access/data/remote-access.service.d.ts +94 -0
- package/remote-access/data/remote-access.service.d.ts.map +1 -0
- package/remote-access/passthrough/c8y-ngx-components-remote-access-passthrough.d.ts.map +1 -0
- package/remote-access/passthrough/index.d.ts +17 -0
- package/remote-access/passthrough/index.d.ts.map +1 -0
- package/remote-access/shared/c8y-ngx-components-remote-access-shared.d.ts.map +1 -0
- package/remote-access/shared/index.d.ts +3 -0
- package/remote-access/shared/index.d.ts.map +1 -0
- package/remote-access/shared/remote-access-basic-endpoint-modal/remote-access-basic-endpoint-modal.component.d.ts +37 -0
- package/remote-access/shared/remote-access-basic-endpoint-modal/remote-access-basic-endpoint-modal.component.d.ts.map +1 -0
- package/remote-access/shared/ssh-key-input/ssh-key-input.component.d.ts +38 -0
- package/remote-access/shared/ssh-key-input/ssh-key-input.component.d.ts.map +1 -0
- package/remote-access/ssh/c8y-ngx-components-remote-access-ssh.d.ts.map +1 -0
- package/remote-access/ssh/index.d.ts +22 -0
- package/remote-access/ssh/index.d.ts.map +1 -0
- package/remote-access/ssh/remote-access-ssh-endpoint-modal/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.d.ts.map +1 -0
- package/remote-access/ssh/remote-access-ssh-endpoint-modal/index.d.ts +2 -0
- package/remote-access/ssh/remote-access-ssh-endpoint-modal/index.d.ts.map +1 -0
- package/remote-access/ssh/remote-access-ssh-endpoint-modal/remote-access-ssh-endpoint-modal.component.d.ts +64 -0
- package/remote-access/ssh/remote-access-ssh-endpoint-modal/remote-access-ssh-endpoint-modal.component.d.ts.map +1 -0
- package/remote-access/telnet/c8y-ngx-components-remote-access-telnet.d.ts.map +1 -0
- package/remote-access/telnet/index.d.ts +17 -0
- package/remote-access/telnet/index.d.ts.map +1 -0
- package/remote-access/terminal-viewer/c8y-ngx-components-remote-access-terminal-viewer.d.ts.map +1 -0
- package/remote-access/terminal-viewer/index.d.ts +2 -0
- package/remote-access/terminal-viewer/index.d.ts.map +1 -0
- package/remote-access/terminal-viewer/shell-adapter.d.ts +14 -0
- package/remote-access/terminal-viewer/shell-adapter.d.ts.map +1 -0
- package/remote-access/terminal-viewer/telnet-negotiator.d.ts +13 -0
- package/remote-access/terminal-viewer/telnet-negotiator.d.ts.map +1 -0
- package/remote-access/terminal-viewer/terminal-viewer.component.d.ts +25 -0
- package/remote-access/terminal-viewer/terminal-viewer.component.d.ts.map +1 -0
- package/remote-access/vnc/c8y-ngx-components-remote-access-vnc.d.ts.map +1 -0
- package/remote-access/vnc/index.d.ts +22 -0
- package/remote-access/vnc/index.d.ts.map +1 -0
- package/remote-access/vnc/remote-access-vnc-endpoint-modal/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.d.ts.map +1 -0
- package/remote-access/vnc/remote-access-vnc-endpoint-modal/index.d.ts +2 -0
- package/remote-access/vnc/remote-access-vnc-endpoint-modal/index.d.ts.map +1 -0
- package/remote-access/vnc/remote-access-vnc-endpoint-modal/remote-access-vnc-endpoint-modal.component.d.ts +46 -0
- package/remote-access/vnc/remote-access-vnc-endpoint-modal/remote-access-vnc-endpoint-modal.component.d.ts.map +1 -0
- package/remote-access/vnc/vnc-viewer/c8y-ngx-components-remote-access-vnc-vnc-viewer.d.ts.map +1 -0
- package/remote-access/vnc/vnc-viewer/index.d.ts +2 -0
- package/remote-access/vnc/vnc-viewer/index.d.ts.map +1 -0
- package/remote-access/vnc/vnc-viewer/vnc-credentials-prompt/vnc-credentials-prompt.component.d.ts +32 -0
- package/remote-access/vnc/vnc-viewer/vnc-credentials-prompt/vnc-credentials-prompt.component.d.ts.map +1 -0
- package/remote-access/vnc/vnc-viewer/vnc-viewer.component.d.ts +37 -0
- package/remote-access/vnc/vnc-viewer/vnc-viewer.component.d.ts.map +1 -0
- package/replace-device/replace-device-wizard/replace-device-wizard.model.d.ts +2 -1
- package/replace-device/replace-device-wizard/replace-device-wizard.model.d.ts.map +1 -1
- package/report-dashboard/report-dashboard-list.component.d.ts +29 -0
- package/report-dashboard/report-dashboard-list.component.d.ts.map +1 -1
- package/repository/shared/repository.model.d.ts +2 -1
- package/repository/shared/repository.model.d.ts.map +1 -1
- package/services/status-options/status-options.model.d.ts +2 -1
- package/services/status-options/status-options.model.d.ts.map +1 -1
- package/sub-assets/group-info.component.d.ts +2 -1
- package/sub-assets/group-info.component.d.ts.map +1 -1
- package/translation-editor/data/translation-store.service.d.ts.map +1 -1
- package/trusted-certificates/list/trusted-certificate-list.component.d.ts +7 -2
- package/trusted-certificates/list/trusted-certificate-list.component.d.ts.map +1 -1
- package/upgrade/bridge.service.d.ts +5 -0
- package/upgrade/bridge.service.d.ts.map +1 -1
- package/widgets/implementations/alarms/severity-icon.pipe.d.ts.map +1 -1
- package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts.map +1 -1
- package/widgets/implementations/kpi/kpi-widget.model.d.ts +2 -1
- package/widgets/implementations/kpi/kpi-widget.model.d.ts.map +1 -1
- package/ecosystem/application-plugins/only-latest-plugin-version.pipe.d.ts +0 -10
- package/ecosystem/application-plugins/only-latest-plugin-version.pipe.d.ts.map +0 -1
- package/esm2022/ecosystem/application-plugins/only-latest-plugin-version.pipe.mjs +0 -20
|
@@ -1,29 +1,29 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Injectable, Component, ChangeDetectionStrategy, InjectionToken,
|
|
2
|
+
import { Injectable, Component, ViewChild, ChangeDetectionStrategy, InjectionToken, Input, NgModule } from '@angular/core';
|
|
3
3
|
import * as i4 from 'ngx-bootstrap/modal';
|
|
4
4
|
import { __decorate, __metadata } from 'tslib';
|
|
5
|
-
import * as i1$
|
|
6
|
-
import { gettext, memoize, hookGeneric, ExtensionPointWithoutStateForPlugins, fromTriggerOnce, Status, Permissions, NavigatorNode,
|
|
5
|
+
import * as i1$1 from '@c8y/ngx-components';
|
|
6
|
+
import { gettext, C8yStepper, memoize, hookGeneric, ExtensionPointWithoutStateForPlugins, fromTriggerOnce, Status, Permissions, NavigatorNode, CommonModule, CoreModule, StepperModule, DynamicFormsModule, hookNavigator, DeviceBootstrapRealtimeService } from '@c8y/ngx-components';
|
|
7
7
|
import * as i6$1 from '@angular/forms';
|
|
8
8
|
import { FormGroup } from '@angular/forms';
|
|
9
9
|
import { Subject, BehaviorSubject, from, forkJoin, defer, Observable } from 'rxjs';
|
|
10
10
|
import { takeUntil, finalize, mergeMap, takeLast, map, filter, switchMap, tap, shareReplay, startWith } from 'rxjs/operators';
|
|
11
|
-
import * as
|
|
11
|
+
import * as i2 from '@c8y/client';
|
|
12
12
|
import { DeviceRegistrationStatus, DeviceRegistrationSecurityMode, ApplicationType } from '@c8y/client';
|
|
13
13
|
import * as i1 from '@angular/router';
|
|
14
14
|
import { RouterModule } from '@angular/router';
|
|
15
15
|
import { get, pick, sortBy, flatMap } from 'lodash-es';
|
|
16
|
+
import { saveAs } from 'file-saver';
|
|
16
17
|
import * as i5 from '@angular/common';
|
|
17
18
|
import * as i6 from '@angular/cdk/stepper';
|
|
18
19
|
import { STEP_STATE } from '@angular/cdk/stepper';
|
|
19
20
|
import * as i7 from '@ngx-formly/core';
|
|
20
|
-
import * as
|
|
21
|
-
import * as i4$1 from 'ngx-bootstrap/popover';
|
|
21
|
+
import * as i5$1 from 'ngx-bootstrap/popover';
|
|
22
22
|
import { PopoverModule } from 'ngx-bootstrap/popover';
|
|
23
|
+
import * as i3$1 from '@ngx-translate/core';
|
|
23
24
|
import { flatten } from 'lodash';
|
|
24
25
|
import * as i3 from 'ngx-bootstrap/dropdown';
|
|
25
26
|
import { BsDropdownModule } from 'ngx-bootstrap/dropdown';
|
|
26
|
-
import { saveAs } from 'file-saver';
|
|
27
27
|
|
|
28
28
|
class RegisterDeviceService {
|
|
29
29
|
constructor(router, deviceRegService, alertService) {
|
|
@@ -196,7 +196,7 @@ class RegisterDeviceService {
|
|
|
196
196
|
this._loading.next(false);
|
|
197
197
|
return items;
|
|
198
198
|
}
|
|
199
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RegisterDeviceService, deps: [{ token: i1.Router }, { token:
|
|
199
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RegisterDeviceService, deps: [{ token: i1.Router }, { token: i2.DeviceRegistrationService }, { token: i1$1.AlertService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
200
200
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RegisterDeviceService, providedIn: 'root' }); }
|
|
201
201
|
}
|
|
202
202
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RegisterDeviceService, decorators: [{
|
|
@@ -204,10 +204,143 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
|
|
|
204
204
|
args: [{
|
|
205
205
|
providedIn: 'root'
|
|
206
206
|
}]
|
|
207
|
-
}], ctorParameters: () => [{ type: i1.Router }, { type:
|
|
207
|
+
}], ctorParameters: () => [{ type: i1.Router }, { type: i2.DeviceRegistrationService }, { type: i1$1.AlertService }] });
|
|
208
|
+
|
|
209
|
+
const PRODUCT_EXPERIENCE_BASE_REGISTRATION = {
|
|
210
|
+
EVENT: 'deviceRegistration',
|
|
211
|
+
COMPONENT: {
|
|
212
|
+
BULK: 'bulk-registration',
|
|
213
|
+
EXTENSIBLE_BULK: 'bulk-extensible-registration',
|
|
214
|
+
EXTENSIBLE_SINGLE: 'single-extensible-registration'
|
|
215
|
+
},
|
|
216
|
+
RESULT: { SUCCESS: 'registrationSuccess', FAILURE: 'registrationFailure' }
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
const registerDeviceBulkSchema = {
|
|
220
|
+
$schema: 'https://json-schema.org/draft/2019-09/schema',
|
|
221
|
+
type: 'object',
|
|
222
|
+
properties: {
|
|
223
|
+
csvBulkFile: {
|
|
224
|
+
type: 'array',
|
|
225
|
+
title: gettext('CSV file upload'),
|
|
226
|
+
description: gettext('You can use file upload component to let users send files. This input accepts only a single CSV file.'),
|
|
227
|
+
contentMediaType: 'csv'
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
required: ['csvBulkFile'],
|
|
231
|
+
additionalProperties: false
|
|
232
|
+
};
|
|
233
|
+
const simpleCsvHeaders = ['ID', 'PATH'];
|
|
234
|
+
const csvHeaders = [
|
|
235
|
+
'ID',
|
|
236
|
+
'TYPE',
|
|
237
|
+
'NAME',
|
|
238
|
+
'ICCID',
|
|
239
|
+
'IDTYPE',
|
|
240
|
+
'PATH',
|
|
241
|
+
'SHELL',
|
|
242
|
+
'AUTH_TYPE'
|
|
243
|
+
];
|
|
244
|
+
const fullCsvHeaders = [...csvHeaders, 'CREDENTIALS'];
|
|
245
|
+
const ESTCsvHeaders = [...csvHeaders, 'ENROLLMENT_OTP'];
|
|
246
|
+
class BulkDeviceRegistrationModalComponent {
|
|
247
|
+
constructor(jsonschema, deviceRegistrationService, registerDeviceService, bsModalRef, gainsightService, featureService) {
|
|
248
|
+
this.jsonschema = jsonschema;
|
|
249
|
+
this.deviceRegistrationService = deviceRegistrationService;
|
|
250
|
+
this.registerDeviceService = registerDeviceService;
|
|
251
|
+
this.bsModalRef = bsModalRef;
|
|
252
|
+
this.gainsightService = gainsightService;
|
|
253
|
+
this.featureService = featureService;
|
|
254
|
+
this.form = new FormGroup({});
|
|
255
|
+
this.model = {};
|
|
256
|
+
this.certificateAuthorityFeatureEnabled = this.featureService
|
|
257
|
+
.detail('certificate-authority')
|
|
258
|
+
.then(({ data }) => data.active);
|
|
259
|
+
}
|
|
260
|
+
ngOnInit() {
|
|
261
|
+
this.template = [this.jsonschema.toFieldConfig(registerDeviceBulkSchema)];
|
|
262
|
+
}
|
|
263
|
+
upload() {
|
|
264
|
+
this.pending = true;
|
|
265
|
+
const file = this.getFile(this.model);
|
|
266
|
+
this.deviceRegistrationService
|
|
267
|
+
.create(file)
|
|
268
|
+
.then(({ res, data }) => {
|
|
269
|
+
if (res.status < 400) {
|
|
270
|
+
this.result = data;
|
|
271
|
+
this.success = data.numberOfFailed === 0 && data.numberOfSuccessful === data.numberOfAll;
|
|
272
|
+
this.message = this.success
|
|
273
|
+
? gettext('Device registration created.')
|
|
274
|
+
: (this.message = gettext('Device registration failed.'));
|
|
275
|
+
if (this.success) {
|
|
276
|
+
this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {
|
|
277
|
+
result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.SUCCESS,
|
|
278
|
+
component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.BULK
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {
|
|
283
|
+
result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.FAILURE,
|
|
284
|
+
component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.BULK
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
this.failedResult = data;
|
|
290
|
+
this.message = gettext('Device registration failed.');
|
|
291
|
+
this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {
|
|
292
|
+
result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.FAILURE,
|
|
293
|
+
component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.BULK
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
this.model = {};
|
|
297
|
+
this.pending = false;
|
|
298
|
+
this.stepper.next();
|
|
299
|
+
})
|
|
300
|
+
.catch(() => {
|
|
301
|
+
this.message = gettext('Error occurred while processing the uploaded file.');
|
|
302
|
+
this.pending = false;
|
|
303
|
+
this.stepper.next();
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
downloadSimple() {
|
|
307
|
+
return this.download(simpleCsvHeaders, gettext('Simple bulk registration - template.csv'));
|
|
308
|
+
}
|
|
309
|
+
downloadFull() {
|
|
310
|
+
return this.download(fullCsvHeaders, gettext('Full bulk registration - template.csv'));
|
|
311
|
+
}
|
|
312
|
+
downloadEst() {
|
|
313
|
+
return this.download(ESTCsvHeaders, gettext('EST registration - template.csv'));
|
|
314
|
+
}
|
|
315
|
+
download(headers, fileName) {
|
|
316
|
+
const headerRaw = headers.map(header => `"${header}"`).join(';');
|
|
317
|
+
const binaryFile = new Blob([headerRaw], { type: 'text/csv' });
|
|
318
|
+
saveAs(binaryFile, fileName);
|
|
319
|
+
}
|
|
320
|
+
complete() {
|
|
321
|
+
this.registerDeviceService.list();
|
|
322
|
+
this.bsModalRef.hide();
|
|
323
|
+
}
|
|
324
|
+
cancel() {
|
|
325
|
+
this.bsModalRef.hide();
|
|
326
|
+
}
|
|
327
|
+
getFile(model) {
|
|
328
|
+
const csvBulkFile = model?.csvBulkFile;
|
|
329
|
+
return csvBulkFile ? csvBulkFile[0]?.file : undefined;
|
|
330
|
+
}
|
|
331
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: BulkDeviceRegistrationModalComponent, deps: [{ token: i1$1.C8yJSONSchema }, { token: i2.DeviceRegistrationBulkService }, { token: RegisterDeviceService }, { token: i4.BsModalRef }, { token: i1$1.GainsightService }, { token: i2.FeatureService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
332
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: BulkDeviceRegistrationModalComponent, selector: "bulk-device-registration", viewQueries: [{ propertyName: "stepper", first: true, predicate: C8yStepper, descendants: true, static: true }], ngImport: i0, template: "<c8y-modal\n [title]=\"'Bulk device registration' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <i c8yIcon=\"upload\"></i>\n </ng-container>\n\n <c8y-stepper [hideStepProgress]=\"true\" linear id=\"modal-body\">\n <cdk-step>\n <p class=\"modal-subtitle sticky-top\" translate>Register devices in bulk</p>\n\n <c8y-form-group class=\"d-block p-24 p-t-16 p-b-0 m-b-0\">\n <formly-form [form]=\"form\" [fields]=\"template\" [model]=\"model\"></formly-form>\n </c8y-form-group>\n\n <div class=\"p-24 m-t-0 bg-level-1\">\n <div class=\"bg-gray-white separator-bottom p-t-16 p-b-16 p-l-24 p-r-24\">\n <div>\n <p class=\"m-b-8 text-medium\">\n <strong translate>Simple registration</strong>\n </p>\n <small class=\"text-muted\" translate>\n Creates all registration requests at once, then each one needs to go through regular\n acceptance process.\n </small>\n </div>\n <div class=\"m-b-16 m-t-16\">\n <a\n title=\"{{ 'Download template' | translate }}\"\n class=\"btn btn-default btn-sm\"\n target=\"_self\"\n (click)=\"downloadSimple()\"\n >\n <i c8yIcon=\"download\" translate></i>\n {{ 'Download template' | translate }}\n </a>\n </div>\n </div>\n <div class=\"bg-gray-white separator-bottom p-t-16 p-b-16 p-l-24 p-r-24\">\n <div>\n <p class=\"m-b-8 text-medium\">\n <strong translate>Full registration</strong>\n </p>\n <small class=\"text-muted\" translate>\n Creates all device credentials and devices using provided list of property values.\n Devices can start communicating with the platform immediately.\n </small>\n </div>\n <div class=\"m-b-16 m-t-16\">\n <a\n title=\"{{ 'Download template' | translate }}\"\n class=\"btn btn-default btn-sm\"\n target=\"_self\"\n (click)=\"downloadFull()\"\n >\n <i c8yIcon=\"download\" translate></i>\n {{ 'Download template' | translate }}\n </a>\n </div>\n </div>\n <div class=\"bg-gray-white separator-bottom p-t-16 p-b-16 p-l-24 p-r-24\" *ngIf=\"certificateAuthorityFeatureEnabled | async\">\n <div>\n <p class=\"m-b-8 text-medium\">\n <strong translate>Full registration with device certificate creation</strong>\n </p>\n <small class=\"text-muted\" translate>\n Creates device certificates and devices using the provided list of property values. Once the certificates are provisioned, the devices can immediately start communicating with the platform\n </small>\n </div>\n <div class=\"m-b-16 m-t-16\">\n <a\n title=\"{{ 'Download template' | translate }}\"\n class=\"btn btn-default btn-sm\"\n target=\"_self\"\n (click)=\"downloadEst()\"\n >\n <i c8yIcon=\"download\"></i>\n {{ 'Download template' | translate }}\n </a>\n </div>\n </div>\n </div>\n\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [disabled]=\"form.invalid\"\n [pending]=\"pending\"\n (onCancel)=\"cancel()\"\n (onNext)=\"upload()\"\n [labels]=\"{ next: 'Upload' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n\n <cdk-step state=\"final\">\n <div class=\"m-24\">\n <div *ngIf=\"success; else warning\">\n <c8y-operation-result\n text=\"{{ message | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"success\"\n class=\"lead\"\n ></c8y-operation-result>\n </div>\n <ng-template #warning>\n <c8y-operation-result\n text=\"{{ message | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"error\"\n class=\"lead\"\n ></c8y-operation-result>\n </ng-template>\n <c8y-list-group class=\"separator-top m-t-16\">\n <ng-container *ngIf=\"result; else failedResponse\">\n <c8y-li *ngIf=\"success; else fail\">\n <c8y-li-icon class=\"text-success\" icon=\"check-circle\"></c8y-li-icon>\n <p>{{ 'All devices have been processed.' | translate }}</p>\n <c8y-li-collapse>\n <pre><code>{{ result | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n <ng-template #fail>\n <c8y-li>\n <c8y-li-icon class=\"text-danger\" icon=\"ban\"></c8y-li-icon>\n <p\n ngNonBindable\n [translateParams]=\"{ count: result?.numberOfFailed, total: result?.numberOfAll }\"\n translate\n >\n Failed to process {{ count }} out of {{ total }}.\n </p>\n <c8y-li-collapse>\n <pre><code>{{ result | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n </ng-template>\n </ng-container>\n <ng-template #failedResponse>\n <c8y-li>\n <c8y-li-icon class=\"text-danger\" [icon]=\"'ban'\"></c8y-li-icon>\n <small>{{ failedResult?.message | translate }}</small>\n <c8y-li-collapse>\n <pre><code>{{ failedResult | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n </ng-template>\n </c8y-list-group>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n [showButtons]=\"{ next: true }\"\n (onNext)=\"complete()\"\n [labels]=\"{ next: success ? 'Close' : 'Cancel' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n</c8y-modal>\n", dependencies: [{ kind: "directive", type: i1$1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1$1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1$1.OperationResultComponent, selector: "c8y-operation-result", inputs: ["text", "vertical", "size", "type"] }, { kind: "component", type: i1$1.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: i1$1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: i1$1.C8yStepper, selector: "c8y-stepper", inputs: ["disableDefaultIcons", "disableProgressButtons", "customClasses", "hideStepProgress", "useStepLabelsAsTitlesOnly"], outputs: ["onStepChange"] }, { kind: "component", type: i6.CdkStep, selector: "cdk-step", inputs: ["stepControl", "label", "errorMessage", "aria-label", "aria-labelledby", "state", "editable", "optional", "completed", "hasError"], outputs: ["interacted"], exportAs: ["cdkStep"] }, { kind: "component", type: i1$1.C8yStepperButtons, selector: "c8y-stepper-buttons", inputs: ["labels", "pending", "disabled", "showButtons"], outputs: ["onCancel", "onNext", "onBack", "onCustom"] }, { kind: "component", type: i1$1.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i1$1.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i1$1.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i1$1.ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "component", type: i7.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "pipe", type: i1$1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.JsonPipe, name: "json" }] }); }
|
|
333
|
+
}
|
|
334
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: BulkDeviceRegistrationModalComponent, decorators: [{
|
|
335
|
+
type: Component,
|
|
336
|
+
args: [{ selector: 'bulk-device-registration', template: "<c8y-modal\n [title]=\"'Bulk device registration' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <i c8yIcon=\"upload\"></i>\n </ng-container>\n\n <c8y-stepper [hideStepProgress]=\"true\" linear id=\"modal-body\">\n <cdk-step>\n <p class=\"modal-subtitle sticky-top\" translate>Register devices in bulk</p>\n\n <c8y-form-group class=\"d-block p-24 p-t-16 p-b-0 m-b-0\">\n <formly-form [form]=\"form\" [fields]=\"template\" [model]=\"model\"></formly-form>\n </c8y-form-group>\n\n <div class=\"p-24 m-t-0 bg-level-1\">\n <div class=\"bg-gray-white separator-bottom p-t-16 p-b-16 p-l-24 p-r-24\">\n <div>\n <p class=\"m-b-8 text-medium\">\n <strong translate>Simple registration</strong>\n </p>\n <small class=\"text-muted\" translate>\n Creates all registration requests at once, then each one needs to go through regular\n acceptance process.\n </small>\n </div>\n <div class=\"m-b-16 m-t-16\">\n <a\n title=\"{{ 'Download template' | translate }}\"\n class=\"btn btn-default btn-sm\"\n target=\"_self\"\n (click)=\"downloadSimple()\"\n >\n <i c8yIcon=\"download\" translate></i>\n {{ 'Download template' | translate }}\n </a>\n </div>\n </div>\n <div class=\"bg-gray-white separator-bottom p-t-16 p-b-16 p-l-24 p-r-24\">\n <div>\n <p class=\"m-b-8 text-medium\">\n <strong translate>Full registration</strong>\n </p>\n <small class=\"text-muted\" translate>\n Creates all device credentials and devices using provided list of property values.\n Devices can start communicating with the platform immediately.\n </small>\n </div>\n <div class=\"m-b-16 m-t-16\">\n <a\n title=\"{{ 'Download template' | translate }}\"\n class=\"btn btn-default btn-sm\"\n target=\"_self\"\n (click)=\"downloadFull()\"\n >\n <i c8yIcon=\"download\" translate></i>\n {{ 'Download template' | translate }}\n </a>\n </div>\n </div>\n <div class=\"bg-gray-white separator-bottom p-t-16 p-b-16 p-l-24 p-r-24\" *ngIf=\"certificateAuthorityFeatureEnabled | async\">\n <div>\n <p class=\"m-b-8 text-medium\">\n <strong translate>Full registration with device certificate creation</strong>\n </p>\n <small class=\"text-muted\" translate>\n Creates device certificates and devices using the provided list of property values. Once the certificates are provisioned, the devices can immediately start communicating with the platform\n </small>\n </div>\n <div class=\"m-b-16 m-t-16\">\n <a\n title=\"{{ 'Download template' | translate }}\"\n class=\"btn btn-default btn-sm\"\n target=\"_self\"\n (click)=\"downloadEst()\"\n >\n <i c8yIcon=\"download\"></i>\n {{ 'Download template' | translate }}\n </a>\n </div>\n </div>\n </div>\n\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [disabled]=\"form.invalid\"\n [pending]=\"pending\"\n (onCancel)=\"cancel()\"\n (onNext)=\"upload()\"\n [labels]=\"{ next: 'Upload' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n\n <cdk-step state=\"final\">\n <div class=\"m-24\">\n <div *ngIf=\"success; else warning\">\n <c8y-operation-result\n text=\"{{ message | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"success\"\n class=\"lead\"\n ></c8y-operation-result>\n </div>\n <ng-template #warning>\n <c8y-operation-result\n text=\"{{ message | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"error\"\n class=\"lead\"\n ></c8y-operation-result>\n </ng-template>\n <c8y-list-group class=\"separator-top m-t-16\">\n <ng-container *ngIf=\"result; else failedResponse\">\n <c8y-li *ngIf=\"success; else fail\">\n <c8y-li-icon class=\"text-success\" icon=\"check-circle\"></c8y-li-icon>\n <p>{{ 'All devices have been processed.' | translate }}</p>\n <c8y-li-collapse>\n <pre><code>{{ result | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n <ng-template #fail>\n <c8y-li>\n <c8y-li-icon class=\"text-danger\" icon=\"ban\"></c8y-li-icon>\n <p\n ngNonBindable\n [translateParams]=\"{ count: result?.numberOfFailed, total: result?.numberOfAll }\"\n translate\n >\n Failed to process {{ count }} out of {{ total }}.\n </p>\n <c8y-li-collapse>\n <pre><code>{{ result | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n </ng-template>\n </ng-container>\n <ng-template #failedResponse>\n <c8y-li>\n <c8y-li-icon class=\"text-danger\" [icon]=\"'ban'\"></c8y-li-icon>\n <small>{{ failedResult?.message | translate }}</small>\n <c8y-li-collapse>\n <pre><code>{{ failedResult | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n </ng-template>\n </c8y-list-group>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n [showButtons]=\"{ next: true }\"\n (onNext)=\"complete()\"\n [labels]=\"{ next: success ? 'Close' : 'Cancel' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n</c8y-modal>\n" }]
|
|
337
|
+
}], ctorParameters: () => [{ type: i1$1.C8yJSONSchema }, { type: i2.DeviceRegistrationBulkService }, { type: RegisterDeviceService }, { type: i4.BsModalRef }, { type: i1$1.GainsightService }, { type: i2.FeatureService }], propDecorators: { stepper: [{
|
|
338
|
+
type: ViewChild,
|
|
339
|
+
args: [C8yStepper, { static: true }]
|
|
340
|
+
}] } });
|
|
208
341
|
|
|
209
342
|
class GeneralDeviceRegistrationComponent {
|
|
210
|
-
constructor(tenantUIService, tenantService, registerDeviceService, inventoryService, cd, bsModalRef, gainsightService) {
|
|
343
|
+
constructor(tenantUIService, tenantService, registerDeviceService, inventoryService, cd, bsModalRef, gainsightService, deviceRegistrationService, featureService) {
|
|
211
344
|
this.tenantUIService = tenantUIService;
|
|
212
345
|
this.tenantService = tenantService;
|
|
213
346
|
this.registerDeviceService = registerDeviceService;
|
|
@@ -215,18 +348,25 @@ class GeneralDeviceRegistrationComponent {
|
|
|
215
348
|
this.cd = cd;
|
|
216
349
|
this.bsModalRef = bsModalRef;
|
|
217
350
|
this.gainsightService = gainsightService;
|
|
351
|
+
this.deviceRegistrationService = deviceRegistrationService;
|
|
352
|
+
this.featureService = featureService;
|
|
218
353
|
this.MANAGEMENT = 'management';
|
|
219
354
|
this.FILTER = {
|
|
220
355
|
withTotalPages: true,
|
|
221
356
|
pageSize: 25
|
|
222
357
|
};
|
|
358
|
+
this.useEST$ = new BehaviorSubject(false);
|
|
359
|
+
this.certificateAuthorityFeatureEnabled = this.featureService
|
|
360
|
+
.detail('certificate-authority')
|
|
361
|
+
.then(({ data }) => data.active);
|
|
223
362
|
this.form = new FormGroup({});
|
|
224
363
|
this.model = {
|
|
225
364
|
devicesToCreate: [{}]
|
|
226
365
|
};
|
|
227
366
|
this.options = {
|
|
228
367
|
formState: {
|
|
229
|
-
canLoadTenants: true
|
|
368
|
+
canLoadTenants: true,
|
|
369
|
+
useEST: this.useEST$.getValue()
|
|
230
370
|
}
|
|
231
371
|
};
|
|
232
372
|
this.PRODUCT_EXPERIENCE = {
|
|
@@ -240,7 +380,7 @@ class GeneralDeviceRegistrationComponent {
|
|
|
240
380
|
{
|
|
241
381
|
type: 'array',
|
|
242
382
|
key: 'devicesToCreate',
|
|
243
|
-
|
|
383
|
+
props: {
|
|
244
384
|
addText: gettext('Add device'),
|
|
245
385
|
addTextDataCy: 'add-device'
|
|
246
386
|
},
|
|
@@ -250,7 +390,7 @@ class GeneralDeviceRegistrationComponent {
|
|
|
250
390
|
key: 'id',
|
|
251
391
|
type: 'string',
|
|
252
392
|
focus: true,
|
|
253
|
-
|
|
393
|
+
props: {
|
|
254
394
|
placeholder: '0123ab32fcd',
|
|
255
395
|
label: gettext('Device ID'),
|
|
256
396
|
required: true
|
|
@@ -268,14 +408,17 @@ class GeneralDeviceRegistrationComponent {
|
|
|
268
408
|
{
|
|
269
409
|
key: 'tenant',
|
|
270
410
|
type: 'typeahead',
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
field.
|
|
411
|
+
expressions: {
|
|
412
|
+
hide: field => {
|
|
413
|
+
const formState = field.options?.formState;
|
|
414
|
+
if (!formState?.canLoadTenants) {
|
|
415
|
+
field.formControl.setValue(null);
|
|
416
|
+
}
|
|
417
|
+
return !formState?.canLoadTenants || false;
|
|
274
418
|
}
|
|
275
|
-
return !formState?.canLoadTenants || false;
|
|
276
419
|
},
|
|
277
420
|
defaultValue: { id: this.MANAGEMENT },
|
|
278
|
-
|
|
421
|
+
props: {
|
|
279
422
|
label: gettext('Add to tenant'),
|
|
280
423
|
required: true,
|
|
281
424
|
c8yForOptions: this.canLoadTenants$().pipe(filter(canLoad => canLoad), switchMap(() => this.getTenants$())),
|
|
@@ -293,19 +436,21 @@ class GeneralDeviceRegistrationComponent {
|
|
|
293
436
|
{
|
|
294
437
|
key: 'group',
|
|
295
438
|
type: 'typeahead',
|
|
296
|
-
|
|
297
|
-
'
|
|
439
|
+
expressions: {
|
|
440
|
+
'props.disabled': (field) => {
|
|
441
|
+
const formState = field.options?.formState;
|
|
442
|
+
const model = field.model;
|
|
298
443
|
if (formState?.canLoadTenants) {
|
|
299
444
|
if (model?.tenant?.id !== this.MANAGEMENT) {
|
|
300
445
|
field.formControl.setValue(null);
|
|
301
446
|
}
|
|
302
447
|
return !(model?.tenant?.id === this.MANAGEMENT);
|
|
303
448
|
}
|
|
304
|
-
delete field?.
|
|
449
|
+
delete field?.props?.description;
|
|
305
450
|
return false;
|
|
306
451
|
}
|
|
307
452
|
},
|
|
308
|
-
|
|
453
|
+
props: {
|
|
309
454
|
disabled: false,
|
|
310
455
|
label: gettext('Add to group'),
|
|
311
456
|
description: gettext('You can add device to specific group for management tenant only.'),
|
|
@@ -320,6 +465,24 @@ class GeneralDeviceRegistrationComponent {
|
|
|
320
465
|
this.cd.detectChanges();
|
|
321
466
|
}))
|
|
322
467
|
}
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
key: 'oneTimePassword',
|
|
471
|
+
type: 'string',
|
|
472
|
+
expressions: {
|
|
473
|
+
hide: field => !field.options?.formState?.useEST
|
|
474
|
+
},
|
|
475
|
+
props: {
|
|
476
|
+
placeholder: 'TruDN3H45L0',
|
|
477
|
+
label: gettext('One-time password'),
|
|
478
|
+
required: true
|
|
479
|
+
},
|
|
480
|
+
hooks: {
|
|
481
|
+
onInit: _field => this.useEST$.pipe(tap(useEST => {
|
|
482
|
+
this.options.formState.useEST = useEST;
|
|
483
|
+
this.cd.detectChanges();
|
|
484
|
+
}))
|
|
485
|
+
}
|
|
323
486
|
}
|
|
324
487
|
]
|
|
325
488
|
}
|
|
@@ -336,6 +499,20 @@ class GeneralDeviceRegistrationComponent {
|
|
|
336
499
|
this.destroy$.next();
|
|
337
500
|
this.destroy$.complete();
|
|
338
501
|
}
|
|
502
|
+
registerDevice(eventObject) {
|
|
503
|
+
!this.useEST$.getValue() ? this.create(eventObject) : this.registerByEst(eventObject);
|
|
504
|
+
}
|
|
505
|
+
fixErrors(event, failedRequests) {
|
|
506
|
+
if (failedRequests && failedRequests.length > 0) {
|
|
507
|
+
this.options.resetModel({
|
|
508
|
+
devicesToCreate: [
|
|
509
|
+
...this.lastCreatedDevices.filter(el => failedRequests.map(data => data.id).includes(el.id))
|
|
510
|
+
]
|
|
511
|
+
});
|
|
512
|
+
this.cd.detectChanges();
|
|
513
|
+
}
|
|
514
|
+
event?.stepper.previous();
|
|
515
|
+
}
|
|
339
516
|
create(eventObject) {
|
|
340
517
|
if (this.model?.devicesToCreate?.length > 0) {
|
|
341
518
|
this.lastCreatedDevices = [...this.model.devicesToCreate];
|
|
@@ -374,16 +551,45 @@ class GeneralDeviceRegistrationComponent {
|
|
|
374
551
|
});
|
|
375
552
|
}
|
|
376
553
|
}
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
554
|
+
registerByEst(eventObject) {
|
|
555
|
+
this.lastCreatedDevices = [...this.model.devicesToCreate];
|
|
556
|
+
this.deviceRegistrationService
|
|
557
|
+
.create(this.convertObjectToCSVFile(this.model.devicesToCreate))
|
|
558
|
+
.then(({ res, data }) => {
|
|
559
|
+
if (res.status < 400) {
|
|
560
|
+
this.failed = data.failedCreationList.map(value => {
|
|
561
|
+
return {
|
|
562
|
+
id: value.deviceId,
|
|
563
|
+
message: value.failureReason
|
|
564
|
+
};
|
|
565
|
+
});
|
|
566
|
+
const failedIds = new Set(this.failed.map(item => item.id));
|
|
567
|
+
this.success = this.model.devicesToCreate.filter(item => !failedIds.has(item.id));
|
|
568
|
+
}
|
|
569
|
+
eventObject.stepper.next();
|
|
570
|
+
})
|
|
571
|
+
.catch(() => {
|
|
572
|
+
eventObject.stepper.next();
|
|
573
|
+
});
|
|
574
|
+
}
|
|
575
|
+
convertObjectToCSVFile(data) {
|
|
576
|
+
const fullCsvHeaders = ESTCsvHeaders;
|
|
577
|
+
const csvHeaders = fullCsvHeaders.join(';') + '\n';
|
|
578
|
+
const dataToSend = data.map(el => {
|
|
579
|
+
return {
|
|
580
|
+
ID: el.id,
|
|
581
|
+
AUTH_TYPE: 'CERTIFICATES',
|
|
582
|
+
ENROLLMENT_OTP: el.oneTimePassword,
|
|
583
|
+
PATH: el.group?.id || '',
|
|
584
|
+
TENANT: el.tenant?.id || ''
|
|
585
|
+
};
|
|
586
|
+
});
|
|
587
|
+
const csvRows = dataToSend
|
|
588
|
+
.map(row => fullCsvHeaders.map(header => row[header] ?? '').join(';'))
|
|
589
|
+
.join('\n');
|
|
590
|
+
const csvContent = csvHeaders + csvRows;
|
|
591
|
+
const blob = new Blob([csvContent], { type: 'text/csv' });
|
|
592
|
+
return new File([blob], `ESTRegistrationFile.csv`, { type: 'text/csv' });
|
|
387
593
|
}
|
|
388
594
|
canLoadTenants$() {
|
|
389
595
|
return defer(() => from(this.tenantUIService.isManagementTenant())).pipe(shareReplay(1));
|
|
@@ -394,8 +600,8 @@ class GeneralDeviceRegistrationComponent {
|
|
|
394
600
|
getGroups$() {
|
|
395
601
|
return defer(() => from(this.inventoryService.listQuery({ __filter: { __has: 'c8y_IsDeviceGroup' }, __orderby: [{ name: 1 }] }, { ...this.FILTER }))).pipe(shareReplay(1));
|
|
396
602
|
}
|
|
397
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: GeneralDeviceRegistrationComponent, deps: [{ token: i1$
|
|
398
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: GeneralDeviceRegistrationComponent, selector: "c8y-general-device-registration", ngImport: i0, template: "<c8y-modal\n [title]=\"'Register devices' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span [c8yIcon]=\"'c8y-device-connect'\"></span>\n </ng-container>\n <c8y-stepper [hideStepProgress]=\"true\" linear c8y-modal-body>\n <cdk-step [stepControl]=\"form\">\n <div class=\"
|
|
603
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: GeneralDeviceRegistrationComponent, deps: [{ token: i1$1.TenantUiService }, { token: i2.TenantService }, { token: RegisterDeviceService }, { token: i2.InventoryService }, { token: i0.ChangeDetectorRef }, { token: i4.BsModalRef }, { token: i1$1.GainsightService }, { token: i2.DeviceRegistrationBulkService }, { token: i2.FeatureService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
604
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: GeneralDeviceRegistrationComponent, selector: "c8y-general-device-registration", ngImport: i0, template: "<c8y-modal\n [title]=\"'Register devices' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span [c8yIcon]=\"'c8y-device-connect'\"></span>\n </ng-container>\n <c8y-stepper [hideStepProgress]=\"true\" linear c8y-modal-body>\n <cdk-step [stepControl]=\"form\">\n <div class=\"text-center sticky-top bg-component\">\n <p class=\"text-medium text-16 separator-bottom p-16\" translate>Register general devices</p>\n <label\n class=\"c8y-switch m-24 a-i-center\"\n title=\"{{ 'Create device certificates during device registration' | translate }}\"\n for=\"useEST\"\n *ngIf=\"certificateAuthorityFeatureEnabled | async\"\n >\n <input\n type=\"checkbox\"\n name=\"useEST\"\n id=\"useEST\"\n [ngModel]=\"useEST$.getValue()\"\n (ngModelChange)=\"useEST$.next($event)\"\n />\n <span></span>\n <span class=\"control-label\">{{ 'Create device certificates during device registration' | translate }}</span>\n <button\n type=\"button\"\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'The device registration process includes creating device certificates, which are issued by the tenant\\'s Certificate Authority (CA).' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </label>\n </div>\n <div>\n <formly-form\n [form]=\"form\"\n [fields]=\"fields\"\n [model]=\"model\"\n [options]=\"options\"\n class=\"formly-group-array-cols d-block p-l-24 p-b-24 min-height-fit p-r-8\"\n [ngClass]=\"{'p-t-24' : !(certificateAuthorityFeatureEnabled | async)}\"\n ></formly-form>\n </div>\n <c8y-stepper-buttons\n (onNext)=\"registerDevice($event)\"\n (onCancel)=\"bsModalRef.hide()\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [disabled]=\"!form?.valid\"\n [pending]=\"isLoading$ | async\"\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n ></c8y-stepper-buttons>\n </cdk-step>\n <cdk-step state=\"final\">\n <div class=\"p-24 min-height-fit\">\n <c8y-operation-result\n *ngIf=\"success.length === 1 && failed.length === 0\"\n text=\"{{ 'Device registered' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"success\"\n class=\"lead\"\n ></c8y-operation-result>\n <c8y-operation-result\n *ngIf=\"success.length === 0 && failed.length === 1\"\n text=\"{{ 'Failed to register device' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"error\"\n class=\"lead\"\n ></c8y-operation-result>\n\n <ng-container *ngIf=\"success.length > 1 || failed.length > 1\">\n <c8y-operation-result\n *ngIf=\"failed.length === 0\"\n [text]=\"\n '{{ successfulDevicesCount }} devices registered'\n | translate: { successfulDevicesCount: success.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"success\"\n class=\"lead\"\n ></c8y-operation-result>\n <c8y-operation-result\n *ngIf=\"success.length === 0\"\n [text]=\"\n '{{ failedDevicesCount }} devices failed to register'\n | translate: { failedDevicesCount: failed.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"error\"\n class=\"lead\"\n ></c8y-operation-result>\n </ng-container>\n\n <div *ngIf=\"success.length > 0 && failed.length > 0\" class=\"p-l-24 p-r-24 text-center\">\n <c8y-operation-result\n text=\"{{ 'Several devices failed to register' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"error\"\n class=\"lead\"\n ></c8y-operation-result>\n <p\n ngNonBindable\n translate\n [translateParams]=\"{ count: failed.length, total: failed.length + success.length }\"\n class=\"p-b-16 text-danger\"\n >\n Registration failed for {{ count }} devices out of {{ total }}.\n </p>\n </div>\n\n <div class=\"m-b-8 p-l-24 p-r-24\" *ngIf=\"success.length > 0\" translate>\n Turn on the registered device(s) and wait for connection(s) to be established. Once a\n device is connected, its status will change to \"Pending acceptance\". You will need to\n approve it by clicking on the \"Accept\" button.\n </div>\n\n <c8y-list-group class=\"separator-top m-t-16\">\n <c8y-li *ngFor=\"let fail of failed\">\n <c8y-li-icon class=\"text-danger\" [icon]=\"'ban'\"></c8y-li-icon>\n <p>{{ fail?.id }}</p>\n <small>{{ fail?.message | translate }}</small>\n <c8y-li-collapse>\n <pre><code>{{ fail?.details | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n\n <c8y-li *ngFor=\"let s of success\">\n <c8y-li-icon class=\"text-success\" [icon]=\"'check-circle'\"></c8y-li-icon>\n {{ s?.id }}\n </c8y-li>\n </c8y-list-group>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onCustom)=\"bsModalRef.hide()\"\n (onBack)=\"fixErrors($event, failed)\"\n [showButtons]=\"{ back: failed.length > 0, custom: true }\"\n [labels]=\"{ back: 'Fix errors', custom: 'Close' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n</c8y-modal>\n", dependencies: [{ kind: "directive", type: i5$1.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: i1$1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1$1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1$1.OperationResultComponent, selector: "c8y-operation-result", inputs: ["text", "vertical", "size", "type"] }, { kind: "component", type: i1$1.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "directive", type: i6$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i1$1.C8yStepper, selector: "c8y-stepper", inputs: ["disableDefaultIcons", "disableProgressButtons", "customClasses", "hideStepProgress", "useStepLabelsAsTitlesOnly"], outputs: ["onStepChange"] }, { kind: "component", type: i6.CdkStep, selector: "cdk-step", inputs: ["stepControl", "label", "errorMessage", "aria-label", "aria-labelledby", "state", "editable", "optional", "completed", "hasError"], outputs: ["interacted"], exportAs: ["cdkStep"] }, { kind: "component", type: i1$1.C8yStepperButtons, selector: "c8y-stepper-buttons", inputs: ["labels", "pending", "disabled", "showButtons"], outputs: ["onCancel", "onNext", "onBack", "onCustom"] }, { kind: "component", type: i1$1.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i1$1.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i1$1.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i1$1.ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "component", type: i7.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "pipe", type: i1$1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.JsonPipe, name: "json" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
399
605
|
}
|
|
400
606
|
__decorate([
|
|
401
607
|
memoize(),
|
|
@@ -417,23 +623,23 @@ __decorate([
|
|
|
417
623
|
], GeneralDeviceRegistrationComponent.prototype, "getGroups$", null);
|
|
418
624
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: GeneralDeviceRegistrationComponent, decorators: [{
|
|
419
625
|
type: Component,
|
|
420
|
-
args: [{ selector: 'c8y-general-device-registration', changeDetection: ChangeDetectionStrategy.OnPush, template: "<c8y-modal\n [title]=\"'Register devices' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span [c8yIcon]=\"'c8y-device-connect'\"></span>\n </ng-container>\n <c8y-stepper [hideStepProgress]=\"true\" linear c8y-modal-body>\n <cdk-step [stepControl]=\"form\">\n <div class=\"
|
|
421
|
-
}], ctorParameters: () => [{ type: i1$
|
|
626
|
+
args: [{ selector: 'c8y-general-device-registration', changeDetection: ChangeDetectionStrategy.OnPush, template: "<c8y-modal\n [title]=\"'Register devices' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span [c8yIcon]=\"'c8y-device-connect'\"></span>\n </ng-container>\n <c8y-stepper [hideStepProgress]=\"true\" linear c8y-modal-body>\n <cdk-step [stepControl]=\"form\">\n <div class=\"text-center sticky-top bg-component\">\n <p class=\"text-medium text-16 separator-bottom p-16\" translate>Register general devices</p>\n <label\n class=\"c8y-switch m-24 a-i-center\"\n title=\"{{ 'Create device certificates during device registration' | translate }}\"\n for=\"useEST\"\n *ngIf=\"certificateAuthorityFeatureEnabled | async\"\n >\n <input\n type=\"checkbox\"\n name=\"useEST\"\n id=\"useEST\"\n [ngModel]=\"useEST$.getValue()\"\n (ngModelChange)=\"useEST$.next($event)\"\n />\n <span></span>\n <span class=\"control-label\">{{ 'Create device certificates during device registration' | translate }}</span>\n <button\n type=\"button\"\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'The device registration process includes creating device certificates, which are issued by the tenant\\'s Certificate Authority (CA).' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </label>\n </div>\n <div>\n <formly-form\n [form]=\"form\"\n [fields]=\"fields\"\n [model]=\"model\"\n [options]=\"options\"\n class=\"formly-group-array-cols d-block p-l-24 p-b-24 min-height-fit p-r-8\"\n [ngClass]=\"{'p-t-24' : !(certificateAuthorityFeatureEnabled | async)}\"\n ></formly-form>\n </div>\n <c8y-stepper-buttons\n (onNext)=\"registerDevice($event)\"\n (onCancel)=\"bsModalRef.hide()\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [disabled]=\"!form?.valid\"\n [pending]=\"isLoading$ | async\"\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n ></c8y-stepper-buttons>\n </cdk-step>\n <cdk-step state=\"final\">\n <div class=\"p-24 min-height-fit\">\n <c8y-operation-result\n *ngIf=\"success.length === 1 && failed.length === 0\"\n text=\"{{ 'Device registered' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"success\"\n class=\"lead\"\n ></c8y-operation-result>\n <c8y-operation-result\n *ngIf=\"success.length === 0 && failed.length === 1\"\n text=\"{{ 'Failed to register device' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"error\"\n class=\"lead\"\n ></c8y-operation-result>\n\n <ng-container *ngIf=\"success.length > 1 || failed.length > 1\">\n <c8y-operation-result\n *ngIf=\"failed.length === 0\"\n [text]=\"\n '{{ successfulDevicesCount }} devices registered'\n | translate: { successfulDevicesCount: success.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"success\"\n class=\"lead\"\n ></c8y-operation-result>\n <c8y-operation-result\n *ngIf=\"success.length === 0\"\n [text]=\"\n '{{ failedDevicesCount }} devices failed to register'\n | translate: { failedDevicesCount: failed.length }\n \"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"error\"\n class=\"lead\"\n ></c8y-operation-result>\n </ng-container>\n\n <div *ngIf=\"success.length > 0 && failed.length > 0\" class=\"p-l-24 p-r-24 text-center\">\n <c8y-operation-result\n text=\"{{ 'Several devices failed to register' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"error\"\n class=\"lead\"\n ></c8y-operation-result>\n <p\n ngNonBindable\n translate\n [translateParams]=\"{ count: failed.length, total: failed.length + success.length }\"\n class=\"p-b-16 text-danger\"\n >\n Registration failed for {{ count }} devices out of {{ total }}.\n </p>\n </div>\n\n <div class=\"m-b-8 p-l-24 p-r-24\" *ngIf=\"success.length > 0\" translate>\n Turn on the registered device(s) and wait for connection(s) to be established. Once a\n device is connected, its status will change to \"Pending acceptance\". You will need to\n approve it by clicking on the \"Accept\" button.\n </div>\n\n <c8y-list-group class=\"separator-top m-t-16\">\n <c8y-li *ngFor=\"let fail of failed\">\n <c8y-li-icon class=\"text-danger\" [icon]=\"'ban'\"></c8y-li-icon>\n <p>{{ fail?.id }}</p>\n <small>{{ fail?.message | translate }}</small>\n <c8y-li-collapse>\n <pre><code>{{ fail?.details | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n\n <c8y-li *ngFor=\"let s of success\">\n <c8y-li-icon class=\"text-success\" [icon]=\"'check-circle'\"></c8y-li-icon>\n {{ s?.id }}\n </c8y-li>\n </c8y-list-group>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n (onCustom)=\"bsModalRef.hide()\"\n (onBack)=\"fixErrors($event, failed)\"\n [showButtons]=\"{ back: failed.length > 0, custom: true }\"\n [labels]=\"{ back: 'Fix errors', custom: 'Close' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n</c8y-modal>\n" }]
|
|
627
|
+
}], ctorParameters: () => [{ type: i1$1.TenantUiService }, { type: i2.TenantService }, { type: RegisterDeviceService }, { type: i2.InventoryService }, { type: i0.ChangeDetectorRef }, { type: i4.BsModalRef }, { type: i1$1.GainsightService }, { type: i2.DeviceRegistrationBulkService }, { type: i2.FeatureService }], propDecorators: { canLoadTenants$: [], getTenants$: [], getGroups$: [] } });
|
|
422
628
|
|
|
423
629
|
class GeneralDeviceRegistrationButtonComponent {
|
|
424
630
|
constructor(modalService) {
|
|
425
631
|
this.modalService = modalService;
|
|
426
632
|
}
|
|
427
|
-
open() {
|
|
633
|
+
async open() {
|
|
428
634
|
this.modalService.show(GeneralDeviceRegistrationComponent, {
|
|
429
|
-
class: 'modal-
|
|
635
|
+
class: 'modal-md',
|
|
430
636
|
ariaDescribedby: 'modal-body',
|
|
431
637
|
ariaLabelledBy: 'modal-title',
|
|
432
638
|
ignoreBackdropClick: true
|
|
433
639
|
});
|
|
434
640
|
}
|
|
435
641
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: GeneralDeviceRegistrationButtonComponent, deps: [{ token: i4.BsModalService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
436
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: GeneralDeviceRegistrationButtonComponent, selector: "c8y-general-device-registration-button", ngImport: i0, template: "<button title=\"{{ 'General' | translate }}\" type=\"button\" (click)=\"open()\">\n <i c8yIcon=\"c8y-device-connect\"></i>\n {{ 'General' | translate }}\n</button>\n", dependencies: [{ kind: "directive", type: i1$
|
|
642
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: GeneralDeviceRegistrationButtonComponent, selector: "c8y-general-device-registration-button", ngImport: i0, template: "<button title=\"{{ 'General' | translate }}\" type=\"button\" (click)=\"open()\">\n <i c8yIcon=\"c8y-device-connect\"></i>\n {{ 'General' | translate }}\n</button>\n", dependencies: [{ kind: "directive", type: i1$1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i1$1.C8yTranslatePipe, name: "translate" }] }); }
|
|
437
643
|
}
|
|
438
644
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: GeneralDeviceRegistrationButtonComponent, decorators: [{
|
|
439
645
|
type: Component,
|
|
@@ -484,7 +690,7 @@ class RegisterDeviceExtensionService extends ExtensionPointWithoutStateForPlugin
|
|
|
484
690
|
() => this.factories
|
|
485
691
|
]).pipe(startWith([]), shareReplay(1));
|
|
486
692
|
}
|
|
487
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RegisterDeviceExtensionService, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i1$
|
|
693
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RegisterDeviceExtensionService, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i1$1.PluginsResolveService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
488
694
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RegisterDeviceExtensionService, providedIn: 'root' }); }
|
|
489
695
|
}
|
|
490
696
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RegisterDeviceExtensionService, decorators: [{
|
|
@@ -492,7 +698,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
|
|
|
492
698
|
args: [{
|
|
493
699
|
providedIn: 'root'
|
|
494
700
|
}]
|
|
495
|
-
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1.Router }, { type: i1$
|
|
701
|
+
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1.Router }, { type: i1$1.PluginsResolveService }] });
|
|
496
702
|
|
|
497
703
|
class RegisterDeviceDropdownComponent {
|
|
498
704
|
constructor(registerDeviceExtensionService, registerDeviceService) {
|
|
@@ -503,7 +709,7 @@ class RegisterDeviceDropdownComponent {
|
|
|
503
709
|
this.limit$ = this.registerDeviceService.limit$.pipe(map(limit => limit.isReached));
|
|
504
710
|
}
|
|
505
711
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RegisterDeviceDropdownComponent, deps: [{ token: RegisterDeviceExtensionService }, { token: RegisterDeviceService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
506
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: RegisterDeviceDropdownComponent, selector: "c8y-register-device-dropdown", ngImport: i0, template: "<div class=\"dropdown\" dropdown>\n <button\n *ngIf=\"!(limit$ | async); else disable\"\n title=\"{{ 'Register device' | translate }}\"\n type=\"button\"\n class=\"dropdown-toggle c8y-dropdown d-flex a-i-center\"\n dropdownToggle\n aria-haspopup=\"true\"\n data-cy=\"register-device--dropdown-button\"\n >\n <span class=\"text-truncate\" translate>Register device</span>\n <i [c8yIcon]=\"'caret-down'\" class=\"m-l-4 text-primary\"></i>\n </button>\n <ng-template #disable>\n <button\n title=\"{{ 'Device registration disabled' | translate }}\"\n type=\"button\"\n class=\"btn btn-clean d-flex p-l-8\"\n disabled\n >\n <span class=\"text-truncate\" translate>Register device</span>\n <i [c8yIcon]=\"'caret-down'\"></i>\n </button>\n </ng-template>\n\n <!-- dropdown for normal screen sizes -->\n <ul class=\"dropdown-menu dropdown-menu-right hidden-xs\" data-cy=\"register-device--dropdown\" *dropdownMenu>\n <ng-container *ngTemplateOutlet=\"dropdown\"></ng-container>\n </ul>\n\n <!-- fake dropdown for mobile screen sizes. *dropdownMenu is missing by design! -->\n <ul class=\"dropdown-menu dropdown-menu visible-xs\">\n <ng-container *ngTemplateOutlet=\"dropdown\"></ng-container>\n </ul>\n\n <ng-template #dropdown>\n <ng-container *ngIf=\"single$ | async as single\">\n <li class=\"dropdown-header\" *ngIf=\"single.length > 0\" translate data-cy=\"single-group\">Single registration</li>\n <li *ngFor=\"let item of single\">\n <ng-container *c8yOutlet=\"item.template\"></ng-container>\n </li>\n </ng-container>\n <ng-container *ngIf=\"bulk$ | async as bulk\">\n <li class=\"dropdown-header\" *ngIf=\"bulk.length > 0\" translate data-cy=\"bulk-group\">Bulk registration</li>\n <li *ngFor=\"let item of bulk\">\n <ng-container *c8yOutlet=\"item.template\"></ng-container>\n </li>\n </ng-container>\n </ng-template>\n</div>\n", dependencies: [{ kind: "directive", type: i3.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i3.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i3.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i1$
|
|
712
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: RegisterDeviceDropdownComponent, selector: "c8y-register-device-dropdown", ngImport: i0, template: "<div class=\"dropdown\" dropdown>\n <button\n *ngIf=\"!(limit$ | async); else disable\"\n title=\"{{ 'Register device' | translate }}\"\n type=\"button\"\n class=\"dropdown-toggle c8y-dropdown d-flex a-i-center\"\n dropdownToggle\n aria-haspopup=\"true\"\n data-cy=\"register-device--dropdown-button\"\n >\n <span class=\"text-truncate\" translate>Register device</span>\n <i [c8yIcon]=\"'caret-down'\" class=\"m-l-4 text-primary\"></i>\n </button>\n <ng-template #disable>\n <button\n title=\"{{ 'Device registration disabled' | translate }}\"\n type=\"button\"\n class=\"btn btn-clean d-flex p-l-8\"\n disabled\n >\n <span class=\"text-truncate\" translate>Register device</span>\n <i [c8yIcon]=\"'caret-down'\"></i>\n </button>\n </ng-template>\n\n <!-- dropdown for normal screen sizes -->\n <ul class=\"dropdown-menu dropdown-menu-right hidden-xs\" data-cy=\"register-device--dropdown\" *dropdownMenu>\n <ng-container *ngTemplateOutlet=\"dropdown\"></ng-container>\n </ul>\n\n <!-- fake dropdown for mobile screen sizes. *dropdownMenu is missing by design! -->\n <ul class=\"dropdown-menu dropdown-menu visible-xs\">\n <ng-container *ngTemplateOutlet=\"dropdown\"></ng-container>\n </ul>\n\n <ng-template #dropdown>\n <ng-container *ngIf=\"single$ | async as single\">\n <li class=\"dropdown-header\" *ngIf=\"single.length > 0\" translate data-cy=\"single-group\">Single registration</li>\n <li *ngFor=\"let item of single\">\n <ng-container *c8yOutlet=\"item.template\"></ng-container>\n </li>\n </ng-container>\n <ng-container *ngIf=\"bulk$ | async as bulk\">\n <li class=\"dropdown-header\" *ngIf=\"bulk.length > 0\" translate data-cy=\"bulk-group\">Bulk registration</li>\n <li *ngFor=\"let item of bulk\">\n <ng-container *c8yOutlet=\"item.template\"></ng-container>\n </li>\n </ng-container>\n </ng-template>\n</div>\n", dependencies: [{ kind: "directive", type: i3.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i3.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i3.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i1$1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1$1.OutletDirective, selector: "[c8yOutlet]", inputs: ["c8yOutlet", "c8yOutletProperties", "c8yOutletInjector"] }, { kind: "directive", type: i1$1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i1$1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] }); }
|
|
507
713
|
}
|
|
508
714
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RegisterDeviceDropdownComponent, decorators: [{
|
|
509
715
|
type: Component,
|
|
@@ -619,13 +825,13 @@ class DeviceRegistrationViewComponent {
|
|
|
619
825
|
showTokenInputBasedOnSecurityMode() {
|
|
620
826
|
return this._securityTokenPolicy.getValue() !== DeviceRegistrationSecurityMode.IGNORED;
|
|
621
827
|
}
|
|
622
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DeviceRegistrationViewComponent, deps: [{ token: RegisterDeviceService }, { token: i1$
|
|
623
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: DeviceRegistrationViewComponent, selector: "c8y-device-registration-view", ngImport: i0, template: "<ng-container *ngIf=\"deviceRequests$ | async as deviceRequestList\">\n <c8y-title>\n {{ 'Device registration' | translate }}\n <small *ngIf=\"deviceRequestList.data.length === 1\">1 {{ 'new device' | translate }}</small>\n <small *ngIf=\"deviceRequestList.data.length > 1\">\n {{ deviceRequestList.data.length }} {{ 'new devices' | translate }}\n </small>\n </c8y-title>\n\n <c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'exchange'\"\n [label]=\"'Devices' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-connect'\"\n [label]=\"'Device registration' | translate\"\n ></c8y-breadcrumb-item>\n </c8y-breadcrumb>\n\n <c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form hidden-xs\"\n >\n <c8y-list-display-switch (onListClassChange)=\"displayMode($event)\"></c8y-list-display-switch>\n </c8y-action-bar-item>\n\n <ng-container *ngIf=\"limit$ | async as limitStatus\">\n <c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"10\"\n >\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Accept all' | translate }}\"\n type=\"button\"\n *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n (click)=\"acceptAll()\"\n [disabled]=\"canAcceptAll() || limitStatus?.isReached\"\n >\n <i [c8yIcon]=\"'check'\"></i>\n {{ 'Accept all' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"9\"\n >\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"loadAll()\"\n [disabled]=\"isLoading\"\n >\n <i\n [c8yIcon]=\"'refresh'\"\n [ngClass]=\"{ 'icon-spin': isLoading }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item\n [placement]=\"'right'\"\n *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n >\n <c8y-register-device-dropdown></c8y-register-device-dropdown>\n </c8y-action-bar-item>\n\n <c8y-help\n src=\"/docs/device-management-application/registering-devices/#registering-devices\"\n ></c8y-help>\n\n <ng-container *ngIf=\"deviceRequestList.data.length > 0; else noData\">\n <div\n class=\"card-group\"\n [ngClass]=\"gridOrList\"\n >\n <!-- START interact-list sticky header START -->\n <div\n class=\"page-sticky-header hidden-xs\"\n *ngIf=\"gridOrList === 'interact-list'\"\n >\n <div class=\"d-flex\">\n <div class=\"card-header p-l-40\">\n <p translate>Device</p>\n </div>\n <div class=\"card-block card-column-30 p-l-0 m-l-8\">\n <p translate>Status</p>\n </div>\n <div\n class=\"card-block card-column-30 p-0\"\n *ngIf=\"showTokenInputBasedOnSecurityMode()\"\n >\n <p translate>Security token</p>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Security token is required if the connected device uses it.' | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n <div class=\"card-footer card-column-50\">\n <div\n class=\"d-contents\"\n *ngIf=\"isManagementTenant; else noManagement\"\n >\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-30\">\n {{ 'By`user`' | translate }}\n </div>\n <div class=\"card-column-20\">\n {{ 'Tenant ID' | translate }}\n </div>\n </div>\n <ng-template #noManagement>\n <div class=\"d-contents\">\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-50\">\n {{ 'By`user`' | translate }}\n </div>\n </div>\n </ng-template>\n </div>\n <div\n class=\"card-actions-group\"\n style=\"min-width: 176px\"\n >\n <div class=\"btn btn-xs invisible\">\n <!--EMPTY by design-->\n </div>\n </div>\n </div>\n </div>\n <!-- END interact-list sticky header END -->\n\n <div\n class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\"\n *ngIf=\"limitStatus?.isReached\"\n >\n <p\n class=\"alert alert-warning center-block\"\n role=\"alert\"\n >\n <strong>\n {{ limitReachedInfo$ | async }}\n </strong>\n <br />\n <span translate>Please contact your platform administrator.</span>\n </p>\n </div>\n\n <ng-container *ngFor=\"let singleRequest of deviceRequestList.data\">\n <div class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n <div class=\"card\">\n <div class=\"card-header separator\">\n <div class=\"card-icon\">\n <i\n [class]=\"statusProps[singleRequest.status].cls\"\n [c8yIcon]=\"statusProps[singleRequest.status].icon\"\n ></i>\n </div>\n <p\n class=\"card-title text-truncate\"\n title=\"{{ singleRequest.id }}\"\n >\n {{ singleRequest.id }}\n </p>\n </div>\n\n <div class=\"card-block text-center card-column-30\">\n <span\n class=\"text-label-small\"\n translate\n >\n Status\n </span>\n <p>\n <i\n class=\"icon-spin text-primary\"\n c8yIcon=\"refresh\"\n *ngIf=\"singleRequest.status === status.WAITING_FOR_CONNECTION\"\n ></i>\n {{ statusProps[singleRequest.status].label | translate }}\n </p>\n </div>\n\n <ng-container *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n <div\n class=\"card-block text-center card-column-30 p-t-0\"\n [ngClass]=\"{ 'p-b-0': !shouldShowSecurityTokenInput(singleRequest) }\"\n *ngIf=\"showTokenInputBasedOnSecurityMode()\"\n >\n <ng-container *ngIf=\"shouldShowSecurityTokenInput(singleRequest)\">\n <span\n class=\"text-label-small\"\n *ngIf=\"gridOrList !== 'interact-list'\"\n translate\n >\n Security token\n </span>\n <input\n class=\"form-control\"\n type=\"text\"\n [(ngModel)]=\"singleRequest.securityToken\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'A1e3gh5ds' }\"\n [required]=\"requireSecurityToken\"\n />\n </ng-container>\n </div>\n\n <div\n class=\"card-actions-group d-flex a-i-center j-c-center\"\n style=\"min-width: 176px\"\n >\n <button\n class=\"btn btn-sm\"\n title=\"{{\n singleRequest.status === status.PENDING_ACCEPTANCE\n ? ('Remove' | translate)\n : ('Cancel' | translate)\n }}\"\n type=\"button\"\n [ngClass]=\"{\n 'btn-danger': singleRequest.status === status.PENDING_ACCEPTANCE,\n 'btn-default': singleRequest.status !== status.PENDING_ACCEPTANCE\n }\"\n (click)=\"delete(singleRequest.id)\"\n [disabled]=\"isLoading\"\n >\n <span *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\">\n {{ 'Remove' | translate }}\n </span>\n <span *ngIf=\"singleRequest.status !== status.PENDING_ACCEPTANCE\">\n {{ 'Cancel' | translate }}\n </span>\n </button>\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Accept' | translate }}\"\n type=\"button\"\n (click)=\"accept(singleRequest)\"\n *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\"\n [disabled]=\"\n isLoading ||\n limitStatus?.isReached ||\n (!singleRequest.securityToken && requireSecurityToken)\n \"\n >\n {{ 'Accept' | translate }}\n </button>\n </div>\n </ng-container>\n\n <div class=\"card-footer separator text-center card-column-50\">\n <small\n class=\"d-contents\"\n *ngIf=\"isManagementTenant; else noManagement\"\n >\n <div\n class=\"d-contents\"\n *ngIf=\"singleRequest.creationTime && singleRequest.owner\"\n >\n <span class=\"card-column-50\">\n <span\n class=\"text-label-small m-l-4 m-r-4\"\n translate\n >\n Created on`date`\n </span>\n <span data-cy=\"device-registration--creation-date\">\n {{ singleRequest.creationTime | c8yDate }}\n </span>\n </span>\n <span class=\"card-column-30 text-truncate\">\n <span\n class=\"text-label-small m-l-4 m-r-4\"\n translate\n >\n by`user`\n </span>\n <span\n title=\"{{ singleRequest.owner }}\"\n data-cy=\"device-registration--created-by\"\n >\n {{ singleRequest.owner }}\n </span>\n </span>\n <span class=\"card-column-20\">\n <span\n class=\"text-label-small m-l-4 m-r-4\"\n translate\n >\n in`tenant`\n </span>\n <span>{{ singleRequest.tenantId }}</span>\n </span>\n </div>\n <div\n class=\"d-contents\"\n *ngIf=\"!singleRequest.creationTime || !singleRequest.owner\"\n >\n <div class=\"card-column-50\"></div>\n <div class=\"card-column-30\"></div>\n <span\n class=\"text-label-small\"\n translate\n >\n Created in`tenant`\n </span>\n <div class=\"card-column-20\">\n <span>\n {{ singleRequest.tenantId }}\n </span>\n </div>\n </div>\n </small>\n <ng-template #noManagement>\n <small class=\"d-contents\">\n <span class=\"card-column-50\">\n <span\n class=\"text-label-small m-l-4 m-r-4\"\n translate\n >\n Created on`date`\n </span>\n <span data-cy=\"device-registration--creation-date\">\n {{ singleRequest.creationTime | c8yDate }}\n </span>\n </span>\n <span class=\"card-column-50 text-truncate\">\n <span\n class=\"text-label-small m-l-4 m-r-4\"\n translate\n >\n by`user`\n </span>\n <span\n title=\"{{ singleRequest.owner }}\"\n data-cy=\"device-registration--created-by\"\n >\n {{ singleRequest.owner }}\n </span>\n </span>\n </small>\n </ng-template>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <c8y-load-more\n [paging]=\"deviceRequestList.paging\"\n [hidden]=\"true\"\n (onLoad)=\"updateList($event)\"\n ></c8y-load-more>\n </ng-container>\n\n <ng-template #noData>\n <div class=\"c8y-empty-state m-t-40 text-center\">\n <h1 class=\"c8y-icon c8y-icon-device-connect c8y-icon-duocolor\"></h1>\n <ng-container *ngIf=\"limitStatus?.isReached; else limitNotReached\">\n <h3>\n {{ limitReachedInfo$ | async }}\n </h3>\n <p translate>Please contact your platform administrator.</p>\n </ng-container>\n <ng-template #limitNotReached>\n <h3 translate>No pending registrations to display.</h3>\n <p\n *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n translate\n >\n Use the \"Register device\" dropdown in the top right corner.\n </p>\n </ng-template>\n </div>\n </ng-template>\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i4$1.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: i1$2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1$2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.IfAllowedDirective, selector: "[c8yIfAllowed]", inputs: ["c8yIfAllowed", "c8yIfAllowedAllowAny"] }, { kind: "component", type: i1$2.LoadMoreComponent, selector: "c8y-load-more", inputs: ["paging", "useIntersection", "hidden", "container", "class", "maxIterations", "noMoreDataHint", "loadingTemplate", "hideNoMoreDataHint", "loadNextLabel", "loadingLabel"], outputs: ["onLoad"] }, { kind: "component", type: i1$2.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "component", type: i1$2.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i1$2.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i1$2.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i6$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1$2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i1$2.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "component", type: i1$2.ListDisplaySwitchComponent, selector: "c8y-list-display-switch", inputs: ["listKey", "listLength", "filterPipe"], outputs: ["onListClassChange"] }, { kind: "component", type: RegisterDeviceDropdownComponent, selector: "c8y-register-device-dropdown" }, { kind: "pipe", type: i1$2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$2.DatePipe, name: "c8yDate" }] }); }
|
|
828
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DeviceRegistrationViewComponent, deps: [{ token: RegisterDeviceService }, { token: i1$1.DeviceBootstrapRealtimeService }, { token: i1$1.TenantUiService }, { token: i1$1.ModalService }, { token: i3$1.TranslateService }, { token: i1$1.OptionsService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
829
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: DeviceRegistrationViewComponent, selector: "c8y-device-registration-view", ngImport: i0, template: "<ng-container *ngIf=\"deviceRequests$ | async as deviceRequestList\">\n <c8y-title>\n {{ 'Device registration' | translate }}\n <small *ngIf=\"deviceRequestList.data.length === 1\">1 {{ 'new device' | translate }}</small>\n <small *ngIf=\"deviceRequestList.data.length > 1\">\n {{ deviceRequestList.data.length }} {{ 'new devices' | translate }}\n </small>\n </c8y-title>\n\n <c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'exchange'\"\n [label]=\"'Devices' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-connect'\"\n [label]=\"'Device registration' | translate\"\n ></c8y-breadcrumb-item>\n </c8y-breadcrumb>\n\n <c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form hidden-xs\"\n >\n <c8y-list-display-switch (onListClassChange)=\"displayMode($event)\"></c8y-list-display-switch>\n </c8y-action-bar-item>\n\n <ng-container *ngIf=\"limit$ | async as limitStatus\">\n <c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"10\"\n >\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Accept all' | translate }}\"\n type=\"button\"\n *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n (click)=\"acceptAll()\"\n [disabled]=\"canAcceptAll() || limitStatus?.isReached\"\n >\n <i [c8yIcon]=\"'check'\"></i>\n {{ 'Accept all' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"9\"\n >\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"loadAll()\"\n [disabled]=\"isLoading\"\n >\n <i\n [c8yIcon]=\"'refresh'\"\n [ngClass]=\"{ 'icon-spin': isLoading }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item\n [placement]=\"'right'\"\n *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n >\n <c8y-register-device-dropdown></c8y-register-device-dropdown>\n </c8y-action-bar-item>\n\n <c8y-help\n src=\"/docs/device-management-application/registering-devices/#registering-devices\"\n ></c8y-help>\n\n <ng-container *ngIf=\"deviceRequestList.data.length > 0; else noData\">\n <div\n class=\"card-group\"\n [ngClass]=\"gridOrList\"\n >\n <!-- START interact-list sticky header START -->\n <div\n class=\"page-sticky-header hidden-xs\"\n *ngIf=\"gridOrList === 'interact-list'\"\n >\n <div class=\"d-flex\">\n <div class=\"card-header p-l-40\">\n <p translate>Device</p>\n </div>\n <div class=\"card-block card-column-30 p-l-0 m-l-8\">\n <p translate>Status</p>\n </div>\n <div\n class=\"card-block card-column-30 p-0\"\n *ngIf=\"showTokenInputBasedOnSecurityMode()\"\n >\n <p translate>Security token</p>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Security token is required if the connected device uses it.' | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n <div class=\"card-footer card-column-50\">\n <div\n class=\"d-contents\"\n *ngIf=\"isManagementTenant; else noManagement\"\n >\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-30\">\n {{ 'By`user`' | translate }}\n </div>\n <div class=\"card-column-20\">\n {{ 'Tenant ID' | translate }}\n </div>\n </div>\n <ng-template #noManagement>\n <div class=\"d-contents\">\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-50\">\n {{ 'By`user`' | translate }}\n </div>\n </div>\n </ng-template>\n </div>\n <div\n class=\"card-actions-group\"\n style=\"min-width: 176px\"\n >\n <div class=\"btn btn-xs invisible\">\n <!--EMPTY by design-->\n </div>\n </div>\n </div>\n </div>\n <!-- END interact-list sticky header END -->\n\n <div\n class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\"\n *ngIf=\"limitStatus?.isReached\"\n >\n <p\n class=\"alert alert-warning center-block\"\n role=\"alert\"\n >\n <strong>\n {{ limitReachedInfo$ | async }}\n </strong>\n <br />\n <span translate>Please contact your platform administrator.</span>\n </p>\n </div>\n\n <ng-container *ngFor=\"let singleRequest of deviceRequestList.data\">\n <div class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n <div class=\"card\">\n <div class=\"card-header separator\">\n <div class=\"card-icon\">\n <i\n [class]=\"statusProps[singleRequest.status].cls\"\n [c8yIcon]=\"statusProps[singleRequest.status].icon\"\n ></i>\n </div>\n <p\n class=\"card-title text-truncate\"\n title=\"{{ singleRequest.id }}\"\n >\n {{ singleRequest.id }}\n </p>\n </div>\n\n <div class=\"card-block text-center card-column-30\">\n <span\n class=\"text-label-small\"\n translate\n >\n Status\n </span>\n <p>\n <i\n class=\"icon-spin text-primary\"\n c8yIcon=\"refresh\"\n *ngIf=\"singleRequest.status === status.WAITING_FOR_CONNECTION\"\n ></i>\n {{ statusProps[singleRequest.status].label | translate }}\n </p>\n </div>\n\n <ng-container *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n <div\n class=\"card-block text-center card-column-30 p-t-0\"\n [ngClass]=\"{ 'p-b-0': !shouldShowSecurityTokenInput(singleRequest) }\"\n *ngIf=\"showTokenInputBasedOnSecurityMode()\"\n >\n <ng-container *ngIf=\"shouldShowSecurityTokenInput(singleRequest)\">\n <span\n class=\"text-label-small\"\n *ngIf=\"gridOrList !== 'interact-list'\"\n translate\n >\n Security token\n </span>\n <input\n class=\"form-control\"\n type=\"text\"\n [(ngModel)]=\"singleRequest.securityToken\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'A1e3gh5ds' }\"\n [required]=\"requireSecurityToken\"\n />\n </ng-container>\n </div>\n\n <div\n class=\"card-actions-group d-flex a-i-center j-c-center\"\n style=\"min-width: 176px\"\n >\n <button\n class=\"btn btn-sm\"\n title=\"{{\n singleRequest.status === status.PENDING_ACCEPTANCE\n ? ('Remove' | translate)\n : ('Cancel' | translate)\n }}\"\n type=\"button\"\n [ngClass]=\"{\n 'btn-danger': singleRequest.status === status.PENDING_ACCEPTANCE,\n 'btn-default': singleRequest.status !== status.PENDING_ACCEPTANCE\n }\"\n (click)=\"delete(singleRequest.id)\"\n [disabled]=\"isLoading\"\n >\n <span *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\">\n {{ 'Remove' | translate }}\n </span>\n <span *ngIf=\"singleRequest.status !== status.PENDING_ACCEPTANCE\">\n {{ 'Cancel' | translate }}\n </span>\n </button>\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Accept' | translate }}\"\n type=\"button\"\n (click)=\"accept(singleRequest)\"\n *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\"\n [disabled]=\"\n isLoading ||\n limitStatus?.isReached ||\n (!singleRequest.securityToken && requireSecurityToken)\n \"\n >\n {{ 'Accept' | translate }}\n </button>\n </div>\n </ng-container>\n\n <div class=\"card-footer separator text-center card-column-50\">\n <small\n class=\"d-contents\"\n *ngIf=\"isManagementTenant; else noManagement\"\n >\n <div\n class=\"d-contents\"\n *ngIf=\"singleRequest.creationTime && singleRequest.owner\"\n >\n <span class=\"card-column-50\">\n <span\n class=\"text-label-small m-l-4 m-r-4\"\n translate\n >\n Created on`date`\n </span>\n <span data-cy=\"device-registration--creation-date\">\n {{ singleRequest.creationTime | c8yDate }}\n </span>\n </span>\n <span class=\"card-column-30 text-truncate\">\n <span\n class=\"text-label-small m-l-4 m-r-4\"\n translate\n >\n by`user`\n </span>\n <span\n title=\"{{ singleRequest.owner }}\"\n data-cy=\"device-registration--created-by\"\n >\n {{ singleRequest.owner }}\n </span>\n </span>\n <span class=\"card-column-20\">\n <span\n class=\"text-label-small m-l-4 m-r-4\"\n translate\n >\n in`tenant`\n </span>\n <span>{{ singleRequest.tenantId }}</span>\n </span>\n </div>\n <div\n class=\"d-contents\"\n *ngIf=\"!singleRequest.creationTime || !singleRequest.owner\"\n >\n <div class=\"card-column-50\"></div>\n <div class=\"card-column-30\"></div>\n <span\n class=\"text-label-small\"\n translate\n >\n Created in`tenant`\n </span>\n <div class=\"card-column-20\">\n <span>\n {{ singleRequest.tenantId }}\n </span>\n </div>\n </div>\n </small>\n <ng-template #noManagement>\n <small class=\"d-contents\">\n <span class=\"card-column-50\">\n <span\n class=\"text-label-small m-l-4 m-r-4\"\n translate\n >\n Created on`date`\n </span>\n <span data-cy=\"device-registration--creation-date\">\n {{ singleRequest.creationTime | c8yDate }}\n </span>\n </span>\n <span class=\"card-column-50 text-truncate\">\n <span\n class=\"text-label-small m-l-4 m-r-4\"\n translate\n >\n by`user`\n </span>\n <span\n title=\"{{ singleRequest.owner }}\"\n data-cy=\"device-registration--created-by\"\n >\n {{ singleRequest.owner }}\n </span>\n </span>\n </small>\n </ng-template>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <c8y-load-more\n [paging]=\"deviceRequestList.paging\"\n [hidden]=\"true\"\n (onLoad)=\"updateList($event)\"\n ></c8y-load-more>\n </ng-container>\n\n <ng-template #noData>\n <div class=\"c8y-empty-state m-t-40 text-center\">\n <h1 class=\"c8y-icon c8y-icon-device-connect c8y-icon-duocolor\"></h1>\n <ng-container *ngIf=\"limitStatus?.isReached; else limitNotReached\">\n <h3>\n {{ limitReachedInfo$ | async }}\n </h3>\n <p translate>Please contact your platform administrator.</p>\n </ng-container>\n <ng-template #limitNotReached>\n <h3 translate>No pending registrations to display.</h3>\n <p\n *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n translate\n >\n Use the \"Register device\" dropdown in the top right corner.\n </p>\n </ng-template>\n </div>\n </ng-template>\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i5$1.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: i1$1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1$1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.IfAllowedDirective, selector: "[c8yIfAllowed]", inputs: ["c8yIfAllowed", "c8yIfAllowedAllowAny"] }, { kind: "component", type: i1$1.LoadMoreComponent, selector: "c8y-load-more", inputs: ["paging", "useIntersection", "hidden", "container", "class", "maxIterations", "noMoreDataHint", "loadingTemplate", "hideNoMoreDataHint", "loadNextLabel", "loadingLabel"], outputs: ["onLoad"] }, { kind: "component", type: i1$1.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "component", type: i1$1.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i1$1.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i1$1.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i6$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1$1.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i1$1.HelpComponent, selector: "c8y-help", inputs: ["src", "isCollapsed", "priority", "icon"] }, { kind: "component", type: i1$1.ListDisplaySwitchComponent, selector: "c8y-list-display-switch", inputs: ["listKey", "listLength", "filterPipe"], outputs: ["onListClassChange"] }, { kind: "component", type: RegisterDeviceDropdownComponent, selector: "c8y-register-device-dropdown" }, { kind: "pipe", type: i1$1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.DatePipe, name: "c8yDate" }] }); }
|
|
624
830
|
}
|
|
625
831
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: DeviceRegistrationViewComponent, decorators: [{
|
|
626
832
|
type: Component,
|
|
627
833
|
args: [{ selector: 'c8y-device-registration-view', template: "<ng-container *ngIf=\"deviceRequests$ | async as deviceRequestList\">\n <c8y-title>\n {{ 'Device registration' | translate }}\n <small *ngIf=\"deviceRequestList.data.length === 1\">1 {{ 'new device' | translate }}</small>\n <small *ngIf=\"deviceRequestList.data.length > 1\">\n {{ deviceRequestList.data.length }} {{ 'new devices' | translate }}\n </small>\n </c8y-title>\n\n <c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'exchange'\"\n [label]=\"'Devices' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-device-connect'\"\n [label]=\"'Device registration' | translate\"\n ></c8y-breadcrumb-item>\n </c8y-breadcrumb>\n\n <c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"navbar-form hidden-xs\"\n >\n <c8y-list-display-switch (onListClassChange)=\"displayMode($event)\"></c8y-list-display-switch>\n </c8y-action-bar-item>\n\n <ng-container *ngIf=\"limit$ | async as limitStatus\">\n <c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"10\"\n >\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Accept all' | translate }}\"\n type=\"button\"\n *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n (click)=\"acceptAll()\"\n [disabled]=\"canAcceptAll() || limitStatus?.isReached\"\n >\n <i [c8yIcon]=\"'check'\"></i>\n {{ 'Accept all' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item\n [placement]=\"'right'\"\n [priority]=\"9\"\n >\n <button\n class=\"btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n (click)=\"loadAll()\"\n [disabled]=\"isLoading\"\n >\n <i\n [c8yIcon]=\"'refresh'\"\n [ngClass]=\"{ 'icon-spin': isLoading }\"\n ></i>\n {{ 'Reload' | translate }}\n </button>\n </c8y-action-bar-item>\n\n <c8y-action-bar-item\n [placement]=\"'right'\"\n *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n >\n <c8y-register-device-dropdown></c8y-register-device-dropdown>\n </c8y-action-bar-item>\n\n <c8y-help\n src=\"/docs/device-management-application/registering-devices/#registering-devices\"\n ></c8y-help>\n\n <ng-container *ngIf=\"deviceRequestList.data.length > 0; else noData\">\n <div\n class=\"card-group\"\n [ngClass]=\"gridOrList\"\n >\n <!-- START interact-list sticky header START -->\n <div\n class=\"page-sticky-header hidden-xs\"\n *ngIf=\"gridOrList === 'interact-list'\"\n >\n <div class=\"d-flex\">\n <div class=\"card-header p-l-40\">\n <p translate>Device</p>\n </div>\n <div class=\"card-block card-column-30 p-l-0 m-l-8\">\n <p translate>Status</p>\n </div>\n <div\n class=\"card-block card-column-30 p-0\"\n *ngIf=\"showTokenInputBasedOnSecurityMode()\"\n >\n <p translate>Security token</p>\n <button\n class=\"btn-help\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'Security token is required if the connected device uses it.' | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n <div class=\"card-footer card-column-50\">\n <div\n class=\"d-contents\"\n *ngIf=\"isManagementTenant; else noManagement\"\n >\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-30\">\n {{ 'By`user`' | translate }}\n </div>\n <div class=\"card-column-20\">\n {{ 'Tenant ID' | translate }}\n </div>\n </div>\n <ng-template #noManagement>\n <div class=\"d-contents\">\n <div class=\"card-column-50\">\n {{ 'Created' | translate }}\n </div>\n <div class=\"card-column-50\">\n {{ 'By`user`' | translate }}\n </div>\n </div>\n </ng-template>\n </div>\n <div\n class=\"card-actions-group\"\n style=\"min-width: 176px\"\n >\n <div class=\"btn btn-xs invisible\">\n <!--EMPTY by design-->\n </div>\n </div>\n </div>\n </div>\n <!-- END interact-list sticky header END -->\n\n <div\n class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\"\n *ngIf=\"limitStatus?.isReached\"\n >\n <p\n class=\"alert alert-warning center-block\"\n role=\"alert\"\n >\n <strong>\n {{ limitReachedInfo$ | async }}\n </strong>\n <br />\n <span translate>Please contact your platform administrator.</span>\n </p>\n </div>\n\n <ng-container *ngFor=\"let singleRequest of deviceRequestList.data\">\n <div class=\"col-xs-12 col-sm-6 col-md-4 col-lg-3\">\n <div class=\"card\">\n <div class=\"card-header separator\">\n <div class=\"card-icon\">\n <i\n [class]=\"statusProps[singleRequest.status].cls\"\n [c8yIcon]=\"statusProps[singleRequest.status].icon\"\n ></i>\n </div>\n <p\n class=\"card-title text-truncate\"\n title=\"{{ singleRequest.id }}\"\n >\n {{ singleRequest.id }}\n </p>\n </div>\n\n <div class=\"card-block text-center card-column-30\">\n <span\n class=\"text-label-small\"\n translate\n >\n Status\n </span>\n <p>\n <i\n class=\"icon-spin text-primary\"\n c8yIcon=\"refresh\"\n *ngIf=\"singleRequest.status === status.WAITING_FOR_CONNECTION\"\n ></i>\n {{ statusProps[singleRequest.status].label | translate }}\n </p>\n </div>\n\n <ng-container *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\">\n <div\n class=\"card-block text-center card-column-30 p-t-0\"\n [ngClass]=\"{ 'p-b-0': !shouldShowSecurityTokenInput(singleRequest) }\"\n *ngIf=\"showTokenInputBasedOnSecurityMode()\"\n >\n <ng-container *ngIf=\"shouldShowSecurityTokenInput(singleRequest)\">\n <span\n class=\"text-label-small\"\n *ngIf=\"gridOrList !== 'interact-list'\"\n translate\n >\n Security token\n </span>\n <input\n class=\"form-control\"\n type=\"text\"\n [(ngModel)]=\"singleRequest.securityToken\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'A1e3gh5ds' }\"\n [required]=\"requireSecurityToken\"\n />\n </ng-container>\n </div>\n\n <div\n class=\"card-actions-group d-flex a-i-center j-c-center\"\n style=\"min-width: 176px\"\n >\n <button\n class=\"btn btn-sm\"\n title=\"{{\n singleRequest.status === status.PENDING_ACCEPTANCE\n ? ('Remove' | translate)\n : ('Cancel' | translate)\n }}\"\n type=\"button\"\n [ngClass]=\"{\n 'btn-danger': singleRequest.status === status.PENDING_ACCEPTANCE,\n 'btn-default': singleRequest.status !== status.PENDING_ACCEPTANCE\n }\"\n (click)=\"delete(singleRequest.id)\"\n [disabled]=\"isLoading\"\n >\n <span *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\">\n {{ 'Remove' | translate }}\n </span>\n <span *ngIf=\"singleRequest.status !== status.PENDING_ACCEPTANCE\">\n {{ 'Cancel' | translate }}\n </span>\n </button>\n <button\n class=\"btn btn-primary btn-sm\"\n title=\"{{ 'Accept' | translate }}\"\n type=\"button\"\n (click)=\"accept(singleRequest)\"\n *ngIf=\"singleRequest.status === status.PENDING_ACCEPTANCE\"\n [disabled]=\"\n isLoading ||\n limitStatus?.isReached ||\n (!singleRequest.securityToken && requireSecurityToken)\n \"\n >\n {{ 'Accept' | translate }}\n </button>\n </div>\n </ng-container>\n\n <div class=\"card-footer separator text-center card-column-50\">\n <small\n class=\"d-contents\"\n *ngIf=\"isManagementTenant; else noManagement\"\n >\n <div\n class=\"d-contents\"\n *ngIf=\"singleRequest.creationTime && singleRequest.owner\"\n >\n <span class=\"card-column-50\">\n <span\n class=\"text-label-small m-l-4 m-r-4\"\n translate\n >\n Created on`date`\n </span>\n <span data-cy=\"device-registration--creation-date\">\n {{ singleRequest.creationTime | c8yDate }}\n </span>\n </span>\n <span class=\"card-column-30 text-truncate\">\n <span\n class=\"text-label-small m-l-4 m-r-4\"\n translate\n >\n by`user`\n </span>\n <span\n title=\"{{ singleRequest.owner }}\"\n data-cy=\"device-registration--created-by\"\n >\n {{ singleRequest.owner }}\n </span>\n </span>\n <span class=\"card-column-20\">\n <span\n class=\"text-label-small m-l-4 m-r-4\"\n translate\n >\n in`tenant`\n </span>\n <span>{{ singleRequest.tenantId }}</span>\n </span>\n </div>\n <div\n class=\"d-contents\"\n *ngIf=\"!singleRequest.creationTime || !singleRequest.owner\"\n >\n <div class=\"card-column-50\"></div>\n <div class=\"card-column-30\"></div>\n <span\n class=\"text-label-small\"\n translate\n >\n Created in`tenant`\n </span>\n <div class=\"card-column-20\">\n <span>\n {{ singleRequest.tenantId }}\n </span>\n </div>\n </div>\n </small>\n <ng-template #noManagement>\n <small class=\"d-contents\">\n <span class=\"card-column-50\">\n <span\n class=\"text-label-small m-l-4 m-r-4\"\n translate\n >\n Created on`date`\n </span>\n <span data-cy=\"device-registration--creation-date\">\n {{ singleRequest.creationTime | c8yDate }}\n </span>\n </span>\n <span class=\"card-column-50 text-truncate\">\n <span\n class=\"text-label-small m-l-4 m-r-4\"\n translate\n >\n by`user`\n </span>\n <span\n title=\"{{ singleRequest.owner }}\"\n data-cy=\"device-registration--created-by\"\n >\n {{ singleRequest.owner }}\n </span>\n </span>\n </small>\n </ng-template>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <c8y-load-more\n [paging]=\"deviceRequestList.paging\"\n [hidden]=\"true\"\n (onLoad)=\"updateList($event)\"\n ></c8y-load-more>\n </ng-container>\n\n <ng-template #noData>\n <div class=\"c8y-empty-state m-t-40 text-center\">\n <h1 class=\"c8y-icon c8y-icon-device-connect c8y-icon-duocolor\"></h1>\n <ng-container *ngIf=\"limitStatus?.isReached; else limitNotReached\">\n <h3>\n {{ limitReachedInfo$ | async }}\n </h3>\n <p translate>Please contact your platform administrator.</p>\n </ng-container>\n <ng-template #limitNotReached>\n <h3 translate>No pending registrations to display.</h3>\n <p\n *c8yIfAllowed=\"['ROLE_DEVICE_CONTROL_ADMIN']\"\n translate\n >\n Use the \"Register device\" dropdown in the top right corner.\n </p>\n </ng-template>\n </div>\n </ng-template>\n </ng-container>\n</ng-container>\n" }]
|
|
628
|
-
}], ctorParameters: () => [{ type: RegisterDeviceService }, { type: i1$
|
|
834
|
+
}], ctorParameters: () => [{ type: RegisterDeviceService }, { type: i1$1.DeviceBootstrapRealtimeService }, { type: i1$1.TenantUiService }, { type: i1$1.ModalService }, { type: i3$1.TranslateService }, { type: i1$1.OptionsService }] });
|
|
629
835
|
|
|
630
836
|
class RegisterDeviceNavigationFactory {
|
|
631
837
|
constructor(permissions) {
|
|
@@ -649,12 +855,12 @@ class RegisterDeviceNavigationFactory {
|
|
|
649
855
|
}
|
|
650
856
|
return nav;
|
|
651
857
|
}
|
|
652
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RegisterDeviceNavigationFactory, deps: [{ token: i1$
|
|
858
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RegisterDeviceNavigationFactory, deps: [{ token: i1$1.Permissions }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
653
859
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RegisterDeviceNavigationFactory }); }
|
|
654
860
|
}
|
|
655
861
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: RegisterDeviceNavigationFactory, decorators: [{
|
|
656
862
|
type: Injectable
|
|
657
|
-
}], ctorParameters: () => [{ type: i1$
|
|
863
|
+
}], ctorParameters: () => [{ type: i1$1.Permissions }] });
|
|
658
864
|
|
|
659
865
|
class BaseExtensibleDeviceRegistrationService {
|
|
660
866
|
constructor(applicationService, stateService) {
|
|
@@ -746,22 +952,12 @@ class ExtensibleDeviceRegistrationService extends BaseExtensibleDeviceRegistrati
|
|
|
746
952
|
const data = await res.json();
|
|
747
953
|
return { res, data };
|
|
748
954
|
}
|
|
749
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ExtensibleDeviceRegistrationService, deps: [{ token:
|
|
955
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ExtensibleDeviceRegistrationService, deps: [{ token: i2.ApplicationService }, { token: i1$1.AppStateService }, { token: i2.FetchClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
750
956
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ExtensibleDeviceRegistrationService }); }
|
|
751
957
|
}
|
|
752
958
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ExtensibleDeviceRegistrationService, decorators: [{
|
|
753
959
|
type: Injectable
|
|
754
|
-
}], ctorParameters: () => [{ type:
|
|
755
|
-
|
|
756
|
-
const PRODUCT_EXPERIENCE_BASE_REGISTRATION = {
|
|
757
|
-
EVENT: 'deviceRegistration',
|
|
758
|
-
COMPONENT: {
|
|
759
|
-
BULK: 'bulk-registration',
|
|
760
|
-
EXTENSIBLE_BULK: 'bulk-extensible-registration',
|
|
761
|
-
EXTENSIBLE_SINGLE: 'single-extensible-registration'
|
|
762
|
-
},
|
|
763
|
-
RESULT: { SUCCESS: 'registrationSuccess', FAILURE: 'registrationFailure' }
|
|
764
|
-
};
|
|
960
|
+
}], ctorParameters: () => [{ type: i2.ApplicationService }, { type: i1$1.AppStateService }, { type: i2.FetchClient }] });
|
|
765
961
|
|
|
766
962
|
class ExtensibleDeviceRegistrationStepperComponent {
|
|
767
963
|
constructor(customProviderService, registerDeviceService, bsModalRef, gainsightService) {
|
|
@@ -846,13 +1042,13 @@ class ExtensibleDeviceRegistrationStepperComponent {
|
|
|
846
1042
|
});
|
|
847
1043
|
this.errorMessage = message;
|
|
848
1044
|
}
|
|
849
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ExtensibleDeviceRegistrationStepperComponent, deps: [{ token: ExtensibleDeviceRegistrationService }, { token: RegisterDeviceService }, { token: i4.BsModalRef }, { token: i1$
|
|
850
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: ExtensibleDeviceRegistrationStepperComponent, selector: "c8y-extensible-device-registration-stepper", inputs: { contextPath: "contextPath", labels: "labels", steps: "steps" }, viewQueries: [{ propertyName: "stepper", first: true, predicate: C8yStepper, descendants: true, static: true }], ngImport: i0, template: "<c8y-stepper\n [disableProgressButtons]=\"true\"\n [disableDefaultIcons]=\"{ edit: true, done: false }\"\n [customClasses]=\"['m-40', 'm-t-8', 'm-b-16']\"\n>\n <cdk-step *ngFor=\"let step of steps; let i = index\" [stepControl]=\"forms[i]\" [label]=\"labels[i]\">\n <c8y-form-group class=\"form-group p-24 p-b-0 p-t-16\">\n <formly-form [form]=\"forms[i]\" [fields]=\"step\" [model]=\"model\"></formly-form>\n </c8y-form-group>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n *ngIf=\"isRegistrationStep()\"\n [showButtons]=\"{ cancel: true, back: true, next: true }\"\n [labels]=\"{ next: 'Register' }\"\n (onCancel)=\"close()\"\n (onNext)=\"save()\"\n [pending]=\"pendingStatus\"\n [disabled]=\"forms[i].invalid\"\n ></c8y-stepper-buttons>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n *ngIf=\"!isRegistrationStep()\"\n [showButtons]=\"{ cancel: true, back: i !== 0, next: true }\"\n [disabled]=\"forms[i].invalid\"\n (onCancel)=\"close()\"\n ></c8y-stepper-buttons>\n </cdk-step>\n <cdk-step [state]=\"finalStepStatus()\" label=\"{{ 'Summary' | translate }}\">\n <c8y-operation-result\n *ngIf=\"!errorMessage; else errorInfo\"\n text=\"{{ message | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"success\"\n class=\"lead\"\n data-cy=\"success\"\n ></c8y-operation-result>\n <ng-template #errorInfo>\n <c8y-operation-result\n text=\"{{ errorMessage | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"error\"\n class=\"lead\"\n data-cy=\"error\"\n ></c8y-operation-result>\n </ng-template>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n [showButtons]=\"{ cancel: errorMessage, back: errorMessage, next: !errorMessage }\"\n [labels]=\"{ back: 'Fix issue', next: 'Close' }\"\n (onCancel)=\"close()\"\n (onNext)=\"complete()\"\n (onBack)=\"goToFirstStep()\"\n ></c8y-stepper-buttons>\n </cdk-step>\n</c8y-stepper>\n", dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1$
|
|
1045
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ExtensibleDeviceRegistrationStepperComponent, deps: [{ token: ExtensibleDeviceRegistrationService }, { token: RegisterDeviceService }, { token: i4.BsModalRef }, { token: i1$1.GainsightService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1046
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: ExtensibleDeviceRegistrationStepperComponent, selector: "c8y-extensible-device-registration-stepper", inputs: { contextPath: "contextPath", labels: "labels", steps: "steps" }, viewQueries: [{ propertyName: "stepper", first: true, predicate: C8yStepper, descendants: true, static: true }], ngImport: i0, template: "<c8y-stepper\n [disableProgressButtons]=\"true\"\n [disableDefaultIcons]=\"{ edit: true, done: false }\"\n [customClasses]=\"['m-40', 'm-t-8', 'm-b-16']\"\n>\n <cdk-step *ngFor=\"let step of steps; let i = index\" [stepControl]=\"forms[i]\" [label]=\"labels[i]\">\n <c8y-form-group class=\"form-group p-24 p-b-0 p-t-16\">\n <formly-form [form]=\"forms[i]\" [fields]=\"step\" [model]=\"model\"></formly-form>\n </c8y-form-group>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n *ngIf=\"isRegistrationStep()\"\n [showButtons]=\"{ cancel: true, back: true, next: true }\"\n [labels]=\"{ next: 'Register' }\"\n (onCancel)=\"close()\"\n (onNext)=\"save()\"\n [pending]=\"pendingStatus\"\n [disabled]=\"forms[i].invalid\"\n ></c8y-stepper-buttons>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n *ngIf=\"!isRegistrationStep()\"\n [showButtons]=\"{ cancel: true, back: i !== 0, next: true }\"\n [disabled]=\"forms[i].invalid\"\n (onCancel)=\"close()\"\n ></c8y-stepper-buttons>\n </cdk-step>\n <cdk-step [state]=\"finalStepStatus()\" label=\"{{ 'Summary' | translate }}\">\n <c8y-operation-result\n *ngIf=\"!errorMessage; else errorInfo\"\n text=\"{{ message | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"success\"\n class=\"lead\"\n data-cy=\"success\"\n ></c8y-operation-result>\n <ng-template #errorInfo>\n <c8y-operation-result\n text=\"{{ errorMessage | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"error\"\n class=\"lead\"\n data-cy=\"error\"\n ></c8y-operation-result>\n </ng-template>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n [showButtons]=\"{ cancel: errorMessage, back: errorMessage, next: !errorMessage }\"\n [labels]=\"{ back: 'Fix issue', next: 'Close' }\"\n (onCancel)=\"close()\"\n (onNext)=\"complete()\"\n (onBack)=\"goToFirstStep()\"\n ></c8y-stepper-buttons>\n </cdk-step>\n</c8y-stepper>\n", dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1$1.OperationResultComponent, selector: "c8y-operation-result", inputs: ["text", "vertical", "size", "type"] }, { kind: "component", type: i1$1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: i1$1.C8yStepper, selector: "c8y-stepper", inputs: ["disableDefaultIcons", "disableProgressButtons", "customClasses", "hideStepProgress", "useStepLabelsAsTitlesOnly"], outputs: ["onStepChange"] }, { kind: "component", type: i6.CdkStep, selector: "cdk-step", inputs: ["stepControl", "label", "errorMessage", "aria-label", "aria-labelledby", "state", "editable", "optional", "completed", "hasError"], outputs: ["interacted"], exportAs: ["cdkStep"] }, { kind: "component", type: i1$1.C8yStepperButtons, selector: "c8y-stepper-buttons", inputs: ["labels", "pending", "disabled", "showButtons"], outputs: ["onCancel", "onNext", "onBack", "onCustom"] }, { kind: "component", type: i7.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "pipe", type: i1$1.C8yTranslatePipe, name: "translate" }] }); }
|
|
851
1047
|
}
|
|
852
1048
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ExtensibleDeviceRegistrationStepperComponent, decorators: [{
|
|
853
1049
|
type: Component,
|
|
854
1050
|
args: [{ selector: 'c8y-extensible-device-registration-stepper', template: "<c8y-stepper\n [disableProgressButtons]=\"true\"\n [disableDefaultIcons]=\"{ edit: true, done: false }\"\n [customClasses]=\"['m-40', 'm-t-8', 'm-b-16']\"\n>\n <cdk-step *ngFor=\"let step of steps; let i = index\" [stepControl]=\"forms[i]\" [label]=\"labels[i]\">\n <c8y-form-group class=\"form-group p-24 p-b-0 p-t-16\">\n <formly-form [form]=\"forms[i]\" [fields]=\"step\" [model]=\"model\"></formly-form>\n </c8y-form-group>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n *ngIf=\"isRegistrationStep()\"\n [showButtons]=\"{ cancel: true, back: true, next: true }\"\n [labels]=\"{ next: 'Register' }\"\n (onCancel)=\"close()\"\n (onNext)=\"save()\"\n [pending]=\"pendingStatus\"\n [disabled]=\"forms[i].invalid\"\n ></c8y-stepper-buttons>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n *ngIf=\"!isRegistrationStep()\"\n [showButtons]=\"{ cancel: true, back: i !== 0, next: true }\"\n [disabled]=\"forms[i].invalid\"\n (onCancel)=\"close()\"\n ></c8y-stepper-buttons>\n </cdk-step>\n <cdk-step [state]=\"finalStepStatus()\" label=\"{{ 'Summary' | translate }}\">\n <c8y-operation-result\n *ngIf=\"!errorMessage; else errorInfo\"\n text=\"{{ message | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"success\"\n class=\"lead\"\n data-cy=\"success\"\n ></c8y-operation-result>\n <ng-template #errorInfo>\n <c8y-operation-result\n text=\"{{ errorMessage | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"error\"\n class=\"lead\"\n data-cy=\"error\"\n ></c8y-operation-result>\n </ng-template>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block modal-footer separator-top bg-component\"\n [showButtons]=\"{ cancel: errorMessage, back: errorMessage, next: !errorMessage }\"\n [labels]=\"{ back: 'Fix issue', next: 'Close' }\"\n (onCancel)=\"close()\"\n (onNext)=\"complete()\"\n (onBack)=\"goToFirstStep()\"\n ></c8y-stepper-buttons>\n </cdk-step>\n</c8y-stepper>\n" }]
|
|
855
|
-
}], ctorParameters: () => [{ type: ExtensibleDeviceRegistrationService }, { type: RegisterDeviceService }, { type: i4.BsModalRef }, { type: i1$
|
|
1051
|
+
}], ctorParameters: () => [{ type: ExtensibleDeviceRegistrationService }, { type: RegisterDeviceService }, { type: i4.BsModalRef }, { type: i1$1.GainsightService }], propDecorators: { stepper: [{
|
|
856
1052
|
type: ViewChild,
|
|
857
1053
|
args: [C8yStepper, { static: true }]
|
|
858
1054
|
}], contextPath: [{
|
|
@@ -886,13 +1082,13 @@ class ExtensibleDeviceRegistrationModalComponent {
|
|
|
886
1082
|
return [this.jsonschema.toFieldConfig(step)];
|
|
887
1083
|
});
|
|
888
1084
|
}
|
|
889
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ExtensibleDeviceRegistrationModalComponent, deps: [{ token: i4.BsModalRef }, { token: i1$
|
|
890
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: ExtensibleDeviceRegistrationModalComponent, selector: "extensible-device-registration-modal", ngImport: i0, template: "<c8y-modal\n [title]=\"title | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span class=\"c8y-icon c8y-icon-device-connect\"></span>\n </ng-container>\n <ng-container *ngIf=\"pages as steps; else loadingOrError\">\n <c8y-extensible-device-registration-stepper\n c8y-modal-body\n [steps]=\"steps\"\n [labels]=\"labels\"\n [contextPath]=\"contextPath\"\n ></c8y-extensible-device-registration-stepper>\n </ng-container>\n <ng-template #loadingOrError>\n <ng-container *ngIf=\"loadingErrorMessage; else loading\">\n <c8y-operation-result\n class=\"lead text-regular\"\n type=\"error\"\n text=\"{{ loadingErrorMessage | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n data-cy=\"error\"\n ></c8y-operation-result>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Close' | translate }}\"\n type=\"button\"\n (click)=\"bsModalRef.hide()\"\n >\n {{ 'Close' | translate }}\n </button>\n </div>\n </ng-container>\n <ng-template #loading>\n <div class=\"modal-header modal-header-info text-center\">\n <c8y-loading\n class=\"text-center\"\n layout=\"application\"\n [message]=\"'Loading the registration form definition\u2026' | translate\"\n ></c8y-loading>\n </div>\n </ng-template>\n </ng-template>\n</c8y-modal>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1$
|
|
1085
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ExtensibleDeviceRegistrationModalComponent, deps: [{ token: i4.BsModalRef }, { token: i1$1.C8yJSONSchema }, { token: ExtensibleDeviceRegistrationService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1086
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: ExtensibleDeviceRegistrationModalComponent, selector: "extensible-device-registration-modal", ngImport: i0, template: "<c8y-modal\n [title]=\"title | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span class=\"c8y-icon c8y-icon-device-connect\"></span>\n </ng-container>\n <ng-container *ngIf=\"pages as steps; else loadingOrError\">\n <c8y-extensible-device-registration-stepper\n c8y-modal-body\n [steps]=\"steps\"\n [labels]=\"labels\"\n [contextPath]=\"contextPath\"\n ></c8y-extensible-device-registration-stepper>\n </ng-container>\n <ng-template #loadingOrError>\n <ng-container *ngIf=\"loadingErrorMessage; else loading\">\n <c8y-operation-result\n class=\"lead text-regular\"\n type=\"error\"\n text=\"{{ loadingErrorMessage | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n data-cy=\"error\"\n ></c8y-operation-result>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Close' | translate }}\"\n type=\"button\"\n (click)=\"bsModalRef.hide()\"\n >\n {{ 'Close' | translate }}\n </button>\n </div>\n </ng-container>\n <ng-template #loading>\n <div class=\"modal-header modal-header-info text-center\">\n <c8y-loading\n class=\"text-center\"\n layout=\"application\"\n [message]=\"'Loading the registration form definition\u2026' | translate\"\n ></c8y-loading>\n </div>\n </ng-template>\n </ng-template>\n</c8y-modal>\n", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1$1.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i1$1.OperationResultComponent, selector: "c8y-operation-result", inputs: ["text", "vertical", "size", "type"] }, { kind: "component", type: i1$1.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: ExtensibleDeviceRegistrationStepperComponent, selector: "c8y-extensible-device-registration-stepper", inputs: ["contextPath", "labels", "steps"] }, { kind: "pipe", type: i1$1.C8yTranslatePipe, name: "translate" }] }); }
|
|
891
1087
|
}
|
|
892
1088
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ExtensibleDeviceRegistrationModalComponent, decorators: [{
|
|
893
1089
|
type: Component,
|
|
894
1090
|
args: [{ selector: 'extensible-device-registration-modal', template: "<c8y-modal\n [title]=\"title | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <span class=\"c8y-icon c8y-icon-device-connect\"></span>\n </ng-container>\n <ng-container *ngIf=\"pages as steps; else loadingOrError\">\n <c8y-extensible-device-registration-stepper\n c8y-modal-body\n [steps]=\"steps\"\n [labels]=\"labels\"\n [contextPath]=\"contextPath\"\n ></c8y-extensible-device-registration-stepper>\n </ng-container>\n <ng-template #loadingOrError>\n <ng-container *ngIf=\"loadingErrorMessage; else loading\">\n <c8y-operation-result\n class=\"lead text-regular\"\n type=\"error\"\n text=\"{{ loadingErrorMessage | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n data-cy=\"error\"\n ></c8y-operation-result>\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Close' | translate }}\"\n type=\"button\"\n (click)=\"bsModalRef.hide()\"\n >\n {{ 'Close' | translate }}\n </button>\n </div>\n </ng-container>\n <ng-template #loading>\n <div class=\"modal-header modal-header-info text-center\">\n <c8y-loading\n class=\"text-center\"\n layout=\"application\"\n [message]=\"'Loading the registration form definition\u2026' | translate\"\n ></c8y-loading>\n </div>\n </ng-template>\n </ng-template>\n</c8y-modal>\n" }]
|
|
895
|
-
}], ctorParameters: () => [{ type: i4.BsModalRef }, { type: i1$
|
|
1091
|
+
}], ctorParameters: () => [{ type: i4.BsModalRef }, { type: i1$1.C8yJSONSchema }, { type: ExtensibleDeviceRegistrationService }] });
|
|
896
1092
|
|
|
897
1093
|
class ExtensibleDeviceRegistrationButtonComponent {
|
|
898
1094
|
constructor(deviceRegistrationService, modalService) {
|
|
@@ -913,7 +1109,7 @@ class ExtensibleDeviceRegistrationButtonComponent {
|
|
|
913
1109
|
});
|
|
914
1110
|
}
|
|
915
1111
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ExtensibleDeviceRegistrationButtonComponent, deps: [{ token: ExtensibleDeviceRegistrationService }, { token: i4.BsModalService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
916
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: ExtensibleDeviceRegistrationButtonComponent, selector: "extensible-device-registration-provider", ngImport: i0, template: "<div *ngFor=\"let provider of providersMetaData | async\">\n <button title=\"{{ provider.name | translate }}\" type=\"button\" (click)=\"click(provider)\">\n <i c8yIcon=\"c8y-device-connect\"></i>\n {{ provider.name | translate }}\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: i1$
|
|
1112
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: ExtensibleDeviceRegistrationButtonComponent, selector: "extensible-device-registration-provider", ngImport: i0, template: "<div *ngFor=\"let provider of providersMetaData | async\">\n <button title=\"{{ provider.name | translate }}\" type=\"button\" (click)=\"click(provider)\">\n <i c8yIcon=\"c8y-device-connect\"></i>\n {{ provider.name | translate }}\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: i1$1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: i1$1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] }); }
|
|
917
1113
|
}
|
|
918
1114
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ExtensibleDeviceRegistrationButtonComponent, decorators: [{
|
|
919
1115
|
type: Component,
|
|
@@ -956,12 +1152,12 @@ class BulkExtensibleDeviceRegistrationService extends BaseExtensibleDeviceRegist
|
|
|
956
1152
|
body.append('file', newFile, newFile.name);
|
|
957
1153
|
return body;
|
|
958
1154
|
}
|
|
959
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: BulkExtensibleDeviceRegistrationService, deps: [{ token:
|
|
1155
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: BulkExtensibleDeviceRegistrationService, deps: [{ token: i2.ApplicationService }, { token: i1$1.AppStateService }, { token: i2.FetchClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
960
1156
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: BulkExtensibleDeviceRegistrationService }); }
|
|
961
1157
|
}
|
|
962
1158
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: BulkExtensibleDeviceRegistrationService, decorators: [{
|
|
963
1159
|
type: Injectable
|
|
964
|
-
}], ctorParameters: () => [{ type:
|
|
1160
|
+
}], ctorParameters: () => [{ type: i2.ApplicationService }, { type: i1$1.AppStateService }, { type: i2.FetchClient }] });
|
|
965
1161
|
|
|
966
1162
|
const extensibleDeviceRegistrationBulkSchema = {
|
|
967
1163
|
$schema: 'https://json-schema.org/draft/2019-09/schema',
|
|
@@ -1059,128 +1255,13 @@ class ExtensibleBulkDeviceRegistrationModalComponent {
|
|
|
1059
1255
|
cancel() {
|
|
1060
1256
|
this.bsModalRef.hide();
|
|
1061
1257
|
}
|
|
1062
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ExtensibleBulkDeviceRegistrationModalComponent, deps: [{ token: i1$
|
|
1063
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: ExtensibleBulkDeviceRegistrationModalComponent, selector: "extensible-device-registration-modal-component", viewQueries: [{ propertyName: "stepper", first: true, predicate: C8yStepper, descendants: true, static: true }], ngImport: i0, template: "<c8y-modal\n [title]=\"title | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <i c8yIcon=\"c8y-device-connect\"></i>\n </ng-container>\n <c8y-stepper [hideStepProgress]=\"true\" linear class=\"p-t-16\" c8y-modal-body>\n <ng-container *ngIf=\"!loadingError\">\n <cdk-step>\n <div class=\"sticky-top bg-component separator-bottom\">\n <p\n class=\"p-l-24 p-r-24 p-t-16 p-b-16 m-b-0 separator-bottom text-16 text-medium text-center bg-component\"\n translate\n >\n Register devices in bulk\n </p>\n <c8y-form-group class=\"p-24 p-t-16 p-b-8 m-b-0\">\n <formly-form [form]=\"form\" [fields]=\"template\" [model]=\"model\"></formly-form>\n </c8y-form-group>\n </div>\n <div\n *ngFor=\"let example of examples\"\n class=\"bg-gray-white separator-bottom p-t-16 p-b-16 p-l-24 p-r-24\"\n >\n <p class=\"m-b-8 text-medium\">\n {{ example.title | translate }}\n </p>\n <p class=\"small m-b-8\">{{ example.description | translate }}</p>\n <a\n title=\"{{ 'Download template' | translate }}\"\n class=\"btn btn-default btn-sm\"\n target=\"_self\"\n [href]=\"example.url\"\n download=\"{{ 'Example bulk registration - template.csv' | translate }}\"\n >\n <i c8yIcon=\"download\"></i>\n <span translate>Download template</span>\n </a>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [disabled]=\"form.invalid\"\n [pending]=\"pending\"\n (onCancel)=\"cancel()\"\n (onNext)=\"upload()\"\n [labels]=\"{ next: 'Upload' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </ng-container>\n <cdk-step state=\"final\">\n <div class=\"p-24\">\n <div *ngIf=\"success; else fail\">\n <c8y-operation-result\n text=\"{{ message | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"success\"\n class=\"lead\"\n data-cy=\"success\"\n ></c8y-operation-result>\n <c8y-list-group class=\"separator-top m-t-16\">\n <c8y-li>\n <c8y-li-icon class=\"text-success\" [icon]=\"'check-circle'\"></c8y-li-icon>\n <p translate>File successfully uploaded.</p>\n <c8y-li-collapse>\n <pre><code>{{ result | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n </c8y-list-group>\n </div>\n <ng-template #fail>\n <c8y-operation-result\n text=\"{{ message | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"error\"\n class=\"lead\"\n data-cy=\"error\"\n ></c8y-operation-result>\n <c8y-list-group *ngIf=\"result\" class=\"separator-top m-t-16\">\n <c8y-li>\n <c8y-li-icon class=\"text-danger\" [icon]=\"'ban'\"></c8y-li-icon>\n <p translate>Bulk operation failed.</p>\n <c8y-li-collapse>\n <pre><code>{{ result | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n </c8y-list-group>\n </ng-template>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-component\"\n [showButtons]=\"{ next: true }\"\n (onNext)=\"complete()\"\n [labels]=\"{ next: success ? 'Complete' : 'Cancel' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n</c8y-modal>\n", dependencies: [{ kind: "directive", type: i1$
|
|
1258
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ExtensibleBulkDeviceRegistrationModalComponent, deps: [{ token: i1$1.C8yJSONSchema }, { token: BulkExtensibleDeviceRegistrationService }, { token: RegisterDeviceService }, { token: i4.BsModalRef }, { token: i1$1.GainsightService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1259
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: ExtensibleBulkDeviceRegistrationModalComponent, selector: "extensible-device-registration-modal-component", viewQueries: [{ propertyName: "stepper", first: true, predicate: C8yStepper, descendants: true, static: true }], ngImport: i0, template: "<c8y-modal\n [title]=\"title | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <i c8yIcon=\"c8y-device-connect\"></i>\n </ng-container>\n <c8y-stepper [hideStepProgress]=\"true\" linear class=\"p-t-16\" c8y-modal-body>\n <ng-container *ngIf=\"!loadingError\">\n <cdk-step>\n <div class=\"sticky-top bg-component separator-bottom\">\n <p\n class=\"p-l-24 p-r-24 p-t-16 p-b-16 m-b-0 separator-bottom text-16 text-medium text-center bg-component\"\n translate\n >\n Register devices in bulk\n </p>\n <c8y-form-group class=\"p-24 p-t-16 p-b-8 m-b-0\">\n <formly-form [form]=\"form\" [fields]=\"template\" [model]=\"model\"></formly-form>\n </c8y-form-group>\n </div>\n <div\n *ngFor=\"let example of examples\"\n class=\"bg-gray-white separator-bottom p-t-16 p-b-16 p-l-24 p-r-24\"\n >\n <p class=\"m-b-8 text-medium\">\n {{ example.title | translate }}\n </p>\n <p class=\"small m-b-8\">{{ example.description | translate }}</p>\n <a\n title=\"{{ 'Download template' | translate }}\"\n class=\"btn btn-default btn-sm\"\n target=\"_self\"\n [href]=\"example.url\"\n download=\"{{ 'Example bulk registration - template.csv' | translate }}\"\n >\n <i c8yIcon=\"download\"></i>\n <span translate>Download template</span>\n </a>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [disabled]=\"form.invalid\"\n [pending]=\"pending\"\n (onCancel)=\"cancel()\"\n (onNext)=\"upload()\"\n [labels]=\"{ next: 'Upload' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </ng-container>\n <cdk-step state=\"final\">\n <div class=\"p-24\">\n <div *ngIf=\"success; else fail\">\n <c8y-operation-result\n text=\"{{ message | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"success\"\n class=\"lead\"\n data-cy=\"success\"\n ></c8y-operation-result>\n <c8y-list-group class=\"separator-top m-t-16\">\n <c8y-li>\n <c8y-li-icon class=\"text-success\" [icon]=\"'check-circle'\"></c8y-li-icon>\n <p translate>File successfully uploaded.</p>\n <c8y-li-collapse>\n <pre><code>{{ result | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n </c8y-list-group>\n </div>\n <ng-template #fail>\n <c8y-operation-result\n text=\"{{ message | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"error\"\n class=\"lead\"\n data-cy=\"error\"\n ></c8y-operation-result>\n <c8y-list-group *ngIf=\"result\" class=\"separator-top m-t-16\">\n <c8y-li>\n <c8y-li-icon class=\"text-danger\" [icon]=\"'ban'\"></c8y-li-icon>\n <p translate>Bulk operation failed.</p>\n <c8y-li-collapse>\n <pre><code>{{ result | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n </c8y-list-group>\n </ng-template>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-component\"\n [showButtons]=\"{ next: true }\"\n (onNext)=\"complete()\"\n [labels]=\"{ next: success ? 'Complete' : 'Cancel' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n</c8y-modal>\n", dependencies: [{ kind: "directive", type: i1$1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1$1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1$1.OperationResultComponent, selector: "c8y-operation-result", inputs: ["text", "vertical", "size", "type"] }, { kind: "component", type: i1$1.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: i1$1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: i1$1.C8yStepper, selector: "c8y-stepper", inputs: ["disableDefaultIcons", "disableProgressButtons", "customClasses", "hideStepProgress", "useStepLabelsAsTitlesOnly"], outputs: ["onStepChange"] }, { kind: "component", type: i6.CdkStep, selector: "cdk-step", inputs: ["stepControl", "label", "errorMessage", "aria-label", "aria-labelledby", "state", "editable", "optional", "completed", "hasError"], outputs: ["interacted"], exportAs: ["cdkStep"] }, { kind: "component", type: i1$1.C8yStepperButtons, selector: "c8y-stepper-buttons", inputs: ["labels", "pending", "disabled", "showButtons"], outputs: ["onCancel", "onNext", "onBack", "onCustom"] }, { kind: "component", type: i1$1.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i1$1.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i1$1.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i1$1.ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "component", type: i7.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "pipe", type: i1$1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.JsonPipe, name: "json" }] }); }
|
|
1064
1260
|
}
|
|
1065
1261
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ExtensibleBulkDeviceRegistrationModalComponent, decorators: [{
|
|
1066
1262
|
type: Component,
|
|
1067
1263
|
args: [{ selector: 'extensible-device-registration-modal-component', template: "<c8y-modal\n [title]=\"title | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <i c8yIcon=\"c8y-device-connect\"></i>\n </ng-container>\n <c8y-stepper [hideStepProgress]=\"true\" linear class=\"p-t-16\" c8y-modal-body>\n <ng-container *ngIf=\"!loadingError\">\n <cdk-step>\n <div class=\"sticky-top bg-component separator-bottom\">\n <p\n class=\"p-l-24 p-r-24 p-t-16 p-b-16 m-b-0 separator-bottom text-16 text-medium text-center bg-component\"\n translate\n >\n Register devices in bulk\n </p>\n <c8y-form-group class=\"p-24 p-t-16 p-b-8 m-b-0\">\n <formly-form [form]=\"form\" [fields]=\"template\" [model]=\"model\"></formly-form>\n </c8y-form-group>\n </div>\n <div\n *ngFor=\"let example of examples\"\n class=\"bg-gray-white separator-bottom p-t-16 p-b-16 p-l-24 p-r-24\"\n >\n <p class=\"m-b-8 text-medium\">\n {{ example.title | translate }}\n </p>\n <p class=\"small m-b-8\">{{ example.description | translate }}</p>\n <a\n title=\"{{ 'Download template' | translate }}\"\n class=\"btn btn-default btn-sm\"\n target=\"_self\"\n [href]=\"example.url\"\n download=\"{{ 'Example bulk registration - template.csv' | translate }}\"\n >\n <i c8yIcon=\"download\"></i>\n <span translate>Download template</span>\n </a>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [disabled]=\"form.invalid\"\n [pending]=\"pending\"\n (onCancel)=\"cancel()\"\n (onNext)=\"upload()\"\n [labels]=\"{ next: 'Upload' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </ng-container>\n <cdk-step state=\"final\">\n <div class=\"p-24\">\n <div *ngIf=\"success; else fail\">\n <c8y-operation-result\n text=\"{{ message | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"success\"\n class=\"lead\"\n data-cy=\"success\"\n ></c8y-operation-result>\n <c8y-list-group class=\"separator-top m-t-16\">\n <c8y-li>\n <c8y-li-icon class=\"text-success\" [icon]=\"'check-circle'\"></c8y-li-icon>\n <p translate>File successfully uploaded.</p>\n <c8y-li-collapse>\n <pre><code>{{ result | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n </c8y-list-group>\n </div>\n <ng-template #fail>\n <c8y-operation-result\n text=\"{{ message | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"error\"\n class=\"lead\"\n data-cy=\"error\"\n ></c8y-operation-result>\n <c8y-list-group *ngIf=\"result\" class=\"separator-top m-t-16\">\n <c8y-li>\n <c8y-li-icon class=\"text-danger\" [icon]=\"'ban'\"></c8y-li-icon>\n <p translate>Bulk operation failed.</p>\n <c8y-li-collapse>\n <pre><code>{{ result | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n </c8y-list-group>\n </ng-template>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-component\"\n [showButtons]=\"{ next: true }\"\n (onNext)=\"complete()\"\n [labels]=\"{ next: success ? 'Complete' : 'Cancel' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n</c8y-modal>\n" }]
|
|
1068
|
-
}], ctorParameters: () => [{ type: i1$
|
|
1069
|
-
type: ViewChild,
|
|
1070
|
-
args: [C8yStepper, { static: true }]
|
|
1071
|
-
}] } });
|
|
1072
|
-
|
|
1073
|
-
const registerDeviceBulkSchema = {
|
|
1074
|
-
$schema: 'https://json-schema.org/draft/2019-09/schema',
|
|
1075
|
-
type: 'object',
|
|
1076
|
-
properties: {
|
|
1077
|
-
csvBulkFile: {
|
|
1078
|
-
type: 'array',
|
|
1079
|
-
title: gettext('CSV file upload'),
|
|
1080
|
-
description: gettext('You can use file upload component to let users send files. This input accepts only a single CSV file.'),
|
|
1081
|
-
contentMediaType: 'csv'
|
|
1082
|
-
}
|
|
1083
|
-
},
|
|
1084
|
-
required: ['csvBulkFile'],
|
|
1085
|
-
additionalProperties: false
|
|
1086
|
-
};
|
|
1087
|
-
const simpleCsvHeaders = ['ID', 'PATH'];
|
|
1088
|
-
const fullCsvHeaders = [
|
|
1089
|
-
'ID',
|
|
1090
|
-
'CREDENTIALS',
|
|
1091
|
-
'TYPE',
|
|
1092
|
-
'NAME',
|
|
1093
|
-
'ICCID',
|
|
1094
|
-
'IDTYPE',
|
|
1095
|
-
'PATH',
|
|
1096
|
-
'SHELL',
|
|
1097
|
-
'AUTH_TYPE'
|
|
1098
|
-
];
|
|
1099
|
-
class BulkDeviceRegistrationModalComponent {
|
|
1100
|
-
constructor(jsonschema, deviceRegistrationService, registerDeviceService, bsModalRef, gainsightService) {
|
|
1101
|
-
this.jsonschema = jsonschema;
|
|
1102
|
-
this.deviceRegistrationService = deviceRegistrationService;
|
|
1103
|
-
this.registerDeviceService = registerDeviceService;
|
|
1104
|
-
this.bsModalRef = bsModalRef;
|
|
1105
|
-
this.gainsightService = gainsightService;
|
|
1106
|
-
this.form = new FormGroup({});
|
|
1107
|
-
this.model = {};
|
|
1108
|
-
}
|
|
1109
|
-
ngOnInit() {
|
|
1110
|
-
this.template = [this.jsonschema.toFieldConfig(registerDeviceBulkSchema)];
|
|
1111
|
-
}
|
|
1112
|
-
upload() {
|
|
1113
|
-
this.pending = true;
|
|
1114
|
-
const file = this.getFile(this.model);
|
|
1115
|
-
this.deviceRegistrationService
|
|
1116
|
-
.create(file)
|
|
1117
|
-
.then(({ res, data }) => {
|
|
1118
|
-
if (res.status < 400) {
|
|
1119
|
-
this.result = data;
|
|
1120
|
-
this.success = data.numberOfFailed === 0 && data.numberOfSuccessful === data.numberOfAll;
|
|
1121
|
-
this.message = this.success
|
|
1122
|
-
? gettext('Device registration created.')
|
|
1123
|
-
: (this.message = gettext('Device registration failed.'));
|
|
1124
|
-
if (this.success) {
|
|
1125
|
-
this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {
|
|
1126
|
-
result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.SUCCESS,
|
|
1127
|
-
component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.BULK
|
|
1128
|
-
});
|
|
1129
|
-
}
|
|
1130
|
-
else {
|
|
1131
|
-
this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {
|
|
1132
|
-
result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.FAILURE,
|
|
1133
|
-
component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.BULK
|
|
1134
|
-
});
|
|
1135
|
-
}
|
|
1136
|
-
}
|
|
1137
|
-
else {
|
|
1138
|
-
this.failedResult = data;
|
|
1139
|
-
this.message = gettext('Device registration failed.');
|
|
1140
|
-
this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_BASE_REGISTRATION.EVENT, {
|
|
1141
|
-
result: PRODUCT_EXPERIENCE_BASE_REGISTRATION.RESULT.FAILURE,
|
|
1142
|
-
component: PRODUCT_EXPERIENCE_BASE_REGISTRATION.COMPONENT.BULK
|
|
1143
|
-
});
|
|
1144
|
-
}
|
|
1145
|
-
this.model = {};
|
|
1146
|
-
this.pending = false;
|
|
1147
|
-
this.stepper.next();
|
|
1148
|
-
})
|
|
1149
|
-
.catch(() => {
|
|
1150
|
-
this.message = gettext('Error occurred while processing the uploaded file.');
|
|
1151
|
-
this.pending = false;
|
|
1152
|
-
this.stepper.next();
|
|
1153
|
-
});
|
|
1154
|
-
}
|
|
1155
|
-
downloadSimple() {
|
|
1156
|
-
return this.download(simpleCsvHeaders, gettext('Simple bulk registration - template.csv'));
|
|
1157
|
-
}
|
|
1158
|
-
downloadFull() {
|
|
1159
|
-
return this.download(fullCsvHeaders, gettext('Full bulk registration - template.csv'));
|
|
1160
|
-
}
|
|
1161
|
-
download(headers, fileName) {
|
|
1162
|
-
const headerRaw = headers.map(header => `"${header}"`).join(';');
|
|
1163
|
-
const binaryFile = new Blob([headerRaw], { type: 'text/csv' });
|
|
1164
|
-
saveAs(binaryFile, fileName);
|
|
1165
|
-
}
|
|
1166
|
-
complete() {
|
|
1167
|
-
this.registerDeviceService.list();
|
|
1168
|
-
this.bsModalRef.hide();
|
|
1169
|
-
}
|
|
1170
|
-
cancel() {
|
|
1171
|
-
this.bsModalRef.hide();
|
|
1172
|
-
}
|
|
1173
|
-
getFile(model) {
|
|
1174
|
-
const csvBulkFile = model?.csvBulkFile;
|
|
1175
|
-
return csvBulkFile ? csvBulkFile[0]?.file : undefined;
|
|
1176
|
-
}
|
|
1177
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: BulkDeviceRegistrationModalComponent, deps: [{ token: i1$2.C8yJSONSchema }, { token: i1$1.DeviceRegistrationBulkService }, { token: RegisterDeviceService }, { token: i4.BsModalRef }, { token: i1$2.GainsightService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1178
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: BulkDeviceRegistrationModalComponent, selector: "bulk-device-registration", viewQueries: [{ propertyName: "stepper", first: true, predicate: C8yStepper, descendants: true, static: true }], ngImport: i0, template: "<c8y-modal\n [title]=\"'Bulk device registration' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <i c8yIcon=\"upload\"></i>\n </ng-container>\n\n <c8y-stepper [hideStepProgress]=\"true\" linear id=\"modal-body\">\n <cdk-step>\n <p class=\"modal-subtitle sticky-top\" translate>Register devices in bulk</p>\n\n <c8y-form-group class=\"d-block p-24 p-t-16 p-b-0 m-b-0\">\n <formly-form [form]=\"form\" [fields]=\"template\" [model]=\"model\"></formly-form>\n </c8y-form-group>\n\n <div class=\"p-24 m-t-0 bg-level-1\">\n <div class=\"content-flex-30 flex-stretch\">\n <div class=\"col-6 p-16 p-b-0 d-flex d-col j-c-between\">\n <div>\n <p class=\"m-b-8\">\n <strong translate>Simple registration</strong>\n </p>\n <small class=\"text-muted\" translate>\n Creates all registration requests at once, then each one needs to go through regular\n acceptance process.\n </small>\n </div>\n <div class=\"m-b-16 m-t-16\">\n <a\n title=\"{{ 'Download template' | translate }}\"\n class=\"btn btn-default btn-sm\"\n target=\"_self\"\n (click)=\"downloadSimple()\"\n >\n <i c8yIcon=\"download\" translate></i>\n {{ 'Download template' | translate }}\n </a>\n </div>\n </div>\n <div class=\"col-6 p-16 p-b-0 d-flex d-col j-c-between\">\n <div>\n <p class=\"m-b-8\">\n <strong translate>Full registration</strong>\n </p>\n <small class=\"text-muted\" translate>\n Creates all device credentials and devices using provided list of property values.\n Devices can start communicating with the platform immediately.\n </small>\n </div>\n <div class=\"m-b-16 m-t-16\">\n <a\n title=\"{{ 'Download template' | translate }}\"\n class=\"btn btn-default btn-sm\"\n target=\"_self\"\n (click)=\"downloadFull()\"\n >\n <i c8yIcon=\"download\" translate></i>\n {{ 'Download template' | translate }}\n </a>\n </div>\n </div>\n </div>\n </div>\n\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [disabled]=\"form.invalid\"\n [pending]=\"pending\"\n (onCancel)=\"cancel()\"\n (onNext)=\"upload()\"\n [labels]=\"{ next: 'Upload' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n\n <cdk-step state=\"final\">\n <div class=\"m-24\">\n <div *ngIf=\"success; else warning\">\n <c8y-operation-result\n text=\"{{ message | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"success\"\n class=\"lead\"\n ></c8y-operation-result>\n </div>\n <ng-template #warning>\n <c8y-operation-result\n text=\"{{ message | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"error\"\n class=\"lead\"\n ></c8y-operation-result>\n </ng-template>\n <c8y-list-group class=\"separator-top m-t-16\">\n <ng-container *ngIf=\"result; else failedResponse\">\n <c8y-li *ngIf=\"success; else fail\">\n <c8y-li-icon class=\"text-success\" icon=\"check-circle\"></c8y-li-icon>\n <p>{{ 'All devices have been processed.' | translate }}</p>\n <c8y-li-collapse>\n <pre><code>{{ result | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n <ng-template #fail>\n <c8y-li>\n <c8y-li-icon class=\"text-danger\" icon=\"ban\"></c8y-li-icon>\n <p\n ngNonBindable\n [translateParams]=\"{ count: result?.numberOfFailed, total: result?.numberOfAll }\"\n translate\n >\n Failed to process {{ count }} out of {{ total }}.\n </p>\n <c8y-li-collapse>\n <pre><code>{{ result | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n </ng-template>\n </ng-container>\n <ng-template #failedResponse>\n <c8y-li>\n <c8y-li-icon class=\"text-danger\" [icon]=\"'ban'\"></c8y-li-icon>\n <small>{{ failedResult?.message | translate }}</small>\n <c8y-li-collapse>\n <pre><code>{{ failedResult | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n </ng-template>\n </c8y-list-group>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n [showButtons]=\"{ next: true }\"\n (onNext)=\"complete()\"\n [labels]=\"{ next: success ? 'Close' : 'Cancel' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n</c8y-modal>\n", dependencies: [{ kind: "directive", type: i1$2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1$2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1$2.OperationResultComponent, selector: "c8y-operation-result", inputs: ["text", "vertical", "size", "type"] }, { kind: "component", type: i1$2.ModalComponent, selector: "c8y-modal", inputs: ["disabled", "close", "dismiss", "title", "body", "customFooter", "headerClasses", "labels"], outputs: ["onDismiss", "onClose"] }, { kind: "component", type: i1$2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: i1$2.C8yStepper, selector: "c8y-stepper", inputs: ["disableDefaultIcons", "disableProgressButtons", "customClasses", "hideStepProgress", "useStepLabelsAsTitlesOnly"], outputs: ["onStepChange"] }, { kind: "component", type: i6.CdkStep, selector: "cdk-step", inputs: ["stepControl", "label", "errorMessage", "aria-label", "aria-labelledby", "state", "editable", "optional", "completed", "hasError"], outputs: ["interacted"], exportAs: ["cdkStep"] }, { kind: "component", type: i1$2.C8yStepperButtons, selector: "c8y-stepper-buttons", inputs: ["labels", "pending", "disabled", "showButtons"], outputs: ["onCancel", "onNext", "onBack", "onCustom"] }, { kind: "component", type: i1$2.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i1$2.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i1$2.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i1$2.ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "component", type: i7.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "pipe", type: i1$2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.JsonPipe, name: "json" }] }); }
|
|
1179
|
-
}
|
|
1180
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: BulkDeviceRegistrationModalComponent, decorators: [{
|
|
1181
|
-
type: Component,
|
|
1182
|
-
args: [{ selector: 'bulk-device-registration', template: "<c8y-modal\n [title]=\"'Bulk device registration' | translate\"\n [headerClasses]=\"'dialog-header'\"\n [customFooter]=\"true\"\n>\n <ng-container c8y-modal-title>\n <i c8yIcon=\"upload\"></i>\n </ng-container>\n\n <c8y-stepper [hideStepProgress]=\"true\" linear id=\"modal-body\">\n <cdk-step>\n <p class=\"modal-subtitle sticky-top\" translate>Register devices in bulk</p>\n\n <c8y-form-group class=\"d-block p-24 p-t-16 p-b-0 m-b-0\">\n <formly-form [form]=\"form\" [fields]=\"template\" [model]=\"model\"></formly-form>\n </c8y-form-group>\n\n <div class=\"p-24 m-t-0 bg-level-1\">\n <div class=\"content-flex-30 flex-stretch\">\n <div class=\"col-6 p-16 p-b-0 d-flex d-col j-c-between\">\n <div>\n <p class=\"m-b-8\">\n <strong translate>Simple registration</strong>\n </p>\n <small class=\"text-muted\" translate>\n Creates all registration requests at once, then each one needs to go through regular\n acceptance process.\n </small>\n </div>\n <div class=\"m-b-16 m-t-16\">\n <a\n title=\"{{ 'Download template' | translate }}\"\n class=\"btn btn-default btn-sm\"\n target=\"_self\"\n (click)=\"downloadSimple()\"\n >\n <i c8yIcon=\"download\" translate></i>\n {{ 'Download template' | translate }}\n </a>\n </div>\n </div>\n <div class=\"col-6 p-16 p-b-0 d-flex d-col j-c-between\">\n <div>\n <p class=\"m-b-8\">\n <strong translate>Full registration</strong>\n </p>\n <small class=\"text-muted\" translate>\n Creates all device credentials and devices using provided list of property values.\n Devices can start communicating with the platform immediately.\n </small>\n </div>\n <div class=\"m-b-16 m-t-16\">\n <a\n title=\"{{ 'Download template' | translate }}\"\n class=\"btn btn-default btn-sm\"\n target=\"_self\"\n (click)=\"downloadFull()\"\n >\n <i c8yIcon=\"download\" translate></i>\n {{ 'Download template' | translate }}\n </a>\n </div>\n </div>\n </div>\n </div>\n\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n [showButtons]=\"{ cancel: true, next: true }\"\n [disabled]=\"form.invalid\"\n [pending]=\"pending\"\n (onCancel)=\"cancel()\"\n (onNext)=\"upload()\"\n [labels]=\"{ next: 'Upload' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n\n <cdk-step state=\"final\">\n <div class=\"m-24\">\n <div *ngIf=\"success; else warning\">\n <c8y-operation-result\n text=\"{{ message | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"success\"\n class=\"lead\"\n ></c8y-operation-result>\n </div>\n <ng-template #warning>\n <c8y-operation-result\n text=\"{{ message | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n type=\"error\"\n class=\"lead\"\n ></c8y-operation-result>\n </ng-template>\n <c8y-list-group class=\"separator-top m-t-16\">\n <ng-container *ngIf=\"result; else failedResponse\">\n <c8y-li *ngIf=\"success; else fail\">\n <c8y-li-icon class=\"text-success\" icon=\"check-circle\"></c8y-li-icon>\n <p>{{ 'All devices have been processed.' | translate }}</p>\n <c8y-li-collapse>\n <pre><code>{{ result | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n <ng-template #fail>\n <c8y-li>\n <c8y-li-icon class=\"text-danger\" icon=\"ban\"></c8y-li-icon>\n <p\n ngNonBindable\n [translateParams]=\"{ count: result?.numberOfFailed, total: result?.numberOfAll }\"\n translate\n >\n Failed to process {{ count }} out of {{ total }}.\n </p>\n <c8y-li-collapse>\n <pre><code>{{ result | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n </ng-template>\n </ng-container>\n <ng-template #failedResponse>\n <c8y-li>\n <c8y-li-icon class=\"text-danger\" [icon]=\"'ban'\"></c8y-li-icon>\n <small>{{ failedResult?.message | translate }}</small>\n <c8y-li-collapse>\n <pre><code>{{ failedResult | json }}</code></pre>\n </c8y-li-collapse>\n </c8y-li>\n </ng-template>\n </c8y-list-group>\n </div>\n <c8y-stepper-buttons\n class=\"sticky-bottom d-block p-t-16 p-b-16 separator-top bg-level-0\"\n [showButtons]=\"{ next: true }\"\n (onNext)=\"complete()\"\n [labels]=\"{ next: success ? 'Close' : 'Cancel' }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n </c8y-stepper>\n</c8y-modal>\n" }]
|
|
1183
|
-
}], ctorParameters: () => [{ type: i1$2.C8yJSONSchema }, { type: i1$1.DeviceRegistrationBulkService }, { type: RegisterDeviceService }, { type: i4.BsModalRef }, { type: i1$2.GainsightService }], propDecorators: { stepper: [{
|
|
1264
|
+
}], ctorParameters: () => [{ type: i1$1.C8yJSONSchema }, { type: BulkExtensibleDeviceRegistrationService }, { type: RegisterDeviceService }, { type: i4.BsModalRef }, { type: i1$1.GainsightService }], propDecorators: { stepper: [{
|
|
1184
1265
|
type: ViewChild,
|
|
1185
1266
|
args: [C8yStepper, { static: true }]
|
|
1186
1267
|
}] } });
|
|
@@ -1204,7 +1285,7 @@ class ExtensibleBulkDeviceRegistrationButtonComponent {
|
|
|
1204
1285
|
});
|
|
1205
1286
|
}
|
|
1206
1287
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ExtensibleBulkDeviceRegistrationButtonComponent, deps: [{ token: BulkExtensibleDeviceRegistrationService }, { token: i4.BsModalService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1207
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: ExtensibleBulkDeviceRegistrationButtonComponent, selector: "extensible-device-registration-component", ngImport: i0, template: "<div *ngFor=\"let provider of bulkProvidersMetaData | async\">\n <button\n title=\"{{ provider.name | translate }}\"\n type=\"button\"\n (click)=\"click(provider.contextPath)\"\n >\n <i c8yIcon=\"upload\"></i>\n {{ provider.name | translate }}\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: i1$
|
|
1288
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: ExtensibleBulkDeviceRegistrationButtonComponent, selector: "extensible-device-registration-component", ngImport: i0, template: "<div *ngFor=\"let provider of bulkProvidersMetaData | async\">\n <button\n title=\"{{ provider.name | translate }}\"\n type=\"button\"\n (click)=\"click(provider.contextPath)\"\n >\n <i c8yIcon=\"upload\"></i>\n {{ provider.name | translate }}\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: i1$1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: i1$1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] }); }
|
|
1208
1289
|
}
|
|
1209
1290
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: ExtensibleBulkDeviceRegistrationButtonComponent, decorators: [{
|
|
1210
1291
|
type: Component,
|
|
@@ -1224,7 +1305,7 @@ class BulkDeviceRegistrationButtonComponent {
|
|
|
1224
1305
|
});
|
|
1225
1306
|
}
|
|
1226
1307
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: BulkDeviceRegistrationButtonComponent, deps: [{ token: i4.BsModalService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1227
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: BulkDeviceRegistrationButtonComponent, selector: "extensible-device-registration-component", ngImport: i0, template: "<button title=\"{{ 'General' | translate }}\" type=\"button\" (click)=\"click()\">\n <i c8yIcon=\"upload\"></i>\n {{ 'General' | translate }}\n</button>\n", dependencies: [{ kind: "directive", type: i1$
|
|
1308
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: BulkDeviceRegistrationButtonComponent, selector: "extensible-device-registration-component", ngImport: i0, template: "<button title=\"{{ 'General' | translate }}\" type=\"button\" (click)=\"click()\">\n <i c8yIcon=\"upload\"></i>\n {{ 'General' | translate }}\n</button>\n", dependencies: [{ kind: "directive", type: i1$1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i1$1.C8yTranslatePipe, name: "translate" }] }); }
|
|
1228
1309
|
}
|
|
1229
1310
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: BulkDeviceRegistrationButtonComponent, decorators: [{
|
|
1230
1311
|
type: Component,
|