@odigos/ui-kit 0.0.24 → 0.0.25

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 (322) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +3 -2
  3. package/lib/components/auto-complete-input/auto-complete-input.stories.d.ts +9 -0
  4. package/lib/components/auto-complete-input/index.d.ts +2 -0
  5. package/lib/components/badge/badge.stories.d.ts +13 -0
  6. package/lib/components/button/button.stories.d.ts +9 -0
  7. package/lib/components/cancel-warning/cancel-warning.stories.d.ts +9 -0
  8. package/lib/components/checkbox/checkbox.stories.d.ts +9 -0
  9. package/lib/components/code/code.stories.d.ts +9 -0
  10. package/lib/components/condition-details/condition-details.stories.d.ts +14 -0
  11. package/lib/components/data-card/data-card-fields/index.d.ts +8 -7
  12. package/lib/components/data-card/data-card.stories.d.ts +11 -0
  13. package/lib/components/data-card/index.d.ts +3 -3
  14. package/lib/components/data-tab/data-tab.stories.d.ts +15 -0
  15. package/lib/components/delete-warning/delete-warning.stories.d.ts +9 -0
  16. package/lib/components/describe-row/describe-row.stories.d.ts +9 -0
  17. package/lib/components/divider/divider.stories.d.ts +9 -0
  18. package/lib/components/docs-button/docs-button.stories.d.ts +9 -0
  19. package/lib/components/drawer/drawer.stories.d.ts +10 -0
  20. package/lib/components/dropdown/dropdown.stories.d.ts +10 -0
  21. package/lib/components/error-boundary/error-boundary.stories.d.ts +9 -0
  22. package/lib/components/extend-arrow/extend-arrow.stories.d.ts +9 -0
  23. package/lib/components/fade-loader/fade-loader.stories.d.ts +9 -0
  24. package/lib/components/field-error/field-error.stories.d.ts +9 -0
  25. package/lib/components/field-label/field-label.stories.d.ts +9 -0
  26. package/lib/components/header/header.stories.d.ts +9 -0
  27. package/lib/components/icon-button/icon-button.stories.d.ts +9 -0
  28. package/lib/components/icon-group/icon-group.stories.d.ts +16 -0
  29. package/lib/components/icon-title-badge/icon-title-badge.stories.d.ts +9 -0
  30. package/lib/components/icon-wrapped/icon-wrapped.stories.d.ts +10 -0
  31. package/lib/components/icons-nav/icons-nav.stories.d.ts +9 -0
  32. package/lib/components/image-controlled/image-controlled.stories.d.ts +9 -0
  33. package/lib/components/index.d.ts +1 -0
  34. package/lib/components/input/input.stories.d.ts +9 -0
  35. package/lib/components/input-list/input-list.stories.d.ts +9 -0
  36. package/lib/components/input-table/input-table.stories.d.ts +9 -0
  37. package/lib/components/interactive-table/interactive-table.stories.d.ts +12 -0
  38. package/lib/components/key-value-input-list/key-value-input-list.stories.d.ts +9 -0
  39. package/lib/components/modal/modal.stories.d.ts +9 -0
  40. package/lib/components/monitors-checkboxes/monitors-checkboxes.stories.d.ts +9 -0
  41. package/lib/components/monitors-icons/monitors-icons.stories.d.ts +9 -0
  42. package/lib/components/navigation-buttons/navigation-buttons.stories.d.ts +9 -0
  43. package/lib/components/no-data-found/no-data-found.stories.d.ts +9 -0
  44. package/lib/components/notification-note/index.d.ts +2 -1
  45. package/lib/components/notification-note/notification-note.stories.d.ts +10 -0
  46. package/lib/components/scroll-x/scroll-x.stories.d.ts +10 -0
  47. package/lib/components/section-title/section-title.stories.d.ts +9 -0
  48. package/lib/components/segment/segment.stories.d.ts +9 -0
  49. package/lib/{containers/data-flow-actions-menu → components}/selection-button/index.d.ts +3 -3
  50. package/lib/components/selection-button/selection-button.stories.d.ts +9 -0
  51. package/lib/components/skeleton-loader/skeleton-loader.stories.d.ts +9 -0
  52. package/lib/components/status/status.stories.d.ts +9 -0
  53. package/lib/components/stepper/stepper.stories.d.ts +9 -0
  54. package/lib/components/styled.d.ts +2 -0
  55. package/lib/components/text/text.stories.d.ts +9 -0
  56. package/lib/components/textarea/textarea.stories.d.ts +9 -0
  57. package/lib/components/toggle/toggle.stories.d.ts +9 -0
  58. package/lib/components/tooltip/tooltip.stories.d.ts +11 -0
  59. package/lib/components/trace-loader/trace-loader.stories.d.ts +9 -0
  60. package/lib/components/warning-modal/warning-modal.stories.d.ts +9 -0
  61. package/lib/components.js +11 -10
  62. package/lib/constants/destinations/index.d.ts +18 -0
  63. package/lib/constants/index.d.ts +1 -0
  64. package/lib/constants/strings/index.d.ts +56 -10
  65. package/lib/constants.js +4 -4
  66. package/lib/containers/action-drawer/action-drawer.stories.d.ts +9 -0
  67. package/lib/containers/action-drawer/build-card.d.ts +1 -7
  68. package/lib/containers/action-form/action-form.stories.d.ts +9 -0
  69. package/lib/containers/action-modal/action-modal.stories.d.ts +9 -0
  70. package/lib/containers/action-table/action-table.stories.d.ts +9 -0
  71. package/lib/containers/await-pipeline/await-pipeline.stories.d.ts +9 -0
  72. package/lib/containers/compute-platform-select/compute-platform-select.stories.d.ts +9 -0
  73. package/lib/containers/compute-platforms/compute-platforms.stories.d.ts +9 -0
  74. package/lib/containers/compute-platforms-actions-menu/compute-platforms-actions-menu.stories.d.ts +9 -0
  75. package/lib/containers/data-flow/data-flow.stories.d.ts +9 -0
  76. package/lib/containers/data-flow-actions-menu/data-flow-actions-menu.stories.d.ts +11 -0
  77. package/lib/containers/data-flow-actions-menu/data-stream-select/index.d.ts +6 -0
  78. package/lib/containers/data-flow-actions-menu/index.d.ts +2 -1
  79. package/lib/containers/data-stream-selection-form/data-stream-selection-form.stories.d.ts +9 -0
  80. package/lib/containers/data-stream-selection-form/index.d.ts +12 -0
  81. package/lib/containers/destination-drawer/build-card.d.ts +1 -7
  82. package/lib/containers/destination-drawer/destination-drawer.stories.d.ts +9 -0
  83. package/lib/containers/destination-drawer/index.d.ts +2 -5
  84. package/lib/containers/destination-form/destination-form.stories.d.ts +9 -0
  85. package/lib/containers/destination-form/index.d.ts +2 -5
  86. package/lib/containers/destination-form/test-connection/index.d.ts +4 -8
  87. package/lib/containers/destination-modal/choose-destination/destinations-list/index.d.ts +2 -1
  88. package/lib/containers/destination-modal/choose-destination/index.d.ts +3 -3
  89. package/lib/containers/destination-modal/destination-modal.stories.d.ts +9 -0
  90. package/lib/containers/destination-modal/index.d.ts +3 -5
  91. package/lib/containers/destination-selection-form/destination-list/index.d.ts +6 -0
  92. package/lib/containers/destination-selection-form/destination-selection-form.stories.d.ts +9 -0
  93. package/lib/containers/destination-selection-form/index.d.ts +6 -9
  94. package/lib/containers/destination-table/destination-table.stories.d.ts +9 -0
  95. package/lib/containers/dropdowns/connection-status-dropdown/connection-status-dropdown.stories.d.ts +9 -0
  96. package/lib/containers/dropdowns/connection-type-dropdown/connection-type-dropdown.stories.d.ts +9 -0
  97. package/lib/containers/dropdowns/error-dropdown/error-dropdown.stories.d.ts +9 -0
  98. package/lib/containers/dropdowns/error-dropdown/index.d.ts +2 -0
  99. package/lib/containers/dropdowns/kind-dropdown/error-dropdown.stories.d.ts +9 -0
  100. package/lib/containers/dropdowns/kind-dropdown/index.d.ts +2 -0
  101. package/lib/containers/dropdowns/language-dropdown/index.d.ts +2 -0
  102. package/lib/containers/dropdowns/language-dropdown/language-dropdown.stories.d.ts +9 -0
  103. package/lib/containers/dropdowns/monitor-dropdown/monitor-dropdown.stories.d.ts +9 -0
  104. package/lib/containers/dropdowns/namespace-dropdown/index.d.ts +2 -0
  105. package/lib/containers/dropdowns/namespace-dropdown/namespace-dropdown.stories.d.ts +9 -0
  106. package/lib/containers/index.d.ts +3 -0
  107. package/lib/containers/instrumentation-rule-drawer/build-card.d.ts +1 -7
  108. package/lib/containers/instrumentation-rule-drawer/instrumentation-rule-drawer.stories.d.ts +9 -0
  109. package/lib/containers/instrumentation-rule-form/instrumentation-rule-form.stories.d.ts +9 -0
  110. package/lib/containers/instrumentation-rule-modal/instrumentation-rule-modal.stories.d.ts +9 -0
  111. package/lib/containers/instrumentation-rule-table/instrumentation-rule-table.stories.d.ts +9 -0
  112. package/lib/containers/multi-source-control/multi-source-control.stories.d.ts +9 -0
  113. package/lib/containers/notification-manager/notification-manager.stories.d.ts +9 -0
  114. package/lib/containers/overview-drawer/overview-drawer.stories.d.ts +9 -0
  115. package/lib/containers/setup-summary/index.d.ts +7 -0
  116. package/lib/containers/setup-summary/setup-summary.stories.d.ts +9 -0
  117. package/lib/containers/side-nav/side-nav.stories.d.ts +9 -0
  118. package/lib/containers/slack-invite/slack-invite.stories.d.ts +9 -0
  119. package/lib/containers/source-drawer/build-card.d.ts +1 -6
  120. package/lib/containers/source-drawer/source-drawer.stories.d.ts +9 -0
  121. package/lib/containers/source-form/source-form.stories.d.ts +9 -0
  122. package/lib/containers/source-modal/index.d.ts +3 -5
  123. package/lib/containers/source-modal/source-modal.stories.d.ts +9 -0
  124. package/lib/containers/source-selection-form/index.d.ts +4 -5
  125. package/lib/containers/source-selection-form/source-list/index.d.ts +8 -0
  126. package/lib/containers/source-selection-form/source-selection-form.stories.d.ts +9 -0
  127. package/lib/containers/source-table/source-table.stories.d.ts +9 -0
  128. package/lib/containers/system-overview/system-overview.stories.d.ts +9 -0
  129. package/lib/containers/table-cell-conditions/table-cell-conditions.stories.d.ts +9 -0
  130. package/lib/containers/toast-list/toast-list.stories.d.ts +9 -0
  131. package/lib/containers/toggle-dark-mode/toggle-dark-mode.stories.d.ts +9 -0
  132. package/lib/containers.js +588 -471
  133. package/lib/functions/filter-destinations-by-stream/index.d.ts +2 -0
  134. package/lib/functions/filter-sources-by-stream/index.d.ts +2 -0
  135. package/lib/functions/index.d.ts +3 -0
  136. package/lib/functions/map-exported-signals/index.d.ts +2 -0
  137. package/lib/functions.js +5 -9
  138. package/lib/hooks/useSourceFormData.d.ts +1 -1
  139. package/lib/hooks/useSourceSelectionFormData.d.ts +9 -17
  140. package/lib/hooks.js +5 -6
  141. package/lib/icons/actions/add-cluster-info-icon/add-cluster-info-icon.stories.d.ts +8 -0
  142. package/lib/icons/actions/delete-attribute-icon/delete-attribute-icon.stories.d.ts +8 -0
  143. package/lib/icons/actions/pii-masking-icon/pii-masking-icon.stories.d.ts +8 -0
  144. package/lib/icons/actions/rename-attribute-icon/rename-attribute-icon.stories.d.ts +8 -0
  145. package/lib/icons/actions/sampler-icon/sampler-icon.stories.d.ts +8 -0
  146. package/lib/icons/brand/odigos-logo/odigos-logo.stories.d.ts +8 -0
  147. package/lib/icons/brand/odigos-logo-text/odigos-logo-text.stories.d.ts +8 -0
  148. package/lib/icons/common/arrow-icon/arrow-icon.stories.d.ts +8 -0
  149. package/lib/icons/common/code-brackets-icon/code-brackets-icon.stories.d.ts +8 -0
  150. package/lib/icons/common/code-icon/code-icon.stories.d.ts +8 -0
  151. package/lib/icons/common/command-icon/command-icon.stories.d.ts +8 -0
  152. package/lib/icons/common/copy-icon/copy-icon.stories.d.ts +8 -0
  153. package/lib/icons/common/edit-icon/edit-icon.stories.d.ts +8 -0
  154. package/lib/icons/common/extend-arrow-icon/extend-arrow-icon.stories.d.ts +8 -0
  155. package/lib/icons/common/filter-icon/filter-icon.stories.d.ts +8 -0
  156. package/lib/icons/common/folder-icon/folder-icon.stories.d.ts +8 -0
  157. package/lib/icons/common/image-error-icon/image-error-icon.stories.d.ts +8 -0
  158. package/lib/icons/common/key-icon/key-icon.stories.d.ts +8 -0
  159. package/lib/icons/common/list-icon/list-icon.stories.d.ts +8 -0
  160. package/lib/icons/common/no-data-icon/no-data-icon.stories.d.ts +8 -0
  161. package/lib/icons/common/notebook-icon/notebook-icon.stories.d.ts +8 -0
  162. package/lib/icons/common/notification-icon/notification-icon.stories.d.ts +8 -0
  163. package/lib/icons/common/search-icon/search-icon.stories.d.ts +8 -0
  164. package/lib/icons/common/sort-arrows-icon/sort-arrows-icon.stories.d.ts +8 -0
  165. package/lib/icons/common/terminal-icon/terminal-icon.stories.d.ts +8 -0
  166. package/lib/icons/common/trash-icon/trash-icon.stories.d.ts +8 -0
  167. package/lib/icons/common/x-icon/x-icon.stories.d.ts +8 -0
  168. package/lib/icons/compute-platform/k8s-logo/k8s-logo.stories.d.ts +8 -0
  169. package/lib/icons/compute-platform/vm-logo/vm-logo.stories.d.ts +8 -0
  170. package/lib/icons/destinations/alauda-logo/alauda-logo.stories.d.ts +8 -0
  171. package/lib/icons/destinations/alibaba-cloud-logo/alibaba-cloud-logo.stories.d.ts +8 -0
  172. package/lib/icons/destinations/app-dynamics-logo/app-dynamics-logo.stories.d.ts +8 -0
  173. package/lib/icons/destinations/aws-cloudwatch-logo/aws-cloudwatch-logo.stories.d.ts +8 -0
  174. package/lib/icons/destinations/aws-s3-logo/aws-s3-logo.stories.d.ts +8 -0
  175. package/lib/icons/destinations/aws-xray-logo/aws-xray-logo.stories.d.ts +8 -0
  176. package/lib/icons/destinations/axiom-logo/axiom-logo.stories.d.ts +8 -0
  177. package/lib/icons/destinations/better-stack-logo/better-stack-logo.stories.d.ts +8 -0
  178. package/lib/icons/destinations/blob-storage-logo/blob-storage-logo.stories.d.ts +8 -0
  179. package/lib/icons/destinations/bonree-logo/bonree-logo.stories.d.ts +8 -0
  180. package/lib/icons/destinations/causely-logo/causely-logo.stories.d.ts +8 -0
  181. package/lib/icons/destinations/checkly-logo/checkly-logo.stories.d.ts +8 -0
  182. package/lib/icons/destinations/chronosphere-logo/chronosphere-logo.stories.d.ts +8 -0
  183. package/lib/icons/destinations/clickhouse-logo/clickhouse-logo.stories.d.ts +8 -0
  184. package/lib/icons/destinations/coralogix-logo/coralogix-logo.stories.d.ts +8 -0
  185. package/lib/icons/destinations/dash0-logo/dash0-logo.stories.d.ts +8 -0
  186. package/lib/icons/destinations/datadog-logo/datadog-logo.stories.d.ts +8 -0
  187. package/lib/icons/destinations/dynatrace-logo/dynatrace-logo.stories.d.ts +8 -0
  188. package/lib/icons/destinations/elastic-apm-logo/elastic-apm-logo.stories.d.ts +8 -0
  189. package/lib/icons/destinations/elastic-search-logo/elastic-search-logo.stories.d.ts +8 -0
  190. package/lib/icons/destinations/gigapipe-logo/gigapipe-logo.stories.d.ts +8 -0
  191. package/lib/icons/destinations/google-cloud-platform-logo/google-cloud-platform-logo.stories.d.ts +8 -0
  192. package/lib/icons/destinations/google-cloud-storage-logo/google-cloud-storage-logo.stories.d.ts +8 -0
  193. package/lib/icons/destinations/grafana-logo/grafana-logo.stories.d.ts +8 -0
  194. package/lib/icons/destinations/greptime-logo/greptime-logo.stories.d.ts +8 -0
  195. package/lib/icons/destinations/groundcover-logo/groundcover-logo.stories.d.ts +8 -0
  196. package/lib/icons/destinations/honeycomb-logo/honeycomb-logo.stories.d.ts +8 -0
  197. package/lib/icons/destinations/hyperdx-logo/hyperdx-logo.stories.d.ts +8 -0
  198. package/lib/icons/destinations/instana-logo/instana-logo.stories.d.ts +8 -0
  199. package/lib/icons/destinations/jaeger-logo/jaeger-logo.stories.d.ts +8 -0
  200. package/lib/icons/destinations/kafka-logo/kafka-logo.stories.d.ts +8 -0
  201. package/lib/icons/destinations/kloudmate-logo/kloudmate-logo.stories.d.ts +8 -0
  202. package/lib/icons/destinations/last9-logo/last9-logo.stories.d.ts +8 -0
  203. package/lib/icons/destinations/lightstep-logo/lightstep-logo.stories.d.ts +8 -0
  204. package/lib/icons/destinations/logzio-logo/logzio-logo.stories.d.ts +8 -0
  205. package/lib/icons/destinations/loki-logo/loki-logo.stories.d.ts +8 -0
  206. package/lib/icons/destinations/lumigo-logo/lumigo-logo.stories.d.ts +8 -0
  207. package/lib/icons/destinations/middleware-logo/middleware-logo.stories.d.ts +8 -0
  208. package/lib/icons/destinations/new-relic-logo/new-relic-logo.stories.d.ts +8 -0
  209. package/lib/icons/destinations/observe-logo/observe-logo.stories.d.ts +8 -0
  210. package/lib/icons/destinations/one-uptime-logo/one-uptime-logo.stories.d.ts +8 -0
  211. package/lib/icons/destinations/open-observe-logo/open-observe-logo.stories.d.ts +8 -0
  212. package/lib/icons/destinations/open-telemetry-logo/open-telemetry-logo.stories.d.ts +8 -0
  213. package/lib/icons/destinations/ops-verse-logo/ops-verse-logo.stories.d.ts +8 -0
  214. package/lib/icons/destinations/oracle-logo/oracle-logo.stories.d.ts +8 -0
  215. package/lib/icons/destinations/prometheus-logo/prometheus-logo.stories.d.ts +8 -0
  216. package/lib/icons/destinations/qryn-logo/qryn-logo.stories.d.ts +8 -0
  217. package/lib/icons/destinations/quickwit-logo/quickwit-logo.stories.d.ts +8 -0
  218. package/lib/icons/destinations/sentry-logo/sentry-logo.stories.d.ts +8 -0
  219. package/lib/icons/destinations/seq-logo/seq-logo.stories.d.ts +8 -0
  220. package/lib/icons/destinations/signoz-logo/signoz-logo.stories.d.ts +8 -0
  221. package/lib/icons/destinations/splunk-logo/splunk-logo.stories.d.ts +8 -0
  222. package/lib/icons/destinations/sumo-logic-logo/sumo-logic-logo.stories.d.ts +8 -0
  223. package/lib/icons/destinations/telemetry-hub-logo/telemetry-hub-logo.stories.d.ts +8 -0
  224. package/lib/icons/destinations/tempo-logo/tempo-logo.stories.d.ts +8 -0
  225. package/lib/icons/destinations/tingyun-logo/tingyun-logo.stories.d.ts +8 -0
  226. package/lib/icons/destinations/traceloop-logo/traceloop-logo.stories.d.ts +8 -0
  227. package/lib/icons/destinations/uptrace-logo/uptrace-logo.stories.d.ts +8 -0
  228. package/lib/icons/destinations/victoria-metrics-logo/victoria-metrics-logo.stories.d.ts +8 -0
  229. package/lib/icons/instrumentation-rules/code-attributes-icon/code-attributes-icon.stories.d.ts +8 -0
  230. package/lib/icons/instrumentation-rules/payload-collection-icon/payload-collection-icon.stories.d.ts +8 -0
  231. package/lib/icons/math/minus-icon/minus-icon.stories.d.ts +8 -0
  232. package/lib/icons/math/plus-icon/plus-icon.stories.d.ts +8 -0
  233. package/lib/icons/monitors/logs-icon/logs-icon.stories.d.ts +8 -0
  234. package/lib/icons/monitors/metrics-icon/metrics-icon.stories.d.ts +8 -0
  235. package/lib/icons/monitors/traces-icon/traces-icon.stories.d.ts +8 -0
  236. package/lib/icons/on-off/eye-closed-icon/eye-closed-icon.stories.d.ts +8 -0
  237. package/lib/icons/on-off/eye-open-icon/eye-open-icon.stories.d.ts +8 -0
  238. package/lib/icons/on-off/light-off-icon/light-off-icon.stories.d.ts +8 -0
  239. package/lib/icons/on-off/light-on-icon/light-on-icon.stories.d.ts +8 -0
  240. package/lib/icons/on-off/moon-icon/moon-icon.stories.d.ts +8 -0
  241. package/lib/icons/on-off/sun-icon/sun-icon.stories.d.ts +8 -0
  242. package/lib/icons/overview/actions-icon/actions-icon.stories.d.ts +8 -0
  243. package/lib/icons/overview/connections-icon/connections-icon.stories.d.ts +8 -0
  244. package/lib/icons/overview/data-streams-icon/data-streams-icon.stories.d.ts +8 -0
  245. package/lib/icons/overview/data-streams-icon/index.d.ts +2 -0
  246. package/lib/icons/overview/destinations-icon/destinations-icon.stories.d.ts +8 -0
  247. package/lib/icons/overview/index.d.ts +1 -0
  248. package/lib/icons/overview/namespaces-icon/namespaces-icon.stories.d.ts +8 -0
  249. package/lib/icons/overview/overview-icon/overview-icon.stories.d.ts +8 -0
  250. package/lib/icons/overview/rules-icon/rules-icon.stories.d.ts +8 -0
  251. package/lib/icons/overview/service-map-icon/service-map-icon.stories.d.ts +8 -0
  252. package/lib/icons/overview/sources-icon/sources-icon.stories.d.ts +8 -0
  253. package/lib/icons/overview/trace-view-icon/trace-view-icon.stories.d.ts +8 -0
  254. package/lib/icons/programming-languages/c-plus-plus-logo/c-plus-plus-logo.stories.d.ts +8 -0
  255. package/lib/icons/programming-languages/c-sharp-logo/c-sharp-logo.stories.d.ts +8 -0
  256. package/lib/icons/programming-languages/dotnet-logo/dotnet-logo.stories.d.ts +8 -0
  257. package/lib/icons/programming-languages/elixir-logo/elixir-logo.stories.d.ts +8 -0
  258. package/lib/icons/programming-languages/go-logo/go-logo.stories.d.ts +8 -0
  259. package/lib/icons/programming-languages/java-logo/java-logo.stories.d.ts +8 -0
  260. package/lib/icons/programming-languages/mysql-logo/mysql-logo.stories.d.ts +8 -0
  261. package/lib/icons/programming-languages/nginx-logo/nginx-logo.stories.d.ts +8 -0
  262. package/lib/icons/programming-languages/nodejs-logo/nodejs-logo.stories.d.ts +8 -0
  263. package/lib/icons/programming-languages/php-logo/php-logo.stories.d.ts +8 -0
  264. package/lib/icons/programming-languages/postgres-logo/postgres-logo.stories.d.ts +8 -0
  265. package/lib/icons/programming-languages/python-logo/python-logo.stories.d.ts +8 -0
  266. package/lib/icons/programming-languages/redis-logo/redis-logo.stories.d.ts +8 -0
  267. package/lib/icons/programming-languages/ruby-logo/ruby-logo.stories.d.ts +8 -0
  268. package/lib/icons/programming-languages/rust-logo/rust-logo.stories.d.ts +8 -0
  269. package/lib/icons/programming-languages/swift-logo/swift-logo.stories.d.ts +8 -0
  270. package/lib/icons/social/slack-logo/slack-logo.stories.d.ts +8 -0
  271. package/lib/icons/status/check-circled-icon/check-circled-icon.stories.d.ts +8 -0
  272. package/lib/icons/status/check-icon/check-icon.stories.d.ts +8 -0
  273. package/lib/icons/status/cross-circled-icon/cross-circled-icon.stories.d.ts +8 -0
  274. package/lib/icons/status/cross-icon/cross-icon.stories.d.ts +8 -0
  275. package/lib/icons/status/error-round-icon/error-round-icon.stories.d.ts +8 -0
  276. package/lib/icons/status/error-triangle-icon/error-triangle-icon.stories.d.ts +8 -0
  277. package/lib/icons/status/info-icon/info-icon.stories.d.ts +8 -0
  278. package/lib/icons/status/warning-triangle-icon/warning-triangle-icon.stories.d.ts +8 -0
  279. package/lib/icons.js +3 -2
  280. package/lib/{index-DwBxpY4g.js → index-BOkleuyi.js} +28 -3
  281. package/lib/{index-C7Y1tYdc.js → index-C0N2DFBu.js} +1 -1
  282. package/lib/{index-B-iLphLA.js → index-C2m4uddS.js} +1 -1
  283. package/lib/{index-DiTtXTRm.js → index-CK8tITRA.js} +25 -2
  284. package/lib/index-CTdoDQzG.js +36 -0
  285. package/lib/index-CWbxXTof.js +11 -0
  286. package/lib/{index-Dylg236O.js → index-CYUrArTm.js} +124 -163
  287. package/lib/{index-KOMAv-TS.js → index-CamnKrev.js} +8 -8
  288. package/lib/index-DE7A6Q_i.js +25 -0
  289. package/lib/index-Dqief9td.js +20 -0
  290. package/lib/{index-D3sp5Hx7.js → index-HOKGoci6.js} +93 -3
  291. package/lib/{data → mock-data}/sources/index.d.ts +1 -0
  292. package/lib/snippets/add-button/index.d.ts +7 -0
  293. package/lib/snippets/edit-button/index.d.ts +7 -0
  294. package/lib/snippets/index.d.ts +3 -0
  295. package/lib/snippets/note-back-to-summary/index.d.ts +6 -0
  296. package/lib/snippets/note-back-to-summary/note-back-to-summary.stories.d.ts +9 -0
  297. package/lib/snippets.js +17 -0
  298. package/lib/store/index.d.ts +1 -0
  299. package/lib/store/useDataStreamStore.d.ts +16 -0
  300. package/lib/store/useSetupStore.d.ts +10 -24
  301. package/lib/store.js +1 -1
  302. package/lib/theme.js +1 -1
  303. package/lib/types/data-streams/index.d.ts +3 -0
  304. package/lib/types/destinations/index.d.ts +14 -2
  305. package/lib/types/index.d.ts +1 -0
  306. package/lib/types/namespaces/index.d.ts +13 -0
  307. package/lib/types/sources/index.d.ts +4 -1
  308. package/lib/{useSourceSelectionFormData-Bec4Ubm7.js → useSourceSelectionFormData-Bxm0NBIy.js} +60 -102
  309. package/lib/{useTransition-D0ykOLrk.js → useTransition-DvT5YNul.js} +2 -2
  310. package/package.json +8 -2
  311. package/lib/containers/destination-modal/choose-destination/potential-destinations-list/index.d.ts +0 -8
  312. package/lib/containers/destination-selection-form/configured-list/index.d.ts +0 -5
  313. package/lib/containers/source-selection-form/controls/index.d.ts +0 -7
  314. package/lib/containers/source-selection-form/list/index.d.ts +0 -9
  315. package/lib/index-C_0J5P9M.js +0 -45
  316. /package/lib/{data → mock-data}/actions/index.d.ts +0 -0
  317. /package/lib/{data → mock-data}/describe/index.d.ts +0 -0
  318. /package/lib/{data → mock-data}/destinations/index.d.ts +0 -0
  319. /package/lib/{data → mock-data}/index.d.ts +0 -0
  320. /package/lib/{data → mock-data}/instrumentation-rules/index.d.ts +0 -0
  321. /package/lib/{data → mock-data}/namespaces/index.d.ts +0 -0
  322. /package/lib/{data → mock-data}/tokens/index.d.ts +0 -0
package/lib/containers.js CHANGED
@@ -1,21 +1,24 @@
1
1
  import React, { useState, useEffect, forwardRef, useRef, useImperativeHandle, useMemo, memo, useContext, createContext, useCallback, useLayoutEffect, Fragment } from 'react';
2
2
  import styled, { css } from 'styled-components';
3
- import { A as ACTION_OPTIONS, M as MONITORS_OPTIONS, I as INSTRUMENTATION_RULE_OPTIONS } from './index-D3sp5Hx7.js';
4
- import { D as DISPLAY_TITLES, F as FORM_ALERTS } from './index-C_0J5P9M.js';
3
+ import { D as DISPLAY_TITLES, A as ACTION_OPTIONS, M as MONITORS_OPTIONS, B as BUTTON_TEXTS, I as INSTRUMENTATION_RULE_OPTIONS, F as FORM_ALERTS } from './index-HOKGoci6.js';
5
4
  import { ActionType, EntityTypes, StatusType, Crud, OtherStatus, NodeTypes, AddNodeTypes, EdgeTypes, FieldTypes, SignalType, CodeAttributesKeyTypes, PayloadCollectionKeyTypes, InstrumentationRuleType } from './types.js';
6
- import { f as DataCardFieldTypes, p as FieldLabel, b as Checkbox, o as FieldError, v as Input, x as InputTable, K as KeyValueInputsList, w as InputList, V as Text, P as Segment, O as SectionTitle, j as DocsButton, z as MonitorsCheckboxes, W as TextArea, k as Drawer, h as DeleteWarning, C as CancelWarning, d as ConditionDetails, D as DataCard, M as Modal, N as NavigationButtons, a3 as ModalBody, A as AutocompleteInput, i as Divider, R as Status, $ as FlexRow, Y as Tooltip, s as IconWrapped, G as MonitorsIcons, a4 as TableContainer, a5 as TableTitleWrap, r as IconTitleBadge, a6 as TableWrap, y as InteractiveTable, a1 as CenterThis, J as NoDataFound, a0 as FlexColumn, Z as TraceLoader, a as Badge, B as Button, E as ExtendArrow, n as Dropdown, a7 as getDefaultExportFromCjs, F as FadeLoader, g as DataTab, Q as SkeletonLoader, X as Toggle, L as NotificationNote, U as Stepper, I as IconButton, e as DataCardFields, t as IconsNav, q as IconGroup } from './index-Dylg236O.js';
7
- import { g as usePendingStore, f as useNotificationStore, a as useDrawerStore, b as useEntityStore, e as useModalStore, c as useFilterStore, s as styleInject, h as useSelectedStore, d as useInstrumentStore, k as getEntityId, i as useSetupStore, u as useDarkMode } from './index-DiTtXTRm.js';
5
+ import { f as DataCardFieldTypes, o as FieldLabel, C as Checkbox, n as FieldError, u as Input, w as InputTable, K as KeyValueInputsList, v as InputList, V as Text, O as Segment, L as SectionTitle, i as DocsButton, y as MonitorsCheckboxes, W as TextArea, j as Drawer, d as ConditionDetails, D as DataCard, M as Modal, N as NavigationButtons, a4 as ModalBody, a as AutocompleteInput, h as Divider, R as Status, $ as FlexRow, Y as Tooltip, r as IconWrapped, z as MonitorsIcons, a5 as TableContainer, a6 as TableTitleWrap, q as IconTitleBadge, a7 as TableWrap, x as InteractiveTable, a1 as CenterThis, G as NoDataFound, a0 as FlexColumn, Z as TraceLoader, b as Badge, E as ExtendArrow, a2 as VerticalScroll, P as SelectionButton, B as Button, m as Dropdown, a8 as getDefaultExportFromCjs, F as FadeLoader, g as DataTab, Q as SkeletonLoader, X as Toggle, A as AddButton$1, J as NotificationNote, U as Stepper, I as IconButton, e as DataCardFields, s as IconsNav, p as IconGroup } from './index-CYUrArTm.js';
6
+ import { h as usePendingStore, g as useNotificationStore, b as useDrawerStore, c as useEntityStore, f as useModalStore, d as useFilterStore, s as styleInject, i as useSelectedStore, e as useInstrumentStore, a as useDataStreamStore, k as getEntityId, j as useSetupStore, u as useDarkMode } from './index-CK8tITRA.js';
8
7
  import Theme from './theme.js';
9
8
  import { i as isEmpty, s as safeJsonParse } from './index-BZS1ijMm.js';
10
9
  import { i as CheckCircledIcon, O as OdigosLogo } from './index-IKusBlIE.js';
11
- import { C as CrossCircledIcon, E as EditIcon, O as OdigosLogoText, a as OverviewIcon, F as FilterIcon, N as NotificationIcon, S as SlackLogo, K as KeyIcon, T as TerminalIcon } from './index-KOMAv-TS.js';
12
- import { g as getActionIcon, a as getInstrumentationRuleIcon } from './index-C7Y1tYdc.js';
13
- import { u as useActionFormData, a as useClickNode, c as useDestinationFormData, b as useClickNotification, d as useSourceFormData, e as useSourceSelectionFormData } from './useSourceSelectionFormData-Bec4Ubm7.js';
14
- import { d as useKeyDown, e as useOnClickOutside, u as useContainerSize, c as useInstrumentationRuleFormData, g as useTransition, f as useTimeAgo, a as useCopy } from './useTransition-D0ykOLrk.js';
15
- import { T as TrashIcon, S as SearchIcon, P as PlusIcon$1, A as ArrowIcon, a as CopyIcon, f as CheckIcon, g as CrossIcon } from './index-BJxaoI0G.js';
16
- import { m as mapConditions, b as getStatusIcon, c as capitalizeFirstLetter } from './index-B-iLphLA.js';
17
- import { f as filterActions, g as getConditionsBooleans, k as getEntityLabel, j as getEntityIcon, s as sleep$1, m as getPlatformIcon, n as getPlatformLabel, d as formatBytes, h as getContainersIcons, o as getValueForRange, i as getDestinationIcon, b as filterSources, a as filterDestinations, c as compareCondition, l as getMetricForEntity, p as getWorkloadId, e as getContainersInstrumentedCount, q as isOverTime } from './index-DwBxpY4g.js';
10
+ import { C as CrossCircledIcon, O as OdigosLogoText, a as OverviewIcon, F as FilterIcon, D as DataStreamsIcon, N as NotificationIcon, S as SlackLogo, K as KeyIcon, T as TerminalIcon } from './index-CamnKrev.js';
11
+ import { g as getActionIcon, a as getInstrumentationRuleIcon } from './index-C0N2DFBu.js';
12
+ import { u as useActionFormData, a as useClickNode, c as useDestinationFormData, b as useClickNotification, d as useSourceFormData, e as useSourceSelectionFormData } from './useSourceSelectionFormData-Bxm0NBIy.js';
13
+ import { d as useKeyDown, e as useOnClickOutside, u as useContainerSize, c as useInstrumentationRuleFormData, g as useTransition, f as useTimeAgo, a as useCopy } from './useTransition-DvT5YNul.js';
14
+ import { E as EditIcon } from './index-CWbxXTof.js';
15
+ import { T as TrashIcon, S as SearchIcon, P as PlusIcon$1, f as CheckIcon, A as ArrowIcon, a as CopyIcon, g as CrossIcon } from './index-BJxaoI0G.js';
16
+ import { D as DeleteWarning, C as CancelWarning } from './index-CTdoDQzG.js';
17
+ import { m as mapConditions, b as getStatusIcon, c as capitalizeFirstLetter } from './index-C2m4uddS.js';
18
+ import { f as filterActions, i as getConditionsBooleans, n as getEntityLabel, m as getEntityIcon, v as sleep$1, p as getPlatformIcon, q as getPlatformLabel, h as formatBytes, k as getContainersIcons, r as getValueForRange, l as getDestinationIcon, u as mapExportedSignals, g as filterSourcesByStream, e as filterSources, b as filterDestinationsByStream, a as filterDestinations, c as compareCondition, d as deepClone, o as getMetricForEntity, s as getWorkloadId, j as getContainersInstrumentedCount, t as isOverTime } from './index-BOkleuyi.js';
18
19
  import { createPortal } from 'react-dom';
20
+ import { N as NoteBackToSummary, E as EditButton } from './index-DE7A6Q_i.js';
21
+ import { D as DESTINATION_CATEGORIES } from './index-Dqief9td.js';
19
22
  import { a6 as RulesIcon, a7 as SourcesIcon, a3 as ActionsIcon, a4 as DestinationsIcon } from './index-BRW_Nl-n.js';
20
23
  import './index-DGel4E-Z.js';
21
24
  import './index-7-KCQK-x.js';
@@ -302,7 +305,7 @@ const CustomFields$1 = ({ actionType, value, setValue, formErrors }) => {
302
305
  return Component ? React.createElement(Component, { value: value, setValue: setValue, formErrors: formErrors }) : null;
303
306
  };
304
307
 
305
- const Container$l = styled.div `
308
+ const Container$n = styled.div `
306
309
  display: flex;
307
310
  flex-direction: column;
308
311
  gap: 24px;
@@ -313,7 +316,7 @@ const FieldTitle$1 = styled(Text) `
313
316
  `;
314
317
  const ActionForm = ({ isUpdate, action, formData, formErrors, handleFormChange }) => {
315
318
  const theme = Theme.useTheme();
316
- return (React.createElement(Container$l, null,
319
+ return (React.createElement(Container$n, null,
317
320
  isUpdate && (React.createElement("div", null,
318
321
  React.createElement(FieldTitle$1, null, "Status"),
319
322
  React.createElement(Segment, { options: [
@@ -668,7 +671,7 @@ const ConditionsStatuses = ({ conditions, id }) => {
668
671
  const columns$3 = [
669
672
  { key: 'icon', title: '' },
670
673
  { key: 'name', title: DISPLAY_TITLES.NAME, sortable: true },
671
- { key: 'signals', title: DISPLAY_TITLES.Monitors },
674
+ { key: 'signals', title: DISPLAY_TITLES.MONITORS },
672
675
  { key: 'active-status', title: DISPLAY_TITLES.STATUS },
673
676
  { key: 'conditions', title: 'Conditions' },
674
677
  { key: 'type', title: DISPLAY_TITLES.TYPE, sortable: true },
@@ -736,14 +739,14 @@ const ActionTable = ({ maxHeight, maxWidth }) => {
736
739
  const badgeTooltip = useMemo(() => (filtered.length !== actions.length ? DISPLAY_TITLES.FILTERED_COUNT_TOOLTIP : undefined), [filtered, actions]);
737
740
  return (React.createElement(TableContainer, { "$maxWidth": maxWidth },
738
741
  React.createElement(TableTitleWrap, null,
739
- React.createElement(IconTitleBadge, { icon: getEntityIcon(EntityTypes.Action), title: DISPLAY_TITLES.Actions, badge: badge, badgeTooltip: badgeTooltip, loading: actionsLoading })),
742
+ React.createElement(IconTitleBadge, { icon: getEntityIcon(EntityTypes.Action), title: DISPLAY_TITLES.ACTIONS, badge: badge, badgeTooltip: badgeTooltip, loading: actionsLoading })),
740
743
  React.createElement(TableWrap, { "$maxHeight": maxHeight },
741
744
  React.createElement(InteractiveTable, { columns: columns$3, rows: rows })),
742
745
  !filtered.length && (React.createElement(CenterThis, { style: { marginTop: '2rem' } },
743
746
  React.createElement(NoDataFound, null)))));
744
747
  };
745
748
 
746
- const Container$k = styled(FlexColumn) `
749
+ const Container$m = styled(FlexColumn) `
747
750
  // width: 100vw;
748
751
  // height: 100vh;
749
752
  gap: 64px;
@@ -777,7 +780,7 @@ const AwaitPipeline = () => {
777
780
  useEffect(() => {
778
781
  awaitPipeline();
779
782
  }, []);
780
- return (React.createElement(Container$k, null,
783
+ return (React.createElement(Container$m, null,
781
784
  React.createElement(OdigosLogoText, { size: 100 }),
782
785
  React.createElement(TraceLoader, { width: 400 }),
783
786
  React.createElement(TextWrap, null,
@@ -787,37 +790,6 @@ const AwaitPipeline = () => {
787
790
  React.createElement(Description, null, "It can take up to a few minutes. Grab a cup of coffee, look out a window, and enjoy your free moment!"))));
788
791
  };
789
792
 
790
- const StyledButton = styled(Button) `
791
- gap: 8px;
792
- text-transform: none;
793
- text-decoration: none;
794
- border: ${({ theme, $withBorder }) => `1px solid ${$withBorder ? theme.colors.border : 'transparent'}`};
795
- &.not-selected {
796
- background-color: ${({ theme, $color }) => $color || theme.colors.dropdown_bg_2 + Theme.opacity.hex['060']};
797
- &:hover {
798
- background-color: ${({ theme, $hoverColor }) => $hoverColor || theme.colors.dropdown_bg_2};
799
- }
800
- }
801
- &.selected {
802
- background-color: ${({ theme }) => theme.colors.majestic_blue + Theme.opacity.hex['048']};
803
- }
804
- `;
805
- const TextLimited = styled(Text) `
806
- white-space: nowrap;
807
- overflow: hidden;
808
- text-overflow: ellipsis;
809
- font-size: 14px;
810
- `;
811
- const SelectionButton = ({ label, onClick, icon: Icon, iconSrc, badgeLabel, badgeFilled, isSelected, withBorder, color, hoverColor, style }) => {
812
- return (React.createElement(StyledButton, { onClick: onClick, className: isSelected ? 'selected' : 'not-selected', "$withBorder": withBorder, "$color": color, "$hoverColor": hoverColor, style: style },
813
- Icon && (React.createElement("div", null,
814
- React.createElement(Icon, null))),
815
- iconSrc && (React.createElement("div", null,
816
- React.createElement("img", { src: iconSrc, alt: '', width: 16, height: 16 }))),
817
- React.createElement(TextLimited, null, label),
818
- badgeLabel !== undefined && React.createElement(Badge, { label: badgeLabel, filled: badgeFilled || isSelected })));
819
- };
820
-
821
793
  const Tab = styled(FlexRow) `
822
794
  width: 260px;
823
795
  padding: 4px;
@@ -850,10 +822,10 @@ const PushToEnd$1 = styled.div `
850
822
  margin-left: auto;
851
823
  margin-right: 6px;
852
824
  `;
853
- const RelativeContainer$2 = styled.div `
825
+ const RelativeContainer$3 = styled.div `
854
826
  position: relative;
855
827
  `;
856
- const AbsoluteContainer$2 = styled.div `
828
+ const AbsoluteContainer$3 = styled.div `
857
829
  position: absolute;
858
830
  top: calc(100% + 8px);
859
831
  left: 0;
@@ -863,12 +835,6 @@ const AbsoluteContainer$2 = styled.div `
863
835
  border-radius: 24px;
864
836
  width: 420px;
865
837
  `;
866
- const VerticalScroll$1 = styled.div `
867
- display: flex;
868
- flex-direction: column;
869
- padding: 12px;
870
- overflow-y: scroll;
871
- `;
872
838
  const HeadWrap = styled.div `
873
839
  border-bottom: ${({ theme }) => `1px solid ${theme.colors.border}`};
874
840
  padding: 12px;
@@ -891,16 +857,16 @@ const ComputePlatformSelect = ({ connections, selected, onSelect, onViewAll }) =
891
857
  const withSelect = !!connections.length;
892
858
  const filtered = connections.filter(({ id }) => id.toLowerCase().includes(searchText));
893
859
  const Icon = !!selected?.type ? getPlatformIcon(selected.type) : null;
894
- return (React.createElement(RelativeContainer$2, { ref: containerRef },
860
+ return (React.createElement(RelativeContainer$3, { ref: containerRef },
895
861
  React.createElement(Tab, { "$withSelect": withSelect, onClick: () => setIsOpen((prev) => !prev) },
896
862
  React.createElement(LogoWrap, null, !!Icon ? React.createElement(Icon, { size: 20, fill: theme.text.info }) : React.createElement(OverviewIcon, { fill: theme.text.info })),
897
863
  React.createElement(Title$2, null, selected?.name || selected?.id || 'no platform'),
898
864
  withSelect && (React.createElement(PushToEnd$1, null,
899
865
  React.createElement(ExtendArrow, { extend: isOpen, align: 'right' })))),
900
- isOpen && withSelect && (React.createElement(AbsoluteContainer$2, null,
866
+ isOpen && withSelect && (React.createElement(AbsoluteContainer$3, null,
901
867
  React.createElement(HeadWrap, null,
902
868
  React.createElement(Input, { placeholder: 'Search...', icon: SearchIcon, value: searchText, onChange: (e) => setSearchText(e.target.value.toLowerCase()) })),
903
- React.createElement(VerticalScroll$1, { style: { maxHeight: '240px' } }, filtered.map(({ id, type, name, status }, idx) => (React.createElement(SelectionButton, { key: `platform-${id}`, icon: () => getPlatformIcon(type)({ fill: status === StatusType.Success ? theme.text.success : theme.text.error }), label: `${!!name ? name : getPlatformLabel(type)} (${id})`, isSelected: selected?.id === id, onClick: () => {
869
+ React.createElement(VerticalScroll, { style: { maxHeight: '240px' } }, filtered.map(({ id, type, name, status }, idx) => (React.createElement(SelectionButton, { key: `platform-${id}`, icon: () => getPlatformIcon(type)({ fill: status === StatusType.Success ? theme.text.success : theme.text.error }), label: `${!!name ? name : getPlatformLabel(type)} (${id})`, isSelected: selected?.id === id, onClick: () => {
904
870
  if (status === StatusType.Success) {
905
871
  onSelect(filtered[idx]);
906
872
  }
@@ -975,8 +941,7 @@ const ConnectionTypeDropdown = ({ connections, title = '', value, onSelect, onDe
975
941
  return React.createElement(Dropdown, { disabled: !options?.length, title: title, placeholder: 'All Types', options: options, value: value, onSelect: onSelect, onDeselect: onDeselect, ...props });
976
942
  };
977
943
 
978
- const ErrorDropdown = ({ title = 'Error Message', value, onSelect, onDeselect, disabled, ...props }) => {
979
- const { sources } = useEntityStore();
944
+ const ErrorDropdown = ({ sources, title = 'Error Message', value, onSelect, onDeselect, disabled, ...props }) => {
980
945
  const options = useMemo(() => {
981
946
  const payload = [];
982
947
  // !! note:
@@ -1001,8 +966,7 @@ const ErrorDropdown = ({ title = 'Error Message', value, onSelect, onDeselect, d
1001
966
  return React.createElement(Dropdown, { disabled: disabled || !options?.length, title: title, placeholder: 'All', options: options, value: value, onSelect: onSelect, onDeselect: onDeselect, ...props });
1002
967
  };
1003
968
 
1004
- const LanguageDropdown = ({ title = 'Programming Language', value, onSelect, onDeselect, ...props }) => {
1005
- const { sources } = useEntityStore();
969
+ const LanguageDropdown = ({ sources, title = 'Programming Language', value, onSelect, onDeselect, ...props }) => {
1006
970
  const options = useMemo(() => {
1007
971
  const payload = [];
1008
972
  sources.forEach(({ containers }) => {
@@ -1029,8 +993,7 @@ const MonitorDropdown = ({ title = 'Monitors', value, onSelect, onDeselect, ...p
1029
993
  return React.createElement(Dropdown, { disabled: !options?.length, title: title, placeholder: 'All', options: options, value: value, onSelect: onSelect, onDeselect: onDeselect, ...props });
1030
994
  };
1031
995
 
1032
- const NamespaceDropdown = ({ title = 'Namespace', value, onSelect, onDeselect, ...props }) => {
1033
- const { namespaces } = useEntityStore();
996
+ const NamespaceDropdown = ({ namespaces, title = 'Namespace', value, onSelect, onDeselect, ...props }) => {
1034
997
  const options = useMemo(() => {
1035
998
  const payload = [];
1036
999
  namespaces?.forEach(({ name }) => {
@@ -1043,8 +1006,7 @@ const NamespaceDropdown = ({ title = 'Namespace', value, onSelect, onDeselect, .
1043
1006
  return React.createElement(Dropdown, { disabled: !options?.length, title: title, placeholder: 'Select namespace', options: options, value: value, onSelect: onSelect, onDeselect: onDeselect, ...props });
1044
1007
  };
1045
1008
 
1046
- const KindDropdown = ({ title = 'Kind', value, onSelect, onDeselect, ...props }) => {
1047
- const { sources } = useEntityStore();
1009
+ const KindDropdown = ({ sources, title = 'Kind', value, onSelect, onDeselect, ...props }) => {
1048
1010
  const options = useMemo(() => {
1049
1011
  const payload = [];
1050
1012
  sources.forEach(({ kind: id }) => {
@@ -1057,7 +1019,7 @@ const KindDropdown = ({ title = 'Kind', value, onSelect, onDeselect, ...props })
1057
1019
  return React.createElement(Dropdown, { disabled: !options?.length, title: title, placeholder: 'All', options: options, value: value, onSelect: onSelect, onDeselect: onDeselect, ...props });
1058
1020
  };
1059
1021
 
1060
- const Container$j = styled.div `
1022
+ const Container$l = styled.div `
1061
1023
  display: flex;
1062
1024
  align-items: center;
1063
1025
  margin: 20px 0;
@@ -1077,7 +1039,7 @@ const ComputePlatformsActionsMenu = ({ connections }) => {
1077
1039
  useEffect(() => {
1078
1040
  return () => clearAll();
1079
1041
  }, [clearAll]);
1080
- return (React.createElement(Container$j, null,
1042
+ return (React.createElement(Container$l, null,
1081
1043
  React.createElement(FlexRow, { "$gap": 16 },
1082
1044
  React.createElement(FlexRow, { "$gap": 12 },
1083
1045
  React.createElement(Title$1, null, "Compute platforms"),
@@ -12475,7 +12437,7 @@ ControlsComponent.displayName = 'Controls';
12475
12437
  * @remarks To extend or customise the controls, you can use the [`<ControlButton />`](/api-reference/components/control-button) component
12476
12438
  *
12477
12439
  */
12478
- const Controls$1 = memo(ControlsComponent);
12440
+ const Controls = memo(ControlsComponent);
12479
12441
 
12480
12442
  function MiniMapNodeComponent({ id, x, y, width, height, style, color, strokeColor, strokeWidth, className, borderRadius, shapeRendering, selected, onClick, }) {
12481
12443
  const { background, backgroundColor } = style || {};
@@ -12794,7 +12756,7 @@ function ResizeControl({ nodeId, position, variant = ResizeControlVariant.Handle
12794
12756
  */
12795
12757
  memo(ResizeControl);
12796
12758
 
12797
- const Container$i = styled(FlexColumn) `
12759
+ const Container$k = styled(FlexColumn) `
12798
12760
  align-items: center !important;
12799
12761
  justify-content: center;
12800
12762
  align-self: stretch;
@@ -12831,7 +12793,7 @@ const AddNode = memo(({ id: nodeId, data }) => {
12831
12793
  const { isThisPending } = usePendingStore();
12832
12794
  const entity = nodeId.split('-')[0];
12833
12795
  const isPending = isThisPending({ entityType: entity });
12834
- return (React.createElement(Container$i, { "$nodeWidth": nodeWidth, className: 'nowheel nodrag' },
12796
+ return (React.createElement(Container$k, { "$nodeWidth": nodeWidth, className: 'nowheel nodrag' },
12835
12797
  isPending ? (React.createElement(Fragment, null,
12836
12798
  React.createElement(TitleWrapper, null,
12837
12799
  React.createElement(FadeLoader, null),
@@ -12848,7 +12810,7 @@ const AddNode = memo(({ id: nodeId, data }) => {
12848
12810
  React.createElement(Handle, { type: 'source', position: Position.Right, style: { visibility: 'hidden' } })));
12849
12811
  });
12850
12812
 
12851
- const Container$h = styled.div `
12813
+ const Container$j = styled.div `
12852
12814
  width: ${({ $nodeWidth }) => `${$nodeWidth}px`};
12853
12815
  `;
12854
12816
  const BaseNode = memo(({ id: nodeId, data }) => {
@@ -12881,7 +12843,7 @@ const BaseNode = memo(({ id: nodeId, data }) => {
12881
12843
  }
12882
12844
  setSelectedSources(namespaces);
12883
12845
  };
12884
- return (React.createElement(Container$h, { "data-id": nodeId, "$nodeWidth": nodeWidth, className: 'nowheel nodrag' },
12846
+ return (React.createElement(Container$j, { "data-id": nodeId, "$nodeWidth": nodeWidth, className: 'nowheel nodrag' },
12885
12847
  React.createElement(DataTab, { title: title, subTitle: subTitle, onClick: () => { }, renderActions: renderActions, iconProps: {
12886
12848
  icon: icon,
12887
12849
  icons: icons,
@@ -12901,19 +12863,19 @@ const BaseNode = memo(({ id: nodeId, data }) => {
12901
12863
  React.createElement(Handle, { type: 'source', position: Position.Right, style: { visibility: 'hidden' } })));
12902
12864
  });
12903
12865
 
12904
- const Container$g = styled.div `
12866
+ const Container$i = styled.div `
12905
12867
  width: ${({ $nodeWidth }) => `${$nodeWidth}px`};
12906
12868
  height: ${({ $nodeHeight }) => `${$nodeHeight}px`};
12907
12869
  opacity: 0;
12908
12870
  `;
12909
12871
  const EdgedNode = memo(({ data }) => {
12910
12872
  const { nodeWidth, nodeHeight } = data;
12911
- return (React.createElement(Container$g, { "$nodeWidth": nodeWidth, "$nodeHeight": nodeHeight, className: 'nowheel nodrag' },
12873
+ return (React.createElement(Container$i, { "$nodeWidth": nodeWidth, "$nodeHeight": nodeHeight, className: 'nowheel nodrag' },
12912
12874
  React.createElement(Handle, { type: 'source', position: Position.Right, style: { visibility: 'hidden' } }),
12913
12875
  React.createElement(Handle, { type: 'target', position: Position.Left, style: { visibility: 'hidden' } })));
12914
12876
  });
12915
12877
 
12916
- const Container$f = styled.div `
12878
+ const Container$h = styled.div `
12917
12879
  width: ${({ $nodeWidth }) => $nodeWidth}px;
12918
12880
  height: ${({ $nodeHeight }) => $nodeHeight}px;
12919
12881
  background: transparent;
@@ -12922,7 +12884,7 @@ const Container$f = styled.div `
12922
12884
  `;
12923
12885
  const FrameNode = memo(({ data }) => {
12924
12886
  const { nodeWidth, nodeHeight } = data;
12925
- return (React.createElement(Container$f, { "$nodeWidth": nodeWidth, "$nodeHeight": nodeHeight, className: 'nowheel nodrag' },
12887
+ return (React.createElement(Container$h, { "$nodeWidth": nodeWidth, "$nodeHeight": nodeHeight, className: 'nowheel nodrag' },
12926
12888
  React.createElement(Handle, { type: 'source', position: Position.Right, style: { visibility: 'hidden' } }),
12927
12889
  React.createElement(Handle, { type: 'target', position: Position.Left, style: { visibility: 'hidden' } })));
12928
12890
  });
@@ -12937,7 +12899,7 @@ const nodeConfig = {
12937
12899
  };
12938
12900
 
12939
12901
  const { framePadding: framePadding$3 } = nodeConfig;
12940
- const Container$e = styled.div `
12902
+ const Container$g = styled.div `
12941
12903
  position: relative;
12942
12904
  z-index: 1;
12943
12905
  width: fit-content;
@@ -12985,7 +12947,7 @@ const ScrollNode = memo(({ data, ...rest }) => {
12985
12947
  current?.addEventListener('scroll', handleScroll);
12986
12948
  return () => current?.removeEventListener('scroll', handleScroll);
12987
12949
  }, [onScroll]);
12988
- return (React.createElement(Container$e, { ref: containerRef, "$nodeHeight": nodeHeight, className: 'nowheel nodrag' },
12950
+ return (React.createElement(Container$g, { ref: containerRef, "$nodeHeight": nodeHeight, className: 'nowheel nodrag' },
12989
12951
  items.map((item) => (React.createElement(BaseNodeWrapper, { key: item.id, onClick: (e) => {
12990
12952
  e.stopPropagation();
12991
12953
  // @ts-ignore
@@ -12995,7 +12957,7 @@ const ScrollNode = memo(({ data, ...rest }) => {
12995
12957
  React.createElement(BottomOverlay, { "$hide": isBottomOfList })));
12996
12958
  });
12997
12959
 
12998
- const Container$d = styled.div `
12960
+ const Container$f = styled.div `
12999
12961
  position: relative;
13000
12962
  width: ${({ $nodeWidth }) => `${$nodeWidth}px`};
13001
12963
  padding: 12px 0px 16px 0px;
@@ -13013,7 +12975,7 @@ const SelectorWrapper = styled(FlexRow) `
13013
12975
  const ActionsWrapper = styled(FlexRow) `
13014
12976
  margin-left: auto;
13015
12977
  `;
13016
- const AddButton$1 = styled(Button) `
12978
+ const AddButton = styled(Button) `
13017
12979
  width: 24px;
13018
12980
  height: 24px;
13019
12981
  padding: 0;
@@ -13064,7 +13026,7 @@ const HeaderNode = memo(({ id: nodeId, data }) => {
13064
13026
  setSelectedSources({});
13065
13027
  }
13066
13028
  };
13067
- return (React.createElement(Container$d, { "$nodeWidth": nodeWidth, className: 'nowheel nodrag' },
13029
+ return (React.createElement(Container$f, { "$nodeWidth": nodeWidth, className: 'nowheel nodrag' },
13068
13030
  entityType === EntityTypes.Source && (React.createElement(SelectorWrapper, null,
13069
13031
  React.createElement(Checkbox, { partiallyChecked: hasSelected && sources?.length !== totalSelectedSources, value: hasSelected && sources?.length === totalSelectedSources, onChange: onSelect, disabled: !sources?.length }))),
13070
13032
  React.createElement(IconTitleBadge, { icon: Icon, title: title, badge: isSourceAwaitingInstrumentation ? `${instrumentingPercent}%` : badge, badgeTooltip: badgeTooltip, loading: isFetching && !isSourceAwaitingInstrumentation }),
@@ -13075,7 +13037,7 @@ const Actions$1 = memo(({ entityType }) => {
13075
13037
  const theme = Theme.useTheme();
13076
13038
  const { onClickNode } = useClickNode();
13077
13039
  return (React.createElement(ActionsWrapper, null,
13078
- React.createElement(AddButton$1, { "data-id": `add-${entityType}`, variant: 'primary', onClick: (e) => {
13040
+ React.createElement(AddButton, { "data-id": `add-${entityType}`, variant: 'primary', onClick: (e) => {
13079
13041
  e.stopPropagation();
13080
13042
  // @ts-ignore
13081
13043
  onClickNode(undefined, {
@@ -13126,12 +13088,12 @@ const LabeledEdge = memo(({ id, sourceX, sourceY, targetX, targetY, sourcePositi
13126
13088
  React.createElement(Tooltip, { text: 'Heads up! The data-flow metrics you see are calculated over 10-second intervals.' }, data?.label)))));
13127
13089
  });
13128
13090
 
13129
- const Container$c = styled.div `
13091
+ const Container$e = styled.div `
13130
13092
  width: ${({ $nodeWidth }) => `${$nodeWidth}px`};
13131
13093
  `;
13132
13094
  const SkeletonNode = memo(({ id: nodeId, data }) => {
13133
13095
  const { nodeWidth } = data;
13134
- return (React.createElement(Container$c, { "data-id": nodeId, "$nodeWidth": nodeWidth, className: 'nowheel nodrag' },
13096
+ return (React.createElement(Container$e, { "data-id": nodeId, "$nodeWidth": nodeWidth, className: 'nowheel nodrag' },
13135
13097
  React.createElement(SkeletonLoader, { size: 3 })));
13136
13098
  });
13137
13099
 
@@ -13173,7 +13135,7 @@ const Flow = ({ nodes, edges, onNodesChange, onEdgesChange }) => {
13173
13135
  return (React.createElement(FlowWrapper, null,
13174
13136
  React.createElement(index, { fitView: false, zoomOnScroll: false, nodes: nodes, nodeTypes: nodeTypes, edges: edges, edgeTypes: edgeTypes, onNodeClick: onClickNode, onNodesChange: (changes) => setTimeout(() => onNodesChange(changes), 0), onEdgesChange: (changes) => setTimeout(() => onEdgesChange(changes), 0) },
13175
13137
  React.createElement(ControllerWrapper, null,
13176
- React.createElement(Controls$1, { position: 'bottom-right', orientation: 'horizontal', showInteractive: false, showZoom: true, showFitView: true, fitViewOptions: {
13138
+ React.createElement(Controls, { position: 'bottom-right', orientation: 'horizontal', showInteractive: false, showZoom: true, showFitView: true, fitViewOptions: {
13177
13139
  duration: 300,
13178
13140
  padding: 0.02,
13179
13141
  includeHiddenNodes: true,
@@ -13253,7 +13215,7 @@ const buildRuleNodes = ({ loading, entities, positions, unfilteredCount }) => {
13253
13215
  },
13254
13216
  data: {
13255
13217
  nodeWidth: nodeWidth$4,
13256
- title: DISPLAY_TITLES.InstrumentationRules,
13218
+ title: DISPLAY_TITLES.INSTRUMENTATION_RULES,
13257
13219
  icon: getEntityIcon(EntityTypes.InstrumentationRule),
13258
13220
  badge: unfilteredCount,
13259
13221
  isFetching: loading,
@@ -13296,8 +13258,8 @@ const buildRuleNodes = ({ loading, entities, positions, unfilteredCount }) => {
13296
13258
  data: {
13297
13259
  nodeWidth: nodeWidth$4,
13298
13260
  type: AddNodeTypes.AddRule,
13299
- title: 'ADD RULE',
13300
- subTitle: 'To modify OpenTelemetry data',
13261
+ title: DISPLAY_TITLES.ADD_INSTRUMENTATION_RULE,
13262
+ subTitle: DISPLAY_TITLES.TO_MODIFY_OTEL_DATA,
13301
13263
  },
13302
13264
  });
13303
13265
  }
@@ -13333,7 +13295,7 @@ const buildActionNodes = ({ loading, entities, positions, unfilteredCount }) =>
13333
13295
  },
13334
13296
  data: {
13335
13297
  nodeWidth: nodeWidth$3,
13336
- title: DISPLAY_TITLES.Actions,
13298
+ title: DISPLAY_TITLES.ACTIONS,
13337
13299
  icon: getEntityIcon(EntityTypes.Action),
13338
13300
  badge: unfilteredCount,
13339
13301
  isFetching: loading,
@@ -13390,8 +13352,8 @@ const buildActionNodes = ({ loading, entities, positions, unfilteredCount }) =>
13390
13352
  data: {
13391
13353
  nodeWidth: nodeWidth$3,
13392
13354
  type: AddNodeTypes.AddAction,
13393
- title: 'ADD Action',
13394
- subTitle: 'To modify OpenTelemetry data',
13355
+ title: DISPLAY_TITLES.ADD_ACTION,
13356
+ subTitle: DISPLAY_TITLES.TO_MODIFY_OTEL_DATA,
13395
13357
  },
13396
13358
  });
13397
13359
  }
@@ -13431,7 +13393,7 @@ const buildSourceNodes = ({ loading, entities, positions, unfilteredCount, conta
13431
13393
  },
13432
13394
  data: {
13433
13395
  nodeWidth: nodeWidth$2,
13434
- title: DISPLAY_TITLES.Sources,
13396
+ title: DISPLAY_TITLES.SOURCES,
13435
13397
  icon: getEntityIcon(EntityTypes.Source),
13436
13398
  badge: hasFiltersApplied ? `${entities.length}/${unfilteredCount}` : unfilteredCount,
13437
13399
  badgeTooltip: hasFiltersApplied ? DISPLAY_TITLES.FILTERED_COUNT_TOOLTIP : undefined,
@@ -13501,8 +13463,8 @@ const buildSourceNodes = ({ loading, entities, positions, unfilteredCount, conta
13501
13463
  data: {
13502
13464
  nodeWidth: nodeWidth$2,
13503
13465
  type: AddNodeTypes.AddSource,
13504
- title: 'ADD Source',
13505
- subTitle: 'To collect OpenTelemetry data',
13466
+ title: DISPLAY_TITLES.ADD_SOURCE,
13467
+ subTitle: DISPLAY_TITLES.TO_COLLECT_OTEL_DATA,
13506
13468
  },
13507
13469
  });
13508
13470
  }
@@ -13559,7 +13521,7 @@ const mapToNodeData = (entity) => {
13559
13521
  subTitle: entity.destinationType.displayName,
13560
13522
  icon,
13561
13523
  iconSrc,
13562
- monitors: Object.keys(entity.exportedSignals).filter((signal) => entity.exportedSignals[signal] === true),
13524
+ monitors: mapExportedSignals(entity.exportedSignals),
13563
13525
  raw: entity,
13564
13526
  };
13565
13527
  };
@@ -13575,7 +13537,7 @@ const buildDestinationNodes = ({ loading, entities, positions, unfilteredCount }
13575
13537
  },
13576
13538
  data: {
13577
13539
  nodeWidth,
13578
- title: DISPLAY_TITLES.Destinations,
13540
+ title: DISPLAY_TITLES.DESTINATIONS,
13579
13541
  icon: getEntityIcon(EntityTypes.Destination),
13580
13542
  badge: unfilteredCount,
13581
13543
  isFetching: loading,
@@ -13618,15 +13580,15 @@ const buildDestinationNodes = ({ loading, entities, positions, unfilteredCount }
13618
13580
  data: {
13619
13581
  nodeWidth,
13620
13582
  type: AddNodeTypes.AddDestination,
13621
- title: 'ADD Destination',
13622
- subTitle: 'To monitor OpenTelemetry data',
13583
+ title: DISPLAY_TITLES.ADD_DESTINATION,
13584
+ subTitle: DISPLAY_TITLES.TO_MONITOR_OTEL_DATA,
13623
13585
  },
13624
13586
  });
13625
13587
  }
13626
13588
  return nodes;
13627
13589
  };
13628
13590
 
13629
- const Container$b = styled.div `
13591
+ const Container$d = styled.div `
13630
13592
  width: 100%;
13631
13593
  height: ${({ $heightToRemove }) => `calc(100vh - ${$heightToRemove})`};
13632
13594
  position: relative;
@@ -13634,6 +13596,7 @@ const Container$b = styled.div `
13634
13596
  const DataFlow = ({ heightToRemove, metrics }) => {
13635
13597
  const theme = Theme.useTheme();
13636
13598
  const filters = useFilterStore();
13599
+ const { selectedStreamName } = useDataStreamStore();
13637
13600
  const { isAwaitingInstrumentation } = useInstrumentStore();
13638
13601
  const { containerRef, containerWidth, containerHeight } = useContainerSize();
13639
13602
  const { sources, sourcesLoading, destinations, destinationsLoading, actions, actionsLoading, instrumentationRules, instrumentationRulesLoading } = useEntityStore();
@@ -13661,25 +13624,27 @@ const DataFlow = ({ heightToRemove, metrics }) => {
13661
13624
  })), prevNodes));
13662
13625
  };
13663
13626
  useEffect(() => {
13627
+ const sourcesByStream = filterSourcesByStream(sources, selectedStreamName);
13664
13628
  const sourceNodes = buildSourceNodes({
13665
- entities: filterSources(sources, filters),
13629
+ entities: filterSources(sourcesByStream, filters),
13666
13630
  loading: sourcesLoading || isAwaitingInstrumentation,
13667
- unfilteredCount: sources.length,
13631
+ unfilteredCount: sourcesByStream.length,
13668
13632
  positions,
13669
13633
  containerHeight,
13670
13634
  onScroll: ({ scrollTop }) => handleNodesScrolled(sourceNodes, EntityTypes.Source, scrollTop),
13671
13635
  });
13672
13636
  handleNodesChanged(sourceNodes, EntityTypes.Source);
13673
- }, [sources, sourcesLoading, isAwaitingInstrumentation, positions[EntityTypes.Source], filters, containerHeight]);
13637
+ }, [selectedStreamName, sources, sourcesLoading, isAwaitingInstrumentation, positions[EntityTypes.Source], filters, containerHeight]);
13674
13638
  useEffect(() => {
13639
+ const destinationsByStream = filterDestinationsByStream(destinations, selectedStreamName);
13675
13640
  const destinationNodes = buildDestinationNodes({
13676
- entities: filterDestinations(destinations, filters),
13641
+ entities: filterDestinations(destinationsByStream, filters),
13677
13642
  loading: destinationsLoading,
13678
- unfilteredCount: destinations.length,
13643
+ unfilteredCount: destinationsByStream.length,
13679
13644
  positions,
13680
13645
  });
13681
13646
  handleNodesChanged(destinationNodes, EntityTypes.Destination);
13682
- }, [destinations, destinationsLoading, positions[EntityTypes.Destination], filters]);
13647
+ }, [selectedStreamName, destinations, destinationsLoading, positions[EntityTypes.Destination], filters]);
13683
13648
  useEffect(() => {
13684
13649
  const actionNodes = buildActionNodes({
13685
13650
  entities: filterActions(actions, filters),
@@ -13699,15 +13664,15 @@ const DataFlow = ({ heightToRemove, metrics }) => {
13699
13664
  });
13700
13665
  handleNodesChanged(ruleNodes, EntityTypes.InstrumentationRule);
13701
13666
  }, [instrumentationRules, instrumentationRulesLoading, positions[EntityTypes.InstrumentationRule]]);
13702
- return (React.createElement(Container$b, { ref: containerRef, "$heightToRemove": heightToRemove },
13667
+ return (React.createElement(Container$d, { ref: containerRef, "$heightToRemove": heightToRemove },
13703
13668
  React.createElement(Flow, { nodes: nodes, edges: edges, onNodesChange: onNodesChange, onEdgesChange: onEdgesChange })));
13704
13669
  };
13705
13670
 
13706
- const RelativeContainer$1 = styled.div `
13671
+ const RelativeContainer$2 = styled.div `
13707
13672
  position: relative;
13708
13673
  max-width: 200px;
13709
13674
  `;
13710
- const AbsoluteContainer$1 = styled.div `
13675
+ const AbsoluteContainer$2 = styled.div `
13711
13676
  position: absolute;
13712
13677
  top: calc(100% + 8px);
13713
13678
  left: 0;
@@ -13784,26 +13749,21 @@ const HorizontalScroll = styled.div `
13784
13749
  border-bottom: ${({ theme }) => `1px solid ${theme.colors.border}`};
13785
13750
  overflow-x: scroll;
13786
13751
  `;
13787
- const VerticalScroll = styled.div `
13788
- display: flex;
13789
- flex-direction: column;
13790
- padding: 12px;
13791
- overflow-y: scroll;
13792
- `;
13793
13752
  const SearchResults = ({ searchText, onClose }) => {
13794
13753
  const theme = Theme.useTheme();
13795
13754
  const { onClickNode } = useClickNode();
13755
+ const { selectedStreamName } = useDataStreamStore();
13796
13756
  const { sources, destinations, actions, instrumentationRules } = useEntityStore();
13797
13757
  const [selectedCategory, setSelectedCategory] = useState('all');
13798
13758
  const { categories, searchResults } = useMemo(() => buildSearchResults({
13799
13759
  instrumentationRules,
13800
- sources,
13760
+ sources: filterSourcesByStream(sources, selectedStreamName),
13801
13761
  actions,
13802
- destinations,
13762
+ destinations: filterDestinationsByStream(destinations, selectedStreamName),
13803
13763
  searchText,
13804
13764
  selectedCategory,
13805
- }), [instrumentationRules, sources, actions, destinations, searchText, selectedCategory]);
13806
- return (React.createElement(AbsoluteContainer$1, null,
13765
+ }), [instrumentationRules, sources, actions, destinations, selectedStreamName, searchText, selectedCategory]);
13766
+ return (React.createElement(AbsoluteContainer$2, null,
13807
13767
  React.createElement(HorizontalScroll, { style: { borderBottom: `1px solid ${!searchResults.length ? 'transparent' : theme.colors.border}` } }, categories.map(({ category, label, count }) => !!count && (React.createElement(SelectionButton, { key: `category-select-${category}`, label: label, badgeLabel: count, isSelected: selectedCategory === category, onClick: () => setSelectedCategory(category) })))),
13808
13768
  searchResults.map(({ category, label, entities }, catIdx) => !!entities.length && (React.createElement(Fragment, { key: `category-list-${category}` },
13809
13769
  React.createElement(VerticalScroll, { style: { maxHeight: selectedCategory !== 'all' ? '240px' : '140px' } },
@@ -13827,7 +13787,7 @@ const Search = () => {
13827
13787
  const containerRef = useRef(null);
13828
13788
  useOnClickOutside(containerRef, () => setFocused(false));
13829
13789
  useKeyDown({ key: 'Escape', active: !!input || focused }, onClose);
13830
- return (React.createElement(RelativeContainer$1, { ref: containerRef },
13790
+ return (React.createElement(RelativeContainer$2, { ref: containerRef },
13831
13791
  React.createElement(Input, { placeholder: 'Search', icon: SearchIcon, value: input, onChange: (e) => setInput(e.target.value.toLowerCase()), onFocus: () => setFocused(true) }),
13832
13792
  !!input || focused ? React.createElement(SearchResults, { searchText: input, onClose: onClose }) : null));
13833
13793
  };
@@ -13867,19 +13827,22 @@ const getFilterCount = (params) => {
13867
13827
  };
13868
13828
  const Filters$1 = () => {
13869
13829
  const theme = Theme.useTheme();
13870
- const { namespaces, kinds, monitors, languages, errors, onlyErrors, setAll, clearAll, getEmptyState } = useFilterStore();
13830
+ const { namespaces, sources } = useEntityStore();
13831
+ const { selectedStreamName } = useDataStreamStore();
13832
+ const { namespaces: namespaceFilters, kinds, monitors, languages, errors, onlyErrors, setAll, clearAll, getEmptyState } = useFilterStore();
13833
+ const sourcesByStream = useMemo(() => filterSourcesByStream(sources, selectedStreamName), [sources, selectedStreamName]);
13871
13834
  // We need local state, because we want to keep the filters in the store only when the user clicks on apply
13872
- const [filters, setFilters] = useState({ namespaces, kinds, monitors, languages, errors, onlyErrors });
13835
+ const [filters, setFilters] = useState({ namespaces: namespaceFilters, kinds, monitors, languages, errors, onlyErrors });
13873
13836
  const [filterCount, setFilterCount] = useState(getFilterCount(filters));
13874
13837
  const [focused, setFocused] = useState(false);
13875
13838
  const toggleFocused = () => setFocused((prev) => !prev);
13876
13839
  useEffect(() => {
13877
13840
  if (!focused) {
13878
- const payload = { namespaces, kinds, monitors, languages, errors, onlyErrors };
13841
+ const payload = { namespaces: namespaceFilters, kinds, monitors, languages, errors, onlyErrors };
13879
13842
  setFilters(payload);
13880
13843
  setFilterCount(getFilterCount(payload));
13881
13844
  }
13882
- }, [focused, namespaces, kinds, monitors, errors, onlyErrors]);
13845
+ }, [focused, namespaceFilters, kinds, monitors, errors, onlyErrors]);
13883
13846
  const onApply = () => {
13884
13847
  // TODO: remove trycatch after debugging
13885
13848
  try {
@@ -13903,17 +13866,17 @@ const Filters$1 = () => {
13903
13866
  const ref = useRef(null);
13904
13867
  useOnClickOutside(ref, onCancel);
13905
13868
  useKeyDown({ key: 'Escape', active: focused }, onCancel);
13906
- return (React.createElement(RelativeContainer$1, { ref: ref },
13869
+ return (React.createElement(RelativeContainer$2, { ref: ref },
13907
13870
  React.createElement(SelectionButton, { label: 'Filters', icon: FilterIcon, badgeLabel: filterCount, badgeFilled: !!filterCount, withBorder: true, color: 'transparent', onClick: toggleFocused }),
13908
- React.createElement(AbsoluteContainer$1, { "$hidden": !focused },
13871
+ React.createElement(AbsoluteContainer$2, { "$hidden": !focused },
13909
13872
  React.createElement(FormWrapper, null,
13910
- React.createElement(NamespaceDropdown, { value: filters['namespaces'], onSelect: (val) => setFilters((prev) => ({ ...prev, namespaces: [...(prev.namespaces || []), val] })), onDeselect: (val) => setFilters((prev) => ({ ...prev, namespaces: (prev.namespaces || []).filter((opt) => opt.id !== val.id) })), showSearch: true, required: true, isMulti: true }),
13911
- React.createElement(KindDropdown, { value: filters['kinds'], onSelect: (val) => setFilters((prev) => ({ ...prev, kinds: [...(prev.kinds || []), val] })), onDeselect: (val) => setFilters((prev) => ({ ...prev, kinds: (prev.kinds || []).filter((opt) => opt.id !== val.id) })), showSearch: true, required: true, isMulti: true }),
13912
- React.createElement(LanguageDropdown, { value: filters['languages'], onSelect: (val) => setFilters((prev) => ({ ...prev, languages: [...(prev.languages || []), val] })), onDeselect: (val) => setFilters((prev) => ({ ...prev, languages: (prev.languages || []).filter((opt) => opt.id !== val.id) })), showSearch: true, required: true, isMulti: true }),
13873
+ React.createElement(NamespaceDropdown, { namespaces: namespaces, value: filters['namespaces'], onSelect: (val) => setFilters((prev) => ({ ...prev, namespaces: [...(prev.namespaces || []), val] })), onDeselect: (val) => setFilters((prev) => ({ ...prev, namespaces: (prev.namespaces || []).filter((opt) => opt.id !== val.id) })), showSearch: true, required: true, isMulti: true }),
13874
+ React.createElement(KindDropdown, { sources: sourcesByStream, value: filters['kinds'], onSelect: (val) => setFilters((prev) => ({ ...prev, kinds: [...(prev.kinds || []), val] })), onDeselect: (val) => setFilters((prev) => ({ ...prev, kinds: (prev.kinds || []).filter((opt) => opt.id !== val.id) })), showSearch: true, required: true, isMulti: true }),
13875
+ React.createElement(LanguageDropdown, { sources: sourcesByStream, value: filters['languages'], onSelect: (val) => setFilters((prev) => ({ ...prev, languages: [...(prev.languages || []), val] })), onDeselect: (val) => setFilters((prev) => ({ ...prev, languages: (prev.languages || []).filter((opt) => opt.id !== val.id) })), showSearch: true, required: true, isMulti: true }),
13913
13876
  React.createElement(MonitorDropdown, { value: filters['monitors'], onSelect: (val) => setFilters((prev) => ({ ...prev, monitors: [...(prev.monitors || []), val] })), onDeselect: (val) => setFilters((prev) => ({ ...prev, monitors: (prev.monitors || []).filter((opt) => opt.id !== val.id) })), showSearch: true, required: true, isMulti: true }),
13914
13877
  React.createElement(ToggleWrapper, null,
13915
13878
  React.createElement(Toggle, { title: 'Show only sources with errors', initialValue: filters['onlyErrors'], onChange: (bool) => setFilters((prev) => ({ ...prev, errors: [], onlyErrors: bool })) })),
13916
- React.createElement(ErrorDropdown, { value: filters['errors'], onSelect: (val) => setFilters((prev) => ({ ...prev, errors: [...(prev.errors || []), val] })), onDeselect: (val) => setFilters((prev) => ({ ...prev, errors: (prev.errors || []).filter((opt) => opt.id !== val.id) })), disabled: !filters['onlyErrors'], showSearch: true, required: true, isMulti: true })),
13879
+ React.createElement(ErrorDropdown, { sources: sourcesByStream, value: filters['errors'], onSelect: (val) => setFilters((prev) => ({ ...prev, errors: [...(prev.errors || []), val] })), onDeselect: (val) => setFilters((prev) => ({ ...prev, errors: (prev.errors || []).filter((opt) => opt.id !== val.id) })), disabled: !filters['onlyErrors'], showSearch: true, required: true, isMulti: true })),
13917
13880
  React.createElement(Actions, null,
13918
13881
  React.createElement(ActionButton$1, { variant: 'primary', onClick: onApply }, "Apply"),
13919
13882
  React.createElement(ActionButton$1, { variant: 'secondary', onClick: onCancel }, "Cancel"),
@@ -13921,7 +13884,60 @@ const Filters$1 = () => {
13921
13884
  React.createElement(ActionButton$1, { variant: 'tertiary', onClick: onReset, "$color": theme.text.error }, "Reset"))))));
13922
13885
  };
13923
13886
 
13924
- const Container$a = styled.div `
13887
+ const RelativeContainer$1 = styled.div `
13888
+ position: relative;
13889
+ `;
13890
+ const Container$c = styled(FlexRow) `
13891
+ border: 1px solid ${({ theme }) => theme.colors.border};
13892
+ border-radius: 32px;
13893
+
13894
+ & button {
13895
+ max-height: 28px;
13896
+ }
13897
+ `;
13898
+ const AbsoluteContainer$1 = styled.div `
13899
+ position: absolute;
13900
+ top: calc(100% + 8px);
13901
+ left: 0;
13902
+ z-index: 1;
13903
+ background-color: ${({ theme }) => theme.colors.dropdown_bg};
13904
+ border: ${({ theme }) => `1px solid ${theme.colors.border}`};
13905
+ border-radius: 24px;
13906
+ width: 420px;
13907
+ `;
13908
+ const SelectionMenuHeadWrap = styled.div `
13909
+ border-bottom: ${({ theme }) => `1px solid ${theme.colors.border}`};
13910
+ padding: 12px;
13911
+ `;
13912
+ const SelectionWrap = styled(VerticalScroll) `
13913
+ max-height: 240px;
13914
+ `;
13915
+ const DataStreamSelect = ({ onClickNewStream }) => {
13916
+ const theme = Theme.useTheme();
13917
+ const { dataStreams, selectedStreamName, setSelectedStreamName } = useDataStreamStore();
13918
+ const containerRef = useRef(null);
13919
+ const [popupOpen, setPopupOpen] = useState(false);
13920
+ useOnClickOutside(containerRef, () => setPopupOpen(false));
13921
+ const [searchText, setSearchText] = useState('');
13922
+ const filteredDataStreams = useMemo(() => dataStreams.filter(({ name }) => !searchText || name.toLowerCase().includes(searchText.toLowerCase())), [dataStreams, searchText]);
13923
+ return (React.createElement(RelativeContainer$1, null,
13924
+ React.createElement(Container$c, { "$gap": 0 },
13925
+ React.createElement(Button, { variant: 'tertiary', onClick: () => setPopupOpen((prev) => !prev) },
13926
+ React.createElement(DataStreamsIcon, { fill: theme.text.info }),
13927
+ React.createElement(Text, null, selectedStreamName),
13928
+ React.createElement(ExtendArrow, { extend: popupOpen })),
13929
+ React.createElement(Divider, { orientation: 'vertical', length: '32px', thickness: 2, margin: '0' }),
13930
+ React.createElement(AddButton$1, { onClick: onClickNewStream, label: BUTTON_TEXTS.NEW })),
13931
+ popupOpen && (React.createElement(AbsoluteContainer$1, { ref: containerRef },
13932
+ React.createElement(SelectionMenuHeadWrap, null,
13933
+ React.createElement(Input, { placeholder: 'Search...', icon: SearchIcon, value: searchText, onChange: (e) => setSearchText(e.target.value) })),
13934
+ React.createElement(SelectionWrap, null, filteredDataStreams.map(({ name }) => (React.createElement(SelectionButton, { key: `stream-${name}`, label: name, isSelected: selectedStreamName === name, onClick: () => {
13935
+ setSelectedStreamName(name);
13936
+ setPopupOpen(false);
13937
+ }, color: 'transparent', style: { width: '100%', justifyContent: 'flex-start' } }))))))));
13938
+ };
13939
+
13940
+ const Container$b = styled.div `
13925
13941
  display: flex;
13926
13942
  align-items: center;
13927
13943
  margin: 20px 0;
@@ -13932,28 +13948,32 @@ const Container$a = styled.div `
13932
13948
  const PushToEnd = styled.div `
13933
13949
  margin-left: auto;
13934
13950
  `;
13935
- const AddButton = styled(Button) `
13936
- display: flex;
13937
- align-items: center;
13938
- justify-content: center;
13939
- gap: 6px;
13940
- min-width: 160px;
13941
- padding-right: 24px;
13942
- `;
13943
- const DataFlowActionsMenu = ({ addEntity }) => {
13944
- const theme = Theme.useTheme();
13951
+ const DataFlowActionsMenu = ({ addEntity, onClickNewStream }) => {
13945
13952
  const { setCurrentModal } = useModalStore();
13946
- return (React.createElement(Container$a, null,
13953
+ return (React.createElement(Container$b, null,
13954
+ onClickNewStream && React.createElement(DataStreamSelect, { onClickNewStream: onClickNewStream }),
13947
13955
  React.createElement(Search, null),
13948
13956
  React.createElement(Filters$1, null),
13949
13957
  addEntity && (React.createElement(PushToEnd, null,
13950
- React.createElement(AddButton, { "data-id": `add-${addEntity}`, onClick: () => setCurrentModal(addEntity) },
13951
- React.createElement(PlusIcon$1, { fill: theme.colors.primary }),
13952
- React.createElement(Text, { size: 14, family: 'secondary', color: theme.text.primary, weight: 600 },
13953
- "ADD ",
13954
- addEntity))))));
13958
+ React.createElement(AddButton$1, { "data-id": `add-${addEntity}`, onClick: () => setCurrentModal(addEntity), label: `${BUTTON_TEXTS.ADD} ${addEntity}`, variant: 'primary' })))));
13955
13959
  };
13956
13960
 
13961
+ const DataStreamSelectionForm = forwardRef(({ isModal, onClickSummary }, ref) => {
13962
+ const { dataStreams } = useDataStreamStore();
13963
+ const [nameInput, setNameInput] = useState('');
13964
+ useImperativeHandle(ref, () => ({
13965
+ getFormValues: () => ({
13966
+ name: nameInput,
13967
+ }),
13968
+ }));
13969
+ const dataStreamOptions = useMemo(() => dataStreams.map(({ name }) => ({ label: name })), [dataStreams]);
13970
+ return (React.createElement(ModalBody, { "$isNotModal": !isModal, "$minHeight": '70vh' },
13971
+ React.createElement(FlexColumn, { "$gap": 24 },
13972
+ onClickSummary && React.createElement(NoteBackToSummary, { onClick: onClickSummary }),
13973
+ React.createElement(SectionTitle, { title: DISPLAY_TITLES.STREAM_NAME, description: DISPLAY_TITLES.STREAM_DESCRIPTION }),
13974
+ React.createElement(AutocompleteInput, { placeholder: DISPLAY_TITLES.STREAM_NAME_PLACEHOLDER, autoFocus: true, options: dataStreamOptions, defaultText: nameInput, onTextChange: setNameInput }))));
13975
+ });
13976
+
13957
13977
  const buildMonitorsList = (exportedSignals) => Object.keys(exportedSignals)
13958
13978
  .filter((key) => exportedSignals[key])
13959
13979
  .join(', ');
@@ -13962,7 +13982,7 @@ const buildCard$2 = (destination, yamlFields) => {
13962
13982
  const arr = [
13963
13983
  { title: DISPLAY_TITLES.NAME, value: destinationType.displayName },
13964
13984
  { title: DISPLAY_TITLES.TYPE, value: destinationType.type },
13965
- { type: DataCardFieldTypes.Monitors, title: DISPLAY_TITLES.Monitors, value: buildMonitorsList(exportedSignals) },
13985
+ { type: DataCardFieldTypes.Monitors, title: DISPLAY_TITLES.MONITORS, value: buildMonitorsList(exportedSignals) },
13966
13986
  ];
13967
13987
  const parsedFields = safeJsonParse(fields, {});
13968
13988
  const sortedParsedFields = yamlFields.map((field) => ({ key: field.name, value: parsedFields[field.name] ?? null })).filter((item) => item.value !== null) ||
@@ -14027,7 +14047,7 @@ const ActionButton = styled(Button) `
14027
14047
  align-items: center;
14028
14048
  gap: 8px;
14029
14049
 
14030
- ${({ $status, theme }) => $status === 'success'
14050
+ ${({ $status, theme }) => $status === StatusType.Success
14031
14051
  ? css `
14032
14052
  border-color: transparent;
14033
14053
  background-color: ${theme.colors.success};
@@ -14041,27 +14061,26 @@ const ActionButton = styled(Button) `
14041
14061
  background-color: transparent;
14042
14062
  `}
14043
14063
  `;
14044
- const TestConnection = ({ destination, disabled, status, onError, onSuccess, validateForm, testConnection, testLoading, testResult }) => {
14064
+ const TestConnection = ({ destination, disabled, validateForm, status, testConnection, onSuccess, onError }) => {
14045
14065
  const theme = Theme.useTheme();
14046
- useEffect(() => {
14047
- if (testResult) {
14048
- if (testResult.succeeded)
14049
- onSuccess();
14050
- else
14051
- onError();
14052
- }
14053
- }, [testResult]);
14066
+ const [loading, setLoading] = useState(false);
14054
14067
  const onClick = async () => {
14055
- if (validateForm())
14056
- await testConnection(destination);
14068
+ if (validateForm()) {
14069
+ setLoading(true);
14070
+ const testResult = await testConnection(destination);
14071
+ if (testResult) {
14072
+ testResult.succeeded ? onSuccess(testResult) : onError(testResult);
14073
+ }
14074
+ setLoading(false);
14075
+ }
14057
14076
  };
14058
14077
  const Icon = !!status ? getStatusIcon(status, theme) : undefined;
14059
14078
  return (React.createElement(ActionButton, { "$status": status, variant: 'secondary', disabled: disabled, onClick: onClick },
14060
- testLoading ? React.createElement(FadeLoader, null) : Icon ? React.createElement(Icon, null) : null,
14061
- React.createElement(Text, { family: 'secondary', decoration: 'underline', size: 14, color: !!status ? theme.text[status] : undefined }, testLoading ? 'Checking' : status === 'success' ? 'Connection OK' : status === 'error' ? 'Connection Failed' : 'Test Connection')));
14079
+ loading ? React.createElement(FadeLoader, null) : Icon ? React.createElement(Icon, null) : null,
14080
+ React.createElement(Text, { family: 'secondary', decoration: 'underline', size: 14, color: !!status ? theme.text[status] : undefined }, loading ? 'Checking' : status === StatusType.Success ? 'Connection OK' : status === 'error' ? 'Connection Failed' : 'Test Connection')));
14062
14081
  };
14063
14082
 
14064
- const Container$9 = styled(FlexColumn) `
14083
+ const Container$a = styled(FlexColumn) `
14065
14084
  align-items: unset;
14066
14085
  padding: 0 4px;
14067
14086
  `;
@@ -14070,11 +14089,11 @@ const NotesWrapper = styled.div `
14070
14089
  flex-direction: column;
14071
14090
  gap: 12px;
14072
14091
  `;
14073
- const DestinationForm = ({ isUpdate, categoryItem, formData, formErrors, validateForm, handleFormChange, dynamicFields, setDynamicFields, testConnection, testLoading, testResult, }) => {
14092
+ const DestinationForm = ({ isUpdate, categoryItem, formData, formErrors, validateForm, handleFormChange, dynamicFields, setDynamicFields, testConnection }) => {
14074
14093
  const { supportedSignals, testConnectionSupported, displayName } = categoryItem || {};
14075
14094
  const [autoFilled, setAutoFilled] = useState(false);
14076
14095
  const [isFormDirty, setIsFormDirty] = useState(false);
14077
- const [connectionStatus, setConnectionStatus] = useState(undefined);
14096
+ const [connection, setConnection] = useState(undefined);
14078
14097
  const autoFillCheckRef = useRef(false);
14079
14098
  useEffect(() => {
14080
14099
  if (!!dynamicFields.length && !autoFillCheckRef.current) {
@@ -14097,7 +14116,7 @@ const DestinationForm = ({ isUpdate, categoryItem, formData, formErrors, validat
14097
14116
  }, [dynamicFields, isFormDirty]);
14098
14117
  const dirtyForm = () => {
14099
14118
  setIsFormDirty(true);
14100
- setConnectionStatus(undefined);
14119
+ setConnection(undefined);
14101
14120
  };
14102
14121
  const supportedMonitors = useMemo(() => {
14103
14122
  const { logs, metrics, traces } = supportedSignals || {};
@@ -14129,19 +14148,28 @@ const DestinationForm = ({ isUpdate, categoryItem, formData, formErrors, validat
14129
14148
  traces: signals.includes(SignalType.Traces),
14130
14149
  });
14131
14150
  };
14132
- return (React.createElement(Container$9, { "$gap": 24 },
14133
- React.createElement(Container$9, { "$gap": 12 },
14134
- React.createElement(SectionTitle, { title: isUpdate ? 'Update destination' : 'Create destination', description: `Connect ${displayName} with Odigos.`, actionButton: testConnectionSupported && (React.createElement(TestConnection, { destination: formData, disabled: !isFormDirty, validateForm: validateForm, status: connectionStatus, testConnection: testConnection, testLoading: testLoading, testResult: testResult, onError: () => {
14135
- setIsFormDirty(false);
14136
- setConnectionStatus(StatusType.Error);
14137
- }, onSuccess: () => {
14138
- setIsFormDirty(false);
14139
- setConnectionStatus(StatusType.Success);
14140
- } })) }),
14151
+ const onTestConnectionError = (testResult) => {
14152
+ setIsFormDirty(false);
14153
+ setConnection({
14154
+ type: StatusType.Error,
14155
+ title: testResult?.reason || 'Connection failed',
14156
+ message: testResult?.message || 'Please check your input and try again.',
14157
+ });
14158
+ };
14159
+ const onTestConnectionSuccess = (testResult) => {
14160
+ setIsFormDirty(false);
14161
+ setConnection({
14162
+ type: StatusType.Success,
14163
+ title: testResult?.reason || 'Connection succeeded',
14164
+ message: testResult?.message || '',
14165
+ });
14166
+ };
14167
+ return (React.createElement(Container$a, { "$gap": 24 },
14168
+ React.createElement(Container$a, { "$gap": 12 },
14169
+ React.createElement(SectionTitle, { title: isUpdate ? 'Update destination' : 'Create destination', description: `Connect ${displayName} with Odigos.`, actionButton: testConnectionSupported && (React.createElement(TestConnection, { destination: formData, disabled: !isFormDirty, validateForm: validateForm, status: connection?.type, testConnection: testConnection, onError: onTestConnectionError, onSuccess: onTestConnectionSuccess })) }),
14141
14170
  React.createElement(NotesWrapper, null,
14142
- testConnectionSupported && connectionStatus === StatusType.Error && React.createElement(NotificationNote, { type: StatusType.Error, message: 'Connection failed. Please check your input and try again.' }),
14143
- testConnectionSupported && connectionStatus === StatusType.Success && React.createElement(NotificationNote, { type: StatusType.Success, message: 'Connection succeeded.' }),
14144
- autoFilled && !connectionStatus && !isUpdate && React.createElement(NotificationNote, { type: StatusType.Default, message: `Odigos autocompleted ${displayName} destination details.` })),
14171
+ testConnectionSupported && connection && React.createElement(NotificationNote, { type: connection.type, title: connection.title, message: connection.message }),
14172
+ autoFilled && !connection && !isUpdate && React.createElement(NotificationNote, { type: StatusType.Default, message: `Odigos autocompleted ${displayName} destination details.` })),
14145
14173
  React.createElement(Divider, null)),
14146
14174
  React.createElement(MonitorsCheckboxes, { title: isUpdate ? '' : 'This connection will monitor:', required: true, allowedSignals: supportedMonitors, selectedSignals: selectedMonitors, setSelectedSignals: handleSelectedSignals, errorMessage: formErrors['exportedSignals'] }),
14147
14175
  !isUpdate && (React.createElement(Input, { title: 'Destination name', placeholder: 'Enter destination name', value: formData['name'], onChange: (e) => {
@@ -14173,9 +14201,11 @@ const DataContainer$2 = styled.div `
14173
14201
  flex-direction: column;
14174
14202
  gap: 12px;
14175
14203
  `;
14176
- const DestinationDrawer = ({ categories, updateDestination, deleteDestination, testConnection, testLoading, testResult }) => {
14204
+ const DestinationDrawer = ({ categories, updateDestination, deleteDestination, testConnection }) => {
14177
14205
  const { destinations } = useEntityStore();
14206
+ const { selectedStreamName } = useDataStreamStore();
14178
14207
  const { drawerType, drawerEntityId } = useDrawerStore();
14208
+ const destinationsByStream = useMemo(() => filterDestinationsByStream(destinations, selectedStreamName), [destinations, selectedStreamName]);
14179
14209
  const drawerRef = useRef(null);
14180
14210
  const isOpen = drawerType !== EntityTypes.Destination;
14181
14211
  const [isEditing, setIsEditing] = useState(false);
@@ -14189,7 +14219,7 @@ const DestinationDrawer = ({ categories, updateDestination, deleteDestination, t
14189
14219
  const thisItem = useMemo(() => {
14190
14220
  if (isOpen)
14191
14221
  return null;
14192
- const found = destinations?.find((x) => x.id === drawerEntityId);
14222
+ const found = destinationsByStream?.find((x) => x.id === drawerEntityId);
14193
14223
  if (!!found) {
14194
14224
  loadFormWithDrawerItem(found);
14195
14225
  const fields = [];
@@ -14207,7 +14237,7 @@ const DestinationDrawer = ({ categories, updateDestination, deleteDestination, t
14207
14237
  setYamlFields(fields);
14208
14238
  }
14209
14239
  return found;
14210
- }, [isOpen, drawerEntityId, destinations]);
14240
+ }, [isOpen, drawerEntityId, destinationsByStream]);
14211
14241
  if (!thisItem)
14212
14242
  return null;
14213
14243
  const thisOptionType = categories.flatMap((category) => category.items).find((option) => option.type === thisItem.destinationType.type);
@@ -14237,32 +14267,34 @@ const DestinationDrawer = ({ categories, updateDestination, deleteDestination, t
14237
14267
  setIsFormDirty(false);
14238
14268
  }
14239
14269
  };
14240
- return (React.createElement(OverviewDrawer, { ref: drawerRef, title: thisItem.name || thisItem.destinationType.displayName, icons: icon ? [icon] : undefined, iconSrcs: iconSrc ? [iconSrc] : undefined, isEdit: isEditing, isFormDirty: isFormDirty, onEdit: handleEdit, onSave: handleSave, onDelete: handleDelete, onCancel: handleCancel, isLastItem: destinations.length === 1 }, isEditing ? (React.createElement(FormContainer$2, null,
14270
+ return (React.createElement(OverviewDrawer, { ref: drawerRef, title: thisItem.name || thisItem.destinationType.displayName, icons: icon ? [icon] : undefined, iconSrcs: iconSrc ? [iconSrc] : undefined, isEdit: isEditing, isFormDirty: isFormDirty, onEdit: handleEdit, onSave: handleSave, onDelete: handleDelete, onCancel: handleCancel, isLastItem: destinationsByStream.length === 1 }, isEditing ? (React.createElement(FormContainer$2, null,
14241
14271
  React.createElement(DestinationForm, { isUpdate: true, categoryItem: thisOptionType, formData: formData, formErrors: formErrors, handleFormChange: (...params) => {
14242
14272
  setIsFormDirty(true);
14243
14273
  handleFormChange(...params);
14244
14274
  }, dynamicFields: dynamicFields, setDynamicFields: (...params) => {
14245
14275
  setIsFormDirty(true);
14246
14276
  setDynamicFields(...params);
14247
- }, validateForm: validateForm, testConnection: testConnection, testLoading: testLoading, testResult: testResult }))) : (React.createElement(DataContainer$2, null,
14277
+ }, validateForm: validateForm, testConnection: testConnection }))) : (React.createElement(DataContainer$2, null,
14248
14278
  React.createElement(ConditionDetails, { conditions: thisItem.conditions || [] }),
14249
14279
  React.createElement(DataCard, { title: DISPLAY_TITLES.DESTINATION_DETAILS, data: !!thisItem ? buildCard$2(thisItem, yamlFields) : [] })))));
14250
14280
  };
14251
14281
 
14252
- const ListsWrapper$1 = styled.div `
14282
+ const ListsWrapper = styled.div `
14253
14283
  display: flex;
14254
14284
  flex-direction: column;
14255
14285
  gap: 12px;
14256
14286
  `;
14257
- const DestinationsList = ({ items, setSelectedItem }) => {
14287
+ const DestinationsList = ({ items, onSelectOption, onSelectConfigured }) => {
14258
14288
  return items.map((category) => {
14259
- return (React.createElement(ListsWrapper$1, { key: `category-${category.name}` },
14260
- React.createElement(SectionTitle, { size: 'small', title: capitalizeFirstLetter(category.name), description: category.description }),
14261
- category.items.map((item, idx) => {
14289
+ const isAlreadyExisting = category.name === DESTINATION_CATEGORIES['EXISTS']['TITLE'];
14290
+ return (React.createElement(ListsWrapper, { key: `category-${category.name}` },
14291
+ React.createElement(SectionTitle, { size: 'small', icon: category.icon, title: capitalizeFirstLetter(category.name), description: category.description }),
14292
+ category.items.map((item) => {
14262
14293
  const { icon, iconSrc } = getDestinationIcon(item.type);
14263
- return (React.createElement(DataTab, { key: `select-destination-${item.type}-${idx}`, "data-id": `select-destination-${item.type}`, title: item.displayName, hoverText: 'Select', onClick: () => setSelectedItem(item), iconProps: {
14264
- icon,
14265
- iconSrc,
14294
+ return (React.createElement(DataTab, { key: `select-${category.name}-destination-${item.type}`, "data-id": `select-${category.name}-destination-${item.type}`, title: item.displayName, hoverText: 'SELECT', onClick: () => (isAlreadyExisting ? onSelectConfigured(item.id) : onSelectOption(item)), iconProps: { icon, iconSrc }, checkboxProps: {
14295
+ withCheckbox: isAlreadyExisting,
14296
+ isChecked: item.selected,
14297
+ onCheckboxChange: () => onSelectConfigured(item.id),
14266
14298
  }, visualProps: {
14267
14299
  monitors: Object.keys(item.supportedSignals).filter((signal) => item.supportedSignals[signal].supported),
14268
14300
  monitorsWithLabels: true,
@@ -14271,29 +14303,7 @@ const DestinationsList = ({ items, setSelectedItem }) => {
14271
14303
  });
14272
14304
  };
14273
14305
 
14274
- const ListsWrapper = styled.div `
14275
- display: flex;
14276
- flex-direction: column;
14277
- gap: 12px;
14278
- `;
14279
- const PotentialDestinationsList = ({ items, setSelectedItem }) => {
14280
- if (!items.length)
14281
- return null;
14282
- return (React.createElement(ListsWrapper, null,
14283
- React.createElement(SectionTitle, { size: 'small', icon: OdigosLogo, title: 'Detected by Odigos', description: 'Odigos detects destinations for which automatic connection is available. All data will be filled out automatically.' }),
14284
- items.map((item, idx) => {
14285
- const { icon, iconSrc } = getDestinationIcon(item.type);
14286
- return (React.createElement(DataTab, { key: `select-potential-destination-${item.type}-${idx}`, "data-id": `select-potential-destination-${item.type}`, title: item.displayName, hoverText: 'Select', onClick: () => setSelectedItem(item), iconProps: {
14287
- icon,
14288
- iconSrc,
14289
- }, visualProps: {
14290
- monitors: Object.keys(item.supportedSignals).filter((signal) => item.supportedSignals[signal].supported),
14291
- monitorsWithLabels: true,
14292
- } }));
14293
- })));
14294
- };
14295
-
14296
- const Container$8 = styled.div `
14306
+ const Container$9 = styled.div `
14297
14307
  display: flex;
14298
14308
  flex-direction: column;
14299
14309
  gap: 24px;
@@ -14304,7 +14314,7 @@ const Filters = styled.div `
14304
14314
  gap: 12px;
14305
14315
  `;
14306
14316
  const WidthConstraint = styled.div `
14307
- width: 160px;
14317
+ width: 170px;
14308
14318
  margin-right: 8px;
14309
14319
  `;
14310
14320
  const ListsContainer = styled.div `
@@ -14319,22 +14329,60 @@ const ListsContainer = styled.div `
14319
14329
  max-height: calc(100vh - 400px);
14320
14330
  }
14321
14331
  `;
14322
- const NoDataFoundWrapper$1 = styled(Container$8) `
14332
+ const NoDataFoundWrapper = styled(Container$9) `
14323
14333
  margin-top: 80px;
14324
14334
  `;
14335
+ const { MANAGED, SELF_HOSTED, DETECTED, EXISTS } = DESTINATION_CATEGORIES;
14325
14336
  const DROPDOWN_OPTIONS = [
14326
14337
  { value: 'All types', id: 'all' },
14327
- { value: 'Managed', id: 'managed' },
14328
- { value: 'Self-hosted', id: 'self hosted' },
14338
+ { value: MANAGED.TITLE, id: MANAGED.TITLE },
14339
+ { value: SELF_HOSTED.TITLE, id: SELF_HOSTED.TITLE },
14340
+ { value: DETECTED.TITLE, id: DETECTED.TITLE },
14341
+ { value: EXISTS.TITLE, id: EXISTS.TITLE },
14329
14342
  ];
14330
14343
  const DEFAULT_CATEGORY = DROPDOWN_OPTIONS[0];
14331
14344
  const DEFAULT_MONITORS = [SignalType.Logs, SignalType.Metrics, SignalType.Traces];
14332
- const ChooseDestinationBody = ({ hidden, categories, potentialDestinations, onSelect }) => {
14345
+ const createConfiguredItems = (destinations, selectedStreamName, configuredDestinationIds) => destinations.map((dest) => {
14346
+ const { type, displayName } = dest.destinationType;
14347
+ const isInSelectedStream = dest.streamNames?.includes(selectedStreamName);
14348
+ const isConfigured = configuredDestinationIds.has(dest.id);
14349
+ return {
14350
+ id: dest.id,
14351
+ type,
14352
+ displayName,
14353
+ selected: isInSelectedStream || isConfigured,
14354
+ fields: [],
14355
+ testConnectionSupported: false,
14356
+ supportedSignals: {
14357
+ [SignalType.Logs]: { supported: dest.exportedSignals.logs },
14358
+ [SignalType.Metrics]: { supported: dest.exportedSignals.metrics },
14359
+ [SignalType.Traces]: { supported: dest.exportedSignals.traces },
14360
+ },
14361
+ };
14362
+ });
14363
+ const ChooseDestinationBody = ({ hidden, categories, potentialDestinations, onSelectOption, onSelectConfigured }) => {
14364
+ const { destinations } = useEntityStore();
14365
+ const { configuredDestinations } = useSetupStore();
14366
+ const { selectedStreamName } = useDataStreamStore();
14333
14367
  const [search, setSearch] = useState('');
14334
14368
  const [selectedCategory, setSelectedCategory] = useState(DEFAULT_CATEGORY);
14335
14369
  const [selectedMonitors, setSelectedMonitors] = useState(DEFAULT_MONITORS);
14336
14370
  const filteredDestinations = useMemo(() => {
14337
- return categories
14371
+ const clonedDestinationsCategories = deepClone(categories);
14372
+ clonedDestinationsCategories.unshift({
14373
+ name: EXISTS.TITLE,
14374
+ description: EXISTS.DESCRIPTION,
14375
+ icon: CheckIcon,
14376
+ // !! do not "filterDestinationsByStream" here, because we need all destinations to select already configured
14377
+ items: createConfiguredItems(destinations, selectedStreamName, new Set(configuredDestinations.map((d) => d.id))),
14378
+ });
14379
+ clonedDestinationsCategories.unshift({
14380
+ name: DETECTED.TITLE,
14381
+ description: DETECTED.DESCRIPTION,
14382
+ icon: OdigosLogo,
14383
+ items: potentialDestinations,
14384
+ });
14385
+ return clonedDestinationsCategories
14338
14386
  .map((category) => {
14339
14387
  const filteredItems = category.items.filter((item) => {
14340
14388
  const matchesSearch = !search || item.displayName.toLowerCase().includes(search.toLowerCase());
@@ -14345,25 +14393,24 @@ const ChooseDestinationBody = ({ hidden, categories, potentialDestinations, onSe
14345
14393
  return { ...category, items: filteredItems };
14346
14394
  })
14347
14395
  .filter(({ items }) => !!items.length); // Filter out empty categories
14348
- }, [categories, search, selectedCategory, selectedMonitors]);
14396
+ }, [categories, potentialDestinations, destinations, search, selectedCategory, selectedMonitors, selectedStreamName, configuredDestinations]);
14349
14397
  if (hidden)
14350
14398
  return null;
14351
- return (React.createElement(Container$8, null,
14399
+ return (React.createElement(Container$9, null,
14352
14400
  React.createElement(SectionTitle, { title: 'Choose destination', description: 'Add backend destination you want to connect with Odigos.' }),
14353
14401
  React.createElement(Filters, null,
14354
14402
  React.createElement(WidthConstraint, null,
14355
14403
  React.createElement(Input, { placeholder: 'Search...', icon: SearchIcon, value: search, onChange: ({ target: { value } }) => setSearch(value) })),
14356
14404
  React.createElement(WidthConstraint, null,
14357
- React.createElement(Dropdown, { options: DROPDOWN_OPTIONS, value: selectedCategory, onSelect: (opt) => setSelectedCategory(opt), onDeselect: () => { } })),
14405
+ React.createElement(Dropdown, { options: DROPDOWN_OPTIONS, value: selectedCategory, onSelect: setSelectedCategory, onDeselect: () => { } })),
14358
14406
  React.createElement(MonitorsCheckboxes, { title: '', selectedSignals: selectedMonitors, setSelectedSignals: setSelectedMonitors })),
14359
14407
  React.createElement(Divider, null),
14360
- !filteredDestinations.length && !potentialDestinations.length ? (React.createElement(NoDataFoundWrapper$1, null,
14408
+ !filteredDestinations.length ? (React.createElement(NoDataFoundWrapper, null,
14361
14409
  React.createElement(NoDataFound, { title: 'No destinations found' }))) : (React.createElement(ListsContainer, null,
14362
- React.createElement(PotentialDestinationsList, { items: potentialDestinations, setSelectedItem: onSelect }),
14363
- React.createElement(DestinationsList, { items: filteredDestinations, setSelectedItem: onSelect })))));
14410
+ React.createElement(DestinationsList, { items: filteredDestinations, onSelectOption: onSelectOption, onSelectConfigured: onSelectConfigured })))));
14364
14411
  };
14365
14412
 
14366
- const Container$7 = styled.div `
14413
+ const Container$8 = styled.div `
14367
14414
  display: flex;
14368
14415
  `;
14369
14416
  const SideMenuWrapper = styled.div `
@@ -14374,7 +14421,9 @@ const SideMenuWrapper = styled.div `
14374
14421
  display: none;
14375
14422
  }
14376
14423
  `;
14377
- const DestinationModal = ({ isOnboarding, categories, potentialDestinations, createDestination, testConnection, testLoading, testResult }) => {
14424
+ const DestinationModal = ({ isOnboarding, categories, potentialDestinations, createDestination, updateDestination, testConnection }) => {
14425
+ const { destinations } = useEntityStore();
14426
+ const { selectedStreamName } = useDataStreamStore();
14378
14427
  const { addConfiguredDestination } = useSetupStore();
14379
14428
  const { currentModal, setCurrentModal } = useModalStore();
14380
14429
  const isOpen = currentModal === EntityTypes.Destination;
@@ -14383,6 +14432,55 @@ const DestinationModal = ({ isOnboarding, categories, potentialDestinations, cre
14383
14432
  supportedSignals: selectedItem?.supportedSignals,
14384
14433
  preLoadedFields: selectedItem?.fields,
14385
14434
  });
14435
+ const handleAddExisting = (alreadyConfigDest) => {
14436
+ const parsedFields = safeJsonParse(alreadyConfigDest.fields, {});
14437
+ const fieldsArray = Object.entries(parsedFields).map(([key, value]) => ({
14438
+ key,
14439
+ value: String(value),
14440
+ }));
14441
+ const payload = {
14442
+ type: alreadyConfigDest.destinationType.type,
14443
+ name: alreadyConfigDest.destinationType.displayName,
14444
+ currentStreamName: selectedStreamName,
14445
+ exportedSignals: alreadyConfigDest.exportedSignals,
14446
+ fields: fieldsArray,
14447
+ };
14448
+ updateDestination(alreadyConfigDest.id, payload);
14449
+ };
14450
+ const handleAddOnboarding = () => {
14451
+ const fields = {};
14452
+ dynamicFields.forEach((f) => {
14453
+ fields[f.name] = (f.componentType === FieldTypes.Dropdown ? f.value?.value || '' : f.value);
14454
+ });
14455
+ addConfiguredDestination({
14456
+ id: formData.type,
14457
+ name: formData.name,
14458
+ streamNames: [],
14459
+ conditions: [],
14460
+ exportedSignals: formData.exportedSignals,
14461
+ fields: JSON.stringify(fields),
14462
+ destinationType: {
14463
+ type: selectedItem.type,
14464
+ displayName: selectedItem.displayName,
14465
+ supportedSignals: {
14466
+ logs: { supported: false },
14467
+ metrics: { supported: false },
14468
+ traces: { supported: false },
14469
+ },
14470
+ },
14471
+ });
14472
+ };
14473
+ const handleAdd = (alreadyConfigDest) => {
14474
+ // Handle case from already configured
14475
+ if (alreadyConfigDest)
14476
+ return handleAddExisting(alreadyConfigDest);
14477
+ // Handle new cases from onboarding
14478
+ if (isOnboarding)
14479
+ return handleAddOnboarding();
14480
+ // Handle new cases from overview
14481
+ else
14482
+ return createDestination(formData);
14483
+ };
14386
14484
  const handleClose = () => {
14387
14485
  resetFormData();
14388
14486
  setSelectedItem(undefined);
@@ -14392,36 +14490,25 @@ const DestinationModal = ({ isOnboarding, categories, potentialDestinations, cre
14392
14490
  resetFormData();
14393
14491
  setSelectedItem(undefined);
14394
14492
  };
14395
- const handleSelect = (item) => {
14493
+ const handleSelectOption = (item) => {
14396
14494
  resetFormData();
14397
14495
  handleFormChange('type', item?.type || '');
14496
+ handleFormChange('currentStreamName', selectedStreamName);
14398
14497
  setYamlFields(item?.fields || []);
14399
14498
  setSelectedItem(item);
14400
14499
  };
14500
+ const handleSelectConfigured = (id) => {
14501
+ // !! do not "filterDestinationsByStream" here, because we need all destinations to select already configured
14502
+ const foundConfigured = destinations.find((dest) => dest.id === id);
14503
+ if (foundConfigured)
14504
+ handleAdd(foundConfigured);
14505
+ };
14401
14506
  const handleSubmit = async () => {
14402
- const isFormOk = validateForm({ withAlert: !isOnboarding, alertTitle: Crud.Create });
14403
- if (!isFormOk)
14404
- return null;
14405
- if (isOnboarding) {
14406
- const destinationTypeDetails = dynamicFields.map((field) => ({
14407
- title: field.title || '',
14408
- value: (field.componentType === FieldTypes.Dropdown ? field.value?.value || '' : field.value),
14409
- }));
14410
- destinationTypeDetails.unshift({
14411
- title: 'Destination name',
14412
- value: formData.name,
14413
- });
14414
- const storedDestination = {
14415
- type: selectedItem.type,
14416
- displayName: selectedItem.displayName,
14417
- exportedSignals: formData.exportedSignals,
14418
- destinationTypeDetails,
14419
- category: '', // Could be handled in a more dynamic way if needed
14420
- };
14421
- addConfiguredDestination({ stored: storedDestination, form: formData });
14422
- }
14423
- else {
14424
- createDestination(formData);
14507
+ if (selectedItem) {
14508
+ const isFormValid = validateForm({ withAlert: !isOnboarding, alertTitle: Crud.Create });
14509
+ if (!isFormValid)
14510
+ return null;
14511
+ handleAdd();
14425
14512
  }
14426
14513
  handleClose();
14427
14514
  };
@@ -14431,10 +14518,9 @@ const DestinationModal = ({ isOnboarding, categories, potentialDestinations, cre
14431
14518
  label: 'DONE',
14432
14519
  variant: 'primary',
14433
14520
  onClick: handleSubmit,
14434
- disabled: !selectedItem,
14435
14521
  },
14436
14522
  ];
14437
- if (!!selectedItem) {
14523
+ if (selectedItem) {
14438
14524
  buttons.unshift({
14439
14525
  label: 'BACK',
14440
14526
  icon: ArrowIcon,
@@ -14445,105 +14531,104 @@ const DestinationModal = ({ isOnboarding, categories, potentialDestinations, cre
14445
14531
  return buttons;
14446
14532
  };
14447
14533
  useKeyDown({ key: 'Enter', active: isOpen }, () => handleSubmit());
14448
- return (React.createElement(Modal, { isOpen: isOpen, onClose: handleClose, header: { title: 'Add Destination' }, actionComponent: React.createElement(NavigationButtons, { buttons: renderHeaderButtons() }) },
14449
- React.createElement(Container$7, null,
14534
+ return (React.createElement(Modal, { isOpen: isOpen, onClose: handleClose, header: { title: DISPLAY_TITLES.ADD_DESTINATION }, actionComponent: React.createElement(NavigationButtons, { buttons: renderHeaderButtons() }) },
14535
+ React.createElement(Container$8, null,
14450
14536
  React.createElement(SideMenuWrapper, null,
14451
- React.createElement(Stepper, { currentStep: !!selectedItem ? 2 : 1, data: [
14452
- { stepNumber: 1, title: 'Destinations' },
14453
- { stepNumber: 2, title: 'CONNECTION' },
14537
+ React.createElement(Stepper, { currentStep: selectedItem ? 2 : 1, data: [
14538
+ { stepNumber: 1, title: DISPLAY_TITLES.DESTINATIONS },
14539
+ { stepNumber: 2, title: DISPLAY_TITLES.CONNECTION },
14454
14540
  ] })),
14455
14541
  React.createElement(ModalBody, { style: { margin: '32px 24px 12px 24px' } },
14456
- React.createElement(ChooseDestinationBody, { hidden: !!selectedItem, categories: categories, potentialDestinations: potentialDestinations, onSelect: handleSelect }),
14457
- !!selectedItem && (React.createElement(DestinationForm, { categoryItem: selectedItem, formData: formData, formErrors: formErrors, handleFormChange: handleFormChange, dynamicFields: dynamicFields, setDynamicFields: setDynamicFields, validateForm: validateForm, testConnection: testConnection, testLoading: testLoading, testResult: testResult }))))));
14542
+ React.createElement(ChooseDestinationBody, { hidden: selectedItem !== undefined, categories: categories, potentialDestinations: potentialDestinations, onSelectOption: handleSelectOption, onSelectConfigured: handleSelectConfigured }),
14543
+ selectedItem && (React.createElement(DestinationForm, { categoryItem: selectedItem, formData: formData, formErrors: formErrors, handleFormChange: handleFormChange, dynamicFields: dynamicFields, setDynamicFields: setDynamicFields, validateForm: validateForm, testConnection: testConnection }))))));
14458
14544
  };
14459
14545
 
14460
- const Container$6 = styled.div `
14546
+ const Container$7 = styled.div `
14461
14547
  display: flex;
14462
14548
  flex-direction: column;
14463
- align-items: flex-start;
14549
+ align-items: center;
14464
14550
  gap: 12px;
14465
- margin-top: 24px;
14466
- max-height: calc(100vh - 400px);
14467
- height: 100%;
14468
- overflow-x: hidden;
14551
+ width: 100%;
14552
+ max-height: calc(100vh - 310px);
14553
+ height: fit-content;
14469
14554
  overflow-y: scroll;
14470
14555
  `;
14471
- const ConfiguredList = () => {
14556
+ const DestinationList = ({ withDelete }) => {
14472
14557
  const { configuredDestinations } = useSetupStore();
14473
- return (React.createElement(Container$6, null, configuredDestinations.map(({ stored }, idx) => (React.createElement(ListItem, { key: `selected-destination-${stored.type}-${idx}`, "data-id": `selected-destination-${stored.type}`, item: stored, isLastItem: configuredDestinations.length === 1 })))));
14558
+ if (!configuredDestinations.length) {
14559
+ return (React.createElement(CenterThis, null,
14560
+ React.createElement(NoDataFound, { title: 'No destinations', subTitle: 'Please add a destination' })));
14561
+ }
14562
+ return (React.createElement(Container$7, null, configuredDestinations.map((dest, idx) => (React.createElement(ListItem, { key: `configured-destination-${dest.destinationType.type}-${idx}`, "data-id": `configured-destination-${dest.destinationType.type}`, item: dest, isLastItem: configuredDestinations.length === 1, withDelete: withDelete })))));
14474
14563
  };
14475
- const ListItem = ({ item, isLastItem }) => {
14564
+ const ListItem = ({ item, isLastItem, withDelete }) => {
14476
14565
  const { removeConfiguredDestination } = useSetupStore();
14477
14566
  const [deleteWarning, setDeleteWarning] = useState(false);
14478
- const { icon, iconSrc } = getDestinationIcon(item.type);
14567
+ const { icon, iconSrc } = getDestinationIcon(item.destinationType.type);
14568
+ const mappedFields = useMemo(() => Object.entries(safeJsonParse(item.fields, {})).map(([k, v]) => ({ title: k, value: v })) || [], [item.fields]);
14479
14569
  return (React.createElement(React.Fragment, null,
14480
- React.createElement(DataTab, { title: item.displayName, iconProps: {
14481
- icon,
14482
- iconSrc,
14483
- }, visualProps: {
14484
- monitors: Object.keys(item.exportedSignals).filter((signal) => item.exportedSignals[signal] === true),
14570
+ React.createElement(DataTab, { title: item.destinationType.displayName || item.name, subTitle: item.destinationType.type, iconProps: { icon, iconSrc }, visualProps: {
14571
+ monitors: mapExportedSignals(item.exportedSignals),
14485
14572
  monitorsWithLabels: true,
14486
14573
  }, extendableProps: {
14487
14574
  withExtend: true,
14488
- renderExtended: () => React.createElement(DataCardFields, { data: item.destinationTypeDetails }),
14489
- }, renderActions: () => (React.createElement(IconButton, { onClick: () => setDeleteWarning(true) },
14490
- React.createElement(TrashIcon, null))) }),
14491
- React.createElement(DeleteWarning, { isOpen: deleteWarning, name: item.displayName || item.type, type: EntityTypes.Destination, isLastItem: isLastItem, onApprove: () => removeConfiguredDestination(item), onDeny: () => setDeleteWarning(false) })));
14575
+ renderExtended: () => React.createElement(DataCardFields, { data: mappedFields }),
14576
+ }, renderActions: withDelete
14577
+ ? () => (React.createElement(IconButton, { onClick: () => setDeleteWarning(true) },
14578
+ React.createElement(TrashIcon, null)))
14579
+ : undefined }),
14580
+ withDelete && (React.createElement(DeleteWarning, { isOpen: deleteWarning, name: item.destinationType.displayName || item.name, type: EntityTypes.Destination, isLastItem: isLastItem, onApprove: () => removeConfiguredDestination(item), onDeny: () => setDeleteWarning(false) }))));
14492
14581
  };
14493
14582
 
14494
- const ContentWrapper = styled.div `
14495
- width: 640px;
14496
- padding-top: 64px;
14497
- `;
14498
- const NotificationNoteWrapper = styled.div `
14499
- margin-top: 24px;
14500
- `;
14501
- const AddDestinationButtonWrapper = styled.div `
14502
- width: 100%;
14503
- margin-top: 24px;
14504
- `;
14505
- const StyledAddDestinationButton = styled(Button) `
14583
+ const LargeAndWideAddButton = styled(Button) `
14506
14584
  display: flex;
14507
14585
  align-items: center;
14508
14586
  justify-content: center;
14509
14587
  gap: 8px;
14510
14588
  width: 100%;
14589
+ padding: 32px;
14590
+ border-radius: 16px;
14591
+ border-style: dashed !important;
14511
14592
  `;
14512
- const DestinationSelectionForm = ({ categories, potentialDestinations, createDestination, isLoading, testConnection, testLoading, testResult, isSourcesListEmpty, goToSources, }) => {
14593
+ const DestinationSelectionForm = ({ isSourcesListEmpty, goToSources, categories, potentialDestinations, updateDestination, testConnection, onClickSummary }) => {
14513
14594
  const theme = Theme.useTheme();
14514
14595
  const { setCurrentModal } = useModalStore();
14596
+ const { configuredDestinations } = useSetupStore();
14515
14597
  const onOpen = () => setCurrentModal(EntityTypes.Destination);
14516
- return (React.createElement(ContentWrapper, null,
14517
- React.createElement(SectionTitle, { title: 'Configure destinations', description: 'Select destinations where telemetry data will be sent and configure their settings.' }),
14518
- !isLoading && isSourcesListEmpty && (React.createElement(NotificationNoteWrapper, null,
14519
- React.createElement(NotificationNote, { type: StatusType.Warning, message: 'No sources selected. Please go back to select sources.', action: {
14520
- label: 'Select Sources',
14521
- onClick: goToSources,
14522
- } }))),
14523
- React.createElement(AddDestinationButtonWrapper, null,
14524
- React.createElement(StyledAddDestinationButton, { variant: 'secondary', disabled: isLoading, onClick: onOpen },
14525
- React.createElement(PlusIcon$1, null),
14526
- React.createElement(Text, { color: theme.colors.secondary, size: 14, decoration: 'underline', family: 'secondary' }, "ADD Destination")),
14527
- React.createElement(DestinationModal, { isOnboarding: true, categories: categories, potentialDestinations: potentialDestinations, createDestination: createDestination, testConnection: testConnection, testLoading: testLoading, testResult: testResult })),
14528
- isLoading ? (React.createElement(CenterThis, null,
14529
- React.createElement(FadeLoader, { scale: 2, cssOverride: { marginTop: '3rem' } }))) : (React.createElement(ConfiguredList, null))));
14598
+ return (React.createElement(React.Fragment, null,
14599
+ React.createElement(ModalBody, { "$isNotModal": true },
14600
+ React.createElement(FlexColumn, { "$gap": 12 },
14601
+ React.createElement(FlexColumn, { "$gap": 24 },
14602
+ onClickSummary && React.createElement(NoteBackToSummary, { onClick: onClickSummary }),
14603
+ React.createElement(SectionTitle, { title: DISPLAY_TITLES.ADD_DESTINATIONS, badgeLabel: configuredDestinations.length, description: DISPLAY_TITLES.ADD_DESTINATION_DESCRIPTION }),
14604
+ isSourcesListEmpty && (React.createElement(NotificationNote, { type: StatusType.Warning, message: DISPLAY_TITLES.NO_SOURCES_GO_BACK, action: {
14605
+ label: DISPLAY_TITLES.SELECT_SOURCES,
14606
+ onClick: goToSources,
14607
+ } })),
14608
+ React.createElement(LargeAndWideAddButton, { variant: 'secondary', onClick: onOpen },
14609
+ React.createElement(PlusIcon$1, null),
14610
+ React.createElement(Text, { color: theme.colors.secondary, size: 14, decoration: 'underline', family: 'secondary' }, DISPLAY_TITLES.ADD_DESTINATION))),
14611
+ React.createElement(DestinationList, { withDelete: true }))),
14612
+ React.createElement(DestinationModal, { isOnboarding: true, categories: categories, potentialDestinations: potentialDestinations, createDestination: () => { }, updateDestination: updateDestination, testConnection: testConnection })));
14530
14613
  };
14531
14614
 
14532
14615
  const columns$2 = [
14533
14616
  { key: 'icon', title: '' },
14534
14617
  { key: 'name', title: DISPLAY_TITLES.NAME, sortable: true },
14535
14618
  { key: 'type', title: DISPLAY_TITLES.TYPE, sortable: true },
14536
- { key: 'signals', title: DISPLAY_TITLES.Monitors },
14619
+ { key: 'signals', title: DISPLAY_TITLES.MONITORS },
14537
14620
  { key: 'conditions', title: 'Conditions' },
14538
14621
  { key: 'throughput', title: 'Throughput', sortable: true },
14539
14622
  ];
14540
14623
  const DestinationTable = ({ metrics, maxHeight, maxWidth }) => {
14541
14624
  const theme = Theme.useTheme();
14542
14625
  const filters = useFilterStore();
14543
- const { destinations, destinationsLoading } = useEntityStore();
14626
+ const { selectedStreamName } = useDataStreamStore();
14544
14627
  const { setDrawerType, setDrawerEntityId } = useDrawerStore();
14545
- const filtered = useMemo(() => filterDestinations(destinations, filters), [destinations, filters]);
14546
- const rows = useMemo(() => filtered.map((dest) => {
14628
+ const { destinations, destinationsLoading } = useEntityStore();
14629
+ const destinationsByStream = useMemo(() => filterDestinationsByStream(destinations, selectedStreamName), [destinations, selectedStreamName]);
14630
+ const filteredDestinations = useMemo(() => filterDestinations(destinationsByStream, filters), [destinationsByStream, filters]);
14631
+ const rows = useMemo(() => filteredDestinations.map((dest) => {
14547
14632
  const { hasErrors, hasWarnings, hasDisableds } = getConditionsBooleans(dest.conditions || []);
14548
14633
  const { icon, iconSrc } = getDestinationIcon(dest.destinationType.type);
14549
14634
  return {
@@ -14578,19 +14663,29 @@ const DestinationTable = ({ metrics, maxHeight, maxWidth }) => {
14578
14663
  },
14579
14664
  {
14580
14665
  columnKey: 'signals',
14581
- component: () => React.createElement(MonitorsIcons, { withLabels: true, monitors: Object.keys(dest.exportedSignals).filter((signal) => dest.exportedSignals[signal] === true) }),
14666
+ component: () => React.createElement(MonitorsIcons, { withLabels: true, monitors: mapExportedSignals(dest.exportedSignals) }),
14582
14667
  },
14583
14668
  ],
14584
14669
  };
14585
- }), [filtered, metrics]);
14586
- const badge = useMemo(() => (filtered.length !== destinations.length ? `${filtered.length}/${destinations.length}` : destinations.length), [filtered, destinations]);
14587
- const badgeTooltip = useMemo(() => (filtered.length !== destinations.length ? DISPLAY_TITLES.FILTERED_COUNT_TOOLTIP : undefined), [filtered, destinations]);
14670
+ }), [filteredDestinations, metrics]);
14671
+ const { badge, badgeTooltip } = useMemo(() => {
14672
+ if (filteredDestinations.length !== destinationsByStream.length) {
14673
+ return {
14674
+ badge: `${filteredDestinations.length}/${destinationsByStream.length}`,
14675
+ badgeTooltip: DISPLAY_TITLES.FILTERED_COUNT_TOOLTIP,
14676
+ };
14677
+ }
14678
+ return {
14679
+ badge: destinationsByStream.length,
14680
+ badgeTooltip: undefined,
14681
+ };
14682
+ }, [filteredDestinations, destinationsByStream]);
14588
14683
  return (React.createElement(TableContainer, { "$maxWidth": maxWidth },
14589
14684
  React.createElement(TableTitleWrap, null,
14590
- React.createElement(IconTitleBadge, { icon: getEntityIcon(EntityTypes.Destination), title: DISPLAY_TITLES.Destinations, badge: badge, badgeTooltip: badgeTooltip, loading: destinationsLoading })),
14685
+ React.createElement(IconTitleBadge, { icon: getEntityIcon(EntityTypes.Destination), title: DISPLAY_TITLES.DESTINATIONS, badge: badge, badgeTooltip: badgeTooltip, loading: destinationsLoading })),
14591
14686
  React.createElement(TableWrap, { "$maxHeight": maxHeight },
14592
14687
  React.createElement(InteractiveTable, { columns: columns$2, rows: rows })),
14593
- !filtered.length && (React.createElement(CenterThis, { style: { marginTop: '2rem' } },
14688
+ !filteredDestinations.length && (React.createElement(CenterThis, { style: { marginTop: '2rem' } },
14594
14689
  React.createElement(NoDataFound, null)))));
14595
14690
  };
14596
14691
 
@@ -14791,7 +14886,7 @@ const CustomFields = ({ ruleType, value, setValue, formErrors }) => {
14791
14886
  return Component ? React.createElement(Component, { value: value, setValue: setValue, formErrors: formErrors }) : null;
14792
14887
  };
14793
14888
 
14794
- const Container$5 = styled.div `
14889
+ const Container$6 = styled.div `
14795
14890
  display: flex;
14796
14891
  flex-direction: column;
14797
14892
  gap: 24px;
@@ -14802,7 +14897,7 @@ const FieldTitle = styled(Text) `
14802
14897
  `;
14803
14898
  const InstrumentationRuleForm = ({ isUpdate, rule, formData, formErrors, handleFormChange }) => {
14804
14899
  const theme = Theme.useTheme();
14805
- return (React.createElement(Container$5, null,
14900
+ return (React.createElement(Container$6, null,
14806
14901
  isUpdate && (React.createElement("div", null,
14807
14902
  React.createElement(FieldTitle, null, "Status"),
14808
14903
  React.createElement(Segment, { options: [
@@ -15024,14 +15119,14 @@ const InstrumentationRuleTable = ({ maxHeight, maxWidth }) => {
15024
15119
  }), [instrumentationRules]);
15025
15120
  return (React.createElement(TableContainer, { "$maxWidth": maxWidth },
15026
15121
  React.createElement(TableTitleWrap, null,
15027
- React.createElement(IconTitleBadge, { icon: getEntityIcon(EntityTypes.Action), title: DISPLAY_TITLES.InstrumentationRules, badge: instrumentationRules.length, loading: instrumentationRulesLoading })),
15122
+ React.createElement(IconTitleBadge, { icon: getEntityIcon(EntityTypes.Action), title: DISPLAY_TITLES.INSTRUMENTATION_RULES, badge: instrumentationRules.length, loading: instrumentationRulesLoading })),
15028
15123
  React.createElement(TableWrap, { "$maxHeight": maxHeight },
15029
15124
  React.createElement(InteractiveTable, { columns: columns$1, rows: rows })),
15030
15125
  !instrumentationRules.length && (React.createElement(CenterThis, { style: { marginTop: '2rem' } },
15031
15126
  React.createElement(NoDataFound, null)))));
15032
15127
  };
15033
15128
 
15034
- const Container$4 = styled.div `
15129
+ const Container$5 = styled.div `
15035
15130
  position: fixed;
15036
15131
  bottom: 0;
15037
15132
  left: 50%;
@@ -15048,7 +15143,7 @@ const Container$4 = styled.div `
15048
15143
  const MultiSourceControl = ({ totalSourceCount, uninstrumentSources }) => {
15049
15144
  const theme = Theme.useTheme();
15050
15145
  const Transition = useTransition({
15051
- container: Container$4,
15146
+ container: Container$5,
15052
15147
  animateIn: Theme.animations.slide.in['center'],
15053
15148
  animateOut: Theme.animations.slide.out['center'],
15054
15149
  });
@@ -15227,6 +15322,124 @@ const NotificationListItem = ({ id, seen, type, title, message, time, crdType, t
15227
15322
  React.createElement(Text, { size: 10, color: theme.colors.orange_soft }, "new")))))));
15228
15323
  };
15229
15324
 
15325
+ const Container$4 = styled.div `
15326
+ display: flex;
15327
+ flex-direction: column;
15328
+ align-items: center;
15329
+
15330
+ gap: 12px;
15331
+ width: 100%;
15332
+ max-height: ${({ $isModal }) => ($isModal ? 'calc(100vh - 510px)' : 'calc(100vh - 310px)')};
15333
+ height: fit-content;
15334
+ overflow-y: scroll;
15335
+ `;
15336
+ const Group = styled.div `
15337
+ width: 100%;
15338
+ padding-bottom: ${({ $isOpen }) => ($isOpen ? '18px' : '0')};
15339
+ border-radius: 16px;
15340
+ background-color: ${({ $selected, theme }) => ($selected ? theme.colors.majestic_blue + Theme.opacity.hex['024'] : theme.colors.dropdown_bg_2 + Theme.opacity.hex['040'])};
15341
+ `;
15342
+ const NamespaceItem = styled.div `
15343
+ display: flex;
15344
+ justify-content: space-between;
15345
+ gap: 12px;
15346
+ margin: 0;
15347
+ padding: 18px;
15348
+ border-radius: 16px;
15349
+ cursor: ${({ $withClick }) => ($withClick ? 'pointer' : 'unset')};
15350
+ &:hover {
15351
+ background-color: ${({ $withClick, $selected, theme }) => $withClick && ($selected ? theme.colors.majestic_blue + Theme.opacity.hex['040'] : theme.colors.dropdown_bg_2 + Theme.opacity.hex['080'])};
15352
+ transition: background-color 0.3s;
15353
+ }
15354
+ `;
15355
+ const SourceItem = styled(NamespaceItem) `
15356
+ width: calc(100% - 50px);
15357
+ margin-left: auto;
15358
+ padding: 8px;
15359
+ `;
15360
+ const RelativeWrapper = styled.div `
15361
+ position: relative;
15362
+ padding-bottom: ${({ $addPadding }) => ($addPadding ? '16px' : '0')};
15363
+ `;
15364
+ const AbsoluteWrapper = styled.div `
15365
+ position: absolute;
15366
+ top: 6px;
15367
+ left: 18px;
15368
+ `;
15369
+ const NotSourcesWrapper = styled(CenterThis) `
15370
+ padding-bottom: ${({ $addPadding }) => ($addPadding ? '16px' : '0')};
15371
+ `;
15372
+ const SelectionCount = styled(Text) `
15373
+ width: 18px;
15374
+ `;
15375
+ const SourceList = ({ isModal = false, withInstances = true, filteredNamespacesAndSources, selectedNamespace, onSelectNamespace, selectedSources, onSelectSource }) => {
15376
+ const theme = Theme.useTheme();
15377
+ const { namespacesLoading } = useEntityStore();
15378
+ const matrix = Object.entries(filteredNamespacesAndSources || {});
15379
+ if (!matrix?.length) {
15380
+ return (React.createElement(CenterThis, null, namespacesLoading ? (React.createElement(FadeLoader, null)) : (React.createElement(NoDataFound, { title: DISPLAY_TITLES.NO_SOURCES, subTitle: onSelectNamespace ? DISPLAY_TITLES.PLEASE_MAKE_SURE_UNIGNORED_NAMESPACES : DISPLAY_TITLES.PLEASE_ADD_SOURCE }))));
15381
+ }
15382
+ return (React.createElement(Container$4, { "$isModal": isModal }, matrix.map(([namespace, sources]) => {
15383
+ const sourcesForNamespace = selectedSources?.[namespace] || [];
15384
+ const onlySelectedSources = sourcesForNamespace.filter(({ selected }) => selected);
15385
+ const isNamespaceLoaded = sourcesForNamespace.length > 0;
15386
+ const isNamespaceSelected = selectedNamespace === namespace;
15387
+ const isNamespaceAllSourcesSelected = onlySelectedSources.length > 0 && onlySelectedSources.length === sources.length;
15388
+ const isNamespacePartiallySourcesSelected = onlySelectedSources.length > 0 && onlySelectedSources.length !== sources.length;
15389
+ const hasSources = sources.length > 0;
15390
+ if (!onSelectNamespace && !hasSources)
15391
+ return null;
15392
+ return (React.createElement(Group, { key: `namespace-${namespace}`, "data-id": `namespace-${namespace}`, "$selected": isNamespaceAllSourcesSelected, "$isOpen": isNamespaceSelected },
15393
+ React.createElement(NamespaceItem, { "$selected": isNamespaceAllSourcesSelected, "$withClick": !!onSelectNamespace, onClick: () => onSelectNamespace?.(namespace) },
15394
+ React.createElement(FlexRow, { "$gap": 12 },
15395
+ onSelectNamespace && React.createElement(Checkbox, { partiallyChecked: isNamespacePartiallySourcesSelected, value: isNamespaceAllSourcesSelected, onChange: (bool) => onSelectNamespace(namespace, bool) }),
15396
+ React.createElement(Text, null, namespace)),
15397
+ React.createElement(FlexRow, { "$gap": 12 },
15398
+ React.createElement(SelectionCount, { size: 10, color: theme.text.grey }, isNamespaceLoaded ? `${onlySelectedSources.length}/${sources.length}` : null),
15399
+ onSelectNamespace && React.createElement(ExtendArrow, { extend: isNamespaceSelected }))),
15400
+ (isNamespaceSelected || !onSelectNamespace) &&
15401
+ (hasSources ? (React.createElement(RelativeWrapper, { "$addPadding": !onSelectSource },
15402
+ React.createElement(AbsoluteWrapper, null,
15403
+ React.createElement(Divider, { orientation: 'vertical', length: `${(sources.length || 0) * 36}px` })),
15404
+ sources.map((source) => {
15405
+ const isSourceSelected = onlySelectedSources.some(({ name }) => name === source.name);
15406
+ return React.createElement(SourceRow, { key: `source-${source.name}`, withInstances: withInstances, source: source, namespace: namespace, isSelected: isSourceSelected, onSelect: onSelectSource });
15407
+ }))) : (React.createElement(NotSourcesWrapper, { "$addPadding": !onSelectSource }, namespacesLoading ? React.createElement(FadeLoader, null) : React.createElement(NoDataFound, { title: DISPLAY_TITLES.NO_SOURCES_NAMESPACE, subTitle: DISPLAY_TITLES.TRY_SEARCH_OR_OTHER_NAMESPACE }))))));
15408
+ })));
15409
+ };
15410
+ const SourceRow = ({ withInstances, source, namespace, isSelected, onSelect, }) => {
15411
+ return (React.createElement(SourceItem, { "data-id": `source-${source.name}`, "$selected": isSelected, "$withClick": !!onSelect, onClick: () => onSelect?.(source) },
15412
+ React.createElement(FlexRow, { "$gap": 12 },
15413
+ onSelect && React.createElement(Checkbox, { value: isSelected, onChange: () => onSelect(source, namespace) }),
15414
+ React.createElement(Text, null, source.name),
15415
+ React.createElement(Text, { opacity: 0.8, size: 10 },
15416
+ withInstances ? `${source.numberOfInstances || 0} running instance${source.numberOfInstances !== 1 ? 's' : ''} • ` : '',
15417
+ source.kind))));
15418
+ };
15419
+
15420
+ const Container$3 = styled.div `
15421
+ display: flex;
15422
+ flex-direction: column;
15423
+ align-items: center;
15424
+ gap: 12px;
15425
+ width: 100%;
15426
+ max-height: calc(100vh - 200px);
15427
+ height: fit-content;
15428
+ overflow-y: scroll;
15429
+ `;
15430
+ const SetupSummary = ({ onEditSources, onEditDestinations }) => {
15431
+ const { configuredSources, configuredDestinations } = useSetupStore();
15432
+ const sourceCount = useMemo(() => Object.values(configuredSources).reduce((total, sourceList) => total + sourceList.filter((s) => s.selected).length, 0), [configuredSources]);
15433
+ return (React.createElement(ModalBody, { "$isNotModal": true },
15434
+ React.createElement(FlexColumn, { "$gap": 12 },
15435
+ React.createElement(SectionTitle, { title: DISPLAY_TITLES.SUMMARY, description: DISPLAY_TITLES.STREAM_CONFIRM }),
15436
+ React.createElement(Container$3, null,
15437
+ React.createElement(DataCard, { title: DISPLAY_TITLES.SELECTED_SOURCES, titleBadge: sourceCount, action: () => React.createElement(EditButton, { onClick: onEditSources }) },
15438
+ React.createElement(SourceList, { filteredNamespacesAndSources: configuredSources, withInstances: false })),
15439
+ React.createElement(DataCard, { title: DISPLAY_TITLES.SELECTED_DESTINATIONS, titleBadge: configuredDestinations.length, action: () => React.createElement(EditButton, { onClick: onEditDestinations }) },
15440
+ React.createElement(DestinationList, null))))));
15441
+ };
15442
+
15230
15443
  var NavIconIds;
15231
15444
  (function (NavIconIds) {
15232
15445
  NavIconIds["Overview"] = "overview";
@@ -15390,21 +15603,21 @@ const Describe$1 = ({ source, fetchDescribeSource }) => {
15390
15603
  const buildCard = (source) => {
15391
15604
  const { name, kind, namespace } = source;
15392
15605
  const arr = [
15393
- { title: DISPLAY_TITLES.Namespace, value: namespace },
15606
+ { title: DISPLAY_TITLES.NAMESPACE, value: namespace },
15394
15607
  { title: DISPLAY_TITLES.KIND, value: kind },
15395
15608
  { title: DISPLAY_TITLES.NAME, value: name, tooltip: 'K8s resource name' },
15396
15609
  ];
15397
15610
  return arr;
15398
15611
  };
15399
15612
 
15400
- const Container$3 = styled.div `
15613
+ const Container$2 = styled.div `
15401
15614
  display: flex;
15402
15615
  flex-direction: column;
15403
15616
  gap: 24px;
15404
15617
  padding: 4px;
15405
15618
  `;
15406
15619
  const SourceForm = ({ formData, handleFormChange }) => {
15407
- return (React.createElement(Container$3, null,
15620
+ return (React.createElement(Container$2, null,
15408
15621
  React.createElement(Input, { name: 'sourceName', title: 'Source name', tooltip: 'This overrides the default service name that runs in your cluster.', placeholder: 'Use a name that overrides the source name', value: formData.otelServiceName, onChange: ({ target: { value } }) => handleFormChange('otelServiceName', value) })));
15409
15622
  };
15410
15623
 
@@ -15427,7 +15640,9 @@ const DataContainer$1 = styled.div `
15427
15640
  `;
15428
15641
  const SourceDrawer = ({ persistSources, updateSource, fetchDescribeSource }) => {
15429
15642
  const { sources } = useEntityStore();
15643
+ const { selectedStreamName } = useDataStreamStore();
15430
15644
  const { drawerType, drawerEntityId } = useDrawerStore();
15645
+ const sourcesByStream = useMemo(() => filterSourcesByStream(sources, selectedStreamName), [sources, selectedStreamName]);
15431
15646
  const drawerRef = useRef(null);
15432
15647
  const isOpen = drawerType !== EntityTypes.Source;
15433
15648
  const [isEditing, setIsEditing] = useState(false);
@@ -15437,11 +15652,11 @@ const SourceDrawer = ({ persistSources, updateSource, fetchDescribeSource }) =>
15437
15652
  const thisItem = useMemo(() => {
15438
15653
  if (isOpen)
15439
15654
  return null;
15440
- const found = sources?.find((x) => x.namespace === drawerEntityId.namespace && x.name === drawerEntityId.name && x.kind === drawerEntityId.kind);
15655
+ const found = sourcesByStream?.find((x) => x.namespace === drawerEntityId.namespace && x.name === drawerEntityId.name && x.kind === drawerEntityId.kind);
15441
15656
  if (!!found)
15442
15657
  loadFormWithDrawerItem(found);
15443
15658
  return found;
15444
- }, [isOpen, drawerEntityId, sources]);
15659
+ }, [isOpen, drawerEntityId, sourcesByStream]);
15445
15660
  if (!thisItem)
15446
15661
  return null;
15447
15662
  const containersData = thisItem.containers?.map((container) => ({
@@ -15458,7 +15673,7 @@ const SourceDrawer = ({ persistSources, updateSource, fetchDescribeSource }) =>
15458
15673
  };
15459
15674
  const handleDelete = async () => {
15460
15675
  const { namespace } = thisItem;
15461
- persistSources({ [namespace]: [{ ...thisItem, selected: false }] }, {});
15676
+ persistSources({ [namespace]: [{ ...thisItem, selected: false, currentStreamName: selectedStreamName }] }, {});
15462
15677
  setIsFormDirty(false);
15463
15678
  setIsEditing(false);
15464
15679
  resetFormData();
@@ -15472,7 +15687,7 @@ const SourceDrawer = ({ persistSources, updateSource, fetchDescribeSource }) =>
15472
15687
  setIsFormDirty(false);
15473
15688
  setIsEditing(false);
15474
15689
  };
15475
- return (React.createElement(OverviewDrawer, { ref: drawerRef, title: thisItem.otelServiceName || thisItem.name, titleTooltip: 'This attribute is used to identify the name of the service (service.name) that is generating telemetry data.', icons: getContainersIcons(thisItem.containers), isEdit: isEditing, isFormDirty: isFormDirty, onEdit: selectedTab === Tabs.Overview ? handleEdit : undefined, onSave: handleSave, onDelete: selectedTab === Tabs.Overview ? handleDelete : undefined, onCancel: handleCancel, isLastItem: sources.length === 1, tabs: [
15690
+ return (React.createElement(OverviewDrawer, { ref: drawerRef, title: thisItem.otelServiceName || thisItem.name, titleTooltip: 'This attribute is used to identify the name of the service (service.name) that is generating telemetry data.', icons: getContainersIcons(thisItem.containers), isEdit: isEditing, isFormDirty: isFormDirty, onEdit: selectedTab === Tabs.Overview ? handleEdit : undefined, onSave: handleSave, onDelete: selectedTab === Tabs.Overview ? handleDelete : undefined, onCancel: handleCancel, isLastItem: sourcesByStream.length === 1, tabs: [
15476
15691
  {
15477
15692
  label: Tabs.Overview,
15478
15693
  onClick: () => setSelectedTab(Tabs.Overview),
@@ -15487,137 +15702,22 @@ const SourceDrawer = ({ persistSources, updateSource, fetchDescribeSource }) =>
15487
15702
  React.createElement(SourceForm, { formData: formData, handleFormChange: (...params) => {
15488
15703
  setIsFormDirty(true);
15489
15704
  handleFormChange(...params);
15705
+ handleFormChange('currentStreamName', selectedStreamName);
15490
15706
  } }))) : (React.createElement(DataContainer$1, null,
15491
15707
  React.createElement(ConditionDetails, { conditions: thisItem.conditions || [] }),
15492
15708
  React.createElement(DataCard, { title: DISPLAY_TITLES.SOURCE_DETAILS, data: !!thisItem ? buildCard(thisItem) : [] }),
15493
15709
  React.createElement(DataCard, { title: DISPLAY_TITLES.DETECTED_CONTAINERS, titleBadge: containersData.length, description: DISPLAY_TITLES.DETECTED_CONTAINERS_DESCRIPTION, data: containersData })))) : (React.createElement(Describe$1, { source: thisItem, fetchDescribeSource: fetchDescribeSource }))));
15494
15710
  };
15495
15711
 
15496
- const Container$2 = styled.div `
15497
- display: flex;
15498
- flex-direction: column;
15499
- align-items: center;
15500
- gap: 12px;
15501
- max-height: ${({ $isModal }) => ($isModal ? 'calc(100vh - 510px)' : 'calc(100vh - 310px)')};
15502
- height: fit-content;
15503
- overflow-y: scroll;
15504
- `;
15505
- const Group = styled.div `
15506
- width: 100%;
15507
- padding-bottom: ${({ $isOpen }) => ($isOpen ? '18px' : '0')};
15508
- border-radius: 16px;
15509
- background-color: ${({ $selected, theme }) => ($selected ? theme.colors.majestic_blue + Theme.opacity.hex['024'] : theme.colors.dropdown_bg_2 + Theme.opacity.hex['040'])};
15510
- `;
15511
- const NamespaceItem = styled.div `
15512
- display: flex;
15513
- justify-content: space-between;
15514
- gap: 12px;
15515
- margin: 0;
15516
- padding: 18px;
15517
- border-radius: 16px;
15518
- cursor: pointer;
15519
- &:hover {
15520
- background-color: ${({ $selected, theme }) => ($selected ? theme.colors.majestic_blue + Theme.opacity.hex['040'] : theme.colors.dropdown_bg_2 + Theme.opacity.hex['080'])};
15521
- transition: background-color 0.3s;
15522
- }
15523
- `;
15524
- const SourceItem = styled(NamespaceItem) `
15525
- width: calc(100% - 50px);
15526
- margin-left: auto;
15527
- padding: 8px;
15528
- `;
15529
- const RelativeWrapper = styled.div `
15530
- position: relative;
15531
- `;
15532
- const AbsoluteWrapper = styled.div `
15533
- position: absolute;
15534
- top: 6px;
15535
- left: 18px;
15536
- `;
15537
- const SelectionCount = styled(Text) `
15538
- width: 18px;
15539
- `;
15540
- const NoDataFoundWrapper = styled.div `
15541
- padding: 50px 0;
15542
- display: flex;
15543
- flex-direction: column;
15544
- align-items: center;
15545
- gap: 12px;
15546
- height: 100%;
15547
- max-height: calc(100vh - 360px);
15548
- overflow-y: auto;
15549
- `;
15550
- const List = ({ isModal = false, filterNamespaces, filterSources, selectedNamespace, onSelectNamespace, selectedSources, onSelectSource, selectedFutureApps, onSelectFutureApps, onSelectAll, }) => {
15551
- const theme = Theme.useTheme();
15552
- const namespaces = filterNamespaces();
15553
- const { namespacesLoading } = useEntityStore();
15554
- if (!namespaces.length) {
15555
- return React.createElement(NoDataFoundWrapper, null, namespacesLoading ? React.createElement(FadeLoader, { scale: 2 }) : React.createElement(NoDataFound, { title: 'No namespaces found' }));
15556
- }
15557
- return (React.createElement(Container$2, { "$isModal": isModal }, namespaces.map(([namespace, sources]) => {
15558
- const sourcesForNamespace = selectedSources[namespace] || [];
15559
- const futureAppsForNamespace = selectedFutureApps[namespace] || false;
15560
- const isNamespaceLoaded = !!sourcesForNamespace.length;
15561
- const isNamespaceSelected = selectedNamespace === namespace;
15562
- const onlySelectedSources = sourcesForNamespace.filter(({ selected }) => selected);
15563
- const filteredSources = filterSources(namespace, { cancelSearch: true });
15564
- const isNamespaceAllSourcesSelected = !!onlySelectedSources.length && onlySelectedSources.length === sources.length;
15565
- const isNamespacePartiallySourcesSelected = !!onlySelectedSources.length && onlySelectedSources.length !== sources.length;
15566
- const hasFilteredSources = !!filteredSources.length;
15567
- return (React.createElement(Group, { key: `namespace-${namespace}`, "data-id": `namespace-${namespace}`, "$selected": isNamespaceAllSourcesSelected, "$isOpen": isNamespaceSelected && hasFilteredSources },
15568
- React.createElement(NamespaceItem, { "$selected": isNamespaceAllSourcesSelected, onClick: () => onSelectNamespace(namespace) },
15569
- React.createElement(FlexRow, { "$gap": 12 },
15570
- React.createElement(Checkbox, { partiallyChecked: isNamespacePartiallySourcesSelected, value: isNamespaceAllSourcesSelected, onChange: (bool) => onSelectAll(bool, namespace) }),
15571
- React.createElement(Text, null, namespace)),
15572
- React.createElement(FlexRow, { "$gap": 12 },
15573
- React.createElement(Toggle, { title: 'Include Future Sources', initialValue: futureAppsForNamespace, onChange: (bool) => onSelectFutureApps(bool, namespace) }),
15574
- React.createElement(Divider, { orientation: 'vertical', length: '12px', margin: '0' }),
15575
- React.createElement(SelectionCount, { size: 10, color: theme.text.grey }, isNamespaceLoaded ? `${onlySelectedSources.length}/${sources.length}` : null),
15576
- React.createElement(ExtendArrow, { extend: isNamespaceSelected }))),
15577
- isNamespaceSelected &&
15578
- (hasFilteredSources ? (React.createElement(RelativeWrapper, null,
15579
- React.createElement(AbsoluteWrapper, null,
15580
- React.createElement(Divider, { orientation: 'vertical', length: `${filteredSources.length * 36 - 12}px` })),
15581
- filteredSources.map((source) => {
15582
- const isSourceSelected = !!onlySelectedSources.find(({ name }) => name === source.name);
15583
- return (React.createElement(SourceItem, { key: `source-${source.name}`, "data-id": `source-${source.name}`, "$selected": isSourceSelected, onClick: () => onSelectSource(source) },
15584
- React.createElement(FlexRow, { "$gap": 12 },
15585
- React.createElement(Checkbox, { value: isSourceSelected, onChange: () => onSelectSource(source, namespace) }),
15586
- React.createElement(Text, null, source.name),
15587
- React.createElement(Text, { opacity: 0.8, size: 10 },
15588
- source.numberOfInstances,
15589
- " running instance",
15590
- source.numberOfInstances !== 1 && 's',
15591
- " \u00B7 ",
15592
- source.kind))));
15593
- }))) : (React.createElement(NoDataFoundWrapper, null, namespacesLoading ? React.createElement(FadeLoader, { scale: 1.5 }) : React.createElement(NoDataFound, { title: 'No sources available in this namespace', subTitle: 'Try searching again or select another namespace.' }))))));
15594
- })));
15595
- };
15596
-
15597
- const FlexContainer = styled.div `
15598
- display: flex;
15599
- align-items: center;
15712
+ const ActionsRow = styled(FlexRow) `
15600
15713
  justify-content: space-between;
15601
15714
  `;
15602
- // when bringin back the "Select all" checkbox, change the following width to 300px
15603
15715
  const SearchWrapper = styled.div `
15604
- width: 444px;
15716
+ width: 420px;
15605
15717
  `;
15606
- const Controls = ({ selectedSources, searchText, setSearchText, showSelectedOnly, setShowSelectedOnly }) => {
15607
- const selectedAppsCount = Object.values(selectedSources).reduce((prev, curr) => prev + curr.filter((s) => s.selected).length, 0);
15608
- return (React.createElement(React.Fragment, null,
15609
- React.createElement(SectionTitle, { title: 'Select Sources for Instrumentation', badgeLabel: selectedAppsCount, description: 'Select apps to monitor in each namespace. Odigos will instrument them and send telemetry data to your destinations.' }),
15610
- React.createElement(FlexContainer, { style: { marginTop: 24 } },
15611
- React.createElement(SearchWrapper, null,
15612
- React.createElement(Input, { placeholder: 'Search Kubernetes Namespaces', icon: SearchIcon, value: searchText, onChange: (e) => setSearchText(e.target.value.toLowerCase()) })),
15613
- React.createElement(Toggle, { title: 'Show selected only', initialValue: showSelectedOnly, onChange: setShowSelectedOnly })),
15614
- React.createElement(Divider, { margin: '16px 0' })));
15615
- };
15616
-
15617
- const SourceSelectionForm = forwardRef((props, ref) => {
15618
- const { isModal, selectedNamespace, onSelectNamespace, namespace } = props;
15619
- const formState = useSourceSelectionFormData({ selectedNamespace, onSelectNamespace, namespace });
15620
- const { recordedInitialSources, getApiSourcesPayload, getApiFutureAppsPayload } = formState;
15718
+ const SourceSelectionForm = forwardRef(({ isModal, fetchSingleNamespace, onClickSummary }, ref) => {
15719
+ const formState = useSourceSelectionFormData({ fetchSingleNamespace });
15720
+ const { recordedInitialSources, selectedSources, getApiSourcesPayload, getApiFutureAppsPayload, searchText, setSearchText, showSelectedOnly, setShowSelectedOnly } = formState;
15621
15721
  useImperativeHandle(ref, () => ({
15622
15722
  getFormValues: () => ({
15623
15723
  initial: recordedInitialSources,
@@ -15625,19 +15725,24 @@ const SourceSelectionForm = forwardRef((props, ref) => {
15625
15725
  futureApps: getApiFutureAppsPayload(),
15626
15726
  }),
15627
15727
  }));
15728
+ const selectedCount = Object.values(selectedSources).reduce((prev, curr) => prev + curr.filter((s) => s.selected).length, 0);
15628
15729
  return (React.createElement(ModalBody, { "$isNotModal": !isModal },
15629
- React.createElement(Controls, { ...props, ...formState }),
15630
- React.createElement(List, { ...props, ...formState })));
15730
+ React.createElement(FlexColumn, { "$gap": 12 },
15731
+ React.createElement(FlexColumn, { "$gap": 24 },
15732
+ onClickSummary && React.createElement(NoteBackToSummary, { onClick: onClickSummary }),
15733
+ React.createElement(SectionTitle, { title: DISPLAY_TITLES.SELECT_SOURCES, badgeLabel: selectedCount, description: DISPLAY_TITLES.SELECT_SOURCES_DESCRIPTION }),
15734
+ React.createElement(ActionsRow, null,
15735
+ React.createElement(SearchWrapper, null,
15736
+ React.createElement(Input, { placeholder: DISPLAY_TITLES.SEARCH_NAMESPACES, icon: SearchIcon, value: searchText, onChange: (e) => setSearchText(e.target.value.toLowerCase()) })),
15737
+ React.createElement(Toggle, { title: DISPLAY_TITLES.SHOW_SELECTED_ONLY, initialValue: showSelectedOnly, onChange: setShowSelectedOnly }))),
15738
+ React.createElement(Divider, null),
15739
+ React.createElement(SourceList, { isModal: isModal, ...formState }))));
15631
15740
  });
15632
15741
 
15633
- const SourceModal = ({ selectedNamespace, setSelectedNamespace, namespace, persistSources }) => {
15742
+ const SourceModal = ({ fetchSingleNamespace, persistSources }) => {
15634
15743
  const { currentModal, setCurrentModal } = useModalStore();
15635
15744
  const isOpen = currentModal === EntityTypes.Source;
15636
- const onSelectNamespace = (ns) => {
15637
- setSelectedNamespace((prev) => (prev === ns ? '' : ns));
15638
- };
15639
15745
  const handleClose = () => {
15640
- setSelectedNamespace('');
15641
15746
  setCurrentModal('');
15642
15747
  };
15643
15748
  const handleSubmit = async () => {
@@ -15656,14 +15761,14 @@ const SourceModal = ({ selectedNamespace, setSelectedNamespace, namespace, persi
15656
15761
  onClick: handleSubmit,
15657
15762
  },
15658
15763
  ] }) },
15659
- React.createElement(SourceSelectionForm, { ref: formRef, isModal: true, selectedNamespace: selectedNamespace, onSelectNamespace: onSelectNamespace, namespace: namespace })));
15764
+ React.createElement(SourceSelectionForm, { ref: formRef, isModal: true, fetchSingleNamespace: fetchSingleNamespace })));
15660
15765
  };
15661
15766
 
15662
15767
  const columns = [
15663
15768
  { key: 'checkbox-and-icon', title: '' },
15664
15769
  { key: 'name', title: DISPLAY_TITLES.NAME, sortable: true },
15665
15770
  { key: 'type', title: 'Kubernetes Type', sortable: true },
15666
- { key: 'namespace', title: DISPLAY_TITLES.Namespace, sortable: true },
15771
+ { key: 'namespace', title: DISPLAY_TITLES.NAMESPACE, sortable: true },
15667
15772
  { key: 'containers', title: DISPLAY_TITLES.DETECTED_CONTAINERS },
15668
15773
  { key: 'conditions', title: 'Conditions' },
15669
15774
  { key: 'throughput', title: 'Throughput', sortable: true },
@@ -15672,6 +15777,7 @@ const SourceTable = ({ metrics, maxHeight, maxWidth }) => {
15672
15777
  const theme = Theme.useTheme();
15673
15778
  const filters = useFilterStore();
15674
15779
  const { isThisPending } = usePendingStore();
15780
+ const { selectedStreamName } = useDataStreamStore();
15675
15781
  const { sources, sourcesLoading } = useEntityStore();
15676
15782
  const { setDrawerType, setDrawerEntityId } = useDrawerStore();
15677
15783
  const { selectedSources, setSelectedSources } = useSelectedStore();
@@ -15684,7 +15790,8 @@ const SourceTable = ({ metrics, maxHeight, maxWidth }) => {
15684
15790
  return calculateProgress(sourcesToDelete, sourcesDeleted);
15685
15791
  return 1;
15686
15792
  }, [sourcesToCreate, sourcesCreated, sourcesToDelete, sourcesDeleted]);
15687
- const filtered = useMemo(() => filterSources(sources, filters), [sources, filters]);
15793
+ const sourcesByStream = useMemo(() => filterSourcesByStream(sources, selectedStreamName), [sources, selectedStreamName]);
15794
+ const filteredSources = useMemo(() => filterSources(sourcesByStream, filters), [sourcesByStream, filters]);
15688
15795
  const [hasSelected, totalSelectedSources] = useMemo(() => {
15689
15796
  let num = 0;
15690
15797
  Object.values(selectedSources).forEach((selectedSources) => {
@@ -15695,7 +15802,7 @@ const SourceTable = ({ metrics, maxHeight, maxWidth }) => {
15695
15802
  const onSelectAll = useCallback((bool) => {
15696
15803
  if (bool) {
15697
15804
  const payload = {};
15698
- filtered.forEach((source) => {
15805
+ filteredSources.forEach((source) => {
15699
15806
  const id = { namespace: source.namespace, name: source.name, kind: source.kind };
15700
15807
  const isPending = isThisPending({ entityType: EntityTypes.Source, entityId: id });
15701
15808
  if (!isPending) {
@@ -15712,7 +15819,7 @@ const SourceTable = ({ metrics, maxHeight, maxWidth }) => {
15712
15819
  else {
15713
15820
  setSelectedSources({});
15714
15821
  }
15715
- }, [filtered]);
15822
+ }, [filteredSources]);
15716
15823
  const onSelectOne = useCallback((source) => {
15717
15824
  const { namespace, name, kind } = source;
15718
15825
  const payload = { ...selectedSources };
@@ -15727,7 +15834,7 @@ const SourceTable = ({ metrics, maxHeight, maxWidth }) => {
15727
15834
  }
15728
15835
  setSelectedSources(payload);
15729
15836
  }, [selectedSources]);
15730
- const rows = useMemo(() => filtered.map((source) => {
15837
+ const rows = useMemo(() => filteredSources.map((source) => {
15731
15838
  const id = getWorkloadId(source);
15732
15839
  const idString = JSON.stringify(id);
15733
15840
  const { hasErrors, hasWarnings, hasDisableds } = getConditionsBooleans(source.conditions || []);
@@ -15777,13 +15884,23 @@ const SourceTable = ({ metrics, maxHeight, maxWidth }) => {
15777
15884
  },
15778
15885
  ],
15779
15886
  };
15780
- }), [filtered, selectedSources, metrics, onSelectOne]);
15781
- const badge = useMemo(() => (filtered.length !== sources.length ? `${filtered.length}/${sources.length}` : sources.length), [filtered, sources]);
15782
- const badgeTooltip = useMemo(() => (filtered.length !== sources.length ? DISPLAY_TITLES.FILTERED_COUNT_TOOLTIP : undefined), [filtered, sources]);
15887
+ }), [filteredSources, selectedSources, metrics, onSelectOne]);
15888
+ const { badge, badgeTooltip } = useMemo(() => {
15889
+ if (filteredSources.length !== sourcesByStream.length) {
15890
+ return {
15891
+ badge: `${filteredSources.length}/${sourcesByStream.length}`,
15892
+ badgeTooltip: DISPLAY_TITLES.FILTERED_COUNT_TOOLTIP,
15893
+ };
15894
+ }
15895
+ return {
15896
+ badge: sourcesByStream.length,
15897
+ badgeTooltip: undefined,
15898
+ };
15899
+ }, [filteredSources, sourcesByStream]);
15783
15900
  return (React.createElement(TableContainer, { "$maxWidth": maxWidth },
15784
15901
  React.createElement(TableTitleWrap, null,
15785
- React.createElement(Checkbox, { partiallyChecked: hasSelected && filtered?.length !== totalSelectedSources, value: hasSelected && filtered?.length === totalSelectedSources, onChange: onSelectAll, disabled: !filtered?.length }),
15786
- React.createElement(IconTitleBadge, { icon: getEntityIcon(EntityTypes.Source), title: DISPLAY_TITLES.Sources, badge: badge, badgeTooltip: badgeTooltip, loading: sourcesLoading && !isAwaitingInstrumentation })),
15902
+ React.createElement(Checkbox, { partiallyChecked: hasSelected && filteredSources?.length !== totalSelectedSources, value: hasSelected && filteredSources?.length === totalSelectedSources, onChange: onSelectAll, disabled: !filteredSources?.length }),
15903
+ React.createElement(IconTitleBadge, { icon: getEntityIcon(EntityTypes.Source), title: DISPLAY_TITLES.SOURCES, badge: badge, badgeTooltip: badgeTooltip, loading: sourcesLoading && !isAwaitingInstrumentation })),
15787
15904
  React.createElement(TableWrap, { "$maxHeight": maxHeight },
15788
15905
  React.createElement(InteractiveTable, { columns: columns, rows: isAwaitingInstrumentation ? [] : rows })),
15789
15906
  isAwaitingInstrumentation ? (React.createElement(CenterThis, { style: { marginTop: '2rem', gap: '24px' } },
@@ -15792,7 +15909,7 @@ const SourceTable = ({ metrics, maxHeight, maxWidth }) => {
15792
15909
  React.createElement(Text, { color: theme.text.info },
15793
15910
  !!sourcesToCreate ? 'Instrumenting' : 'Uninstrumenting',
15794
15911
  " workloads..."),
15795
- React.createElement(Badge, { label: `${instrumentingPercent}%` })))) : !filtered.length ? (React.createElement(CenterThis, { style: { marginTop: '2rem' } },
15912
+ React.createElement(Badge, { label: `${instrumentingPercent}%` })))) : !filteredSources.length ? (React.createElement(CenterThis, { style: { marginTop: '2rem' } },
15796
15913
  React.createElement(NoDataFound, null))) : null));
15797
15914
  };
15798
15915
 
@@ -16044,4 +16161,4 @@ const ToggleDarkMode = () => {
16044
16161
  React.createElement(Background, { "$darkMode": darkMode })));
16045
16162
  };
16046
16163
 
16047
- export { ActionDrawer, ActionForm, ActionModal, ActionTable, AwaitPipeline, ComputePlatformSelect, ComputePlatforms, ComputePlatformsActionsMenu, ConnectionStatusDropdown, ConnectionTypeDropdown, DataFlow, DataFlowActionsMenu, DestinationDrawer, DestinationForm, DestinationModal, DestinationSelectionForm, DestinationTable, ErrorDropdown, InstrumentationRuleDrawer, InstrumentationRuleForm, InstrumentationRuleModal, InstrumentationRuleTable, KindDropdown, LanguageDropdown, MonitorDropdown, MultiSourceControl, NamespaceDropdown, NavIconIds, NotificationManager, OverviewDrawer, SideNav, SlackInvite, SourceDrawer, SourceForm, SourceModal, SourceSelectionForm, SourceTable, SystemOverview, ToastList, ToggleDarkMode };
16164
+ export { ActionDrawer, ActionForm, ActionModal, ActionTable, AwaitPipeline, ComputePlatformSelect, ComputePlatforms, ComputePlatformsActionsMenu, ConnectionStatusDropdown, ConnectionTypeDropdown, DataFlow, DataFlowActionsMenu, DataStreamSelectionForm, DestinationDrawer, DestinationForm, DestinationModal, DestinationSelectionForm, DestinationTable, ErrorDropdown, InstrumentationRuleDrawer, InstrumentationRuleForm, InstrumentationRuleModal, InstrumentationRuleTable, KindDropdown, LanguageDropdown, MonitorDropdown, MultiSourceControl, NamespaceDropdown, NavIconIds, NotificationManager, OverviewDrawer, SetupSummary, SideNav, SlackInvite, SourceDrawer, SourceForm, SourceModal, SourceSelectionForm, SourceTable, SystemOverview, TableCellConditions, ToastList, ToggleDarkMode };