@c8y/ngx-components 1021.38.1 → 1021.49.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (524) hide show
  1. package/api/services.d.ts +1 -1
  2. package/api/services.d.ts.map +1 -1
  3. package/auth-configuration/sso-configuration/template-parts/access-mapping/access-mapping.component.d.ts.map +1 -1
  4. package/connectivity/abstract-connectivity-tab.factory.d.ts +1 -1
  5. package/context-dashboard/add-dashboard.component.d.ts.map +1 -1
  6. package/context-dashboard/context-dashboard.model.d.ts +4 -2
  7. package/context-dashboard/context-dashboard.model.d.ts.map +1 -1
  8. package/context-dashboard/dashboard-detail.component.d.ts.map +1 -1
  9. package/context-dashboard/dashboard-manager/dashboard-manager.model.d.ts +1 -0
  10. package/context-dashboard/dashboard-manager/dashboard-manager.model.d.ts.map +1 -1
  11. package/context-dashboard/dashboard-manager/dashboard-manager.service.d.ts +0 -1
  12. package/context-dashboard/dashboard-manager/dashboard-manager.service.d.ts.map +1 -1
  13. package/context-dashboard/dashboard-manager/type-dashboards-list/type-dashboards-list.component.d.ts.map +1 -1
  14. package/context-dashboard/new-dashboard.guard.d.ts +1 -1
  15. package/context-dashboard/new-dashboard.guard.d.ts.map +1 -1
  16. package/core/action/action.component.d.ts +2 -1
  17. package/core/action/action.component.d.ts.map +1 -1
  18. package/core/action/action.model.d.ts +3 -2
  19. package/core/action/action.model.d.ts.map +1 -1
  20. package/core/breadcrumb/breadcrumb-item.component.d.ts +2 -1
  21. package/core/breadcrumb/breadcrumb-item.component.d.ts.map +1 -1
  22. package/core/breadcrumb/breadcrumb.model.d.ts +2 -1
  23. package/core/breadcrumb/breadcrumb.model.d.ts.map +1 -1
  24. package/core/common/ApplicationOptions.d.ts +1 -0
  25. package/core/common/ApplicationOptions.d.ts.map +1 -1
  26. package/core/common/empty-state/empty-state.component.d.ts +2 -1
  27. package/core/common/empty-state/empty-state.component.d.ts.map +1 -1
  28. package/core/common/get-group-icon.pipe.d.ts +2 -1
  29. package/core/common/get-group-icon.pipe.d.ts.map +1 -1
  30. package/core/common/group.service.d.ts +22 -7
  31. package/core/common/group.service.d.ts.map +1 -1
  32. package/core/common/icon.directive.d.ts +5 -5
  33. package/core/common/icon.directive.d.ts.map +1 -1
  34. package/core/common/service-registry.model.d.ts +2 -1
  35. package/core/common/service-registry.model.d.ts.map +1 -1
  36. package/core/data-grid/data-grid.model.d.ts +2 -1
  37. package/core/data-grid/data-grid.model.d.ts.map +1 -1
  38. package/core/docs/docs.models.d.ts +2 -1
  39. package/core/docs/docs.models.d.ts.map +1 -1
  40. package/core/docs/help-and-support-outlet/help-and-support-outlet.component.d.ts +5 -1
  41. package/core/docs/help-and-support-outlet/help-and-support-outlet.component.d.ts.map +1 -1
  42. package/core/docs/legal-notices-outlet/legal-notices-outlet.component.d.ts +5 -1
  43. package/core/docs/legal-notices-outlet/legal-notices-outlet.component.d.ts.map +1 -1
  44. package/core/docs/support-outlet/support-outlet.component.d.ts +5 -1
  45. package/core/docs/support-outlet/support-outlet.component.d.ts.map +1 -1
  46. package/core/forms/filter-input.component.d.ts +8 -3
  47. package/core/forms/filter-input.component.d.ts.map +1 -1
  48. package/core/list-group/list-item-action.component.d.ts +2 -1
  49. package/core/list-group/list-item-action.component.d.ts.map +1 -1
  50. package/core/list-group/list-item-icon.component.d.ts +2 -1
  51. package/core/list-group/list-item-icon.component.d.ts.map +1 -1
  52. package/core/login/login.service.d.ts.map +1 -1
  53. package/core/navigator/navigator-icon.component.d.ts +1 -1
  54. package/core/navigator/navigator-icon.component.d.ts.map +1 -1
  55. package/core/navigator/navigator-node-data.d.ts +2 -1
  56. package/core/navigator/navigator-node-data.d.ts.map +1 -1
  57. package/core/navigator/navigator-node.component.d.ts.map +1 -1
  58. package/core/navigator/navigator-node.d.ts +2 -1
  59. package/core/navigator/navigator-node.d.ts.map +1 -1
  60. package/core/plugins/plugins.model.d.ts +7 -2
  61. package/core/plugins/plugins.model.d.ts.map +1 -1
  62. package/core/plugins/plugins.service.d.ts.map +1 -1
  63. package/core/properties-list/properties-list.component.d.ts +2 -1
  64. package/core/properties-list/properties-list.component.d.ts.map +1 -1
  65. package/core/provider-configuration/model/dynamic-provider-config.model.d.ts +2 -2
  66. package/core/provider-configuration/model/dynamic-provider-config.model.d.ts.map +1 -1
  67. package/core/router/context-route.service.d.ts.map +1 -1
  68. package/core/router/router.model.d.ts +1 -1
  69. package/core/router/router.model.d.ts.map +1 -1
  70. package/core/router/scoped-context-route.service.d.ts.map +1 -1
  71. package/core/search/search.model.d.ts +2 -1
  72. package/core/search/search.model.d.ts.map +1 -1
  73. package/core/select/select-keyboard.service.d.ts +4 -0
  74. package/core/select/select-keyboard.service.d.ts.map +1 -1
  75. package/core/select/select.component.d.ts +14 -3
  76. package/core/select/select.component.d.ts.map +1 -1
  77. package/core/select-modal/select-modal.component.d.ts +2 -1
  78. package/core/select-modal/select-modal.component.d.ts.map +1 -1
  79. package/core/shared/core.model.d.ts +5 -1
  80. package/core/shared/core.model.d.ts.map +1 -1
  81. package/core/tabs/conditional-tabs-outlet.component.d.ts.map +1 -1
  82. package/core/tabs/tab.component.d.ts +3 -2
  83. package/core/tabs/tab.component.d.ts.map +1 -1
  84. package/core/tabs/tab.model.d.ts +10 -5
  85. package/core/tabs/tab.model.d.ts.map +1 -1
  86. package/core/tabs/tabs-outlet.component.d.ts +7 -4
  87. package/core/tabs/tabs-outlet.component.d.ts.map +1 -1
  88. package/core/user/user-menu-item.component.d.ts +2 -1
  89. package/core/user/user-menu-item.component.d.ts.map +1 -1
  90. package/core/user/user.model.d.ts +2 -1
  91. package/core/user/user.model.d.ts.map +1 -1
  92. package/core/wizard/wizard.model.d.ts +4 -3
  93. package/core/wizard/wizard.model.d.ts.map +1 -1
  94. package/data-grid-columns/asset-type/asset-type.cell-renderer.component.d.ts.map +1 -1
  95. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts +15 -46
  96. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.d.ts.map +1 -1
  97. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes.model.d.ts +3 -0
  98. package/datapoint-selector/datapoint-attributes-form/datapoint-attributes.model.d.ts.map +1 -1
  99. package/datapoint-selector/datapoint-selection.model.d.ts +6 -7
  100. package/datapoint-selector/datapoint-selection.model.d.ts.map +1 -1
  101. package/datapoints-export-selector/datapoints-export-selector.model.d.ts +2 -1
  102. package/datapoints-export-selector/datapoints-export-selector.model.d.ts.map +1 -1
  103. package/device-grid/columns/icon.cell-renderer.component.d.ts +14 -0
  104. package/device-grid/columns/icon.cell-renderer.component.d.ts.map +1 -0
  105. package/device-grid/columns/index.d.ts +1 -0
  106. package/device-grid/columns/index.d.ts.map +1 -1
  107. package/device-grid/device-grid.component.d.ts.map +1 -1
  108. package/device-grid/device-grid.service.d.ts +0 -2
  109. package/device-grid/device-grid.service.d.ts.map +1 -1
  110. package/device-provisioned-certificates/c8y-ngx-components-device-provisioned-certificates.d.ts.map +1 -0
  111. package/device-provisioned-certificates/device-provisioned-certificates.guard.d.ts +11 -0
  112. package/device-provisioned-certificates/device-provisioned-certificates.guard.d.ts.map +1 -0
  113. package/device-provisioned-certificates/device-provisioned-certificates.module.d.ts +13 -0
  114. package/device-provisioned-certificates/device-provisioned-certificates.module.d.ts.map +1 -0
  115. package/device-provisioned-certificates/device-provisioned-certificates.service.d.ts +13 -0
  116. package/device-provisioned-certificates/device-provisioned-certificates.service.d.ts.map +1 -0
  117. package/device-provisioned-certificates/device-tab-provisioned-certificates.component.d.ts +57 -0
  118. package/device-provisioned-certificates/device-tab-provisioned-certificates.component.d.ts.map +1 -0
  119. package/device-provisioned-certificates/index.d.ts +2 -0
  120. package/device-provisioned-certificates/index.d.ts.map +1 -0
  121. package/ecosystem/application-plugins/application-plugins.component.d.ts +4 -0
  122. package/ecosystem/application-plugins/application-plugins.component.d.ts.map +1 -1
  123. package/ecosystem/application-plugins/application-plugins.module.d.ts +2 -2
  124. package/ecosystem/application-plugins/application-plugins.module.d.ts.map +1 -1
  125. package/ecosystem/application-plugins/index.d.ts +1 -0
  126. package/ecosystem/application-plugins/index.d.ts.map +1 -1
  127. package/ecosystem/application-plugins/install-plugin.component.d.ts +9 -11
  128. package/ecosystem/application-plugins/install-plugin.component.d.ts.map +1 -1
  129. package/ecosystem/application-plugins/only-latest-filter/only-latest-filter.component.d.ts +12 -0
  130. package/ecosystem/application-plugins/only-latest-filter/only-latest-filter.component.d.ts.map +1 -0
  131. package/ecosystem/application-plugins/plugin-list-item.component.d.ts +8 -3
  132. package/ecosystem/application-plugins/plugin-list-item.component.d.ts.map +1 -1
  133. package/ecosystem/application-plugins/plugin-list.component.d.ts.map +1 -1
  134. package/ecosystem/application-plugins/update-plugin-of-app/update-plugin-of-app.component.d.ts.map +1 -1
  135. package/ecosystem/applications/application-list/application-list.component.d.ts +2 -2
  136. package/ecosystem/applications/application-list/application-list.component.d.ts.map +1 -1
  137. package/ecosystem/applications/install-from-package/install-from-package.component.d.ts.map +1 -1
  138. package/ecosystem/archived-confirm/archived-confirm-modal.component.d.ts +11 -0
  139. package/ecosystem/archived-confirm/archived-confirm-modal.component.d.ts.map +1 -0
  140. package/ecosystem/archived-confirm/archived-confirm.module.d.ts +10 -0
  141. package/ecosystem/archived-confirm/archived-confirm.module.d.ts.map +1 -0
  142. package/ecosystem/archived-confirm/c8y-ngx-components-ecosystem-archived-confirm.d.ts.map +1 -0
  143. package/ecosystem/archived-confirm/index.d.ts +3 -0
  144. package/ecosystem/archived-confirm/index.d.ts.map +1 -0
  145. package/ecosystem/ecosystem.module.d.ts +2 -1
  146. package/ecosystem/ecosystem.module.d.ts.map +1 -1
  147. package/ecosystem/features/feature-list.component.d.ts +2 -2
  148. package/ecosystem/features/feature-list.component.d.ts.map +1 -1
  149. package/ecosystem/microservices/microservice-list.component.d.ts +2 -2
  150. package/ecosystem/microservices/microservice-list.component.d.ts.map +1 -1
  151. package/ecosystem/packages/deploy-application/deploy-application.component.d.ts.map +1 -1
  152. package/ecosystem/packages/package-details/package-details.component.d.ts +7 -2
  153. package/ecosystem/packages/package-details/package-details.component.d.ts.map +1 -1
  154. package/ecosystem/packages/package-list/packages-list.component.d.ts +2 -2
  155. package/ecosystem/packages/package-list/packages-list.component.d.ts.map +1 -1
  156. package/ecosystem/shared/add-application.component.d.ts +2 -1
  157. package/ecosystem/shared/add-application.component.d.ts.map +1 -1
  158. package/ecosystem/shared/application-card.component.d.ts +4 -0
  159. package/ecosystem/shared/application-card.component.d.ts.map +1 -1
  160. package/ecosystem/shared/archived-filter/archived-filter.component.d.ts +12 -0
  161. package/ecosystem/shared/archived-filter/archived-filter.component.d.ts.map +1 -0
  162. package/ecosystem/shared/ecosystem.constants.d.ts +4 -0
  163. package/ecosystem/shared/ecosystem.constants.d.ts.map +1 -1
  164. package/ecosystem/shared/ecosystem.model.d.ts +5 -1
  165. package/ecosystem/shared/ecosystem.model.d.ts.map +1 -1
  166. package/ecosystem/shared/ecosystem.service.d.ts +7 -0
  167. package/ecosystem/shared/ecosystem.service.d.ts.map +1 -1
  168. package/ecosystem/shared/index.d.ts +1 -0
  169. package/ecosystem/shared/index.d.ts.map +1 -1
  170. package/ecosystem/shared/list-filters/list-filters.component.d.ts +14 -4
  171. package/ecosystem/shared/list-filters/list-filters.component.d.ts.map +1 -1
  172. package/ecosystem/shared/list-filters/list-filters.model.d.ts +8 -2
  173. package/ecosystem/shared/list-filters/list-filters.model.d.ts.map +1 -1
  174. package/ecosystem/shared/shared-ecosystem.module.d.ts +9 -8
  175. package/ecosystem/shared/shared-ecosystem.module.d.ts.map +1 -1
  176. package/ecosystem/shared/translate-package-label.pipe.d.ts +1 -1
  177. package/ecosystem/shared/translate-package-label.pipe.d.ts.map +1 -1
  178. package/esm2022/alarms/alarm-info.component.mjs +1 -1
  179. package/esm2022/api/services.mjs +2 -2
  180. package/esm2022/auth-configuration/sso-configuration/template-parts/access-mapping/access-mapping.component.mjs +10 -5
  181. package/esm2022/auth-configuration/sso-configuration/template-parts/user-data-mapping.component.mjs +4 -4
  182. package/esm2022/context-dashboard/add-dashboard.component.mjs +4 -2
  183. package/esm2022/context-dashboard/context-dashboard.model.mjs +3 -2
  184. package/esm2022/context-dashboard/context-dashboard.service.mjs +2 -2
  185. package/esm2022/context-dashboard/dashboard-detail.component.mjs +5 -3
  186. package/esm2022/context-dashboard/dashboard-manager/dashboard-manager.model.mjs +1 -1
  187. package/esm2022/context-dashboard/dashboard-manager/dashboard-manager.service.mjs +5 -15
  188. package/esm2022/context-dashboard/dashboard-manager/type-dashboards-list/type-dashboards-list.component.mjs +2 -2
  189. package/esm2022/context-dashboard/new-dashboard.guard.mjs +1 -1
  190. package/esm2022/core/action/action.component.mjs +1 -1
  191. package/esm2022/core/action/action.model.mjs +1 -1
  192. package/esm2022/core/bootstrap/bootstrap.component.mjs +1 -1
  193. package/esm2022/core/breadcrumb/breadcrumb-item.component.mjs +1 -1
  194. package/esm2022/core/breadcrumb/breadcrumb.model.mjs +1 -1
  195. package/esm2022/core/common/ApplicationOptions.mjs +1 -1
  196. package/esm2022/core/common/empty-state/empty-state.component.mjs +1 -1
  197. package/esm2022/core/common/get-group-icon.pipe.mjs +1 -1
  198. package/esm2022/core/common/group.service.mjs +2 -2
  199. package/esm2022/core/common/icon.directive.mjs +1 -1
  200. package/esm2022/core/common/service-registry.model.mjs +1 -1
  201. package/esm2022/core/data-grid/data-grid.model.mjs +1 -1
  202. package/esm2022/core/docs/docs.models.mjs +1 -1
  203. package/esm2022/core/docs/support-outlet/support-outlet.component.mjs +3 -3
  204. package/esm2022/core/forms/filter-input.component.mjs +22 -7
  205. package/esm2022/core/list-group/list-item-action.component.mjs +1 -1
  206. package/esm2022/core/list-group/list-item-icon.component.mjs +1 -1
  207. package/esm2022/core/login/credentials.component.mjs +2 -2
  208. package/esm2022/core/login/login.service.mjs +18 -7
  209. package/esm2022/core/navigator/navigator-node-data.mjs +1 -1
  210. package/esm2022/core/navigator/navigator-node.component.mjs +11 -2
  211. package/esm2022/core/navigator/navigator-node.mjs +1 -1
  212. package/esm2022/core/plugins/plugins.model.mjs +5 -1
  213. package/esm2022/core/plugins/plugins.service.mjs +6 -2
  214. package/esm2022/core/properties-list/properties-list.component.mjs +1 -1
  215. package/esm2022/core/provider-configuration/model/dynamic-provider-config.model.mjs +1 -1
  216. package/esm2022/core/router/context-route.service.mjs +4 -2
  217. package/esm2022/core/router/router.model.mjs +1 -1
  218. package/esm2022/core/router/scoped-context-route.service.mjs +4 -2
  219. package/esm2022/core/search/search.model.mjs +1 -1
  220. package/esm2022/core/select/select-keyboard.service.mjs +7 -3
  221. package/esm2022/core/select/select.component.mjs +36 -8
  222. package/esm2022/core/select-modal/select-modal.component.mjs +2 -2
  223. package/esm2022/core/shared/core.model.mjs +6 -2
  224. package/esm2022/core/tabs/conditional-tabs-outlet.component.mjs +4 -2
  225. package/esm2022/core/tabs/tab.component.mjs +1 -1
  226. package/esm2022/core/tabs/tab.model.mjs +1 -1
  227. package/esm2022/core/tabs/tabs-outlet.component.mjs +41 -12
  228. package/esm2022/core/user/user-menu-item.component.mjs +1 -1
  229. package/esm2022/core/user/user.model.mjs +1 -1
  230. package/esm2022/core/wizard/wizard.model.mjs +1 -1
  231. package/esm2022/data-grid-columns/asset-type/asset-type.cell-renderer.component.mjs +1 -1
  232. package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes-form.component.mjs +47 -22
  233. package/esm2022/datapoint-selector/datapoint-attributes-form/datapoint-attributes.model.mjs +1 -1
  234. package/esm2022/datapoint-selector/datapoint-selection.model.mjs +1 -1
  235. package/esm2022/datapoint-selector/datapoint-selector-list-item/datapoint-selector-list-item.component.mjs +3 -3
  236. package/esm2022/datapoints-export-selector/datapoints-export-selector.model.mjs +1 -1
  237. package/esm2022/device-grid/columns/icon.cell-renderer.component.mjs +42 -0
  238. package/esm2022/device-grid/columns/index.mjs +2 -1
  239. package/esm2022/device-grid/device-grid.component.mjs +3 -3
  240. package/esm2022/device-grid/device-grid.service.mjs +7 -25
  241. package/esm2022/device-provisioned-certificates/c8y-ngx-components-device-provisioned-certificates.mjs +5 -0
  242. package/esm2022/device-provisioned-certificates/device-provisioned-certificates.guard.mjs +28 -0
  243. package/esm2022/device-provisioned-certificates/device-provisioned-certificates.module.mjs +51 -0
  244. package/esm2022/device-provisioned-certificates/device-provisioned-certificates.service.mjs +31 -0
  245. package/esm2022/device-provisioned-certificates/device-tab-provisioned-certificates.component.mjs +76 -0
  246. package/esm2022/device-provisioned-certificates/index.mjs +2 -0
  247. package/esm2022/ecosystem/application-plugins/application-plugins.component.mjs +41 -39
  248. package/esm2022/ecosystem/application-plugins/application-plugins.module.mjs +8 -6
  249. package/esm2022/ecosystem/application-plugins/apps-to-update-remotes-select.component.mjs +1 -1
  250. package/esm2022/ecosystem/application-plugins/index.mjs +2 -1
  251. package/esm2022/ecosystem/application-plugins/install-plugin.component.mjs +18 -21
  252. package/esm2022/ecosystem/application-plugins/only-latest-filter/only-latest-filter.component.mjs +26 -0
  253. package/esm2022/ecosystem/application-plugins/plugin-list-item.component.mjs +14 -6
  254. package/esm2022/ecosystem/application-plugins/plugin-list.component.mjs +14 -12
  255. package/esm2022/ecosystem/application-plugins/update-plugin-of-app/update-plugin-of-app.component.mjs +7 -1
  256. package/esm2022/ecosystem/applications/application-list/application-list.component.mjs +1 -1
  257. package/esm2022/ecosystem/applications/install-from-package/install-from-package.component.mjs +6 -1
  258. package/esm2022/ecosystem/archived-confirm/archived-confirm-modal.component.mjs +22 -0
  259. package/esm2022/ecosystem/archived-confirm/archived-confirm.module.mjs +32 -0
  260. package/esm2022/ecosystem/archived-confirm/c8y-ngx-components-ecosystem-archived-confirm.mjs +5 -0
  261. package/esm2022/ecosystem/archived-confirm/index.mjs +3 -0
  262. package/esm2022/ecosystem/ecosystem.module.mjs +20 -16
  263. package/esm2022/ecosystem/features/feature-list.component.mjs +1 -1
  264. package/esm2022/ecosystem/microservices/microservice-list.component.mjs +1 -1
  265. package/esm2022/ecosystem/packages/deploy-application/deploy-application.component.mjs +6 -1
  266. package/esm2022/ecosystem/packages/package-details/package-details.component.mjs +13 -8
  267. package/esm2022/ecosystem/packages/package-list/packages-list.component.mjs +4 -4
  268. package/esm2022/ecosystem/shared/add-application.component.mjs +1 -1
  269. package/esm2022/ecosystem/shared/application-card.component.mjs +3 -3
  270. package/esm2022/ecosystem/shared/archived-filter/archived-filter.component.mjs +27 -0
  271. package/esm2022/ecosystem/shared/ecosystem.constants.mjs +5 -1
  272. package/esm2022/ecosystem/shared/ecosystem.model.mjs +7 -3
  273. package/esm2022/ecosystem/shared/ecosystem.service.mjs +26 -1
  274. package/esm2022/ecosystem/shared/index.mjs +2 -1
  275. package/esm2022/ecosystem/shared/list-filters/list-filters.component.mjs +75 -13
  276. package/esm2022/ecosystem/shared/list-filters/list-filters.model.mjs +1 -1
  277. package/esm2022/ecosystem/shared/shared-ecosystem.module.mjs +10 -5
  278. package/esm2022/ecosystem/shared/translate-package-label.pipe.mjs +3 -3
  279. package/esm2022/files-repository/files-repository.component.mjs +2 -2
  280. package/esm2022/files-repository/files-repository.service.mjs +5 -16
  281. package/esm2022/icon-selector/icon-selector.component.mjs +1 -1
  282. package/esm2022/icon-selector/icons/index.mjs +1 -1
  283. package/esm2022/operations/shared/status-option.model.mjs +1 -1
  284. package/esm2022/protocol-lwm2m/components/configuration/lwm2m-configuration.component.mjs +2 -2
  285. package/esm2022/protocol-opcua/opcua-auto-apply-settings.component.mjs +1 -1
  286. package/esm2022/register-device/bulk/bulk-device-registration-modal.component.mjs +17 -9
  287. package/esm2022/register-device/general/general-device-registration-button.component.mjs +3 -3
  288. package/esm2022/register-device/general/general-device-registration.component.mjs +109 -33
  289. package/esm2022/remote-access/configurations/c8y-ngx-components-remote-access-configurations.mjs +5 -0
  290. package/esm2022/remote-access/configurations/index.mjs +16 -0
  291. package/esm2022/remote-access/configurations/remote-access-configuration-list/remote-access-configuration-list.component.mjs +218 -0
  292. package/esm2022/remote-access/configurations/remote-access-configuration-list/remote-access-connect-button/remote-access-connect-button.component.mjs +60 -0
  293. package/esm2022/remote-access/configurations/remote-access-pick-protocol-modal/remote-access-pick-protocol-modal.component.mjs +36 -0
  294. package/esm2022/remote-access/data/c8y-ngx-components-remote-access-data.mjs +5 -0
  295. package/esm2022/remote-access/data/index.mjs +3 -0
  296. package/esm2022/remote-access/data/remote-access-protocol-provider.mjs +2 -0
  297. package/esm2022/remote-access/data/remote-access.service.mjs +200 -0
  298. package/esm2022/remote-access/passthrough/c8y-ngx-components-remote-access-passthrough.mjs +5 -0
  299. package/esm2022/remote-access/passthrough/index.mjs +36 -0
  300. package/esm2022/remote-access/shared/c8y-ngx-components-remote-access-shared.mjs +5 -0
  301. package/esm2022/remote-access/shared/index.mjs +3 -0
  302. package/esm2022/remote-access/shared/remote-access-basic-endpoint-modal/remote-access-basic-endpoint-modal.component.mjs +49 -0
  303. package/esm2022/remote-access/shared/ssh-key-input/ssh-key-input.component.mjs +87 -0
  304. package/esm2022/remote-access/ssh/c8y-ngx-components-remote-access-ssh.mjs +5 -0
  305. package/esm2022/remote-access/ssh/index.mjs +73 -0
  306. package/esm2022/remote-access/ssh/remote-access-ssh-endpoint-modal/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs +5 -0
  307. package/esm2022/remote-access/ssh/remote-access-ssh-endpoint-modal/index.mjs +2 -0
  308. package/esm2022/remote-access/ssh/remote-access-ssh-endpoint-modal/remote-access-ssh-endpoint-modal.component.mjs +104 -0
  309. package/esm2022/remote-access/telnet/c8y-ngx-components-remote-access-telnet.mjs +5 -0
  310. package/esm2022/remote-access/telnet/index.mjs +43 -0
  311. package/esm2022/remote-access/terminal-viewer/c8y-ngx-components-remote-access-terminal-viewer.mjs +5 -0
  312. package/esm2022/remote-access/terminal-viewer/index.mjs +2 -0
  313. package/esm2022/remote-access/terminal-viewer/shell-adapter.mjs +36 -0
  314. package/esm2022/remote-access/terminal-viewer/telnet-negotiator.mjs +96 -0
  315. package/esm2022/remote-access/terminal-viewer/terminal-viewer.component.mjs +101 -0
  316. package/esm2022/remote-access/vnc/c8y-ngx-components-remote-access-vnc.mjs +5 -0
  317. package/esm2022/remote-access/vnc/index.mjs +73 -0
  318. package/esm2022/remote-access/vnc/remote-access-vnc-endpoint-modal/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.mjs +5 -0
  319. package/esm2022/remote-access/vnc/remote-access-vnc-endpoint-modal/index.mjs +2 -0
  320. package/esm2022/remote-access/vnc/remote-access-vnc-endpoint-modal/remote-access-vnc-endpoint-modal.component.mjs +59 -0
  321. package/esm2022/remote-access/vnc/vnc-viewer/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs +5 -0
  322. package/esm2022/remote-access/vnc/vnc-viewer/index.mjs +2 -0
  323. package/esm2022/remote-access/vnc/vnc-viewer/vnc-credentials-prompt/vnc-credentials-prompt.component.mjs +57 -0
  324. package/esm2022/remote-access/vnc/vnc-viewer/vnc-viewer.component.mjs +158 -0
  325. package/esm2022/replace-device/replace-device-wizard/replace-device-wizard.model.mjs +1 -1
  326. package/esm2022/report-dashboard/report-dashboard-list.component.mjs +4 -3
  327. package/esm2022/repository/configuration/device-tab/device-configuration-list.component.mjs +1 -1
  328. package/esm2022/repository/shared/repository.model.mjs +1 -1
  329. package/esm2022/repository/shared/repository.service.mjs +3 -3
  330. package/esm2022/services/status-options/status-options.model.mjs +1 -1
  331. package/esm2022/sub-assets/group-info.component.mjs +1 -1
  332. package/esm2022/translation-editor/data/translation-store.service.mjs +4 -3
  333. package/esm2022/trusted-certificates/list/trusted-certificate-list.component.mjs +35 -9
  334. package/esm2022/upgrade/bridge.service.mjs +16 -2
  335. package/esm2022/widgets/implementations/alarms/severity-icon.pipe.mjs +1 -1
  336. package/esm2022/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.mjs +3 -2
  337. package/esm2022/widgets/implementations/kpi/kpi-widget.model.mjs +1 -1
  338. package/fesm2022/c8y-ngx-components-alarms.mjs +1 -1
  339. package/fesm2022/c8y-ngx-components-alarms.mjs.map +1 -1
  340. package/fesm2022/c8y-ngx-components-api.mjs +3 -2
  341. package/fesm2022/c8y-ngx-components-api.mjs.map +1 -1
  342. package/fesm2022/c8y-ngx-components-auth-configuration.mjs +12 -7
  343. package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
  344. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +15 -20
  345. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  346. package/fesm2022/c8y-ngx-components-data-grid-columns-asset-type.mjs.map +1 -1
  347. package/fesm2022/c8y-ngx-components-data-grid-columns.mjs.map +1 -1
  348. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +48 -23
  349. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  350. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
  351. package/fesm2022/c8y-ngx-components-device-grid.mjs +48 -28
  352. package/fesm2022/c8y-ngx-components-device-grid.mjs.map +1 -1
  353. package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs +174 -0
  354. package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs.map +1 -0
  355. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs +125 -105
  356. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
  357. package/fesm2022/c8y-ngx-components-ecosystem-archived-confirm.mjs +57 -0
  358. package/fesm2022/c8y-ngx-components-ecosystem-archived-confirm.mjs.map +1 -0
  359. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs +147 -31
  360. package/fesm2022/c8y-ngx-components-ecosystem-shared.mjs.map +1 -1
  361. package/fesm2022/c8y-ngx-components-ecosystem.mjs +1452 -1414
  362. package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
  363. package/fesm2022/c8y-ngx-components-files-repository.mjs +5 -16
  364. package/fesm2022/c8y-ngx-components-files-repository.mjs.map +1 -1
  365. package/fesm2022/c8y-ngx-components-icon-selector-icons.mjs.map +1 -1
  366. package/fesm2022/c8y-ngx-components-icon-selector.mjs.map +1 -1
  367. package/fesm2022/c8y-ngx-components-protocol-lwm2m-components-configuration.mjs +1 -1
  368. package/fesm2022/c8y-ngx-components-protocol-lwm2m-components-configuration.mjs.map +1 -1
  369. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +1 -1
  370. package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
  371. package/fesm2022/c8y-ngx-components-register-device.mjs +269 -188
  372. package/fesm2022/c8y-ngx-components-register-device.mjs.map +1 -1
  373. package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs +314 -0
  374. package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs.map +1 -0
  375. package/fesm2022/c8y-ngx-components-remote-access-data.mjs +206 -0
  376. package/fesm2022/c8y-ngx-components-remote-access-data.mjs.map +1 -0
  377. package/fesm2022/c8y-ngx-components-remote-access-passthrough.mjs +42 -0
  378. package/fesm2022/c8y-ngx-components-remote-access-passthrough.mjs.map +1 -0
  379. package/fesm2022/c8y-ngx-components-remote-access-shared.mjs +138 -0
  380. package/fesm2022/c8y-ngx-components-remote-access-shared.mjs.map +1 -0
  381. package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs +111 -0
  382. package/fesm2022/c8y-ngx-components-remote-access-ssh-remote-access-ssh-endpoint-modal.mjs.map +1 -0
  383. package/fesm2022/c8y-ngx-components-remote-access-ssh.mjs +79 -0
  384. package/fesm2022/c8y-ngx-components-remote-access-ssh.mjs.map +1 -0
  385. package/fesm2022/c8y-ngx-components-remote-access-telnet.mjs +50 -0
  386. package/fesm2022/c8y-ngx-components-remote-access-telnet.mjs.map +1 -0
  387. package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs +235 -0
  388. package/fesm2022/c8y-ngx-components-remote-access-terminal-viewer.mjs.map +1 -0
  389. package/fesm2022/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.mjs +66 -0
  390. package/fesm2022/c8y-ngx-components-remote-access-vnc-remote-access-vnc-endpoint-modal.mjs.map +1 -0
  391. package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs +211 -0
  392. package/fesm2022/c8y-ngx-components-remote-access-vnc-vnc-viewer.mjs.map +1 -0
  393. package/fesm2022/c8y-ngx-components-remote-access-vnc.mjs +79 -0
  394. package/fesm2022/c8y-ngx-components-remote-access-vnc.mjs.map +1 -0
  395. package/fesm2022/c8y-ngx-components-replace-device-replace-device-wizard.mjs.map +1 -1
  396. package/fesm2022/c8y-ngx-components-report-dashboard.mjs +3 -2
  397. package/fesm2022/c8y-ngx-components-report-dashboard.mjs.map +1 -1
  398. package/fesm2022/c8y-ngx-components-repository-configuration.mjs +1 -1
  399. package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
  400. package/fesm2022/c8y-ngx-components-repository-shared.mjs +2 -2
  401. package/fesm2022/c8y-ngx-components-repository-shared.mjs.map +1 -1
  402. package/fesm2022/c8y-ngx-components-services.mjs.map +1 -1
  403. package/fesm2022/c8y-ngx-components-sub-assets.mjs.map +1 -1
  404. package/fesm2022/c8y-ngx-components-translation-editor-data.mjs +3 -2
  405. package/fesm2022/c8y-ngx-components-translation-editor-data.mjs.map +1 -1
  406. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +43 -17
  407. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
  408. package/fesm2022/c8y-ngx-components-upgrade.mjs +16 -2
  409. package/fesm2022/c8y-ngx-components-upgrade.mjs.map +1 -1
  410. package/fesm2022/c8y-ngx-components-widgets-implementations-alarms.mjs.map +1 -1
  411. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +2 -1
  412. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
  413. package/fesm2022/c8y-ngx-components.mjs +151 -38
  414. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  415. package/files-repository/files-repository.component.d.ts.map +1 -1
  416. package/files-repository/files-repository.service.d.ts +0 -2
  417. package/files-repository/files-repository.service.d.ts.map +1 -1
  418. package/icon-selector/icon-selector.component.d.ts +3 -2
  419. package/icon-selector/icon-selector.component.d.ts.map +1 -1
  420. package/icon-selector/icons/index.d.ts +1 -0
  421. package/icon-selector/icons/index.d.ts.map +1 -1
  422. package/locales/de.po +157 -5
  423. package/locales/es.po +157 -5
  424. package/locales/fr.po +157 -5
  425. package/locales/ja_JP.po +156 -5
  426. package/locales/ko.po +156 -5
  427. package/locales/locales.pot +156 -4
  428. package/locales/nl.po +157 -5
  429. package/locales/pl.po +157 -5
  430. package/locales/pt_BR.po +157 -5
  431. package/locales/zh_CN.po +156 -5
  432. package/locales/zh_TW.po +156 -5
  433. package/operations/shared/status-option.model.d.ts +2 -1
  434. package/operations/shared/status-option.model.d.ts.map +1 -1
  435. package/package.json +1 -1
  436. package/register-device/bulk/bulk-device-registration-modal.component.d.ts +6 -2
  437. package/register-device/bulk/bulk-device-registration-modal.component.d.ts.map +1 -1
  438. package/register-device/general/general-device-registration-button.component.d.ts +1 -1
  439. package/register-device/general/general-device-registration-button.component.d.ts.map +1 -1
  440. package/register-device/general/general-device-registration.component.d.ts +21 -7
  441. package/register-device/general/general-device-registration.component.d.ts.map +1 -1
  442. package/remote-access/configurations/c8y-ngx-components-remote-access-configurations.d.ts.map +1 -0
  443. package/remote-access/configurations/index.d.ts +3 -0
  444. package/remote-access/configurations/index.d.ts.map +1 -0
  445. package/remote-access/configurations/remote-access-configuration-list/remote-access-configuration-list.component.d.ts +34 -0
  446. package/remote-access/configurations/remote-access-configuration-list/remote-access-configuration-list.component.d.ts.map +1 -0
  447. package/remote-access/configurations/remote-access-configuration-list/remote-access-connect-button/remote-access-connect-button.component.d.ts +17 -0
  448. package/remote-access/configurations/remote-access-configuration-list/remote-access-connect-button/remote-access-connect-button.component.d.ts.map +1 -0
  449. package/remote-access/configurations/remote-access-pick-protocol-modal/remote-access-pick-protocol-modal.component.d.ts +18 -0
  450. package/remote-access/configurations/remote-access-pick-protocol-modal/remote-access-pick-protocol-modal.component.d.ts.map +1 -0
  451. package/remote-access/data/c8y-ngx-components-remote-access-data.d.ts.map +1 -0
  452. package/remote-access/data/index.d.ts +3 -0
  453. package/remote-access/data/index.d.ts.map +1 -0
  454. package/remote-access/data/remote-access-protocol-provider.d.ts +21 -0
  455. package/remote-access/data/remote-access-protocol-provider.d.ts.map +1 -0
  456. package/remote-access/data/remote-access.service.d.ts +94 -0
  457. package/remote-access/data/remote-access.service.d.ts.map +1 -0
  458. package/remote-access/passthrough/c8y-ngx-components-remote-access-passthrough.d.ts.map +1 -0
  459. package/remote-access/passthrough/index.d.ts +17 -0
  460. package/remote-access/passthrough/index.d.ts.map +1 -0
  461. package/remote-access/shared/c8y-ngx-components-remote-access-shared.d.ts.map +1 -0
  462. package/remote-access/shared/index.d.ts +3 -0
  463. package/remote-access/shared/index.d.ts.map +1 -0
  464. package/remote-access/shared/remote-access-basic-endpoint-modal/remote-access-basic-endpoint-modal.component.d.ts +37 -0
  465. package/remote-access/shared/remote-access-basic-endpoint-modal/remote-access-basic-endpoint-modal.component.d.ts.map +1 -0
  466. package/remote-access/shared/ssh-key-input/ssh-key-input.component.d.ts +38 -0
  467. package/remote-access/shared/ssh-key-input/ssh-key-input.component.d.ts.map +1 -0
  468. package/remote-access/ssh/c8y-ngx-components-remote-access-ssh.d.ts.map +1 -0
  469. package/remote-access/ssh/index.d.ts +22 -0
  470. package/remote-access/ssh/index.d.ts.map +1 -0
  471. 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
  472. package/remote-access/ssh/remote-access-ssh-endpoint-modal/index.d.ts +2 -0
  473. package/remote-access/ssh/remote-access-ssh-endpoint-modal/index.d.ts.map +1 -0
  474. package/remote-access/ssh/remote-access-ssh-endpoint-modal/remote-access-ssh-endpoint-modal.component.d.ts +64 -0
  475. package/remote-access/ssh/remote-access-ssh-endpoint-modal/remote-access-ssh-endpoint-modal.component.d.ts.map +1 -0
  476. package/remote-access/telnet/c8y-ngx-components-remote-access-telnet.d.ts.map +1 -0
  477. package/remote-access/telnet/index.d.ts +17 -0
  478. package/remote-access/telnet/index.d.ts.map +1 -0
  479. package/remote-access/terminal-viewer/c8y-ngx-components-remote-access-terminal-viewer.d.ts.map +1 -0
  480. package/remote-access/terminal-viewer/index.d.ts +2 -0
  481. package/remote-access/terminal-viewer/index.d.ts.map +1 -0
  482. package/remote-access/terminal-viewer/shell-adapter.d.ts +14 -0
  483. package/remote-access/terminal-viewer/shell-adapter.d.ts.map +1 -0
  484. package/remote-access/terminal-viewer/telnet-negotiator.d.ts +13 -0
  485. package/remote-access/terminal-viewer/telnet-negotiator.d.ts.map +1 -0
  486. package/remote-access/terminal-viewer/terminal-viewer.component.d.ts +25 -0
  487. package/remote-access/terminal-viewer/terminal-viewer.component.d.ts.map +1 -0
  488. package/remote-access/vnc/c8y-ngx-components-remote-access-vnc.d.ts.map +1 -0
  489. package/remote-access/vnc/index.d.ts +22 -0
  490. package/remote-access/vnc/index.d.ts.map +1 -0
  491. 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
  492. package/remote-access/vnc/remote-access-vnc-endpoint-modal/index.d.ts +2 -0
  493. package/remote-access/vnc/remote-access-vnc-endpoint-modal/index.d.ts.map +1 -0
  494. package/remote-access/vnc/remote-access-vnc-endpoint-modal/remote-access-vnc-endpoint-modal.component.d.ts +46 -0
  495. package/remote-access/vnc/remote-access-vnc-endpoint-modal/remote-access-vnc-endpoint-modal.component.d.ts.map +1 -0
  496. package/remote-access/vnc/vnc-viewer/c8y-ngx-components-remote-access-vnc-vnc-viewer.d.ts.map +1 -0
  497. package/remote-access/vnc/vnc-viewer/index.d.ts +2 -0
  498. package/remote-access/vnc/vnc-viewer/index.d.ts.map +1 -0
  499. package/remote-access/vnc/vnc-viewer/vnc-credentials-prompt/vnc-credentials-prompt.component.d.ts +32 -0
  500. package/remote-access/vnc/vnc-viewer/vnc-credentials-prompt/vnc-credentials-prompt.component.d.ts.map +1 -0
  501. package/remote-access/vnc/vnc-viewer/vnc-viewer.component.d.ts +37 -0
  502. package/remote-access/vnc/vnc-viewer/vnc-viewer.component.d.ts.map +1 -0
  503. package/replace-device/replace-device-wizard/replace-device-wizard.model.d.ts +2 -1
  504. package/replace-device/replace-device-wizard/replace-device-wizard.model.d.ts.map +1 -1
  505. package/report-dashboard/report-dashboard-list.component.d.ts +29 -0
  506. package/report-dashboard/report-dashboard-list.component.d.ts.map +1 -1
  507. package/repository/shared/repository.model.d.ts +2 -1
  508. package/repository/shared/repository.model.d.ts.map +1 -1
  509. package/services/status-options/status-options.model.d.ts +2 -1
  510. package/services/status-options/status-options.model.d.ts.map +1 -1
  511. package/sub-assets/group-info.component.d.ts +2 -1
  512. package/sub-assets/group-info.component.d.ts.map +1 -1
  513. package/translation-editor/data/translation-store.service.d.ts.map +1 -1
  514. package/trusted-certificates/list/trusted-certificate-list.component.d.ts +7 -2
  515. package/trusted-certificates/list/trusted-certificate-list.component.d.ts.map +1 -1
  516. package/upgrade/bridge.service.d.ts +5 -0
  517. package/upgrade/bridge.service.d.ts.map +1 -1
  518. package/widgets/implementations/alarms/severity-icon.pipe.d.ts.map +1 -1
  519. package/widgets/implementations/datapoints-table/datapoints-table-config/datapoints-table-config.component.d.ts.map +1 -1
  520. package/widgets/implementations/kpi/kpi-widget.model.d.ts +2 -1
  521. package/widgets/implementations/kpi/kpi-widget.model.d.ts.map +1 -1
  522. package/ecosystem/application-plugins/only-latest-plugin-version.pipe.d.ts +0 -10
  523. package/ecosystem/application-plugins/only-latest-plugin-version.pipe.d.ts.map +0 -1
  524. package/esm2022/ecosystem/application-plugins/only-latest-plugin-version.pipe.mjs +0 -20
@@ -1297,10 +1297,10 @@ class GroupService {
1297
1297
  if (genericMoType === 'asset') {
1298
1298
  return await this.getAssetCustomIcon(mo.type);
1299
1299
  }
1300
- const typeIcons = this.getDefaultIcon(genericMoType);
1301
1300
  if (fallbackIcon && genericMoType === 'other') {
1302
1301
  return fallbackIcon;
1303
1302
  }
1303
+ const typeIcons = this.getDefaultIcon(genericMoType);
1304
1304
  return open ? typeIcons.iconOpen : typeIcons.icon;
1305
1305
  }
1306
1306
  /**
@@ -4514,6 +4514,10 @@ var PackageType;
4514
4514
  * A custom package e.g. uploaded to the tenant by a user
4515
4515
  */
4516
4516
  PackageType["CUSTOM"] = "CUSTOM";
4517
+ /**
4518
+ * A package that was archived by the user
4519
+ */
4520
+ PackageType["ARCHIVED"] = "ARCHIVED";
4517
4521
  })(PackageType || (PackageType = {}));
4518
4522
 
4519
4523
  class PluginsResolveService {
@@ -5037,6 +5041,9 @@ class PluginsService {
5037
5041
  */
5038
5042
  getPackageType(packageApplication) {
5039
5043
  const label = packageApplication.label || packageApplication.manifest?.label;
5044
+ if (label === PackageType.ARCHIVED) {
5045
+ return PackageType.ARCHIVED;
5046
+ }
5040
5047
  if (!label) {
5041
5048
  return PackageType.CUSTOM;
5042
5049
  }
@@ -5121,7 +5128,8 @@ class PluginsService {
5121
5128
  versioningMatrix: application.manifest.versioningMatrix,
5122
5129
  tags: useLatest ? ['latest'] : version.tags || [],
5123
5130
  license: application.manifest.license,
5124
- type: this.getPackageType(application)
5131
+ type: this.getPackageType(application),
5132
+ originApp: application
5125
5133
  }));
5126
5134
  return extendedPlugins;
5127
5135
  }
@@ -10859,7 +10867,11 @@ const PRODUCT_EXPERIENCE_CORE_SHARED = {
10859
10867
  QUICK_LINKS: {
10860
10868
  EVENTS: { QUICK_LINK_RIGHT_DRAWER: 'quickLinkRightDrawer' },
10861
10869
  COMPONENTS: { RIGHT_DRAWER_COMPONENT: 'right-drawer' },
10862
- ACTIONS: {},
10870
+ ACTIONS: {
10871
+ ACTIVATE_SUPPORT_ACCESS: 'activateSupportAccess',
10872
+ DEACTIVATE_SUPPORT_ACCESS: 'deactivateSupportAccess',
10873
+ OPEN_SUPPORT_LINK: 'openSupportLink'
10874
+ },
10863
10875
  RESULTS: {}
10864
10876
  }
10865
10877
  };
@@ -12990,13 +13002,24 @@ class LoginService {
12990
13002
  * @param credentials The credentials to try to login.
12991
13003
  */
12992
13004
  async login(auth = this.getAuthStrategy(), credentials) {
12993
- this.client.setAuth(auth);
13005
+ // To ensure backward compatibility, we need to verify whether the backend supports TFA
13006
+ // without requiring the use of /tenant with auth: base64. The tfaSupported flag indicates
13007
+ // whether authentication is possible exclusively via OAI-SECURE.
13008
+ // TfaSupported flag should be removed during: MTM-62641
13009
+ const isOAISecureAndTFAIsSupported = (this.tenantUiService.isOauthInternal(this.loginMode) && this.loginMode.tfaSupported) ||
13010
+ false;
13011
+ if (isOAISecureAndTFAIsSupported && (await this.switchLoginMode(credentials))) {
13012
+ auth = this.cookieAuth;
13013
+ }
13014
+ else {
13015
+ this.client.setAuth(auth);
13016
+ }
12994
13017
  const tenantRes = await this.tenant.current({ withParent: true });
12995
13018
  const tenant = tenantRes.data;
12996
13019
  if (credentials) {
12997
13020
  credentials.tenant = tenant.name;
12998
13021
  }
12999
- if (await this.switchLoginMode(credentials)) {
13022
+ if (!isOAISecureAndTFAIsSupported && (await this.switchLoginMode(credentials))) {
13000
13023
  auth = this.cookieAuth;
13001
13024
  }
13002
13025
  const userRes = await this.user.current();
@@ -13064,7 +13087,7 @@ class LoginService {
13064
13087
  grant_type: 'PASSWORD',
13065
13088
  username: credentials.user,
13066
13089
  password: credentials.password,
13067
- tfa_code: credentials.tfa
13090
+ ...(credentials.tfa !== undefined && { tfa_code: credentials.tfa })
13068
13091
  });
13069
13092
  return await new FetchClient().fetch(this.getUrlForOauth(credentials), {
13070
13093
  method: 'POST',
@@ -15559,15 +15582,27 @@ class FilterInputComponent {
15559
15582
  this.onSearch = new EventEmitter();
15560
15583
  this.filterChange$ = new Subject();
15561
15584
  this.filterTerm = '';
15585
+ this.searchLabel = gettext$1('search');
15586
+ this.closeLabel = gettext$1('close');
15562
15587
  this.CARRIAGE_RETURN_KEY = 13;
15563
15588
  this.CARRIAGE_RETURN_CODE = 'Enter';
15589
+ this.CARRIAGE_ESCAPE_CODE = 'Escape';
15590
+ this.AUTO_SEARCH_DEBOUNCE = 500;
15564
15591
  }
15565
15592
  ngOnInit() {
15566
- this.reset();
15567
15593
  this.filterChange$
15568
- .pipe(debounce((event) => event.code === this.CARRIAGE_RETURN_CODE || event.keyCode === this.CARRIAGE_RETURN_KEY
15569
- ? timer(10)
15570
- : timer(300)), map((e) => e.target.value), distinctUntilChanged())
15594
+ .pipe(debounce((event) => {
15595
+ if (event.code === this.CARRIAGE_RETURN_CODE ||
15596
+ event.keyCode === this.CARRIAGE_RETURN_KEY) {
15597
+ event.preventDefault();
15598
+ return timer(0);
15599
+ }
15600
+ if (event.code === this.CARRIAGE_ESCAPE_CODE) {
15601
+ this.reset();
15602
+ return timer(0);
15603
+ }
15604
+ return timer(this.AUTO_SEARCH_DEBOUNCE);
15605
+ }), map((e) => e.target.value), distinctUntilChanged())
15571
15606
  .subscribe(filterTerm => {
15572
15607
  this.filterTerm = filterTerm;
15573
15608
  this.onSearch.emit(filterTerm);
@@ -15581,15 +15616,17 @@ class FilterInputComponent {
15581
15616
  this.filterChange$.complete();
15582
15617
  }
15583
15618
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: FilterInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
15584
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: FilterInputComponent, selector: "c8y-filter", inputs: { icon: "icon" }, outputs: { onSearch: "onSearch" }, ngImport: i0, template: "<div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Filter\u2026' | translate }}\"\n type=\"text\"\n [value]=\"filterTerm\"\n (keyup)=\"filterChange$.next($event)\"\n px-event=\"Filter\u2026\"\n data-cy=\"filter-input--filter-input\"\n />\n <span class=\"input-group-btn\">\n <button class=\"btn btn-clean\" title=\"{{filterTerm.length === 0 ? ('search' | translate) : ('close' | translate)}}\" px-event=\"Clear filtering\" (click)=\"reset()\">\n <i [c8yIcon]=\"filterTerm.length === 0 ? 'search' : 'close'\"></i>\n </button>\n </span>\n</div>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
15619
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: FilterInputComponent, selector: "c8y-filter", inputs: { icon: "icon", filterTerm: "filterTerm" }, outputs: { onSearch: "onSearch" }, ngImport: i0, template: "<div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Filter\u2026' | translate }}\"\n type=\"text\"\n [value]=\"filterTerm\"\n (keydown)=\"filterChange$.next($event)\"\n px-event=\"Filter\u2026\"\n data-cy=\"filter-input--filter-input\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-clean\"\n title=\"{{ filterTerm.length === 0 ? searchLabel : closeLabel }}\"\n px-event=\"Clear filtering\"\n (click)=\"reset()\"\n >\n <i [c8yIcon]=\"filterTerm.length === 0 ? 'search' : 'close'\"></i>\n </button>\n </span>\n</div>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
15585
15620
  }
15586
15621
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: FilterInputComponent, decorators: [{
15587
15622
  type: Component,
15588
- args: [{ selector: 'c8y-filter', template: "<div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Filter\u2026' | translate }}\"\n type=\"text\"\n [value]=\"filterTerm\"\n (keyup)=\"filterChange$.next($event)\"\n px-event=\"Filter\u2026\"\n data-cy=\"filter-input--filter-input\"\n />\n <span class=\"input-group-btn\">\n <button class=\"btn btn-clean\" title=\"{{filterTerm.length === 0 ? ('search' | translate) : ('close' | translate)}}\" px-event=\"Clear filtering\" (click)=\"reset()\">\n <i [c8yIcon]=\"filterTerm.length === 0 ? 'search' : 'close'\"></i>\n </button>\n </span>\n</div>\n" }]
15623
+ args: [{ selector: 'c8y-filter', template: "<div class=\"input-group input-group-search\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Filter\u2026' | translate }}\"\n type=\"text\"\n [value]=\"filterTerm\"\n (keydown)=\"filterChange$.next($event)\"\n px-event=\"Filter\u2026\"\n data-cy=\"filter-input--filter-input\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-clean\"\n title=\"{{ filterTerm.length === 0 ? searchLabel : closeLabel }}\"\n px-event=\"Clear filtering\"\n (click)=\"reset()\"\n >\n <i [c8yIcon]=\"filterTerm.length === 0 ? 'search' : 'close'\"></i>\n </button>\n </span>\n</div>\n" }]
15589
15624
  }], propDecorators: { icon: [{
15590
15625
  type: Input
15591
15626
  }], onSearch: [{
15592
15627
  type: Output
15628
+ }], filterTerm: [{
15629
+ type: Input
15593
15630
  }] } });
15594
15631
 
15595
15632
  class InputGroupListComponent {
@@ -16579,7 +16616,7 @@ class CredentialsComponent {
16579
16616
  if (e.res && e.res.headers && e.res.headers.get(this.PASSWORD_RESET_HEADER_NAME)) {
16580
16617
  this.handlePasswordReset(e.res);
16581
16618
  }
16582
- else if (e.res && e.res.status === 401 && /pin/i.test(e.data.message)) {
16619
+ else if (e.res && e.res.status === 401 && /pin.*generated/i.test(e.data.message)) {
16583
16620
  this.handleSmsChallenge(e.data.message);
16584
16621
  }
16585
16622
  else if (e.res && e.res.status === 401 && /TOTP/i.test(e.data.message)) {
@@ -16921,30 +16958,47 @@ class TabsOutletComponent {
16921
16958
  get isVertical() {
16922
16959
  return this.orientation !== 'horizontal';
16923
16960
  }
16924
- constructor(router, renderer, header, tabsService) {
16961
+ constructor(router, renderer, header, tabsService, activatedRoute) {
16925
16962
  this.router = router;
16926
16963
  this.renderer = renderer;
16927
16964
  this.header = header;
16928
16965
  this.tabsService = tabsService;
16966
+ this.activatedRoute = activatedRoute;
16929
16967
  this.tabs = [];
16930
16968
  this.orientation = 'vertical';
16931
16969
  this.navigatorOpen = false;
16970
+ this.openFirstTab = true;
16932
16971
  /**
16933
16972
  * Identifies if the current view has a header element.
16934
16973
  */
16935
16974
  this.hasHeader = false;
16936
16975
  this.showLeft = false;
16937
16976
  this.showRight = false;
16977
+ this.extras = {
16978
+ queryParamsHandling: 'preserve',
16979
+ relativeTo: this.activatedRoute
16980
+ };
16938
16981
  this.destroy$ = new Subject();
16939
16982
  this.tabsChanges$ = new BehaviorSubject([]);
16940
16983
  }
16941
16984
  ngOnInit() {
16942
16985
  if (this.outletName && this.tabs.length === 0) {
16943
- this.tabsService.items$
16944
- .pipe(map(tabs => tabs.filter(tab => tab.tabsOutlet === this.outletName)), takeUntil(this.destroy$))
16945
- .subscribe(tabs => {
16986
+ const tabsSubscription$ = this.tabsService.items$.pipe(map(tabs => tabs.filter(tab => tab.tabsOutlet === this.outletName)), takeUntil(this.destroy$));
16987
+ tabsSubscription$.subscribe(tabs => {
16946
16988
  this.tabs = tabs;
16947
16989
  });
16990
+ tabsSubscription$.pipe(take(1)).subscribe(tabs => {
16991
+ if (this.openFirstTab && tabs.length) {
16992
+ this.navigateTo(tabs[0].path);
16993
+ }
16994
+ });
16995
+ }
16996
+ else if (this.openFirstTab && this.tabs.length) {
16997
+ const matchingTab = this.tabs.find(tab => this.isActive(tab));
16998
+ // only navigate to first tab if no tab is active
16999
+ if (!matchingTab) {
17000
+ this.navigateTo(this.tabs[0].path);
17001
+ }
16948
17002
  }
16949
17003
  }
16950
17004
  ngOnChanges(changes) {
@@ -16967,7 +17021,13 @@ class TabsOutletComponent {
16967
17021
  }
16968
17022
  isActive(tab) {
16969
17023
  if (tab && tab.path) {
16970
- return this.router.isActive(tab.path, false);
17024
+ const tree = this.router.createUrlTree(typeof tab.path === 'string' ? [tab.path] : tab.path);
17025
+ return this.router.isActive(tree, {
17026
+ paths: 'subset',
17027
+ queryParams: 'subset',
17028
+ fragment: 'ignored',
17029
+ matrixParams: 'ignored'
17030
+ });
16971
17031
  }
16972
17032
  else {
16973
17033
  return false;
@@ -16975,7 +17035,11 @@ class TabsOutletComponent {
16975
17035
  }
16976
17036
  navigateTo(path) {
16977
17037
  this.header.toggle();
16978
- this.router.navigate([path]);
17038
+ if (typeof path === 'string') {
17039
+ this.router.navigate([path], this.extras);
17040
+ return;
17041
+ }
17042
+ this.router.navigate(path, this.extras);
16979
17043
  }
16980
17044
  scroll(direction = 'right') {
16981
17045
  const { widthScroll, width, scrollLeft } = this.getDimensions();
@@ -17010,13 +17074,13 @@ class TabsOutletComponent {
17010
17074
  const scrollLeft = el.scrollLeft;
17011
17075
  return { widthScroll, width, scrollLeft };
17012
17076
  }
17013
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: TabsOutletComponent, deps: [{ token: i1$3.Router }, { token: i0.Renderer2 }, { token: HeaderService }, { token: TabsService }], target: i0.ɵɵFactoryTarget.Component }); }
17014
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: TabsOutletComponent, selector: "c8y-tabs-outlet,c8y-ui-tabs", inputs: { tabs: "tabs", orientation: "orientation", navigatorOpen: "navigatorOpen", outletName: "outletName", context: "context", hasHeader: "hasHeader" }, host: { properties: { "class.has-header": "this.hasHeader", "class.navigator-open": "this.isNavigatorOpen", "class.page-tabs": "this.hasTabs", "class.page-tabs-horizontal": "this.isHorizontal", "class.page-tabs-vertical": "this.isVertical" } }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ElementRef, static: true }, { propertyName: "tabsContainer", first: true, predicate: ["tabsContainer"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"tabContainer\"\n [ngClass]=\"{ 'hidden-xs': !outletName }\"\n #container\n>\n <button\n class=\"tabs-slider tabs-slider-left\"\n title=\"{{ 'Scroll to the left' | translate }}\"\n type=\"button\"\n #left\n *ngIf=\"showLeft || showRight\"\n [disabled]=\"!showLeft\"\n (click)=\"scroll('left')\"\n >\n <i [c8yIcon]=\"'chevron-left'\"></i>\n </button>\n <button\n class=\"tabs-slider tabs-slider-right\"\n title=\"{{ 'Scroll to the right' | translate }}\"\n type=\"button\"\n #right\n *ngIf=\"showRight || showLeft\"\n [disabled]=\"!showRight\"\n (click)=\"scroll('right')\"\n >\n <i [c8yIcon]=\"'chevron-right'\"></i>\n </button>\n <ng-container *ngIf=\"!outletName\">\n <div\n class=\"nav nav-tabs nav-tabsc8y\"\n role=\"list\"\n #tabsContainer\n >\n <ng-container *ngFor=\"let tab of tabs\">\n <div\n role=\"listitem\"\n [ngClass]=\"{ active: rla?.isActive }\"\n *ngIf=\"!tab.component && !tab.hide\"\n >\n <a\n [routerLink]=\"tab.path\"\n routerLinkActive\n [queryParamsHandling]=\"'preserve'\"\n #rla=\"routerLinkActive\"\n [ngClass]=\"{ 'p-r-24': !tab.template && tab?.badge }\"\n (click)=\"tab.onSelect?.emit()\"\n >\n <i\n [c8yIcon]=\"tab?.icon\"\n *ngIf=\"!tab.template && tab?.icon\"\n ></i>\n <span\n title=\"{{ tab?.label | translate }}\"\n *ngIf=\"!tab.template && !tab.component\"\n >\n {{ tab?.label | translate }}\n </span>\n <span\n class=\"dashboard-template-marker\"\n tooltip=\"{{ tab?.tooltipText | translate }}\"\n placement=\"bottom\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n [delay]=\"300\"\n *ngIf=\"!tab.template && tab?.badge\"\n ></span>\n </a>\n <ng-container *ngTemplateOutlet=\"tab.template; injector: tab.injector\"></ng-container>\n </div>\n <ng-container *ngComponentOutlet=\"tab.component; injector: tab.injector\"></ng-container>\n </ng-container>\n </div>\n </ng-container>\n\n <div\n class=\"component-tabs nav nav-tabs nav-tabsc8y\"\n *ngIf=\"outletName\"\n #tabsContainer\n >\n <ng-container *ngFor=\"let tab of tabs; trackBy: trackByPath\">\n <div\n [ngClass]=\"{ active: tab.isActive }\"\n [routerLink]=\"tab.path\"\n [routerLinkActive]=\"tab.path ? 'active' : ''\"\n [queryParamsHandling]=\"'preserve'\"\n >\n <a\n class=\"pointer\"\n title=\"{{ tab?.label | translate }}\"\n (click)=\"tab.onSelect?.emit()\"\n >\n <i [c8yIcon]=\"tab?.icon\"></i>\n <span>\n {{ tab?.label | translate }}\n </span>\n </a>\n </div>\n </ng-container>\n </div>\n</div>\n\n<div\n class=\"visible-xs mobile-tabs\"\n *ngIf=\"!outletName\"\n>\n <ul class=\"list-unstyled d-flex m-b-0\">\n <li class=\"c8y-select-wrapper flex-grow\">\n <select\n (change)=\"navigateTo($event.target.value)\"\n #select\n >\n <ng-container *ngFor=\"let tab of tabs\">\n <option\n *ngIf=\"!tab.component\"\n [value]=\"tab.path\"\n [selected]=\"isActive(tab)\"\n >\n {{ tab?.label | translate }}\n </option>\n </ng-container>\n </select>\n </li>\n <ng-container *ngFor=\"let tab of tabs\">\n <ng-container *ngIf=\"tab.component\">\n <ng-container\n *c8yComponentOutlet=\"tab.component; environmentInjector: tab.injector\"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ul>\n</div>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: C8yComponentOutlet, selector: "[c8yComponentOutlet]", inputs: ["c8yComponentOutlet", "c8yComponentOutletInjector", "c8yComponentOutletEnvironmentInjector"] }, { kind: "directive", type: i1$3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i1$3.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: i2$3.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
17077
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: TabsOutletComponent, deps: [{ token: i1$3.Router }, { token: i0.Renderer2 }, { token: HeaderService }, { token: TabsService }, { token: i1$3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
17078
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: TabsOutletComponent, selector: "c8y-tabs-outlet,c8y-ui-tabs", inputs: { tabs: "tabs", orientation: "orientation", navigatorOpen: "navigatorOpen", outletName: "outletName", context: "context", openFirstTab: "openFirstTab", hasHeader: "hasHeader" }, host: { properties: { "class.has-header": "this.hasHeader", "class.navigator-open": "this.isNavigatorOpen", "class.page-tabs": "this.hasTabs", "class.page-tabs-horizontal": "this.isHorizontal", "class.page-tabs-vertical": "this.isVertical" } }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ElementRef, static: true }, { propertyName: "tabsContainer", first: true, predicate: ["tabsContainer"], descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"tabContainer\"\n [ngClass]=\"{ 'hidden-xs': !outletName }\"\n #container\n>\n <button\n class=\"tabs-slider tabs-slider-left\"\n title=\"{{ 'Scroll to the left' | translate }}\"\n type=\"button\"\n #left\n *ngIf=\"showLeft || showRight\"\n [disabled]=\"!showLeft\"\n (click)=\"scroll('left')\"\n >\n <i [c8yIcon]=\"'chevron-left'\"></i>\n </button>\n <button\n class=\"tabs-slider tabs-slider-right\"\n title=\"{{ 'Scroll to the right' | translate }}\"\n type=\"button\"\n #right\n *ngIf=\"showRight || showLeft\"\n [disabled]=\"!showRight\"\n (click)=\"scroll('right')\"\n >\n <i [c8yIcon]=\"'chevron-right'\"></i>\n </button>\n <ng-container *ngIf=\"!outletName\">\n <div\n class=\"nav nav-tabs nav-tabsc8y\"\n role=\"list\"\n #tabsContainer\n >\n <ng-container *ngFor=\"let tab of tabs\">\n <div\n role=\"listitem\"\n [ngClass]=\"{ active: rla?.isActive }\"\n *ngIf=\"!tab.component && !tab.hide\"\n >\n <a\n [routerLink]=\"tab.path\"\n routerLinkActive\n [queryParamsHandling]=\"'preserve'\"\n #rla=\"routerLinkActive\"\n [ngClass]=\"{ 'p-r-24': !tab.template && tab?.badge }\"\n (click)=\"tab.onSelect?.emit()\"\n >\n <i\n [c8yIcon]=\"tab?.icon\"\n *ngIf=\"!tab.template && tab?.icon\"\n ></i>\n <span\n title=\"{{ tab?.label | translate }}\"\n *ngIf=\"!tab.template && !tab.component\"\n >\n {{ tab?.label | translate }}\n </span>\n <span\n class=\"dashboard-template-marker\"\n tooltip=\"{{ tab?.tooltipText | translate }}\"\n placement=\"bottom\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n [delay]=\"300\"\n *ngIf=\"!tab.template && tab?.badge\"\n ></span>\n </a>\n <ng-container *ngTemplateOutlet=\"tab.template; injector: tab.injector\"></ng-container>\n </div>\n <ng-container *ngComponentOutlet=\"tab.component; injector: tab.injector\"></ng-container>\n </ng-container>\n </div>\n </ng-container>\n\n <div\n class=\"component-tabs nav nav-tabs nav-tabsc8y\"\n *ngIf=\"outletName\"\n #tabsContainer\n >\n <ng-container *ngFor=\"let tab of tabs; trackBy: trackByPath\">\n <div\n [ngClass]=\"{ active: tab.isActive }\"\n [routerLink]=\"tab.path\"\n [routerLinkActive]=\"tab.path ? 'active' : ''\"\n [queryParamsHandling]=\"'preserve'\"\n >\n <a\n class=\"pointer\"\n title=\"{{ tab?.label | translate }}\"\n (click)=\"tab.onSelect?.emit()\"\n >\n <i [c8yIcon]=\"tab?.icon\"></i>\n <span>\n {{ tab?.label | translate }}\n </span>\n </a>\n </div>\n </ng-container>\n </div>\n</div>\n\n<div\n class=\"visible-xs mobile-tabs\"\n *ngIf=\"!outletName\"\n>\n <ul class=\"list-unstyled d-flex m-b-0\">\n <li class=\"c8y-select-wrapper flex-grow\">\n <select\n (change)=\"navigateTo($event.target.value)\"\n #select\n >\n <ng-container *ngFor=\"let tab of tabs\">\n <option\n *ngIf=\"!tab.component\"\n [value]=\"tab.path\"\n [selected]=\"isActive(tab)\"\n >\n {{ tab?.label | translate }}\n </option>\n </ng-container>\n </select>\n </li>\n <ng-container *ngFor=\"let tab of tabs\">\n <ng-container *ngIf=\"tab.component\">\n <ng-container\n *c8yComponentOutlet=\"tab.component; environmentInjector: tab.injector\"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ul>\n</div>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: C8yComponentOutlet, selector: "[c8yComponentOutlet]", inputs: ["c8yComponentOutlet", "c8yComponentOutletInjector", "c8yComponentOutletEnvironmentInjector"] }, { kind: "directive", type: i1$3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i1$3.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: i2$3.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
17015
17079
  }
17016
17080
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: TabsOutletComponent, decorators: [{
17017
17081
  type: Component,
17018
17082
  args: [{ selector: 'c8y-tabs-outlet,c8y-ui-tabs', template: "<div\n class=\"tabContainer\"\n [ngClass]=\"{ 'hidden-xs': !outletName }\"\n #container\n>\n <button\n class=\"tabs-slider tabs-slider-left\"\n title=\"{{ 'Scroll to the left' | translate }}\"\n type=\"button\"\n #left\n *ngIf=\"showLeft || showRight\"\n [disabled]=\"!showLeft\"\n (click)=\"scroll('left')\"\n >\n <i [c8yIcon]=\"'chevron-left'\"></i>\n </button>\n <button\n class=\"tabs-slider tabs-slider-right\"\n title=\"{{ 'Scroll to the right' | translate }}\"\n type=\"button\"\n #right\n *ngIf=\"showRight || showLeft\"\n [disabled]=\"!showRight\"\n (click)=\"scroll('right')\"\n >\n <i [c8yIcon]=\"'chevron-right'\"></i>\n </button>\n <ng-container *ngIf=\"!outletName\">\n <div\n class=\"nav nav-tabs nav-tabsc8y\"\n role=\"list\"\n #tabsContainer\n >\n <ng-container *ngFor=\"let tab of tabs\">\n <div\n role=\"listitem\"\n [ngClass]=\"{ active: rla?.isActive }\"\n *ngIf=\"!tab.component && !tab.hide\"\n >\n <a\n [routerLink]=\"tab.path\"\n routerLinkActive\n [queryParamsHandling]=\"'preserve'\"\n #rla=\"routerLinkActive\"\n [ngClass]=\"{ 'p-r-24': !tab.template && tab?.badge }\"\n (click)=\"tab.onSelect?.emit()\"\n >\n <i\n [c8yIcon]=\"tab?.icon\"\n *ngIf=\"!tab.template && tab?.icon\"\n ></i>\n <span\n title=\"{{ tab?.label | translate }}\"\n *ngIf=\"!tab.template && !tab.component\"\n >\n {{ tab?.label | translate }}\n </span>\n <span\n class=\"dashboard-template-marker\"\n tooltip=\"{{ tab?.tooltipText | translate }}\"\n placement=\"bottom\"\n container=\"body\"\n [adaptivePosition]=\"false\"\n [delay]=\"300\"\n *ngIf=\"!tab.template && tab?.badge\"\n ></span>\n </a>\n <ng-container *ngTemplateOutlet=\"tab.template; injector: tab.injector\"></ng-container>\n </div>\n <ng-container *ngComponentOutlet=\"tab.component; injector: tab.injector\"></ng-container>\n </ng-container>\n </div>\n </ng-container>\n\n <div\n class=\"component-tabs nav nav-tabs nav-tabsc8y\"\n *ngIf=\"outletName\"\n #tabsContainer\n >\n <ng-container *ngFor=\"let tab of tabs; trackBy: trackByPath\">\n <div\n [ngClass]=\"{ active: tab.isActive }\"\n [routerLink]=\"tab.path\"\n [routerLinkActive]=\"tab.path ? 'active' : ''\"\n [queryParamsHandling]=\"'preserve'\"\n >\n <a\n class=\"pointer\"\n title=\"{{ tab?.label | translate }}\"\n (click)=\"tab.onSelect?.emit()\"\n >\n <i [c8yIcon]=\"tab?.icon\"></i>\n <span>\n {{ tab?.label | translate }}\n </span>\n </a>\n </div>\n </ng-container>\n </div>\n</div>\n\n<div\n class=\"visible-xs mobile-tabs\"\n *ngIf=\"!outletName\"\n>\n <ul class=\"list-unstyled d-flex m-b-0\">\n <li class=\"c8y-select-wrapper flex-grow\">\n <select\n (change)=\"navigateTo($event.target.value)\"\n #select\n >\n <ng-container *ngFor=\"let tab of tabs\">\n <option\n *ngIf=\"!tab.component\"\n [value]=\"tab.path\"\n [selected]=\"isActive(tab)\"\n >\n {{ tab?.label | translate }}\n </option>\n </ng-container>\n </select>\n </li>\n <ng-container *ngFor=\"let tab of tabs\">\n <ng-container *ngIf=\"tab.component\">\n <ng-container\n *c8yComponentOutlet=\"tab.component; environmentInjector: tab.injector\"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ul>\n</div>\n" }]
17019
- }], ctorParameters: () => [{ type: i1$3.Router }, { type: i0.Renderer2 }, { type: HeaderService }, { type: TabsService }], propDecorators: { tabs: [{
17083
+ }], ctorParameters: () => [{ type: i1$3.Router }, { type: i0.Renderer2 }, { type: HeaderService }, { type: TabsService }, { type: i1$3.ActivatedRoute }], propDecorators: { tabs: [{
17020
17084
  type: Input
17021
17085
  }], orientation: [{
17022
17086
  type: Input
@@ -17026,6 +17090,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
17026
17090
  type: Input
17027
17091
  }], context: [{
17028
17092
  type: Input
17093
+ }], openFirstTab: [{
17094
+ type: Input
17029
17095
  }], hasHeader: [{
17030
17096
  type: Input
17031
17097
  }, {
@@ -18198,7 +18264,7 @@ class BootstrapComponent {
18198
18264
  this.pluginsResolve.markPluginsAsLoaded();
18199
18265
  }
18200
18266
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: BootstrapComponent, deps: [{ token: TabsService }, { token: AppStateService }, { token: NavigatorService }, { token: ActionBarService }, { token: HeaderService }, { token: OptionsService }, { token: PluginsResolveService }, { token: SetupService }, { token: LoginService }, { token: TranslationLoaderService }], target: i0.ɵɵFactoryTarget.Component }); }
18201
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: BootstrapComponent, selector: "c8y-bootstrap", ngImport: i0, template: "<c8y-message-banner\n *ngIf=\"!(showLogin$ | async)\"\n class=\"c8y-message-banner\"\n></c8y-message-banner>\n<c8y-login *ngIf=\"showLogin$ | async\"></c8y-login>\n\n<div\n class=\"init-load\"\n *ngIf=\"showLoadingIndicator$ | async\"\n>\n <div class=\"spinner-snake\"></div>\n <div class=\"mainlogo-placeholder mainlogo\"></div>\n</div>\n\n<div\n [class.head-open]=\"headerService.headerOpen\"\n *ngIf=\"showMainView$ | async\"\n>\n <c8y-header-bar\n *ngIf=\"!headerService.hideHeader\"\n #header\n ></c8y-header-bar>\n <c8y-drawer-outlet\n [tabindex]=\"(headerService.navigatorOpen$ | async) ? '0' : '-1'\"\n role=\"region\"\n position=\"left\"\n data-cy=\"bootstrap.template--c8y-drawer-outlet\"\n [open]=\"headerService.navigatorOpen$ | async\"\n ></c8y-drawer-outlet>\n\n <div class=\"alerts\">\n <c8y-alert-outlet></c8y-alert-outlet>\n </div>\n <c8y-tabs-outlet\n role=\"navigation\"\n #tabsComponent\n [tabs]=\"tabs.items$ | async\"\n [hasHeader]=\"tabsComponent.hasHeader\"\n [navigatorOpen]=\"headerService.navigatorOpen$ | async\"\n [orientation]=\"tabs.orientation$ | async\"\n ></c8y-tabs-outlet>\n <c8y-action-bar\n role=\"group\"\n #actionBarComponent\n [navigatorOpen]=\"headerService.navigatorOpen$ | async\"\n [hasTabs]=\"tabsComponent.hasTabs\"\n [hasHeader]=\"tabsComponent.hasHeader\"\n [isTabsHorizontal]=\"tabsComponent?.isHorizontal\"\n [items$]=\"actionBar.items$\"\n ></c8y-action-bar>\n\n <div\n class=\"mcontainer\"\n [ngClass]=\"{\n open: headerService.navigatorOpen$ | async,\n 'no-apps-margin': noAppsMargin$ | async,\n 'horizontal-tabs': tabsComponent.isHorizontal,\n 'vertical-tabs': !tabsComponent.isHorizontal,\n 'has-tabs': tabsComponent.hasTabs,\n 'has-action-bar': !actionBarComponent?.hidden,\n 'has-header': headerService.hideHeader\n }\"\n >\n <main\n class=\"container-fluid\"\n id=\"main-content\"\n tabindex=\"-1\"\n >\n <router-outlet></router-outlet>\n <ng-content select=\"#c8y-legacy-view\"></ng-content>\n <!-- legacy ng-view, will not be migrated atm -->\n </main>\n </div>\n</div>\n\n<div *ngIf=\"showSetup$ | async\">\n <c8y-header-bar\n *ngIf=\"!headerService.hideHeader\"\n [simple]=\"true\"\n ></c8y-header-bar>\n <div class=\"alerts\">\n <c8y-alert-outlet></c8y-alert-outlet>\n </div>\n <div\n class=\"mcontainer\"\n role=\"main\"\n >\n <div class=\"container-fluid\">\n <c8y-setup></c8y-setup>\n </div>\n </div>\n</div>\n\n<c8y-cookie-banner></c8y-cookie-banner>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: HeaderBarComponent, selector: "c8y-header-bar", inputs: ["simple"] }, { kind: "component", type: LoginComponent, selector: "c8y-login", inputs: ["name"] }, { kind: "directive", type: i1$3.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: TabsOutletComponent, selector: "c8y-tabs-outlet,c8y-ui-tabs", inputs: ["tabs", "orientation", "navigatorOpen", "outletName", "context", "hasHeader"] }, { kind: "component", type: ActionBarComponent, selector: "c8y-action-bar", inputs: ["navigatorOpen", "hasTabs", "hasHeader", "isTabsHorizontal", "items$"] }, { kind: "component", type: AlertOutletComponent, selector: "c8y-alert-outlet" }, { kind: "component", type: SetupComponent, selector: "c8y-setup" }, { kind: "component", type: DrawerOutletComponent, selector: "c8y-drawer-outlet", inputs: ["position", "open"] }, { kind: "component", type: CookieBannerComponent, selector: "c8y-cookie-banner" }, { kind: "component", type: MessageBannerComponent, selector: "c8y-message-banner" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); }
18267
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: BootstrapComponent, selector: "c8y-bootstrap", ngImport: i0, template: "<c8y-message-banner\n *ngIf=\"!(showLogin$ | async)\"\n class=\"c8y-message-banner\"\n></c8y-message-banner>\n<c8y-login *ngIf=\"showLogin$ | async\"></c8y-login>\n\n<div\n class=\"init-load\"\n *ngIf=\"showLoadingIndicator$ | async\"\n>\n <div class=\"spinner-snake\"></div>\n <div class=\"mainlogo-placeholder mainlogo\"></div>\n</div>\n\n<div\n [class.head-open]=\"headerService.headerOpen\"\n *ngIf=\"showMainView$ | async\"\n>\n <c8y-header-bar\n *ngIf=\"!headerService.hideHeader\"\n #header\n ></c8y-header-bar>\n <c8y-drawer-outlet\n [tabindex]=\"(headerService.navigatorOpen$ | async) ? '0' : '-1'\"\n role=\"region\"\n position=\"left\"\n data-cy=\"bootstrap.template--c8y-drawer-outlet\"\n [open]=\"headerService.navigatorOpen$ | async\"\n ></c8y-drawer-outlet>\n\n <div class=\"alerts\">\n <c8y-alert-outlet></c8y-alert-outlet>\n </div>\n <c8y-tabs-outlet\n role=\"navigation\"\n #tabsComponent\n [tabs]=\"tabs.items$ | async\"\n [hasHeader]=\"tabsComponent.hasHeader\"\n [navigatorOpen]=\"headerService.navigatorOpen$ | async\"\n [orientation]=\"tabs.orientation$ | async\"\n ></c8y-tabs-outlet>\n <c8y-action-bar\n role=\"group\"\n #actionBarComponent\n [navigatorOpen]=\"headerService.navigatorOpen$ | async\"\n [hasTabs]=\"tabsComponent.hasTabs\"\n [hasHeader]=\"tabsComponent.hasHeader\"\n [isTabsHorizontal]=\"tabsComponent?.isHorizontal\"\n [items$]=\"actionBar.items$\"\n ></c8y-action-bar>\n\n <div\n class=\"mcontainer\"\n [ngClass]=\"{\n open: headerService.navigatorOpen$ | async,\n 'no-apps-margin': noAppsMargin$ | async,\n 'horizontal-tabs': tabsComponent.isHorizontal,\n 'vertical-tabs': !tabsComponent.isHorizontal,\n 'has-tabs': tabsComponent.hasTabs,\n 'has-action-bar': !actionBarComponent?.hidden,\n 'has-header': headerService.hideHeader\n }\"\n >\n <main\n class=\"container-fluid\"\n id=\"main-content\"\n tabindex=\"-1\"\n >\n <router-outlet></router-outlet>\n <ng-content select=\"#c8y-legacy-view\"></ng-content>\n <!-- legacy ng-view, will not be migrated atm -->\n </main>\n </div>\n</div>\n\n<div *ngIf=\"showSetup$ | async\">\n <c8y-header-bar\n *ngIf=\"!headerService.hideHeader\"\n [simple]=\"true\"\n ></c8y-header-bar>\n <div class=\"alerts\">\n <c8y-alert-outlet></c8y-alert-outlet>\n </div>\n <div\n class=\"mcontainer\"\n role=\"main\"\n >\n <div class=\"container-fluid\">\n <c8y-setup></c8y-setup>\n </div>\n </div>\n</div>\n\n<c8y-cookie-banner></c8y-cookie-banner>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: HeaderBarComponent, selector: "c8y-header-bar", inputs: ["simple"] }, { kind: "component", type: LoginComponent, selector: "c8y-login", inputs: ["name"] }, { kind: "directive", type: i1$3.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: TabsOutletComponent, selector: "c8y-tabs-outlet,c8y-ui-tabs", inputs: ["tabs", "orientation", "navigatorOpen", "outletName", "context", "openFirstTab", "hasHeader"] }, { kind: "component", type: ActionBarComponent, selector: "c8y-action-bar", inputs: ["navigatorOpen", "hasTabs", "hasHeader", "isTabsHorizontal", "items$"] }, { kind: "component", type: AlertOutletComponent, selector: "c8y-alert-outlet" }, { kind: "component", type: SetupComponent, selector: "c8y-setup" }, { kind: "component", type: DrawerOutletComponent, selector: "c8y-drawer-outlet", inputs: ["position", "open"] }, { kind: "component", type: CookieBannerComponent, selector: "c8y-cookie-banner" }, { kind: "component", type: MessageBannerComponent, selector: "c8y-message-banner" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); }
18202
18268
  }
18203
18269
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: BootstrapComponent, decorators: [{
18204
18270
  type: Component,
@@ -18345,6 +18411,15 @@ class NavigatorNodeComponent {
18345
18411
  if (isUndefined(this.node.path)) {
18346
18412
  return false;
18347
18413
  }
18414
+ // on exact match, for empty routes '' we need a special
18415
+ // handling as there seems to be a bug with angular, as it
18416
+ // does not show the primary oulet in this cases.
18417
+ const currentUrlTree = this.router.parseUrl(this.router.url);
18418
+ if (this.node.routerLinkExact &&
18419
+ !currentUrlTree.root.children['primary'] &&
18420
+ this.node.path === '/') {
18421
+ return true;
18422
+ }
18348
18423
  return this.router.isActive(this.node.path, {
18349
18424
  paths: this.node.routerLinkExact ? 'exact' : 'subset',
18350
18425
  queryParams: 'ignored',
@@ -19044,7 +19119,11 @@ class SelectKeyboardService {
19044
19119
  /**
19045
19120
  * Search on key event.
19046
19121
  */
19047
- keyboardSearch: false
19122
+ keyboardSearch: false,
19123
+ /**
19124
+ * Space key event is used to select.
19125
+ */
19126
+ spaceSelect: false
19048
19127
  };
19049
19128
  }
19050
19129
  /**
@@ -19084,7 +19163,7 @@ class SelectKeyboardService {
19084
19163
  this.KEYCODE_DOWN,
19085
19164
  this.KEYCODE_TAB,
19086
19165
  this.KEYCODE_UP,
19087
- this.KEYCODE_SPACE
19166
+ ...(this.options.spaceSelect ? [this.KEYCODE_SPACE] : [])
19088
19167
  ].includes(event.code);
19089
19168
  }
19090
19169
  handleKeyboard(event, input, items, dropdown) {
@@ -20578,6 +20657,10 @@ class SelectComponent {
20578
20657
  * If set to true, the user can select multiple items.
20579
20658
  */
20580
20659
  this.multi = false;
20660
+ /**
20661
+ * If enabled, an item can be selected with the space key.
20662
+ */
20663
+ this.canSelectWithSpace = !this.multi;
20581
20664
  /**
20582
20665
  * If set to true, the select is disabled.
20583
20666
  */
@@ -20631,7 +20714,8 @@ class SelectComponent {
20631
20714
  this.destroy$ = new Subject();
20632
20715
  this.selectKeyboardService.options = {
20633
20716
  emptyInput: true,
20634
- keyboardSearch: true
20717
+ keyboardSearch: true,
20718
+ spaceSelect: this.canSelectWithSpace
20635
20719
  };
20636
20720
  }
20637
20721
  /**
@@ -20651,6 +20735,9 @@ class SelectComponent {
20651
20735
  this.insideClick = this.multi;
20652
20736
  }
20653
20737
  }
20738
+ /**
20739
+ * @ignore
20740
+ */
20654
20741
  ngAfterViewInit() {
20655
20742
  this.selectKeyboardService
20656
20743
  .register$(this.searchControl.nativeElement, this.list, this.dropdown)
@@ -20663,6 +20750,18 @@ class SelectComponent {
20663
20750
  }
20664
20751
  });
20665
20752
  }
20753
+ /**
20754
+ * @ignore
20755
+ */
20756
+ ngOnChanges(changes) {
20757
+ if (changes.canSelectWithSpace) {
20758
+ this.selectKeyboardService.options = {
20759
+ emptyInput: true,
20760
+ keyboardSearch: true,
20761
+ spaceSelect: changes.canSelectWithSpace.currentValue
20762
+ };
20763
+ }
20764
+ }
20666
20765
  /**
20667
20766
  * @ignore
20668
20767
  */
@@ -20676,15 +20775,21 @@ class SelectComponent {
20676
20775
  * @param item The item to select.
20677
20776
  */
20678
20777
  select(item) {
20679
- this.onSelect.emit(item);
20680
20778
  if (this.multi) {
20681
- this._selected.indexOf(item) > -1 ? this.deselect(item) : this._selected.push(item);
20779
+ const isSelected = this._selected.indexOf(item) > -1;
20780
+ if (isSelected) {
20781
+ this.deselect(item);
20782
+ return;
20783
+ }
20784
+ this._selected.push(item);
20682
20785
  this.emitChangeEvent();
20786
+ this.onSelect.emit(item);
20683
20787
  return;
20684
20788
  }
20685
20789
  this._selected = [item];
20686
20790
  this._preselectedItem = item;
20687
20791
  this.emitChangeEvent();
20792
+ this.onSelect.emit(item);
20688
20793
  }
20689
20794
  /**
20690
20795
  * Deselects an item.
@@ -20694,8 +20799,8 @@ class SelectComponent {
20694
20799
  const index = this._selected.indexOf(item);
20695
20800
  if (index > -1) {
20696
20801
  this._selected.splice(index, 1);
20697
- this.onDeselect.emit(item);
20698
20802
  this.emitChangeEvent();
20803
+ this.onDeselect.emit(item);
20699
20804
  this._preselectedItem = null;
20700
20805
  }
20701
20806
  }
@@ -20802,7 +20907,7 @@ class SelectComponent {
20802
20907
  }
20803
20908
  }
20804
20909
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: SelectComponent, deps: [{ token: SelectKeyboardService }], target: i0.ɵɵFactoryTarget.Component }); }
20805
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: SelectComponent, selector: "c8y-select", inputs: { placeholder: "placeholder", items: "items", selected: "selected", container: "container", multi: "multi", disabled: "disabled", autoClose: "autoClose", insideClick: "insideClick", required: "required", canDeselect: "canDeselect", name: "name", icon: "icon" }, outputs: { onSelect: "onSelect", onDeselect: "onDeselect", onIconClick: "onIconClick" }, host: { classAttribute: "c8y-select-v2" }, providers: [
20910
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: SelectComponent, selector: "c8y-select", inputs: { placeholder: "placeholder", items: "items", selected: "selected", container: "container", multi: "multi", canSelectWithSpace: "canSelectWithSpace", disabled: "disabled", autoClose: "autoClose", insideClick: "insideClick", required: "required", canDeselect: "canDeselect", name: "name", icon: "icon" }, outputs: { onSelect: "onSelect", onDeselect: "onDeselect", onIconClick: "onIconClick" }, host: { classAttribute: "c8y-select-v2" }, providers: [
20806
20911
  {
20807
20912
  provide: NG_VALUE_ACCESSOR,
20808
20913
  multi: true,
@@ -20814,7 +20919,7 @@ class SelectComponent {
20814
20919
  multi: true
20815
20920
  },
20816
20921
  SelectKeyboardService
20817
- ], queries: [{ propertyName: "projectedSelectedItems", first: true, predicate: SelectedItemsDirective, descendants: true }, { propertyName: "projectedSelectableItems", predicate: SelectItemDirective }], viewQueries: [{ propertyName: "searchControl", first: true, predicate: ["searchControl"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }, { propertyName: "list", predicate: ListItemComponent, descendants: true }], ngImport: i0, template: "<div\n class=\"c8y-search-dropdown dropdown fit-w\"\n placement=\"bottom left\"\n dropdown\n [container]=\"container\"\n #dropdown=\"bs-dropdown\"\n [autoClose]=\"autoClose\"\n [isDisabled]=\"disabled\"\n [insideClick]=\"insideClick\"\n (onShown)=\"onShown()\"\n (onHidden)=\"onHidden()\"\n dropdownToggle\n (click)=\"open()\"\n>\n <div\n class=\"input-group input-group-dropdown\"\n role=\"button\"\n >\n <div\n class=\"form-control text-truncate\"\n *ngIf=\"true\"\n [ngClass]=\"{\n 'm-r-80': canDeselect && selected.length > 0,\n 'm-r-40': !canDeselect || selected.length === 0,\n 'text-truncate': !multi,\n 'inner-scroll d-flex a-i-center': multi\n }\"\n >\n <!-- rendering of selected items (with content projection) -->\n <div\n class=\"selected-items\"\n *ngIf=\"projectedSelectedItems\"\n >\n <ng-container *ngFor=\"let selectedItem of selected\">\n <ng-container\n *ngTemplateOutlet=\"\n projectedSelectedItems.templateRef;\n context: { $implicit: selectedItem }\n \"\n ></ng-container>\n </ng-container>\n <i\n class=\"text-muted\"\n *ngIf=\"selected.length === 0 && !searchHasFocus && searchControl.value.length === 0\"\n >\n {{ placeholder | translate }}\n </i>\n </div>\n\n <!-- rendering of selected items (default) -->\n <div\n class=\"selected-items\"\n *ngIf=\"!projectedSelectedItems\"\n >\n <span *ngIf=\"!multi\">\n <span *ngIf=\"searchHasFocus && preselectedItem\">\n {{ preselectedItem.label | translate }}\n </span>\n <span *ngIf=\"!searchHasFocus && selected.length === 1\">\n {{ selected[0].label | translate }}\n </span>\n </span>\n <i\n class=\"text-muted\"\n *ngIf=\"selected.length === 0 && !preselectedItem && searchControl.value.length === 0\"\n >\n {{ placeholder | translate }}\n </i>\n <ng-container *ngIf=\"multi\">\n <span class=\"m-r-4\">{{ searchControl.value }}</span>\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let selectedItem of selected\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ selectedItem.label | translate }}\"\n type=\"button\"\n (click)=\"$event.preventDefault(); $event.stopPropagation(); deselect(selectedItem)\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ selectedItem.label | translate }}\n </span>\n </ng-container>\n </div>\n </div>\n \n <input\n class=\"form-control text-truncate\"\n type=\"text\"\n autocomplete=\"off\"\n #searchControl\n [ngClass]=\"{\n 'p-absolute': true,\n 'm-r-80': canDeselect && selected.length > 0,\n 'm-r-40': !canDeselect || selected.length === 0\n }\"\n [required]=\"required\"\n (blur)=\"doBlur()\"\n (focus)=\"doFocus()\"\n [name]=\"name\"\n [disabled]=\"disabled\"\n />\n\n <span class=\"input-group-btn\">\n <!-- this button is displayed only if we have something selected and are allowed to deselect -->\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Deselect' | translate }}\"\n type=\"button\"\n *ngIf=\"canDeselect && selected.length > 0\"\n [disabled]=\"disabled\"\n (click)=\"$event.preventDefault(); $event.stopPropagation(); deselectAll()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Search' | translate }}\"\n type=\"button\"\n [disabled]=\"disabled\"\n (click)=\"onIconClick.emit({ icon, $event })\"\n data-cy=\"select-button\"\n >\n <i\n class=\"text-primary\"\n [c8yIcon]=\"icon\"\n ></i>\n </button>\n </span>\n </div>\n\n <c8y-list-group\n class=\"dropdown-menu dropdown-menu--modal\"\n [style.width]=\"container === 'body' ? searchControl.parentNode.clientWidth + 'px' : undefined\"\n role=\"menu\"\n data-cy=\"select--dropdown-menu\"\n *dropdownMenu\n >\n <!-- rendering of items (default) -->\n <c8y-li\n style=\"cursor: pointer\"\n *ngFor=\"let item of items\"\n [selectable]=\"true\"\n [dense]=\"true\"\n [active]=\"!multi && item.value === selected[0]?.value\"\n (click)=\"select(item)\"\n >\n <span [attr.data-search-label]=\"item.label | translate\"></span>\n <c8y-li-checkbox\n *ngIf=\"multi\"\n [selected]=\"selected.indexOf(item) > -1\"\n (click)=\"$event.preventDefault(); $event.stopPropagation(); select(item)\"\n ></c8y-li-checkbox>\n <c8y-li-body\n *ngIf=\"!item.template\"\n >\n {{ item.label | translate }}\n </c8y-li-body>\n <ng-container\n *ngTemplateOutlet=\"item?.template\"\n ngProjectAs=\"c8y-li-body\"\n ></ng-container>\n </c8y-li>\n <ng-content select=\"div\"></ng-content>\n </c8y-list-group>\n</div>\n", dependencies: [{ kind: "directive", type: i2$2.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i2$2.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i2$2.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: ListItemCheckboxComponent, selector: "c8y-list-item-checkbox, c8y-li-checkbox", inputs: ["selected", "indeterminate", "disabled", "displayAsSwitch"], outputs: ["onSelect"] }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
20922
+ ], queries: [{ propertyName: "projectedSelectedItems", first: true, predicate: SelectedItemsDirective, descendants: true }, { propertyName: "projectedSelectableItems", predicate: SelectItemDirective }], viewQueries: [{ propertyName: "searchControl", first: true, predicate: ["searchControl"], descendants: true }, { propertyName: "dropdown", first: true, predicate: ["dropdown"], descendants: true }, { propertyName: "list", predicate: ListItemComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"c8y-search-dropdown dropdown fit-w\"\n placement=\"bottom left\"\n dropdown\n [container]=\"container\"\n #dropdown=\"bs-dropdown\"\n [autoClose]=\"autoClose\"\n [isDisabled]=\"disabled\"\n [insideClick]=\"insideClick\"\n (onShown)=\"onShown()\"\n (onHidden)=\"onHidden()\"\n dropdownToggle\n (click)=\"open()\"\n>\n <div\n class=\"input-group input-group-dropdown\"\n role=\"button\"\n >\n <div\n class=\"form-control text-truncate\"\n *ngIf=\"true\"\n [ngClass]=\"{\n 'm-r-80': canDeselect && selected.length > 0,\n 'm-r-40': !canDeselect || selected.length === 0,\n 'text-truncate': !multi,\n 'inner-scroll d-flex a-i-center': multi\n }\"\n >\n <!-- rendering of selected items (with content projection) -->\n <div\n class=\"selected-items\"\n *ngIf=\"projectedSelectedItems\"\n >\n <ng-container *ngFor=\"let selectedItem of selected\">\n <ng-container\n *ngTemplateOutlet=\"\n projectedSelectedItems.templateRef;\n context: { $implicit: selectedItem }\n \"\n ></ng-container>\n </ng-container>\n <i\n class=\"text-muted\"\n *ngIf=\"selected.length === 0 && !searchHasFocus && searchControl.value.length === 0\"\n >\n {{ placeholder | translate }}\n </i>\n </div>\n\n <!-- rendering of selected items (default) -->\n <div\n class=\"selected-items\"\n *ngIf=\"!projectedSelectedItems\"\n >\n <span *ngIf=\"!multi\">\n <span *ngIf=\"searchHasFocus && preselectedItem\">\n {{ preselectedItem.label | translate }}\n </span>\n <span *ngIf=\"!searchHasFocus && selected.length === 1\">\n {{ selected[0].label | translate }}\n </span>\n </span>\n <i\n class=\"text-muted\"\n *ngIf=\"selected.length === 0 && !preselectedItem && searchControl.value.length === 0\"\n >\n {{ placeholder | translate }}\n </i>\n <ng-container *ngIf=\"multi\">\n <span class=\"m-r-4\">{{ searchControl.value }}</span>\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let selectedItem of selected\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ selectedItem.label | translate }}\"\n type=\"button\"\n (click)=\"$event.preventDefault(); $event.stopPropagation(); deselect(selectedItem)\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ selectedItem.label | translate }}\n </span>\n </ng-container>\n </div>\n </div>\n \n <input\n class=\"form-control text-truncate\"\n type=\"text\"\n autocomplete=\"off\"\n #searchControl\n [ngClass]=\"{\n 'p-absolute': true,\n 'm-r-80': canDeselect && selected.length > 0,\n 'm-r-40': !canDeselect || selected.length === 0\n }\"\n [required]=\"required\"\n (blur)=\"doBlur()\"\n (focus)=\"doFocus()\"\n [name]=\"name\"\n [disabled]=\"disabled\"\n />\n\n <span class=\"input-group-btn\">\n <!-- this button is displayed only if we have something selected and are allowed to deselect -->\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Deselect' | translate }}\"\n type=\"button\"\n *ngIf=\"canDeselect && selected.length > 0\"\n [disabled]=\"disabled\"\n (click)=\"$event.preventDefault(); $event.stopPropagation(); deselectAll()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Search' | translate }}\"\n type=\"button\"\n [disabled]=\"disabled\"\n (click)=\"onIconClick.emit({ icon, $event })\"\n data-cy=\"select-button\"\n >\n <i\n class=\"text-primary\"\n [c8yIcon]=\"icon\"\n ></i>\n </button>\n </span>\n </div>\n\n <c8y-list-group\n class=\"dropdown-menu dropdown-menu--modal\"\n [style.width]=\"container === 'body' ? searchControl.parentNode.clientWidth + 'px' : undefined\"\n role=\"menu\"\n data-cy=\"select--dropdown-menu\"\n *dropdownMenu\n >\n <!-- rendering of items (default) -->\n <c8y-li\n style=\"cursor: pointer\"\n *ngFor=\"let item of items\"\n [selectable]=\"true\"\n [dense]=\"true\"\n [active]=\"!multi && item.value === selected[0]?.value\"\n (click)=\"select(item)\"\n >\n <span [attr.data-search-label]=\"item.label | translate\"></span>\n <c8y-li-checkbox\n *ngIf=\"multi\"\n [selected]=\"selected.indexOf(item) > -1\"\n (click)=\"$event.preventDefault();\"\n ></c8y-li-checkbox>\n <c8y-li-body\n *ngIf=\"!item.template\"\n >\n {{ item.label | translate }}\n </c8y-li-body>\n <ng-container\n *ngTemplateOutlet=\"item?.template\"\n ngProjectAs=\"c8y-li-body\"\n ></ng-container>\n </c8y-li>\n <ng-content select=\"div\"></ng-content>\n </c8y-list-group>\n</div>\n", dependencies: [{ kind: "directive", type: i2$2.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i2$2.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i2$2.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: ListItemCheckboxComponent, selector: "c8y-list-item-checkbox, c8y-li-checkbox", inputs: ["selected", "indeterminate", "disabled", "displayAsSwitch"], outputs: ["onSelect"] }, { kind: "directive", type: RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
20818
20923
  }
20819
20924
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: SelectComponent, decorators: [{
20820
20925
  type: Component,
@@ -20830,7 +20935,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
20830
20935
  multi: true
20831
20936
  },
20832
20937
  SelectKeyboardService
20833
- ], template: "<div\n class=\"c8y-search-dropdown dropdown fit-w\"\n placement=\"bottom left\"\n dropdown\n [container]=\"container\"\n #dropdown=\"bs-dropdown\"\n [autoClose]=\"autoClose\"\n [isDisabled]=\"disabled\"\n [insideClick]=\"insideClick\"\n (onShown)=\"onShown()\"\n (onHidden)=\"onHidden()\"\n dropdownToggle\n (click)=\"open()\"\n>\n <div\n class=\"input-group input-group-dropdown\"\n role=\"button\"\n >\n <div\n class=\"form-control text-truncate\"\n *ngIf=\"true\"\n [ngClass]=\"{\n 'm-r-80': canDeselect && selected.length > 0,\n 'm-r-40': !canDeselect || selected.length === 0,\n 'text-truncate': !multi,\n 'inner-scroll d-flex a-i-center': multi\n }\"\n >\n <!-- rendering of selected items (with content projection) -->\n <div\n class=\"selected-items\"\n *ngIf=\"projectedSelectedItems\"\n >\n <ng-container *ngFor=\"let selectedItem of selected\">\n <ng-container\n *ngTemplateOutlet=\"\n projectedSelectedItems.templateRef;\n context: { $implicit: selectedItem }\n \"\n ></ng-container>\n </ng-container>\n <i\n class=\"text-muted\"\n *ngIf=\"selected.length === 0 && !searchHasFocus && searchControl.value.length === 0\"\n >\n {{ placeholder | translate }}\n </i>\n </div>\n\n <!-- rendering of selected items (default) -->\n <div\n class=\"selected-items\"\n *ngIf=\"!projectedSelectedItems\"\n >\n <span *ngIf=\"!multi\">\n <span *ngIf=\"searchHasFocus && preselectedItem\">\n {{ preselectedItem.label | translate }}\n </span>\n <span *ngIf=\"!searchHasFocus && selected.length === 1\">\n {{ selected[0].label | translate }}\n </span>\n </span>\n <i\n class=\"text-muted\"\n *ngIf=\"selected.length === 0 && !preselectedItem && searchControl.value.length === 0\"\n >\n {{ placeholder | translate }}\n </i>\n <ng-container *ngIf=\"multi\">\n <span class=\"m-r-4\">{{ searchControl.value }}</span>\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let selectedItem of selected\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ selectedItem.label | translate }}\"\n type=\"button\"\n (click)=\"$event.preventDefault(); $event.stopPropagation(); deselect(selectedItem)\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ selectedItem.label | translate }}\n </span>\n </ng-container>\n </div>\n </div>\n \n <input\n class=\"form-control text-truncate\"\n type=\"text\"\n autocomplete=\"off\"\n #searchControl\n [ngClass]=\"{\n 'p-absolute': true,\n 'm-r-80': canDeselect && selected.length > 0,\n 'm-r-40': !canDeselect || selected.length === 0\n }\"\n [required]=\"required\"\n (blur)=\"doBlur()\"\n (focus)=\"doFocus()\"\n [name]=\"name\"\n [disabled]=\"disabled\"\n />\n\n <span class=\"input-group-btn\">\n <!-- this button is displayed only if we have something selected and are allowed to deselect -->\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Deselect' | translate }}\"\n type=\"button\"\n *ngIf=\"canDeselect && selected.length > 0\"\n [disabled]=\"disabled\"\n (click)=\"$event.preventDefault(); $event.stopPropagation(); deselectAll()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Search' | translate }}\"\n type=\"button\"\n [disabled]=\"disabled\"\n (click)=\"onIconClick.emit({ icon, $event })\"\n data-cy=\"select-button\"\n >\n <i\n class=\"text-primary\"\n [c8yIcon]=\"icon\"\n ></i>\n </button>\n </span>\n </div>\n\n <c8y-list-group\n class=\"dropdown-menu dropdown-menu--modal\"\n [style.width]=\"container === 'body' ? searchControl.parentNode.clientWidth + 'px' : undefined\"\n role=\"menu\"\n data-cy=\"select--dropdown-menu\"\n *dropdownMenu\n >\n <!-- rendering of items (default) -->\n <c8y-li\n style=\"cursor: pointer\"\n *ngFor=\"let item of items\"\n [selectable]=\"true\"\n [dense]=\"true\"\n [active]=\"!multi && item.value === selected[0]?.value\"\n (click)=\"select(item)\"\n >\n <span [attr.data-search-label]=\"item.label | translate\"></span>\n <c8y-li-checkbox\n *ngIf=\"multi\"\n [selected]=\"selected.indexOf(item) > -1\"\n (click)=\"$event.preventDefault(); $event.stopPropagation(); select(item)\"\n ></c8y-li-checkbox>\n <c8y-li-body\n *ngIf=\"!item.template\"\n >\n {{ item.label | translate }}\n </c8y-li-body>\n <ng-container\n *ngTemplateOutlet=\"item?.template\"\n ngProjectAs=\"c8y-li-body\"\n ></ng-container>\n </c8y-li>\n <ng-content select=\"div\"></ng-content>\n </c8y-list-group>\n</div>\n" }]
20938
+ ], template: "<div\n class=\"c8y-search-dropdown dropdown fit-w\"\n placement=\"bottom left\"\n dropdown\n [container]=\"container\"\n #dropdown=\"bs-dropdown\"\n [autoClose]=\"autoClose\"\n [isDisabled]=\"disabled\"\n [insideClick]=\"insideClick\"\n (onShown)=\"onShown()\"\n (onHidden)=\"onHidden()\"\n dropdownToggle\n (click)=\"open()\"\n>\n <div\n class=\"input-group input-group-dropdown\"\n role=\"button\"\n >\n <div\n class=\"form-control text-truncate\"\n *ngIf=\"true\"\n [ngClass]=\"{\n 'm-r-80': canDeselect && selected.length > 0,\n 'm-r-40': !canDeselect || selected.length === 0,\n 'text-truncate': !multi,\n 'inner-scroll d-flex a-i-center': multi\n }\"\n >\n <!-- rendering of selected items (with content projection) -->\n <div\n class=\"selected-items\"\n *ngIf=\"projectedSelectedItems\"\n >\n <ng-container *ngFor=\"let selectedItem of selected\">\n <ng-container\n *ngTemplateOutlet=\"\n projectedSelectedItems.templateRef;\n context: { $implicit: selectedItem }\n \"\n ></ng-container>\n </ng-container>\n <i\n class=\"text-muted\"\n *ngIf=\"selected.length === 0 && !searchHasFocus && searchControl.value.length === 0\"\n >\n {{ placeholder | translate }}\n </i>\n </div>\n\n <!-- rendering of selected items (default) -->\n <div\n class=\"selected-items\"\n *ngIf=\"!projectedSelectedItems\"\n >\n <span *ngIf=\"!multi\">\n <span *ngIf=\"searchHasFocus && preselectedItem\">\n {{ preselectedItem.label | translate }}\n </span>\n <span *ngIf=\"!searchHasFocus && selected.length === 1\">\n {{ selected[0].label | translate }}\n </span>\n </span>\n <i\n class=\"text-muted\"\n *ngIf=\"selected.length === 0 && !preselectedItem && searchControl.value.length === 0\"\n >\n {{ placeholder | translate }}\n </i>\n <ng-container *ngIf=\"multi\">\n <span class=\"m-r-4\">{{ searchControl.value }}</span>\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let selectedItem of selected\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ selectedItem.label | translate }}\"\n type=\"button\"\n (click)=\"$event.preventDefault(); $event.stopPropagation(); deselect(selectedItem)\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ selectedItem.label | translate }}\n </span>\n </ng-container>\n </div>\n </div>\n \n <input\n class=\"form-control text-truncate\"\n type=\"text\"\n autocomplete=\"off\"\n #searchControl\n [ngClass]=\"{\n 'p-absolute': true,\n 'm-r-80': canDeselect && selected.length > 0,\n 'm-r-40': !canDeselect || selected.length === 0\n }\"\n [required]=\"required\"\n (blur)=\"doBlur()\"\n (focus)=\"doFocus()\"\n [name]=\"name\"\n [disabled]=\"disabled\"\n />\n\n <span class=\"input-group-btn\">\n <!-- this button is displayed only if we have something selected and are allowed to deselect -->\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Deselect' | translate }}\"\n type=\"button\"\n *ngIf=\"canDeselect && selected.length > 0\"\n [disabled]=\"disabled\"\n (click)=\"$event.preventDefault(); $event.stopPropagation(); deselectAll()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n <button\n class=\"btn btn-dot\"\n title=\"{{ 'Search' | translate }}\"\n type=\"button\"\n [disabled]=\"disabled\"\n (click)=\"onIconClick.emit({ icon, $event })\"\n data-cy=\"select-button\"\n >\n <i\n class=\"text-primary\"\n [c8yIcon]=\"icon\"\n ></i>\n </button>\n </span>\n </div>\n\n <c8y-list-group\n class=\"dropdown-menu dropdown-menu--modal\"\n [style.width]=\"container === 'body' ? searchControl.parentNode.clientWidth + 'px' : undefined\"\n role=\"menu\"\n data-cy=\"select--dropdown-menu\"\n *dropdownMenu\n >\n <!-- rendering of items (default) -->\n <c8y-li\n style=\"cursor: pointer\"\n *ngFor=\"let item of items\"\n [selectable]=\"true\"\n [dense]=\"true\"\n [active]=\"!multi && item.value === selected[0]?.value\"\n (click)=\"select(item)\"\n >\n <span [attr.data-search-label]=\"item.label | translate\"></span>\n <c8y-li-checkbox\n *ngIf=\"multi\"\n [selected]=\"selected.indexOf(item) > -1\"\n (click)=\"$event.preventDefault();\"\n ></c8y-li-checkbox>\n <c8y-li-body\n *ngIf=\"!item.template\"\n >\n {{ item.label | translate }}\n </c8y-li-body>\n <ng-container\n *ngTemplateOutlet=\"item?.template\"\n ngProjectAs=\"c8y-li-body\"\n ></ng-container>\n </c8y-li>\n <ng-content select=\"div\"></ng-content>\n </c8y-list-group>\n</div>\n" }]
20834
20939
  }], ctorParameters: () => [{ type: SelectKeyboardService }], propDecorators: { placeholder: [{
20835
20940
  type: Input
20836
20941
  }], items: [{
@@ -20841,6 +20946,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
20841
20946
  type: Input
20842
20947
  }], multi: [{
20843
20948
  type: Input
20949
+ }], canSelectWithSpace: [{
20950
+ type: Input
20844
20951
  }], disabled: [{
20845
20952
  type: Input
20846
20953
  }], autoClose: [{
@@ -22665,7 +22772,9 @@ class ConditionalTabsOutletComponent {
22665
22772
  ngOnInit() {
22666
22773
  this.tabsService.firstTab$.pipe(takeUntil(this.endSubscriptions$)).subscribe((tab) => {
22667
22774
  if (tab) {
22668
- this.router.navigateByUrl(tab.path, { replaceUrl: true });
22775
+ this.router.navigate(typeof tab.path === 'string' ? [tab.path] : tab.path, {
22776
+ replaceUrl: true
22777
+ });
22669
22778
  }
22670
22779
  });
22671
22780
  }
@@ -24511,7 +24620,9 @@ class ContextRouteService {
24511
24620
  redirectToFirstTab() {
24512
24621
  const currentContextId = (this.router.url.match(this.ID_REGEX) || []).shift();
24513
24622
  if (this.needsRedirect()) {
24514
- this.tabsService.firstTab$.pipe(filter((tab) => !!tab?.path)).subscribe((tab) => {
24623
+ this.tabsService.firstTab$
24624
+ .pipe(filter((tab) => typeof tab?.path === 'string'))
24625
+ .subscribe((tab) => {
24515
24626
  const tabPathId = (tab.path.match(this.ID_REGEX) || []).shift();
24516
24627
  if (currentContextId === tabPathId) {
24517
24628
  this.router.navigateByUrl(tab.path, { replaceUrl: true });
@@ -24664,7 +24775,9 @@ class ScopedContextRouteService {
24664
24775
  else {
24665
24776
  const currentContextId = (this.router.url.match(this.ID_REGEX) || []).shift();
24666
24777
  if (this.needsRedirectLegacy()) {
24667
- this.tabsService.firstTab$.pipe(filter((tab) => !!tab?.path)).subscribe((tab) => {
24778
+ this.tabsService.firstTab$
24779
+ .pipe(filter((tab) => typeof tab?.path === 'string'))
24780
+ .subscribe((tab) => {
24668
24781
  const tabPathId = (tab.path.match(this.ID_REGEX) || []).shift();
24669
24782
  if (currentContextId === tabPathId) {
24670
24783
  this.router.navigateByUrl(`${tab.path}${queryParamsSuffix}`, { replaceUrl: true });
@@ -25249,11 +25362,11 @@ class SupportOutletComponent {
25249
25362
  this.ui.currentUser.next(currentUserResult.data);
25250
25363
  }
25251
25364
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: SupportOutletComponent, deps: [{ token: AppStateService }, { token: OptionsService }, { token: ModalService }, { token: i1$1.TranslateService }, { token: i1.TenantService }, { token: AlertService }, { token: i1.UserService }, { token: HeaderService }], target: i0.ɵɵFactoryTarget.Component }); }
25252
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: SupportOutletComponent, selector: "c8y-support-outlet", ngImport: i0, template: "<button\n class=\"c8y-right-drawer__link sticky-top\"\n [tabindex]=\"tabIndex$ | async\"\n type=\"button\"\n (click)=\"isCollapsed = !isCollapsed\"\n *ngIf=\"isCollapsible\"\n>\n <i c8yIcon=\"c8y-c8y-support\"></i>\n <span class=\"text-bold\">{{ 'Support' | translate }}</span>\n <i\n class=\"m-l-auto\"\n c8yIcon=\"angle-up\"\n [ngClass]=\"{ 'icon-rotate-180': isCollapsed }\"\n ></i>\n</button>\n<div\n class=\"collapse\"\n id=\"collapseSupport\"\n [collapse]=\"isCollapsed\"\n [isAnimated]=\"true\"\n>\n <button\n class=\"c8y-right-drawer__link\"\n title=\"{{ 'Activate support access' | translate }}\"\n [tabindex]=\"tabIndex$ | async\"\n *ngIf=\"!(supportUserEnabled$ | async) && userSupportAvailable\"\n (click)=\"activateSupportAccess()\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n >\n <i\n c8yIcon=\"c8y-c8y-support\"\n *ngIf=\"!isCollapsible\"\n ></i>\n <span\n [class]=\"textClass\"\n title=\"{{ 'Activate support access' | translate }}\"\n >\n {{ 'Activate support access' | translate }}\n </span>\n </button>\n <button\n class=\"c8y-right-drawer__link\"\n title=\"{{ 'Deactivate support access' | translate }}\"\n [tabindex]=\"tabIndex$ | async\"\n *ngIf=\"(supportUserEnabled$ | async) && userSupportAvailable\"\n (click)=\"deactivateSupportAccess()\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n >\n <i\n c8yIcon=\"c8y-c8y-support\"\n *ngIf=\"!isCollapsible\"\n ></i>\n <span\n [class]=\"textClass\"\n title=\"{{ 'Deactivate support access' | translate }}\"\n >\n {{ 'Deactivate support access' | translate }}\n </span>\n </button>\n <a\n class=\"c8y-right-drawer__link\"\n [ngClass]=\"{'separator-top': !isCollapsible}\"\n title=\"{{ 'Request support' | translate }}\"\n [tabindex]=\"tabIndex$ | async\"\n role=\"button\"\n target=\"_blank\"\n *ngIf=\"supportUrl\"\n rel=\"noopener noreferrer\"\n [href]=\"supportUrl\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n >\n <i\n c8yIcon=\"c8y-c8y-support\"\n *ngIf=\"!isCollapsible\"\n ></i>\n <span\n [class]=\"textClass\"\n title=\"{{ 'Request support' | translate }}\"\n >\n {{ 'Request support' | translate }}\n </span>\n </a>\n</div>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$7.CollapseDirective, selector: "[collapse]", inputs: ["display", "isAnimated", "collapse"], outputs: ["collapsed", "collapses", "expanded", "expands"], exportAs: ["bs-collapse"] }, { kind: "directive", type: ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); }
25365
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: SupportOutletComponent, selector: "c8y-support-outlet", ngImport: i0, template: "<button\n class=\"c8y-right-drawer__link sticky-top\"\n [tabindex]=\"tabIndex$ | async\"\n type=\"button\"\n (click)=\"isCollapsed = !isCollapsed\"\n *ngIf=\"isCollapsible\"\n>\n <i c8yIcon=\"c8y-c8y-support\"></i>\n <span class=\"text-bold\">{{ 'Support' | translate }}</span>\n <i\n class=\"m-l-auto\"\n c8yIcon=\"angle-up\"\n [ngClass]=\"{ 'icon-rotate-180': isCollapsed }\"\n ></i>\n</button>\n<div\n class=\"collapse\"\n id=\"collapseSupport\"\n [collapse]=\"isCollapsed\"\n [isAnimated]=\"true\"\n>\n <button\n class=\"c8y-right-drawer__link\"\n title=\"{{ 'Activate support access' | translate }}\"\n [tabindex]=\"tabIndex$ | async\"\n *ngIf=\"!(supportUserEnabled$ | async) && userSupportAvailable\"\n (click)=\"activateSupportAccess()\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n [actionData]=\"{ action: PRODUCT_EXPERIENCE.QUICK_LINKS.ACTIONS.ACTIVATE_SUPPORT_ACCESS }\"\n >\n <i\n c8yIcon=\"c8y-c8y-support\"\n *ngIf=\"!isCollapsible\"\n ></i>\n <span\n [class]=\"textClass\"\n title=\"{{ 'Activate support access' | translate }}\"\n >\n {{ 'Activate support access' | translate }}\n </span>\n </button>\n <button\n class=\"c8y-right-drawer__link\"\n title=\"{{ 'Deactivate support access' | translate }}\"\n [tabindex]=\"tabIndex$ | async\"\n *ngIf=\"(supportUserEnabled$ | async) && userSupportAvailable\"\n (click)=\"deactivateSupportAccess()\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n [actionData]=\"{ action: PRODUCT_EXPERIENCE.QUICK_LINKS.ACTIONS.DEACTIVATE_SUPPORT_ACCESS }\"\n >\n <i\n c8yIcon=\"c8y-c8y-support\"\n *ngIf=\"!isCollapsible\"\n ></i>\n <span\n [class]=\"textClass\"\n title=\"{{ 'Deactivate support access' | translate }}\"\n >\n {{ 'Deactivate support access' | translate }}\n </span>\n </button>\n <a\n class=\"c8y-right-drawer__link\"\n title=\"{{ 'Request support' | translate }}\"\n [tabindex]=\"tabIndex$ | async\"\n role=\"button\"\n target=\"_blank\"\n [ngClass]=\"{ 'separator-top': !isCollapsible }\"\n *ngIf=\"supportUrl\"\n rel=\"noopener noreferrer\"\n [href]=\"supportUrl\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n [actionData]=\"{ action: PRODUCT_EXPERIENCE.QUICK_LINKS.ACTIONS.OPEN_SUPPORT_LINK }\"\n >\n <i\n c8yIcon=\"c8y-c8y-support\"\n *ngIf=\"!isCollapsible\"\n ></i>\n <span\n [class]=\"textClass\"\n title=\"{{ 'Request support' | translate }}\"\n >\n {{ 'Request support' | translate }}\n </span>\n </a>\n</div>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$7.CollapseDirective, selector: "[collapse]", inputs: ["display", "isAnimated", "collapse"], outputs: ["collapsed", "collapses", "expanded", "expands"], exportAs: ["bs-collapse"] }, { kind: "directive", type: ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); }
25253
25366
  }
25254
25367
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: SupportOutletComponent, decorators: [{
25255
25368
  type: Component,
25256
- args: [{ selector: 'c8y-support-outlet', template: "<button\n class=\"c8y-right-drawer__link sticky-top\"\n [tabindex]=\"tabIndex$ | async\"\n type=\"button\"\n (click)=\"isCollapsed = !isCollapsed\"\n *ngIf=\"isCollapsible\"\n>\n <i c8yIcon=\"c8y-c8y-support\"></i>\n <span class=\"text-bold\">{{ 'Support' | translate }}</span>\n <i\n class=\"m-l-auto\"\n c8yIcon=\"angle-up\"\n [ngClass]=\"{ 'icon-rotate-180': isCollapsed }\"\n ></i>\n</button>\n<div\n class=\"collapse\"\n id=\"collapseSupport\"\n [collapse]=\"isCollapsed\"\n [isAnimated]=\"true\"\n>\n <button\n class=\"c8y-right-drawer__link\"\n title=\"{{ 'Activate support access' | translate }}\"\n [tabindex]=\"tabIndex$ | async\"\n *ngIf=\"!(supportUserEnabled$ | async) && userSupportAvailable\"\n (click)=\"activateSupportAccess()\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n >\n <i\n c8yIcon=\"c8y-c8y-support\"\n *ngIf=\"!isCollapsible\"\n ></i>\n <span\n [class]=\"textClass\"\n title=\"{{ 'Activate support access' | translate }}\"\n >\n {{ 'Activate support access' | translate }}\n </span>\n </button>\n <button\n class=\"c8y-right-drawer__link\"\n title=\"{{ 'Deactivate support access' | translate }}\"\n [tabindex]=\"tabIndex$ | async\"\n *ngIf=\"(supportUserEnabled$ | async) && userSupportAvailable\"\n (click)=\"deactivateSupportAccess()\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n >\n <i\n c8yIcon=\"c8y-c8y-support\"\n *ngIf=\"!isCollapsible\"\n ></i>\n <span\n [class]=\"textClass\"\n title=\"{{ 'Deactivate support access' | translate }}\"\n >\n {{ 'Deactivate support access' | translate }}\n </span>\n </button>\n <a\n class=\"c8y-right-drawer__link\"\n [ngClass]=\"{'separator-top': !isCollapsible}\"\n title=\"{{ 'Request support' | translate }}\"\n [tabindex]=\"tabIndex$ | async\"\n role=\"button\"\n target=\"_blank\"\n *ngIf=\"supportUrl\"\n rel=\"noopener noreferrer\"\n [href]=\"supportUrl\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n >\n <i\n c8yIcon=\"c8y-c8y-support\"\n *ngIf=\"!isCollapsible\"\n ></i>\n <span\n [class]=\"textClass\"\n title=\"{{ 'Request support' | translate }}\"\n >\n {{ 'Request support' | translate }}\n </span>\n </a>\n</div>\n" }]
25369
+ args: [{ selector: 'c8y-support-outlet', template: "<button\n class=\"c8y-right-drawer__link sticky-top\"\n [tabindex]=\"tabIndex$ | async\"\n type=\"button\"\n (click)=\"isCollapsed = !isCollapsed\"\n *ngIf=\"isCollapsible\"\n>\n <i c8yIcon=\"c8y-c8y-support\"></i>\n <span class=\"text-bold\">{{ 'Support' | translate }}</span>\n <i\n class=\"m-l-auto\"\n c8yIcon=\"angle-up\"\n [ngClass]=\"{ 'icon-rotate-180': isCollapsed }\"\n ></i>\n</button>\n<div\n class=\"collapse\"\n id=\"collapseSupport\"\n [collapse]=\"isCollapsed\"\n [isAnimated]=\"true\"\n>\n <button\n class=\"c8y-right-drawer__link\"\n title=\"{{ 'Activate support access' | translate }}\"\n [tabindex]=\"tabIndex$ | async\"\n *ngIf=\"!(supportUserEnabled$ | async) && userSupportAvailable\"\n (click)=\"activateSupportAccess()\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n [actionData]=\"{ action: PRODUCT_EXPERIENCE.QUICK_LINKS.ACTIONS.ACTIVATE_SUPPORT_ACCESS }\"\n >\n <i\n c8yIcon=\"c8y-c8y-support\"\n *ngIf=\"!isCollapsible\"\n ></i>\n <span\n [class]=\"textClass\"\n title=\"{{ 'Activate support access' | translate }}\"\n >\n {{ 'Activate support access' | translate }}\n </span>\n </button>\n <button\n class=\"c8y-right-drawer__link\"\n title=\"{{ 'Deactivate support access' | translate }}\"\n [tabindex]=\"tabIndex$ | async\"\n *ngIf=\"(supportUserEnabled$ | async) && userSupportAvailable\"\n (click)=\"deactivateSupportAccess()\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n [actionData]=\"{ action: PRODUCT_EXPERIENCE.QUICK_LINKS.ACTIONS.DEACTIVATE_SUPPORT_ACCESS }\"\n >\n <i\n c8yIcon=\"c8y-c8y-support\"\n *ngIf=\"!isCollapsible\"\n ></i>\n <span\n [class]=\"textClass\"\n title=\"{{ 'Deactivate support access' | translate }}\"\n >\n {{ 'Deactivate support access' | translate }}\n </span>\n </button>\n <a\n class=\"c8y-right-drawer__link\"\n title=\"{{ 'Request support' | translate }}\"\n [tabindex]=\"tabIndex$ | async\"\n role=\"button\"\n target=\"_blank\"\n [ngClass]=\"{ 'separator-top': !isCollapsible }\"\n *ngIf=\"supportUrl\"\n rel=\"noopener noreferrer\"\n [href]=\"supportUrl\"\n c8yProductExperience\n [actionName]=\"PRODUCT_EXPERIENCE.QUICK_LINKS.EVENTS.QUICK_LINK_RIGHT_DRAWER\"\n [actionData]=\"{ action: PRODUCT_EXPERIENCE.QUICK_LINKS.ACTIONS.OPEN_SUPPORT_LINK }\"\n >\n <i\n c8yIcon=\"c8y-c8y-support\"\n *ngIf=\"!isCollapsible\"\n ></i>\n <span\n [class]=\"textClass\"\n title=\"{{ 'Request support' | translate }}\"\n >\n {{ 'Request support' | translate }}\n </span>\n </a>\n</div>\n" }]
25257
25370
  }], ctorParameters: () => [{ type: AppStateService }, { type: OptionsService }, { type: ModalService }, { type: i1$1.TranslateService }, { type: i1.TenantService }, { type: AlertService }, { type: i1.UserService }, { type: HeaderService }] });
25258
25371
 
25259
25372
  class SupportOutletModule {
@@ -33608,7 +33721,7 @@ class SelectModalComponent {
33608
33721
  provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,
33609
33722
  useExisting: forwardRef(() => SelectModalComponent)
33610
33723
  }
33611
- ], usesOnChanges: true, ngImport: i0, template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"icon\"></i>\n <h1\n class=\"h3\"\n id=\"modal-title\"\n >\n {{ title | translate }}\n </h1>\n </div>\n <div class=\"p-16 text-center separator-bottom min-height-fit\">\n <p class=\"m-b-8\">{{ subTitle | translate }}</p>\n <div class=\"row\">\n <div\n *ngIf=\"showFilter\"\n [ngClass]=\"{\n 'col-xs-6': showFilter && additionalFilterTemplate,\n 'col-xs-12': !showFilter || !additionalFilterTemplate\n }\"\n >\n <c8y-filter\n [icon]=\"'search'\"\n (onSearch)=\"updatePipe($event)\"\n ></c8y-filter>\n </div>\n <div\n *ngIf=\"additionalFilterTemplate\"\n [ngClass]=\"{\n 'col-xs-6': showFilter && additionalFilterTemplate,\n 'col-xs-12': !showFilter || !additionalFilterTemplate\n }\"\n >\n <ng-container *ngTemplateOutlet=\"additionalFilterTemplate\"></ng-container>\n </div>\n </div>\n </div>\n <div\n class=\"modal-inner-scroll\"\n id=\"modal-body\"\n >\n <div class=\"p-l-16 p-r-16\">\n <div\n class=\"panel m-t-8 m-b-8\"\n *ngIf=\"!items || items.length === 0 || (emptyItemsOnly && hideEmptyItems)\"\n >\n <div class=\"c8y-empty-state text-left\">\n <h1\n class=\"c8y-icon-duocolor\"\n c8yIcon=\"{{ icon }} \"\n ></h1>\n <p>{{ (noItemsMessage | translate) ?? 'No items to display.' | translate }}</p>\n </div>\n </div>\n </div>\n <c8y-list-group>\n <ng-container *ngFor=\"let item of listItems | selectModalFilterPipe : filterTerm\">\n <c8y-li *ngIf=\"item.options?.length > 0 || !hideEmptyItems\">\n <c8y-li-icon>\n <i c8yIcon=\"{{ icon }}\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-30\">\n <div class=\"col-9\">\n <div\n *ngFor=\"let bodyPart of item.body\"\n [ngClass]=\"bodyPart.class\"\n >\n <c8y-highlight\n [title]=\"bodyPart.value\"\n [pattern]=\"filterTerm\"\n [text]=\"bodyPart.value\"\n ></c8y-highlight>\n </div>\n </div>\n\n <div\n class=\"col-3 text-right\"\n *ngIf=\"item.additionalInformation\"\n >\n <div [ngClass]=\"item.additionalInformation.class\">\n {{ item.additionalInformation.value }}\n </div>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse *ngIf=\"item.options?.length > 0\">\n <c8y-list-group>\n <c8y-li *ngFor=\"let option of item.options\">\n <c8y-li-radio\n [name]=\"mode === 'single' ? 'single' : item.groupId\"\n (onSelect)=\"updateChoice({ item: item, id: option.obj.id })\"\n [disabled]=\"option.disabled\"\n [selected]=\"option.selected\"\n ></c8y-li-radio>\n <c8y-li-body class=\"content-flex-20\">\n <div\n *ngFor=\"let optionPart of option.body; let i = index\"\n [ngClass]=\"optionPart.class\"\n >\n <c8y-highlight\n [pattern]=\"filterTerm\"\n [text]=\"optionPart.value\"\n ></c8y-highlight>\n </div>\n <ng-container\n *ngIf=\"option.template\"\n [ngTemplateOutlet]=\"option.template\"\n [ngTemplateOutletContext]=\"{ $implicit: item, option: option }\"\n ></ng-container>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </c8y-li-collapse>\n </c8y-li>\n </ng-container>\n <div *ngIf=\"areMoreEntries\">\n <div\n class=\"alert alert-info m-t-16 m-r-8 m-l-8\"\n translate\n >\n Some entries might not be shown. Try narrowing search criteria.\n </div>\n </div>\n </c8y-list-group>\n </div>\n\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ labels.cancel | translate }}\"\n type=\"button\"\n data-cy=\"select-modal--Cancel-button\"\n *ngIf=\"labels.cancel\"\n (click)=\"dismiss()\"\n c8yProductExperience\n inherit\n [actionData]=\"{ result: labels.cancel }\"\n >\n {{ labels.cancel | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ labels.ok | translate }}\"\n type=\"button\"\n data-cy=\"select-modal--Save-button\"\n (click)=\"select()\"\n [disabled]=\"!selected\"\n c8yProductExperience\n inherit\n [actionData]=\"{ result: labels.ok }\"\n >\n {{ labels.ok | translate }}\n </button>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "component", type: ListItemRadioComponent, selector: "c8y-list-item-radio, c8y-li-radio", inputs: ["selected", "name", "disabled", "value"], outputs: ["onSelect"] }, { kind: "component", type: HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "component", type: FilterInputComponent, selector: "c8y-filter", inputs: ["icon"], outputs: ["onSearch"] }, { kind: "directive", type: ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: SelectModalFilterPipe, name: "selectModalFilterPipe" }] }); }
33724
+ ], usesOnChanges: true, ngImport: i0, template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"icon\"></i>\n <h1\n class=\"h3\"\n id=\"modal-title\"\n >\n {{ title | translate }}\n </h1>\n </div>\n <div class=\"p-16 text-center separator-bottom min-height-fit\">\n <p class=\"m-b-8\">{{ subTitle | translate }}</p>\n <div class=\"row\">\n <div\n *ngIf=\"showFilter\"\n [ngClass]=\"{\n 'col-xs-6': showFilter && additionalFilterTemplate,\n 'col-xs-12': !showFilter || !additionalFilterTemplate\n }\"\n >\n <c8y-filter\n [icon]=\"'search'\"\n (onSearch)=\"updatePipe($event)\"\n ></c8y-filter>\n </div>\n <div\n *ngIf=\"additionalFilterTemplate\"\n [ngClass]=\"{\n 'col-xs-6': showFilter && additionalFilterTemplate,\n 'col-xs-12': !showFilter || !additionalFilterTemplate\n }\"\n >\n <ng-container *ngTemplateOutlet=\"additionalFilterTemplate\"></ng-container>\n </div>\n </div>\n </div>\n <div\n class=\"modal-inner-scroll\"\n id=\"modal-body\"\n >\n <div class=\"p-l-16 p-r-16\">\n <div\n class=\"panel m-t-8 m-b-8\"\n *ngIf=\"!items || items.length === 0 || (emptyItemsOnly && hideEmptyItems)\"\n >\n <div class=\"c8y-empty-state text-left\">\n <h1\n class=\"c8y-icon-duocolor\"\n c8yIcon=\"{{ icon }} \"\n ></h1>\n <p>{{ (noItemsMessage | translate) ?? 'No items to display.' | translate }}</p>\n </div>\n </div>\n </div>\n <c8y-list-group>\n <ng-container *ngFor=\"let item of listItems | selectModalFilterPipe : filterTerm\">\n <c8y-li *ngIf=\"item.options?.length > 0 || !hideEmptyItems\">\n <c8y-li-icon>\n <i c8yIcon=\"{{ icon }}\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-30\">\n <div class=\"col-9\">\n <div\n *ngFor=\"let bodyPart of item.body\"\n [ngClass]=\"bodyPart.class\"\n >\n <c8y-highlight\n [title]=\"bodyPart.value\"\n [pattern]=\"filterTerm\"\n [text]=\"bodyPart.value\"\n ></c8y-highlight>\n </div>\n </div>\n\n <div\n class=\"col-3 text-right\"\n *ngIf=\"item.additionalInformation\"\n >\n <div [ngClass]=\"item.additionalInformation.class\">\n {{ item.additionalInformation.value }}\n </div>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse *ngIf=\"item.options?.length > 0\">\n <c8y-list-group>\n <c8y-li *ngFor=\"let option of item.options\">\n <c8y-li-radio\n [name]=\"mode === 'single' ? 'single' : item.groupId\"\n (onSelect)=\"updateChoice({ item: item, id: option.obj.id })\"\n [disabled]=\"option.disabled\"\n [selected]=\"option.selected\"\n ></c8y-li-radio>\n <c8y-li-body class=\"content-flex-20\">\n <div\n *ngFor=\"let optionPart of option.body; let i = index\"\n [ngClass]=\"optionPart.class\"\n >\n <c8y-highlight\n [pattern]=\"filterTerm\"\n [text]=\"optionPart.value\"\n ></c8y-highlight>\n </div>\n <ng-container\n *ngIf=\"option.template\"\n [ngTemplateOutlet]=\"option.template\"\n [ngTemplateOutletContext]=\"{ $implicit: item, option: option }\"\n ></ng-container>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </c8y-li-collapse>\n </c8y-li>\n </ng-container>\n <div *ngIf=\"areMoreEntries\">\n <div\n class=\"alert alert-info m-t-16 m-r-8 m-l-8\"\n translate\n >\n Some entries might not be shown. Try narrowing search criteria.\n </div>\n </div>\n </c8y-list-group>\n </div>\n\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n title=\"{{ labels.cancel | translate }}\"\n type=\"button\"\n data-cy=\"select-modal--Cancel-button\"\n *ngIf=\"labels.cancel\"\n (click)=\"dismiss()\"\n c8yProductExperience\n inherit\n [actionData]=\"{ result: labels.cancel }\"\n >\n {{ labels.cancel | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n title=\"{{ labels.ok | translate }}\"\n type=\"button\"\n data-cy=\"select-modal--Save-button\"\n (click)=\"select()\"\n [disabled]=\"!selected\"\n c8yProductExperience\n inherit\n [actionData]=\"{ result: labels.ok }\"\n >\n {{ labels.ok | translate }}\n </button>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "component", type: ListItemRadioComponent, selector: "c8y-list-item-radio, c8y-li-radio", inputs: ["selected", "name", "disabled", "value"], outputs: ["onSelect"] }, { kind: "component", type: HighlightComponent, selector: "c8y-highlight", inputs: ["pattern", "text", "elementClass", "shouldTrimPattern"] }, { kind: "component", type: FilterInputComponent, selector: "c8y-filter", inputs: ["icon", "filterTerm"], outputs: ["onSearch"] }, { kind: "directive", type: ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: SelectModalFilterPipe, name: "selectModalFilterPipe" }] }); }
33612
33725
  }
33613
33726
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: SelectModalComponent, decorators: [{
33614
33727
  type: Component,