@odigos/ui-kit 0.0.24 → 0.0.26

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 +26 -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 +60 -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 +2 -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 +5 -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 +8 -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 +674 -521
  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-D3sp5Hx7.js → index-B6FywnIf.js} +97 -3
  281. package/lib/{index-DwBxpY4g.js → index-BfatCMWq.js} +28 -3
  282. package/lib/index-ByO2rgKy.js +36 -0
  283. package/lib/{index-C7Y1tYdc.js → index-CFnxjzaW.js} +1 -1
  284. package/lib/{index-B-iLphLA.js → index-CJs4RDHU.js} +1 -1
  285. package/lib/index-CWbxXTof.js +11 -0
  286. package/lib/index-CWufhl9G.js +25 -0
  287. package/lib/{index-Dylg236O.js → index-C_LWKMnO.js} +124 -163
  288. package/lib/{index-KOMAv-TS.js → index-CamnKrev.js} +8 -8
  289. package/lib/{index-DiTtXTRm.js → index-DMXaEyAB.js} +48 -11
  290. package/lib/index-Dqief9td.js +20 -0
  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 +14 -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-plxXIM0Q.js} +60 -102
  309. package/lib/{useTransition-D0ykOLrk.js → useTransition-BPxqZqXu.js} +2 -2
  310. package/package.json +21 -15
  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-B6FywnIf.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-C_LWKMnO.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-DMXaEyAB.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-CFnxjzaW.js';
12
+ import { u as useActionFormData, a as useClickNode, c as useDestinationFormData, b as useClickNotification, d as useSourceFormData, e as useSourceSelectionFormData } from './useSourceSelectionFormData-plxXIM0Q.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-BPxqZqXu.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-ByO2rgKy.js';
17
+ import { m as mapConditions, b as getStatusIcon, c as capitalizeFirstLetter } from './index-CJs4RDHU.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-BfatCMWq.js';
18
19
  import { createPortal } from 'react-dom';
20
+ import { N as NoteBackToSummary, E as EditButton } from './index-CWufhl9G.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"),
@@ -1089,7 +1051,7 @@ const ComputePlatformsActionsMenu = ({ connections }) => {
1089
1051
  React.createElement(ConnectionStatusDropdown, { connections: connections, value: statuses, onSelect: (val) => setStatuses([...(statuses || []), val]), onDeselect: (val) => setStatuses((statuses || []).filter((opt) => opt.id !== val.id)), showSearch: true, required: true, isMulti: true })))));
1090
1052
  };
1091
1053
 
1092
- var css_248z = "/* this gets exported as style.css and can be used for the default theming */\n/* these are the necessary styles for React/Svelte Flow, they get used by base.css and style.css */\n.react-flow {\n direction: ltr;\n\n --xy-edge-stroke-default: #b1b1b7;\n --xy-edge-stroke-width-default: 1;\n --xy-edge-stroke-selected-default: #555;\n\n --xy-connectionline-stroke-default: #b1b1b7;\n --xy-connectionline-stroke-width-default: 1;\n\n --xy-attribution-background-color-default: rgba(255, 255, 255, 0.5);\n\n --xy-minimap-background-color-default: #fff;\n --xy-minimap-mask-background-color-default: rgba(240, 240, 240, 0.6);\n --xy-minimap-mask-stroke-color-default: transparent;\n --xy-minimap-mask-stroke-width-default: 1;\n --xy-minimap-node-background-color-default: #e2e2e2;\n --xy-minimap-node-stroke-color-default: transparent;\n --xy-minimap-node-stroke-width-default: 2;\n\n --xy-background-color-default: transparent;\n --xy-background-pattern-dots-color-default: #91919a;\n --xy-background-pattern-lines-color-default: #eee;\n --xy-background-pattern-cross-color-default: #e2e2e2;\n background-color: var(--xy-background-color, var(--xy-background-color-default));\n --xy-node-color-default: inherit;\n --xy-node-border-default: 1px solid #1a192b;\n --xy-node-background-color-default: #fff;\n --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25);\n --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, 0.08);\n --xy-node-boxshadow-selected-default: 0 0 0 0.5px #1a192b;\n --xy-node-border-radius-default: 3px;\n\n --xy-handle-background-color-default: #1a192b;\n --xy-handle-border-color-default: #fff;\n\n --xy-selection-background-color-default: rgba(0, 89, 220, 0.08);\n --xy-selection-border-default: 1px dotted rgba(0, 89, 220, 0.8);\n\n --xy-controls-button-background-color-default: #fefefe;\n --xy-controls-button-background-color-hover-default: #f4f4f4;\n --xy-controls-button-color-default: inherit;\n --xy-controls-button-color-hover-default: inherit;\n --xy-controls-button-border-color-default: #eee;\n --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08);\n\n --xy-edge-label-background-color-default: #ffffff;\n --xy-edge-label-color-default: inherit;\n --xy-resize-background-color-default: #3367d9;\n}\n.react-flow.dark {\n --xy-edge-stroke-default: #3e3e3e;\n --xy-edge-stroke-width-default: 1;\n --xy-edge-stroke-selected-default: #727272;\n\n --xy-connectionline-stroke-default: #b1b1b7;\n --xy-connectionline-stroke-width-default: 1;\n\n --xy-attribution-background-color-default: rgba(150, 150, 150, 0.25);\n\n --xy-minimap-background-color-default: #141414;\n --xy-minimap-mask-background-color-default: rgba(60, 60, 60, 0.6);\n --xy-minimap-mask-stroke-color-default: transparent;\n --xy-minimap-mask-stroke-width-default: 1;\n --xy-minimap-node-background-color-default: #2b2b2b;\n --xy-minimap-node-stroke-color-default: transparent;\n --xy-minimap-node-stroke-width-default: 2;\n\n --xy-background-color-default: #141414;\n --xy-background-pattern-dots-color-default: #777;\n --xy-background-pattern-lines-color-default: #777;\n --xy-background-pattern-cross-color-default: #777;\n --xy-node-color-default: #f8f8f8;\n --xy-node-border-default: 1px solid #3c3c3c;\n --xy-node-background-color-default: #1e1e1e;\n --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25);\n --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, 0.08);\n --xy-node-boxshadow-selected-default: 0 0 0 0.5px #999;\n\n --xy-handle-background-color-default: #bebebe;\n --xy-handle-border-color-default: #1e1e1e;\n\n --xy-selection-background-color-default: rgba(200, 200, 220, 0.08);\n --xy-selection-border-default: 1px dotted rgba(200, 200, 220, 0.8);\n\n --xy-controls-button-background-color-default: #2b2b2b;\n --xy-controls-button-background-color-hover-default: #3e3e3e;\n --xy-controls-button-color-default: #f8f8f8;\n --xy-controls-button-color-hover-default: #fff;\n --xy-controls-button-border-color-default: #5b5b5b;\n --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08);\n\n --xy-edge-label-background-color-default: #141414;\n --xy-edge-label-color-default: #f8f8f8;\n}\n.react-flow__background {\n background-color: var(--xy-background-color, var(--xy-background-color-props, var(--xy-background-color-default)));\n pointer-events: none;\n z-index: -1;\n}\n.react-flow__container {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n}\n.react-flow__pane {\n z-index: 1;\n}\n.react-flow__pane.draggable {\n cursor: grab;\n }\n.react-flow__pane.dragging {\n cursor: grabbing;\n }\n.react-flow__pane.selection {\n cursor: pointer;\n }\n.react-flow__viewport {\n transform-origin: 0 0;\n z-index: 2;\n pointer-events: none;\n}\n.react-flow__renderer {\n z-index: 4;\n}\n.react-flow__selection {\n z-index: 6;\n}\n.react-flow__nodesselection-rect:focus,\n.react-flow__nodesselection-rect:focus-visible {\n outline: none;\n}\n.react-flow__edge-path {\n stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default));\n stroke-width: var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));\n fill: none;\n}\n.react-flow__connection-path {\n stroke: var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));\n stroke-width: var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));\n fill: none;\n}\n.react-flow .react-flow__edges {\n position: absolute;\n}\n.react-flow .react-flow__edges svg {\n overflow: visible;\n position: absolute;\n pointer-events: none;\n }\n.react-flow__edge {\n pointer-events: visibleStroke;\n}\n.react-flow__edge.selectable {\n cursor: pointer;\n }\n.react-flow__edge.animated path {\n stroke-dasharray: 5;\n animation: dashdraw 0.5s linear infinite;\n }\n.react-flow__edge.animated path.react-flow__edge-interaction {\n stroke-dasharray: none;\n animation: none;\n }\n.react-flow__edge.inactive {\n pointer-events: none;\n }\n.react-flow__edge.selected,\n .react-flow__edge:focus,\n .react-flow__edge:focus-visible {\n outline: none;\n }\n.react-flow__edge.selected .react-flow__edge-path,\n .react-flow__edge.selectable:focus .react-flow__edge-path,\n .react-flow__edge.selectable:focus-visible .react-flow__edge-path {\n stroke: var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default));\n }\n.react-flow__edge-textwrapper {\n pointer-events: all;\n }\n.react-flow__edge .react-flow__edge-text {\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n.react-flow__connection {\n pointer-events: none;\n}\n.react-flow__connection .animated {\n stroke-dasharray: 5;\n animation: dashdraw 0.5s linear infinite;\n }\nsvg.react-flow__connectionline {\n z-index: 1001;\n overflow: visible;\n position: absolute;\n}\n.react-flow__nodes {\n pointer-events: none;\n transform-origin: 0 0;\n}\n.react-flow__node {\n position: absolute;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n pointer-events: all;\n transform-origin: 0 0;\n box-sizing: border-box;\n cursor: default;\n}\n.react-flow__node.selectable {\n cursor: pointer;\n }\n.react-flow__node.draggable {\n cursor: grab;\n pointer-events: all;\n }\n.react-flow__node.draggable.dragging {\n cursor: grabbing;\n }\n.react-flow__nodesselection {\n z-index: 3;\n transform-origin: left top;\n pointer-events: none;\n}\n.react-flow__nodesselection-rect {\n position: absolute;\n pointer-events: all;\n cursor: grab;\n }\n.react-flow__handle {\n position: absolute;\n pointer-events: none;\n min-width: 5px;\n min-height: 5px;\n width: 6px;\n height: 6px;\n background-color: var(--xy-handle-background-color, var(--xy-handle-background-color-default));\n border: 1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));\n border-radius: 100%;\n}\n.react-flow__handle.connectingfrom {\n pointer-events: all;\n }\n.react-flow__handle.connectionindicator {\n pointer-events: all;\n cursor: crosshair;\n }\n.react-flow__handle-bottom {\n top: auto;\n left: 50%;\n bottom: 0;\n transform: translate(-50%, 50%);\n }\n.react-flow__handle-top {\n top: 0;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n.react-flow__handle-left {\n top: 50%;\n left: 0;\n transform: translate(-50%, -50%);\n }\n.react-flow__handle-right {\n top: 50%;\n right: 0;\n transform: translate(50%, -50%);\n }\n.react-flow__edgeupdater {\n cursor: move;\n pointer-events: all;\n}\n.react-flow__panel {\n position: absolute;\n z-index: 5;\n margin: 15px;\n}\n.react-flow__panel.top {\n top: 0;\n }\n.react-flow__panel.bottom {\n bottom: 0;\n }\n.react-flow__panel.top.center, .react-flow__panel.bottom.center {\n left: 50%;\n transform: translateX(-50%);\n }\n.react-flow__panel.left {\n left: 0;\n }\n.react-flow__panel.right {\n right: 0;\n }\n.react-flow__panel.left.center, .react-flow__panel.right.center {\n top: 50%;\n transform: translateY(-50%);\n }\n.react-flow__attribution {\n font-size: 10px;\n background: var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));\n padding: 2px 3px;\n margin: 0;\n}\n.react-flow__attribution a {\n text-decoration: none;\n color: #999;\n }\n@keyframes dashdraw {\n from {\n stroke-dashoffset: 10;\n }\n}\n.react-flow__edgelabel-renderer {\n position: absolute;\n width: 100%;\n height: 100%;\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n left: 0;\n top: 0;\n}\n.react-flow__viewport-portal {\n position: absolute;\n width: 100%;\n height: 100%;\n left: 0;\n top: 0;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.react-flow__minimap {\n background: var(\n --xy-minimap-background-color-props,\n var(--xy-minimap-background-color, var(--xy-minimap-background-color-default))\n );\n}\n.react-flow__minimap-svg {\n display: block;\n }\n.react-flow__minimap-mask {\n fill: var(\n --xy-minimap-mask-background-color-props,\n var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default))\n );\n stroke: var(\n --xy-minimap-mask-stroke-color-props,\n var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default))\n );\n stroke-width: var(\n --xy-minimap-mask-stroke-width-props,\n var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default))\n );\n }\n.react-flow__minimap-node {\n fill: var(\n --xy-minimap-node-background-color-props,\n var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default))\n );\n stroke: var(\n --xy-minimap-node-stroke-color-props,\n var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default))\n );\n stroke-width: var(\n --xy-minimap-node-stroke-width-props,\n var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default))\n );\n }\n.react-flow__background-pattern.dots {\n fill: var(\n --xy-background-pattern-color-props,\n var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default))\n );\n }\n.react-flow__background-pattern.lines {\n stroke: var(\n --xy-background-pattern-color-props,\n var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default))\n );\n }\n.react-flow__background-pattern.cross {\n stroke: var(\n --xy-background-pattern-color-props,\n var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default))\n );\n }\n.react-flow__controls {\n display: flex;\n flex-direction: column;\n box-shadow: var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default));\n}\n.react-flow__controls.horizontal {\n flex-direction: row;\n }\n.react-flow__controls-button {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 26px;\n width: 26px;\n padding: 4px;\n border: none;\n background: var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));\n border-bottom: 1px solid\n var(\n --xy-controls-button-border-color-props,\n var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default))\n );\n color: var(\n --xy-controls-button-color-props,\n var(--xy-controls-button-color, var(--xy-controls-button-color-default))\n );\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n.react-flow__controls-button svg {\n width: 100%;\n max-width: 12px;\n max-height: 12px;\n fill: currentColor;\n }\n.react-flow__edge.updating .react-flow__edge-path {\n stroke: #777;\n }\n.react-flow__edge-text {\n font-size: 10px;\n }\n.react-flow__node.selectable:focus,\n .react-flow__node.selectable:focus-visible {\n outline: none;\n }\n.react-flow__node-input,\n.react-flow__node-default,\n.react-flow__node-output,\n.react-flow__node-group {\n padding: 10px;\n border-radius: var(--xy-node-border-radius, var(--xy-node-border-radius-default));\n width: 150px;\n font-size: 12px;\n color: var(--xy-node-color, var(--xy-node-color-default));\n text-align: center;\n border: var(--xy-node-border, var(--xy-node-border-default));\n background-color: var(--xy-node-background-color, var(--xy-node-background-color-default));\n}\n.react-flow__node-input.selectable:hover, .react-flow__node-default.selectable:hover, .react-flow__node-output.selectable:hover, .react-flow__node-group.selectable:hover {\n box-shadow: var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default));\n }\n.react-flow__node-input.selectable.selected,\n .react-flow__node-input.selectable:focus,\n .react-flow__node-input.selectable:focus-visible,\n .react-flow__node-default.selectable.selected,\n .react-flow__node-default.selectable:focus,\n .react-flow__node-default.selectable:focus-visible,\n .react-flow__node-output.selectable.selected,\n .react-flow__node-output.selectable:focus,\n .react-flow__node-output.selectable:focus-visible,\n .react-flow__node-group.selectable.selected,\n .react-flow__node-group.selectable:focus,\n .react-flow__node-group.selectable:focus-visible {\n box-shadow: var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default));\n }\n.react-flow__node-group {\n background-color: var(--xy-node-group-background-color, var(--xy-node-group-background-color-default));\n}\n.react-flow__nodesselection-rect,\n.react-flow__selection {\n background: var(--xy-selection-background-color, var(--xy-selection-background-color-default));\n border: var(--xy-selection-border, var(--xy-selection-border-default));\n}\n.react-flow__nodesselection-rect:focus,\n .react-flow__nodesselection-rect:focus-visible,\n .react-flow__selection:focus,\n .react-flow__selection:focus-visible {\n outline: none;\n }\n.react-flow__controls-button:hover {\n background: var(\n --xy-controls-button-background-color-hover-props,\n var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default))\n );\n color: var(\n --xy-controls-button-color-hover-props,\n var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default))\n );\n }\n.react-flow__controls-button:disabled {\n pointer-events: none;\n }\n.react-flow__controls-button:disabled svg {\n fill-opacity: 0.4;\n }\n.react-flow__controls-button:last-child {\n border-bottom: none;\n }\n.react-flow__resize-control {\n position: absolute;\n}\n.react-flow__resize-control.left,\n.react-flow__resize-control.right {\n cursor: ew-resize;\n}\n.react-flow__resize-control.top,\n.react-flow__resize-control.bottom {\n cursor: ns-resize;\n}\n.react-flow__resize-control.top.left,\n.react-flow__resize-control.bottom.right {\n cursor: nwse-resize;\n}\n.react-flow__resize-control.bottom.left,\n.react-flow__resize-control.top.right {\n cursor: nesw-resize;\n}\n/* handle styles */\n.react-flow__resize-control.handle {\n width: 4px;\n height: 4px;\n border: 1px solid #fff;\n border-radius: 1px;\n background-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default));\n transform: translate(-50%, -50%);\n}\n.react-flow__resize-control.handle.left {\n left: 0;\n top: 50%;\n}\n.react-flow__resize-control.handle.right {\n left: 100%;\n top: 50%;\n}\n.react-flow__resize-control.handle.top {\n left: 50%;\n top: 0;\n}\n.react-flow__resize-control.handle.bottom {\n left: 50%;\n top: 100%;\n}\n.react-flow__resize-control.handle.top.left {\n left: 0;\n}\n.react-flow__resize-control.handle.bottom.left {\n left: 0;\n}\n.react-flow__resize-control.handle.top.right {\n left: 100%;\n}\n.react-flow__resize-control.handle.bottom.right {\n left: 100%;\n}\n/* line styles */\n.react-flow__resize-control.line {\n border-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default));\n border-width: 0;\n border-style: solid;\n}\n.react-flow__resize-control.line.left,\n.react-flow__resize-control.line.right {\n width: 1px;\n transform: translate(-50%, 0);\n top: 0;\n height: 100%;\n}\n.react-flow__resize-control.line.left {\n left: 0;\n border-left-width: 1px;\n}\n.react-flow__resize-control.line.right {\n left: 100%;\n border-right-width: 1px;\n}\n.react-flow__resize-control.line.top,\n.react-flow__resize-control.line.bottom {\n height: 1px;\n transform: translate(0, -50%);\n left: 0;\n width: 100%;\n}\n.react-flow__resize-control.line.top {\n top: 0;\n border-top-width: 1px;\n}\n.react-flow__resize-control.line.bottom {\n border-bottom-width: 1px;\n top: 100%;\n}\n.react-flow__edge-textbg {\n fill: var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default));\n}\n.react-flow__edge-text {\n fill: var(--xy-edge-label-color, var(--xy-edge-label-color-default));\n}\n";
1054
+ var css_248z = "/* this gets exported as style.css and can be used for the default theming */\n/* these are the necessary styles for React/Svelte Flow, they get used by base.css and style.css */\n.react-flow {\n direction: ltr;\n\n --xy-edge-stroke-default: #b1b1b7;\n --xy-edge-stroke-width-default: 1;\n --xy-edge-stroke-selected-default: #555;\n\n --xy-connectionline-stroke-default: #b1b1b7;\n --xy-connectionline-stroke-width-default: 1;\n\n --xy-attribution-background-color-default: rgba(255, 255, 255, 0.5);\n\n --xy-minimap-background-color-default: #fff;\n --xy-minimap-mask-background-color-default: rgba(240, 240, 240, 0.6);\n --xy-minimap-mask-stroke-color-default: transparent;\n --xy-minimap-mask-stroke-width-default: 1;\n --xy-minimap-node-background-color-default: #e2e2e2;\n --xy-minimap-node-stroke-color-default: transparent;\n --xy-minimap-node-stroke-width-default: 2;\n\n --xy-background-color-default: transparent;\n --xy-background-pattern-dots-color-default: #91919a;\n --xy-background-pattern-lines-color-default: #eee;\n --xy-background-pattern-cross-color-default: #e2e2e2;\n background-color: var(--xy-background-color, var(--xy-background-color-default));\n --xy-node-color-default: inherit;\n --xy-node-border-default: 1px solid #1a192b;\n --xy-node-background-color-default: #fff;\n --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25);\n --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, 0.08);\n --xy-node-boxshadow-selected-default: 0 0 0 0.5px #1a192b;\n --xy-node-border-radius-default: 3px;\n\n --xy-handle-background-color-default: #1a192b;\n --xy-handle-border-color-default: #fff;\n\n --xy-selection-background-color-default: rgba(0, 89, 220, 0.08);\n --xy-selection-border-default: 1px dotted rgba(0, 89, 220, 0.8);\n\n --xy-controls-button-background-color-default: #fefefe;\n --xy-controls-button-background-color-hover-default: #f4f4f4;\n --xy-controls-button-color-default: inherit;\n --xy-controls-button-color-hover-default: inherit;\n --xy-controls-button-border-color-default: #eee;\n --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08);\n\n --xy-edge-label-background-color-default: #ffffff;\n --xy-edge-label-color-default: inherit;\n --xy-resize-background-color-default: #3367d9;\n}\n.react-flow.dark {\n --xy-edge-stroke-default: #3e3e3e;\n --xy-edge-stroke-width-default: 1;\n --xy-edge-stroke-selected-default: #727272;\n\n --xy-connectionline-stroke-default: #b1b1b7;\n --xy-connectionline-stroke-width-default: 1;\n\n --xy-attribution-background-color-default: rgba(150, 150, 150, 0.25);\n\n --xy-minimap-background-color-default: #141414;\n --xy-minimap-mask-background-color-default: rgba(60, 60, 60, 0.6);\n --xy-minimap-mask-stroke-color-default: transparent;\n --xy-minimap-mask-stroke-width-default: 1;\n --xy-minimap-node-background-color-default: #2b2b2b;\n --xy-minimap-node-stroke-color-default: transparent;\n --xy-minimap-node-stroke-width-default: 2;\n\n --xy-background-color-default: #141414;\n --xy-background-pattern-dots-color-default: #777;\n --xy-background-pattern-lines-color-default: #777;\n --xy-background-pattern-cross-color-default: #777;\n --xy-node-color-default: #f8f8f8;\n --xy-node-border-default: 1px solid #3c3c3c;\n --xy-node-background-color-default: #1e1e1e;\n --xy-node-group-background-color-default: rgba(240, 240, 240, 0.25);\n --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, 0.08);\n --xy-node-boxshadow-selected-default: 0 0 0 0.5px #999;\n\n --xy-handle-background-color-default: #bebebe;\n --xy-handle-border-color-default: #1e1e1e;\n\n --xy-selection-background-color-default: rgba(200, 200, 220, 0.08);\n --xy-selection-border-default: 1px dotted rgba(200, 200, 220, 0.8);\n\n --xy-controls-button-background-color-default: #2b2b2b;\n --xy-controls-button-background-color-hover-default: #3e3e3e;\n --xy-controls-button-color-default: #f8f8f8;\n --xy-controls-button-color-hover-default: #fff;\n --xy-controls-button-border-color-default: #5b5b5b;\n --xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08);\n\n --xy-edge-label-background-color-default: #141414;\n --xy-edge-label-color-default: #f8f8f8;\n}\n.react-flow__background {\n background-color: var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));\n pointer-events: none;\n z-index: -1;\n}\n.react-flow__container {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n}\n.react-flow__pane {\n z-index: 1;\n}\n.react-flow__pane.draggable {\n cursor: grab;\n }\n.react-flow__pane.dragging {\n cursor: grabbing;\n }\n.react-flow__pane.selection {\n cursor: pointer;\n }\n.react-flow__viewport {\n transform-origin: 0 0;\n z-index: 2;\n pointer-events: none;\n}\n.react-flow__renderer {\n z-index: 4;\n}\n.react-flow__selection {\n z-index: 6;\n}\n.react-flow__nodesselection-rect:focus,\n.react-flow__nodesselection-rect:focus-visible {\n outline: none;\n}\n.react-flow__edge-path {\n stroke: var(--xy-edge-stroke, var(--xy-edge-stroke-default));\n stroke-width: var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));\n fill: none;\n}\n.react-flow__connection-path {\n stroke: var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));\n stroke-width: var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));\n fill: none;\n}\n.react-flow .react-flow__edges {\n position: absolute;\n}\n.react-flow .react-flow__edges svg {\n overflow: visible;\n position: absolute;\n pointer-events: none;\n }\n.react-flow__edge {\n pointer-events: visibleStroke;\n}\n.react-flow__edge.selectable {\n cursor: pointer;\n }\n.react-flow__edge.animated path {\n stroke-dasharray: 5;\n animation: dashdraw 0.5s linear infinite;\n }\n.react-flow__edge.animated path.react-flow__edge-interaction {\n stroke-dasharray: none;\n animation: none;\n }\n.react-flow__edge.inactive {\n pointer-events: none;\n }\n.react-flow__edge.selected,\n .react-flow__edge:focus,\n .react-flow__edge:focus-visible {\n outline: none;\n }\n.react-flow__edge.selected .react-flow__edge-path,\n .react-flow__edge.selectable:focus .react-flow__edge-path,\n .react-flow__edge.selectable:focus-visible .react-flow__edge-path {\n stroke: var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default));\n }\n.react-flow__edge-textwrapper {\n pointer-events: all;\n }\n.react-flow__edge .react-flow__edge-text {\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n.react-flow__connection {\n pointer-events: none;\n}\n.react-flow__connection .animated {\n stroke-dasharray: 5;\n animation: dashdraw 0.5s linear infinite;\n }\nsvg.react-flow__connectionline {\n z-index: 1001;\n overflow: visible;\n position: absolute;\n}\n.react-flow__nodes {\n pointer-events: none;\n transform-origin: 0 0;\n}\n.react-flow__node {\n position: absolute;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n pointer-events: all;\n transform-origin: 0 0;\n box-sizing: border-box;\n cursor: default;\n}\n.react-flow__node.selectable {\n cursor: pointer;\n }\n.react-flow__node.draggable {\n cursor: grab;\n pointer-events: all;\n }\n.react-flow__node.draggable.dragging {\n cursor: grabbing;\n }\n.react-flow__nodesselection {\n z-index: 3;\n transform-origin: left top;\n pointer-events: none;\n}\n.react-flow__nodesselection-rect {\n position: absolute;\n pointer-events: all;\n cursor: grab;\n }\n.react-flow__handle {\n position: absolute;\n pointer-events: none;\n min-width: 5px;\n min-height: 5px;\n width: 6px;\n height: 6px;\n background-color: var(--xy-handle-background-color, var(--xy-handle-background-color-default));\n border: 1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));\n border-radius: 100%;\n}\n.react-flow__handle.connectingfrom {\n pointer-events: all;\n }\n.react-flow__handle.connectionindicator {\n pointer-events: all;\n cursor: crosshair;\n }\n.react-flow__handle-bottom {\n top: auto;\n left: 50%;\n bottom: 0;\n transform: translate(-50%, 50%);\n }\n.react-flow__handle-top {\n top: 0;\n left: 50%;\n transform: translate(-50%, -50%);\n }\n.react-flow__handle-left {\n top: 50%;\n left: 0;\n transform: translate(-50%, -50%);\n }\n.react-flow__handle-right {\n top: 50%;\n right: 0;\n transform: translate(50%, -50%);\n }\n.react-flow__edgeupdater {\n cursor: move;\n pointer-events: all;\n}\n.react-flow__panel {\n position: absolute;\n z-index: 5;\n margin: 15px;\n}\n.react-flow__panel.top {\n top: 0;\n }\n.react-flow__panel.bottom {\n bottom: 0;\n }\n.react-flow__panel.top.center, .react-flow__panel.bottom.center {\n left: 50%;\n transform: translateX(-15px) translateX(-50%);\n }\n.react-flow__panel.left {\n left: 0;\n }\n.react-flow__panel.right {\n right: 0;\n }\n.react-flow__panel.left.center, .react-flow__panel.right.center {\n top: 50%;\n transform: translateY(-15px) translateY(-50%);\n }\n.react-flow__attribution {\n font-size: 10px;\n background: var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));\n padding: 2px 3px;\n margin: 0;\n}\n.react-flow__attribution a {\n text-decoration: none;\n color: #999;\n }\n@keyframes dashdraw {\n from {\n stroke-dashoffset: 10;\n }\n}\n.react-flow__edgelabel-renderer {\n position: absolute;\n width: 100%;\n height: 100%;\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n left: 0;\n top: 0;\n}\n.react-flow__viewport-portal {\n position: absolute;\n width: 100%;\n height: 100%;\n left: 0;\n top: 0;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n.react-flow__minimap {\n background: var(\n --xy-minimap-background-color-props,\n var(--xy-minimap-background-color, var(--xy-minimap-background-color-default))\n );\n}\n.react-flow__minimap-svg {\n display: block;\n }\n.react-flow__minimap-mask {\n fill: var(\n --xy-minimap-mask-background-color-props,\n var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default))\n );\n stroke: var(\n --xy-minimap-mask-stroke-color-props,\n var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default))\n );\n stroke-width: var(\n --xy-minimap-mask-stroke-width-props,\n var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default))\n );\n }\n.react-flow__minimap-node {\n fill: var(\n --xy-minimap-node-background-color-props,\n var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default))\n );\n stroke: var(\n --xy-minimap-node-stroke-color-props,\n var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default))\n );\n stroke-width: var(\n --xy-minimap-node-stroke-width-props,\n var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default))\n );\n }\n.react-flow__background-pattern.dots {\n fill: var(\n --xy-background-pattern-color-props,\n var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default))\n );\n }\n.react-flow__background-pattern.lines {\n stroke: var(\n --xy-background-pattern-color-props,\n var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default))\n );\n }\n.react-flow__background-pattern.cross {\n stroke: var(\n --xy-background-pattern-color-props,\n var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default))\n );\n }\n.react-flow__controls {\n display: flex;\n flex-direction: column;\n box-shadow: var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default));\n}\n.react-flow__controls.horizontal {\n flex-direction: row;\n }\n.react-flow__controls-button {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 26px;\n width: 26px;\n padding: 4px;\n border: none;\n background: var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));\n border-bottom: 1px solid\n var(\n --xy-controls-button-border-color-props,\n var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default))\n );\n color: var(\n --xy-controls-button-color-props,\n var(--xy-controls-button-color, var(--xy-controls-button-color-default))\n );\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n }\n.react-flow__controls-button svg {\n width: 100%;\n max-width: 12px;\n max-height: 12px;\n fill: currentColor;\n }\n.react-flow__edge.updating .react-flow__edge-path {\n stroke: #777;\n }\n.react-flow__edge-text {\n font-size: 10px;\n }\n.react-flow__node.selectable:focus,\n .react-flow__node.selectable:focus-visible {\n outline: none;\n }\n.react-flow__node-input,\n.react-flow__node-default,\n.react-flow__node-output,\n.react-flow__node-group {\n padding: 10px;\n border-radius: var(--xy-node-border-radius, var(--xy-node-border-radius-default));\n width: 150px;\n font-size: 12px;\n color: var(--xy-node-color, var(--xy-node-color-default));\n text-align: center;\n border: var(--xy-node-border, var(--xy-node-border-default));\n background-color: var(--xy-node-background-color, var(--xy-node-background-color-default));\n}\n.react-flow__node-input.selectable:hover, .react-flow__node-default.selectable:hover, .react-flow__node-output.selectable:hover, .react-flow__node-group.selectable:hover {\n box-shadow: var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default));\n }\n.react-flow__node-input.selectable.selected,\n .react-flow__node-input.selectable:focus,\n .react-flow__node-input.selectable:focus-visible,\n .react-flow__node-default.selectable.selected,\n .react-flow__node-default.selectable:focus,\n .react-flow__node-default.selectable:focus-visible,\n .react-flow__node-output.selectable.selected,\n .react-flow__node-output.selectable:focus,\n .react-flow__node-output.selectable:focus-visible,\n .react-flow__node-group.selectable.selected,\n .react-flow__node-group.selectable:focus,\n .react-flow__node-group.selectable:focus-visible {\n box-shadow: var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default));\n }\n.react-flow__node-group {\n background-color: var(--xy-node-group-background-color, var(--xy-node-group-background-color-default));\n}\n.react-flow__nodesselection-rect,\n.react-flow__selection {\n background: var(--xy-selection-background-color, var(--xy-selection-background-color-default));\n border: var(--xy-selection-border, var(--xy-selection-border-default));\n}\n.react-flow__nodesselection-rect:focus,\n .react-flow__nodesselection-rect:focus-visible,\n .react-flow__selection:focus,\n .react-flow__selection:focus-visible {\n outline: none;\n }\n.react-flow__controls-button:hover {\n background: var(\n --xy-controls-button-background-color-hover-props,\n var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default))\n );\n color: var(\n --xy-controls-button-color-hover-props,\n var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default))\n );\n }\n.react-flow__controls-button:disabled {\n pointer-events: none;\n }\n.react-flow__controls-button:disabled svg {\n fill-opacity: 0.4;\n }\n.react-flow__controls-button:last-child {\n border-bottom: none;\n }\n.react-flow__controls.horizontal .react-flow__controls-button {\n border-bottom: none;\n border-right: 1px solid\n var(\n --xy-controls-button-border-color-props,\n var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default))\n );\n }\n.react-flow__controls.horizontal .react-flow__controls-button:last-child {\n border-right: none;\n }\n.react-flow__resize-control {\n position: absolute;\n}\n.react-flow__resize-control.left,\n.react-flow__resize-control.right {\n cursor: ew-resize;\n}\n.react-flow__resize-control.top,\n.react-flow__resize-control.bottom {\n cursor: ns-resize;\n}\n.react-flow__resize-control.top.left,\n.react-flow__resize-control.bottom.right {\n cursor: nwse-resize;\n}\n.react-flow__resize-control.bottom.left,\n.react-flow__resize-control.top.right {\n cursor: nesw-resize;\n}\n/* handle styles */\n.react-flow__resize-control.handle {\n width: 4px;\n height: 4px;\n border: 1px solid #fff;\n border-radius: 1px;\n background-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default));\n transform: translate(-50%, -50%);\n}\n.react-flow__resize-control.handle.left {\n left: 0;\n top: 50%;\n}\n.react-flow__resize-control.handle.right {\n left: 100%;\n top: 50%;\n}\n.react-flow__resize-control.handle.top {\n left: 50%;\n top: 0;\n}\n.react-flow__resize-control.handle.bottom {\n left: 50%;\n top: 100%;\n}\n.react-flow__resize-control.handle.top.left {\n left: 0;\n}\n.react-flow__resize-control.handle.bottom.left {\n left: 0;\n}\n.react-flow__resize-control.handle.top.right {\n left: 100%;\n}\n.react-flow__resize-control.handle.bottom.right {\n left: 100%;\n}\n/* line styles */\n.react-flow__resize-control.line {\n border-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default));\n border-width: 0;\n border-style: solid;\n}\n.react-flow__resize-control.line.left,\n.react-flow__resize-control.line.right {\n width: 1px;\n transform: translate(-50%, 0);\n top: 0;\n height: 100%;\n}\n.react-flow__resize-control.line.left {\n left: 0;\n border-left-width: 1px;\n}\n.react-flow__resize-control.line.right {\n left: 100%;\n border-right-width: 1px;\n}\n.react-flow__resize-control.line.top,\n.react-flow__resize-control.line.bottom {\n height: 1px;\n transform: translate(0, -50%);\n left: 0;\n width: 100%;\n}\n.react-flow__resize-control.line.top {\n top: 0;\n border-top-width: 1px;\n}\n.react-flow__resize-control.line.bottom {\n border-bottom-width: 1px;\n top: 100%;\n}\n.react-flow__edge-textbg {\n fill: var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default));\n}\n.react-flow__edge-text {\n fill: var(--xy-edge-label-color, var(--xy-edge-label-color-default));\n}\n";
1093
1055
  styleInject(css_248z);
1094
1056
 
1095
1057
  var jsxRuntime = {exports: {}};
@@ -5551,7 +5513,7 @@ const rendererPointToPoint = ({ x, y }, [tx, ty, tScale]) => {
5551
5513
  */
5552
5514
  function parsePadding(padding, viewport) {
5553
5515
  if (typeof padding === 'number') {
5554
- return Math.floor(viewport - viewport / (1 + padding));
5516
+ return Math.floor((viewport - viewport / (1 + padding)) * 0.5);
5555
5517
  }
5556
5518
  if (typeof padding === 'string' && padding.endsWith('px')) {
5557
5519
  const paddingValue = parseFloat(padding);
@@ -5709,6 +5671,19 @@ function areSetsEqual(a, b) {
5709
5671
  }
5710
5672
  return true;
5711
5673
  }
5674
+ /**
5675
+ * Polyfill for Promise.withResolvers until we can use it in all browsers
5676
+ * @internal
5677
+ */
5678
+ function withResolvers() {
5679
+ let resolve;
5680
+ let reject;
5681
+ const promise = new Promise((res, rej) => {
5682
+ resolve = res;
5683
+ reject = rej;
5684
+ });
5685
+ return { promise, resolve, reject };
5686
+ }
5712
5687
 
5713
5688
  function getPointerPosition(event, { snapGrid = [0, 0], snapToGrid = false, transform, containerBounds }) {
5714
5689
  const { x, y } = getEventPosition(event);
@@ -6335,7 +6310,7 @@ function updateAbsolutePositions(nodeLookup, parentLookup, options) {
6335
6310
  }
6336
6311
  function adoptUserNodes(nodes, nodeLookup, parentLookup, options) {
6337
6312
  const _options = mergeObjects(adoptUserNodesDefaultOptions, options);
6338
- let nodesInitialized = true;
6313
+ let nodesInitialized = nodes.length > 0;
6339
6314
  const tmpLookup = new Map(nodeLookup);
6340
6315
  const selectedNodeZ = _options?.elevateNodesOnSelect ? 1000 : 0;
6341
6316
  nodeLookup.clear();
@@ -6366,7 +6341,9 @@ function adoptUserNodes(nodes, nodeLookup, parentLookup, options) {
6366
6341
  };
6367
6342
  nodeLookup.set(userNode.id, internalNode);
6368
6343
  }
6369
- if ((!internalNode.measured || !internalNode.measured.width || !internalNode.measured.height) &&
6344
+ if ((internalNode.measured === undefined ||
6345
+ internalNode.measured.width === undefined ||
6346
+ internalNode.measured.height === undefined) &&
6370
6347
  !internalNode.hidden) {
6371
6348
  nodesInitialized = false;
6372
6349
  }
@@ -7959,7 +7936,7 @@ function nodeToChildExtent(child, parent, nodeOrigin) {
7959
7936
  }
7960
7937
  function XYResizer({ domNode, nodeId, getStoreItems, onChange, onEnd }) {
7961
7938
  const selection = select(domNode);
7962
- function update({ controlPosition, boundaries, keepAspectRatio, onResizeStart, onResize, onResizeEnd, shouldResize, }) {
7939
+ function update({ controlPosition, boundaries, keepAspectRatio, resizeDirection, onResizeStart, onResize, onResizeEnd, shouldResize, }) {
7963
7940
  let prevValues = { ...initPrevValues$1 };
7964
7941
  let startValues = { ...initStartValues };
7965
7942
  const controlDirection = getControlDirection(controlPosition);
@@ -8074,8 +8051,10 @@ function XYResizer({ domNode, nodeId, getStoreItems, onChange, onEnd }) {
8074
8051
  }
8075
8052
  }
8076
8053
  if (isWidthChange || isHeightChange) {
8077
- change.width = isWidthChange ? width : prevValues.width;
8078
- change.height = isHeightChange ? height : prevValues.height;
8054
+ change.width =
8055
+ isWidthChange && (!resizeDirection || resizeDirection === 'horizontal') ? width : prevValues.width;
8056
+ change.height =
8057
+ isHeightChange && (!resizeDirection || resizeDirection === 'vertical') ? height : prevValues.height;
8079
8058
  prevValues.width = change.width;
8080
8059
  prevValues.height = change.height;
8081
8060
  }
@@ -9304,8 +9283,12 @@ function applyChange(change, element) {
9304
9283
  element.measured.width = change.dimensions.width;
9305
9284
  element.measured.height = change.dimensions.height;
9306
9285
  if (change.setAttributes) {
9307
- element.width = change.dimensions.width;
9308
- element.height = change.dimensions.height;
9286
+ if (change.setAttributes === true || change.setAttributes === 'width') {
9287
+ element.width = change.dimensions.width;
9288
+ }
9289
+ if (change.setAttributes === true || change.setAttributes === 'height') {
9290
+ element.height = change.dimensions.height;
9291
+ }
9309
9292
  }
9310
9293
  }
9311
9294
  if (typeof change.resizing === 'boolean') {
@@ -9561,29 +9544,26 @@ function BatchProvider({ children, }) {
9561
9544
  for (const payload of queueItems) {
9562
9545
  next = typeof payload === 'function' ? payload(next) : payload;
9563
9546
  }
9547
+ const changes = getElementsDiffChanges({
9548
+ items: next,
9549
+ lookup: nodeLookup,
9550
+ });
9564
9551
  if (hasDefaultNodes) {
9565
9552
  setNodes(next);
9566
9553
  }
9567
- else {
9568
- // When a controlled flow is used we need to collect the changes
9569
- const changes = getElementsDiffChanges({
9570
- items: next,
9571
- lookup: nodeLookup,
9554
+ // We only want to fire onNodesChange if there are changes to the nodes
9555
+ if (changes.length > 0) {
9556
+ onNodesChange?.(changes);
9557
+ }
9558
+ else if (fitViewQueued) {
9559
+ // If there are no changes to the nodes, we still need to call setNodes
9560
+ // to trigger a re-render and fitView.
9561
+ window.requestAnimationFrame(() => {
9562
+ const { fitViewQueued, nodes, setNodes } = store.getState();
9563
+ if (fitViewQueued) {
9564
+ setNodes(nodes);
9565
+ }
9572
9566
  });
9573
- // We only want to fire onNodesChange if there are changes to the nodes
9574
- if (changes.length > 0) {
9575
- onNodesChange?.(changes);
9576
- }
9577
- else if (fitViewQueued) {
9578
- // If there are no changes to the nodes, we still need to call setNodes
9579
- // to trigger a re-render and fitView.
9580
- window.requestAnimationFrame(() => {
9581
- const { fitViewQueued, nodes, setNodes } = store.getState();
9582
- if (fitViewQueued) {
9583
- setNodes(nodes);
9584
- }
9585
- });
9586
- }
9587
9567
  }
9588
9568
  }, []);
9589
9569
  const nodeQueue = useQueue(nodeQueueHandler);
@@ -9803,7 +9783,7 @@ function useReactFlow() {
9803
9783
  fitView: async (options) => {
9804
9784
  // We either create a new Promise or reuse the existing one
9805
9785
  // Even if fitView is called multiple times in a row, we only end up with a single Promise
9806
- const fitViewResolver = store.getState().fitViewResolver ?? Promise.withResolvers();
9786
+ const fitViewResolver = store.getState().fitViewResolver ?? withResolvers();
9807
9787
  // We schedule a fitView by setting fitViewQueued and triggering a setNodes
9808
9788
  store.setState({ fitViewQueued: true, fitViewOptions: options, fitViewResolver });
9809
9789
  batchContext.nodeQueue.push((nodes) => [...nodes]);
@@ -10942,7 +10922,7 @@ const MarkerDefinitions = ({ defaultColor, rfId }) => {
10942
10922
  if (!markers.length) {
10943
10923
  return null;
10944
10924
  }
10945
- return (jsxRuntimeExports.jsx("svg", { className: "react-flow__marker", children: jsxRuntimeExports.jsx("defs", { children: markers.map((marker) => (jsxRuntimeExports.jsx(Marker, { id: marker.id, type: marker.type, color: marker.color, width: marker.width, height: marker.height, markerUnits: marker.markerUnits, strokeWidth: marker.strokeWidth, orient: marker.orient }, marker.id))) }) }));
10925
+ return (jsxRuntimeExports.jsx("svg", { className: "react-flow__marker", "aria-hidden": "true", children: jsxRuntimeExports.jsx("defs", { children: markers.map((marker) => (jsxRuntimeExports.jsx(Marker, { id: marker.id, type: marker.type, color: marker.color, width: marker.width, height: marker.height, markerUnits: marker.markerUnits, strokeWidth: marker.strokeWidth, orient: marker.orient }, marker.id))) }) }));
10946
10926
  };
10947
10927
  MarkerDefinitions.displayName = 'MarkerDefinitions';
10948
10928
  var MarkerDefinitions$1 = memo(MarkerDefinitions);
@@ -11678,7 +11658,7 @@ function GraphViewComponent({ nodeTypes, edgeTypes, onInit, onNodeClick, onEdgeC
11678
11658
  GraphViewComponent.displayName = 'GraphView';
11679
11659
  const GraphView = memo(GraphViewComponent);
11680
11660
 
11681
- const getInitialState = ({ nodes, edges, defaultNodes, defaultEdges, width, height, fitView, nodeOrigin, nodeExtent, } = {}) => {
11661
+ const getInitialState = ({ nodes, edges, defaultNodes, defaultEdges, width, height, fitView, fitViewOptions, minZoom = 0.5, maxZoom = 2, nodeOrigin, nodeExtent, } = {}) => {
11682
11662
  const nodeLookup = new Map();
11683
11663
  const parentLookup = new Map();
11684
11664
  const connectionLookup = new Map();
@@ -11688,7 +11668,7 @@ const getInitialState = ({ nodes, edges, defaultNodes, defaultEdges, width, heig
11688
11668
  const storeNodeOrigin = nodeOrigin ?? [0, 0];
11689
11669
  const storeNodeExtent = nodeExtent ?? infiniteExtent;
11690
11670
  updateConnectionLookup(connectionLookup, edgeLookup, storeEdges);
11691
- adoptUserNodes(storeNodes, nodeLookup, parentLookup, {
11671
+ const nodesInitialized = adoptUserNodes(storeNodes, nodeLookup, parentLookup, {
11692
11672
  nodeOrigin: storeNodeOrigin,
11693
11673
  nodeExtent: storeNodeExtent,
11694
11674
  elevateNodesOnSelect: false,
@@ -11698,7 +11678,7 @@ const getInitialState = ({ nodes, edges, defaultNodes, defaultEdges, width, heig
11698
11678
  const bounds = getInternalNodesBounds(nodeLookup, {
11699
11679
  filter: (node) => !!((node.width || node.initialWidth) && (node.height || node.initialHeight)),
11700
11680
  });
11701
- const { x, y, zoom } = getViewportForBounds(bounds, width, height, 0.5, 2, 0.1);
11681
+ const { x, y, zoom } = getViewportForBounds(bounds, width, height, minZoom, maxZoom, fitViewOptions?.padding ?? 0.1);
11702
11682
  transform = [x, y, zoom];
11703
11683
  }
11704
11684
  return {
@@ -11707,6 +11687,7 @@ const getInitialState = ({ nodes, edges, defaultNodes, defaultEdges, width, heig
11707
11687
  height: 0,
11708
11688
  transform,
11709
11689
  nodes: storeNodes,
11690
+ nodesInitialized,
11710
11691
  nodeLookup,
11711
11692
  parentLookup,
11712
11693
  edges: storeEdges,
@@ -11717,8 +11698,8 @@ const getInitialState = ({ nodes, edges, defaultNodes, defaultEdges, width, heig
11717
11698
  hasDefaultNodes: defaultNodes !== undefined,
11718
11699
  hasDefaultEdges: defaultEdges !== undefined,
11719
11700
  panZoom: null,
11720
- minZoom: 0.5,
11721
- maxZoom: 2,
11701
+ minZoom,
11702
+ maxZoom,
11722
11703
  translateExtent: infiniteExtent,
11723
11704
  nodeExtent: storeNodeExtent,
11724
11705
  nodesSelectionActive: false,
@@ -11743,7 +11724,7 @@ const getInitialState = ({ nodes, edges, defaultNodes, defaultEdges, width, heig
11743
11724
  selectNodesOnDrag: true,
11744
11725
  multiSelectionActive: false,
11745
11726
  fitViewQueued: fitView ?? false,
11746
- fitViewOptions: undefined,
11727
+ fitViewOptions,
11747
11728
  fitViewResolver: null,
11748
11729
  connection: { ...initialConnection },
11749
11730
  connectionClickStartHandle: null,
@@ -11761,7 +11742,7 @@ const getInitialState = ({ nodes, edges, defaultNodes, defaultEdges, width, heig
11761
11742
  };
11762
11743
  };
11763
11744
 
11764
- const createStore = ({ nodes, edges, defaultNodes, defaultEdges, width, height, fitView, nodeOrigin, nodeExtent, }) => createWithEqualityFn((set, get) => {
11745
+ const createStore = ({ nodes, edges, defaultNodes, defaultEdges, width, height, fitView, fitViewOptions, minZoom, maxZoom, nodeOrigin, nodeExtent, }) => createWithEqualityFn((set, get) => {
11765
11746
  async function resolveFitView() {
11766
11747
  const { nodeLookup, panZoom, fitViewOptions, fitViewResolver, width, height, minZoom, maxZoom } = get();
11767
11748
  if (!panZoom) {
@@ -11783,7 +11764,20 @@ const createStore = ({ nodes, edges, defaultNodes, defaultEdges, width, height,
11783
11764
  set({ fitViewResolver: null });
11784
11765
  }
11785
11766
  return {
11786
- ...getInitialState({ nodes, edges, width, height, fitView, nodeOrigin, nodeExtent, defaultNodes, defaultEdges }),
11767
+ ...getInitialState({
11768
+ nodes,
11769
+ edges,
11770
+ width,
11771
+ height,
11772
+ fitView,
11773
+ fitViewOptions,
11774
+ minZoom,
11775
+ maxZoom,
11776
+ nodeOrigin,
11777
+ nodeExtent,
11778
+ defaultNodes,
11779
+ defaultEdges,
11780
+ }),
11787
11781
  setNodes: (nodes) => {
11788
11782
  const { nodeLookup, parentLookup, nodeOrigin, elevateNodesOnSelect, fitViewQueued } = get();
11789
11783
  /*
@@ -11802,10 +11796,10 @@ const createStore = ({ nodes, edges, defaultNodes, defaultEdges, width, height,
11802
11796
  });
11803
11797
  if (fitViewQueued && nodesInitialized) {
11804
11798
  resolveFitView();
11805
- set({ nodes, fitViewQueued: false, fitViewOptions: undefined });
11799
+ set({ nodes, nodesInitialized, fitViewQueued: false, fitViewOptions: undefined });
11806
11800
  }
11807
11801
  else {
11808
- set({ nodes });
11802
+ set({ nodes, nodesInitialized });
11809
11803
  }
11810
11804
  },
11811
11805
  setEdges: (edges) => {
@@ -11974,7 +11968,10 @@ const createStore = ({ nodes, edges, defaultNodes, defaultEdges, width, height,
11974
11968
  get().panZoom?.setClickDistance(clickDistance);
11975
11969
  },
11976
11970
  resetSelectedElements: () => {
11977
- const { edges, nodes, triggerNodeChanges, triggerEdgeChanges } = get();
11971
+ const { edges, nodes, triggerNodeChanges, triggerEdgeChanges, elementsSelectable } = get();
11972
+ if (!elementsSelectable) {
11973
+ return;
11974
+ }
11978
11975
  const nodeChanges = nodes.reduce((res, node) => (node.selected ? [...res, createSelectionChange(node.id, false)] : res), []);
11979
11976
  const edgeChanges = edges.reduce((res, edge) => (edge.selected ? [...res, createSelectionChange(edge.id, false)] : res), []);
11980
11977
  triggerNodeChanges(nodeChanges);
@@ -12046,7 +12043,7 @@ const createStore = ({ nodes, edges, defaultNodes, defaultEdges, width, height,
12046
12043
  * your router. If you have multiple flows on the same page you will need to use a separate
12047
12044
  * `<ReactFlowProvider />` for each flow.
12048
12045
  */
12049
- function ReactFlowProvider({ initialNodes: nodes, initialEdges: edges, defaultNodes, defaultEdges, initialWidth: width, initialHeight: height, fitView, nodeOrigin, nodeExtent, children, }) {
12046
+ function ReactFlowProvider({ initialNodes: nodes, initialEdges: edges, defaultNodes, defaultEdges, initialWidth: width, initialHeight: height, initialMinZoom: minZoom, initialMaxZoom: maxZoom, initialFitViewOptions: fitViewOptions, fitView, nodeOrigin, nodeExtent, children, }) {
12050
12047
  const [store] = useState(() => createStore({
12051
12048
  nodes,
12052
12049
  edges,
@@ -12055,13 +12052,16 @@ function ReactFlowProvider({ initialNodes: nodes, initialEdges: edges, defaultNo
12055
12052
  width,
12056
12053
  height,
12057
12054
  fitView,
12055
+ minZoom,
12056
+ maxZoom,
12057
+ fitViewOptions,
12058
12058
  nodeOrigin,
12059
12059
  nodeExtent,
12060
12060
  }));
12061
12061
  return (jsxRuntimeExports.jsx(Provider$1, { value: store, children: jsxRuntimeExports.jsx(BatchProvider, { children: children }) }));
12062
12062
  }
12063
12063
 
12064
- function Wrapper({ children, nodes, edges, defaultNodes, defaultEdges, width, height, fitView, nodeOrigin, nodeExtent, }) {
12064
+ function Wrapper({ children, nodes, edges, defaultNodes, defaultEdges, width, height, fitView, fitViewOptions, minZoom, maxZoom, nodeOrigin, nodeExtent, }) {
12065
12065
  const isWrapped = useContext(StoreContext);
12066
12066
  if (isWrapped) {
12067
12067
  /*
@@ -12070,7 +12070,7 @@ function Wrapper({ children, nodes, edges, defaultNodes, defaultEdges, width, he
12070
12070
  */
12071
12071
  return jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment, { children: children });
12072
12072
  }
12073
- return (jsxRuntimeExports.jsx(ReactFlowProvider, { initialNodes: nodes, initialEdges: edges, defaultNodes: defaultNodes, defaultEdges: defaultEdges, initialWidth: width, initialHeight: height, fitView: fitView, nodeOrigin: nodeOrigin, nodeExtent: nodeExtent, children: children }));
12073
+ return (jsxRuntimeExports.jsx(ReactFlowProvider, { initialNodes: nodes, initialEdges: edges, defaultNodes: defaultNodes, defaultEdges: defaultEdges, initialWidth: width, initialHeight: height, fitView: fitView, initialFitViewOptions: fitViewOptions, initialMinZoom: minZoom, initialMaxZoom: maxZoom, nodeOrigin: nodeOrigin, nodeExtent: nodeExtent, children: children }));
12074
12074
  }
12075
12075
 
12076
12076
  const wrapperStyle = {
@@ -12088,7 +12088,7 @@ function ReactFlow({ nodes, edges, defaultNodes, defaultEdges, className, nodeTy
12088
12088
  e.currentTarget.scrollTo({ top: 0, left: 0, behavior: 'instant' });
12089
12089
  onScroll?.(e);
12090
12090
  }, [onScroll]);
12091
- return (jsxRuntimeExports.jsx("div", { "data-testid": "rf__wrapper", ...rest, onScroll: wrapperOnScroll, style: { ...style, ...wrapperStyle }, ref: ref, className: cc(['react-flow', className, colorModeClassName]), id: id, children: jsxRuntimeExports.jsxs(Wrapper, { nodes: nodes, edges: edges, width: width, height: height, fitView: fitView, nodeOrigin: nodeOrigin, nodeExtent: nodeExtent, children: [jsxRuntimeExports.jsx(GraphView, { onInit: onInit, onNodeClick: onNodeClick, onEdgeClick: onEdgeClick, onNodeMouseEnter: onNodeMouseEnter, onNodeMouseMove: onNodeMouseMove, onNodeMouseLeave: onNodeMouseLeave, onNodeContextMenu: onNodeContextMenu, onNodeDoubleClick: onNodeDoubleClick, nodeTypes: nodeTypes, edgeTypes: edgeTypes, connectionLineType: connectionLineType, connectionLineStyle: connectionLineStyle, connectionLineComponent: connectionLineComponent, connectionLineContainerStyle: connectionLineContainerStyle, selectionKeyCode: selectionKeyCode, selectionOnDrag: selectionOnDrag, selectionMode: selectionMode, deleteKeyCode: deleteKeyCode, multiSelectionKeyCode: multiSelectionKeyCode, panActivationKeyCode: panActivationKeyCode, zoomActivationKeyCode: zoomActivationKeyCode, onlyRenderVisibleElements: onlyRenderVisibleElements, defaultViewport: defaultViewport$1, translateExtent: translateExtent, minZoom: minZoom, maxZoom: maxZoom, preventScrolling: preventScrolling, zoomOnScroll: zoomOnScroll, zoomOnPinch: zoomOnPinch, zoomOnDoubleClick: zoomOnDoubleClick, panOnScroll: panOnScroll, panOnScrollSpeed: panOnScrollSpeed, panOnScrollMode: panOnScrollMode, panOnDrag: panOnDrag, onPaneClick: onPaneClick, onPaneMouseEnter: onPaneMouseEnter, onPaneMouseMove: onPaneMouseMove, onPaneMouseLeave: onPaneMouseLeave, onPaneScroll: onPaneScroll, onPaneContextMenu: onPaneContextMenu, paneClickDistance: paneClickDistance, nodeClickDistance: nodeClickDistance, onSelectionContextMenu: onSelectionContextMenu, onSelectionStart: onSelectionStart, onSelectionEnd: onSelectionEnd, onReconnect: onReconnect, onReconnectStart: onReconnectStart, onReconnectEnd: onReconnectEnd, onEdgeContextMenu: onEdgeContextMenu, onEdgeDoubleClick: onEdgeDoubleClick, onEdgeMouseEnter: onEdgeMouseEnter, onEdgeMouseMove: onEdgeMouseMove, onEdgeMouseLeave: onEdgeMouseLeave, reconnectRadius: reconnectRadius, defaultMarkerColor: defaultMarkerColor, noDragClassName: noDragClassName, noWheelClassName: noWheelClassName, noPanClassName: noPanClassName, rfId: rfId, disableKeyboardA11y: disableKeyboardA11y, nodeExtent: nodeExtent, viewport: viewport, onViewportChange: onViewportChange }), jsxRuntimeExports.jsx(StoreUpdater, { nodes: nodes, edges: edges, defaultNodes: defaultNodes, defaultEdges: defaultEdges, onConnect: onConnect, onConnectStart: onConnectStart, onConnectEnd: onConnectEnd, onClickConnectStart: onClickConnectStart, onClickConnectEnd: onClickConnectEnd, nodesDraggable: nodesDraggable, nodesConnectable: nodesConnectable, nodesFocusable: nodesFocusable, edgesFocusable: edgesFocusable, edgesReconnectable: edgesReconnectable, elementsSelectable: elementsSelectable, elevateNodesOnSelect: elevateNodesOnSelect, elevateEdgesOnSelect: elevateEdgesOnSelect, minZoom: minZoom, maxZoom: maxZoom, nodeExtent: nodeExtent, onNodesChange: onNodesChange, onEdgesChange: onEdgesChange, snapToGrid: snapToGrid, snapGrid: snapGrid, connectionMode: connectionMode, translateExtent: translateExtent, connectOnClick: connectOnClick, defaultEdgeOptions: defaultEdgeOptions, fitView: fitView, fitViewOptions: fitViewOptions, onNodesDelete: onNodesDelete, onEdgesDelete: onEdgesDelete, onDelete: onDelete, onNodeDragStart: onNodeDragStart, onNodeDrag: onNodeDrag, onNodeDragStop: onNodeDragStop, onSelectionDrag: onSelectionDrag, onSelectionDragStart: onSelectionDragStart, onSelectionDragStop: onSelectionDragStop, onMove: onMove, onMoveStart: onMoveStart, onMoveEnd: onMoveEnd, noPanClassName: noPanClassName, nodeOrigin: nodeOrigin, rfId: rfId, autoPanOnConnect: autoPanOnConnect, autoPanOnNodeDrag: autoPanOnNodeDrag, autoPanSpeed: autoPanSpeed, onError: onError, connectionRadius: connectionRadius, isValidConnection: isValidConnection, selectNodesOnDrag: selectNodesOnDrag, nodeDragThreshold: nodeDragThreshold, onBeforeDelete: onBeforeDelete, paneClickDistance: paneClickDistance, debug: debug }), jsxRuntimeExports.jsx(SelectionListener, { onSelectionChange: onSelectionChange }), children, jsxRuntimeExports.jsx(Attribution, { proOptions: proOptions, position: attributionPosition }), jsxRuntimeExports.jsx(A11yDescriptions, { rfId: rfId, disableKeyboardA11y: disableKeyboardA11y })] }) }));
12091
+ return (jsxRuntimeExports.jsx("div", { "data-testid": "rf__wrapper", ...rest, onScroll: wrapperOnScroll, style: { ...style, ...wrapperStyle }, ref: ref, className: cc(['react-flow', className, colorModeClassName]), id: id, children: jsxRuntimeExports.jsxs(Wrapper, { nodes: nodes, edges: edges, width: width, height: height, fitView: fitView, fitViewOptions: fitViewOptions, minZoom: minZoom, maxZoom: maxZoom, nodeOrigin: nodeOrigin, nodeExtent: nodeExtent, children: [jsxRuntimeExports.jsx(GraphView, { onInit: onInit, onNodeClick: onNodeClick, onEdgeClick: onEdgeClick, onNodeMouseEnter: onNodeMouseEnter, onNodeMouseMove: onNodeMouseMove, onNodeMouseLeave: onNodeMouseLeave, onNodeContextMenu: onNodeContextMenu, onNodeDoubleClick: onNodeDoubleClick, nodeTypes: nodeTypes, edgeTypes: edgeTypes, connectionLineType: connectionLineType, connectionLineStyle: connectionLineStyle, connectionLineComponent: connectionLineComponent, connectionLineContainerStyle: connectionLineContainerStyle, selectionKeyCode: selectionKeyCode, selectionOnDrag: selectionOnDrag, selectionMode: selectionMode, deleteKeyCode: deleteKeyCode, multiSelectionKeyCode: multiSelectionKeyCode, panActivationKeyCode: panActivationKeyCode, zoomActivationKeyCode: zoomActivationKeyCode, onlyRenderVisibleElements: onlyRenderVisibleElements, defaultViewport: defaultViewport$1, translateExtent: translateExtent, minZoom: minZoom, maxZoom: maxZoom, preventScrolling: preventScrolling, zoomOnScroll: zoomOnScroll, zoomOnPinch: zoomOnPinch, zoomOnDoubleClick: zoomOnDoubleClick, panOnScroll: panOnScroll, panOnScrollSpeed: panOnScrollSpeed, panOnScrollMode: panOnScrollMode, panOnDrag: panOnDrag, onPaneClick: onPaneClick, onPaneMouseEnter: onPaneMouseEnter, onPaneMouseMove: onPaneMouseMove, onPaneMouseLeave: onPaneMouseLeave, onPaneScroll: onPaneScroll, onPaneContextMenu: onPaneContextMenu, paneClickDistance: paneClickDistance, nodeClickDistance: nodeClickDistance, onSelectionContextMenu: onSelectionContextMenu, onSelectionStart: onSelectionStart, onSelectionEnd: onSelectionEnd, onReconnect: onReconnect, onReconnectStart: onReconnectStart, onReconnectEnd: onReconnectEnd, onEdgeContextMenu: onEdgeContextMenu, onEdgeDoubleClick: onEdgeDoubleClick, onEdgeMouseEnter: onEdgeMouseEnter, onEdgeMouseMove: onEdgeMouseMove, onEdgeMouseLeave: onEdgeMouseLeave, reconnectRadius: reconnectRadius, defaultMarkerColor: defaultMarkerColor, noDragClassName: noDragClassName, noWheelClassName: noWheelClassName, noPanClassName: noPanClassName, rfId: rfId, disableKeyboardA11y: disableKeyboardA11y, nodeExtent: nodeExtent, viewport: viewport, onViewportChange: onViewportChange }), jsxRuntimeExports.jsx(StoreUpdater, { nodes: nodes, edges: edges, defaultNodes: defaultNodes, defaultEdges: defaultEdges, onConnect: onConnect, onConnectStart: onConnectStart, onConnectEnd: onConnectEnd, onClickConnectStart: onClickConnectStart, onClickConnectEnd: onClickConnectEnd, nodesDraggable: nodesDraggable, nodesConnectable: nodesConnectable, nodesFocusable: nodesFocusable, edgesFocusable: edgesFocusable, edgesReconnectable: edgesReconnectable, elementsSelectable: elementsSelectable, elevateNodesOnSelect: elevateNodesOnSelect, elevateEdgesOnSelect: elevateEdgesOnSelect, minZoom: minZoom, maxZoom: maxZoom, nodeExtent: nodeExtent, onNodesChange: onNodesChange, onEdgesChange: onEdgesChange, snapToGrid: snapToGrid, snapGrid: snapGrid, connectionMode: connectionMode, translateExtent: translateExtent, connectOnClick: connectOnClick, defaultEdgeOptions: defaultEdgeOptions, fitView: fitView, fitViewOptions: fitViewOptions, onNodesDelete: onNodesDelete, onEdgesDelete: onEdgesDelete, onDelete: onDelete, onNodeDragStart: onNodeDragStart, onNodeDrag: onNodeDrag, onNodeDragStop: onNodeDragStop, onSelectionDrag: onSelectionDrag, onSelectionDragStart: onSelectionDragStart, onSelectionDragStop: onSelectionDragStop, onMove: onMove, onMoveStart: onMoveStart, onMoveEnd: onMoveEnd, noPanClassName: noPanClassName, nodeOrigin: nodeOrigin, rfId: rfId, autoPanOnConnect: autoPanOnConnect, autoPanOnNodeDrag: autoPanOnNodeDrag, autoPanSpeed: autoPanSpeed, onError: onError, connectionRadius: connectionRadius, isValidConnection: isValidConnection, selectNodesOnDrag: selectNodesOnDrag, nodeDragThreshold: nodeDragThreshold, onBeforeDelete: onBeforeDelete, paneClickDistance: paneClickDistance, debug: debug }), jsxRuntimeExports.jsx(SelectionListener, { onSelectionChange: onSelectionChange }), children, jsxRuntimeExports.jsx(Attribution, { proOptions: proOptions, position: attributionPosition }), jsxRuntimeExports.jsx(A11yDescriptions, { rfId: rfId, disableKeyboardA11y: disableKeyboardA11y })] }) }));
12092
12092
  }
12093
12093
  /**
12094
12094
  * The `<ReactFlow />` component is the heart of your React Flow application.
@@ -12475,7 +12475,7 @@ ControlsComponent.displayName = 'Controls';
12475
12475
  * @remarks To extend or customise the controls, you can use the [`<ControlButton />`](/api-reference/components/control-button) component
12476
12476
  *
12477
12477
  */
12478
- const Controls$1 = memo(ControlsComponent);
12478
+ const Controls = memo(ControlsComponent);
12479
12479
 
12480
12480
  function MiniMapNodeComponent({ id, x, y, width, height, style, color, strokeColor, strokeWidth, className, borderRadius, shapeRendering, selected, onClick, }) {
12481
12481
  const { background, backgroundColor } = style || {};
@@ -12652,7 +12652,7 @@ MiniMapComponent.displayName = 'MiniMap';
12652
12652
  */
12653
12653
  memo(MiniMapComponent);
12654
12654
 
12655
- function ResizeControl({ nodeId, position, variant = ResizeControlVariant.Handle, className, style = {}, children, color, minWidth = 10, minHeight = 10, maxWidth = Number.MAX_VALUE, maxHeight = Number.MAX_VALUE, keepAspectRatio = false, shouldResize, onResizeStart, onResize, onResizeEnd, }) {
12655
+ function ResizeControl({ nodeId, position, variant = ResizeControlVariant.Handle, className, style = {}, children, color, minWidth = 10, minHeight = 10, maxWidth = Number.MAX_VALUE, maxHeight = Number.MAX_VALUE, keepAspectRatio = false, resizeDirection, shouldResize, onResizeStart, onResize, onResizeEnd, }) {
12656
12656
  const contextNodeId = useNodeId();
12657
12657
  const id = typeof nodeId === 'string' ? nodeId : contextNodeId;
12658
12658
  const store = useStoreApi();
@@ -12718,11 +12718,12 @@ function ResizeControl({ nodeId, position, variant = ResizeControlVariant.Handle
12718
12718
  changes.push(positionChange);
12719
12719
  }
12720
12720
  if (change.width !== undefined && change.height !== undefined) {
12721
+ const setAttributes = !resizeDirection ? true : resizeDirection === 'horizontal' ? 'width' : 'height';
12721
12722
  const dimensionChange = {
12722
12723
  id,
12723
12724
  type: 'dimensions',
12724
12725
  resizing: true,
12725
- setAttributes: true,
12726
+ setAttributes,
12726
12727
  dimensions: {
12727
12728
  width: change.width,
12728
12729
  height: change.height,
@@ -12762,6 +12763,7 @@ function ResizeControl({ nodeId, position, variant = ResizeControlVariant.Handle
12762
12763
  maxHeight,
12763
12764
  },
12764
12765
  keepAspectRatio,
12766
+ resizeDirection,
12765
12767
  onResizeStart,
12766
12768
  onResize,
12767
12769
  onResizeEnd,
@@ -12794,7 +12796,7 @@ function ResizeControl({ nodeId, position, variant = ResizeControlVariant.Handle
12794
12796
  */
12795
12797
  memo(ResizeControl);
12796
12798
 
12797
- const Container$i = styled(FlexColumn) `
12799
+ const Container$k = styled(FlexColumn) `
12798
12800
  align-items: center !important;
12799
12801
  justify-content: center;
12800
12802
  align-self: stretch;
@@ -12831,7 +12833,7 @@ const AddNode = memo(({ id: nodeId, data }) => {
12831
12833
  const { isThisPending } = usePendingStore();
12832
12834
  const entity = nodeId.split('-')[0];
12833
12835
  const isPending = isThisPending({ entityType: entity });
12834
- return (React.createElement(Container$i, { "$nodeWidth": nodeWidth, className: 'nowheel nodrag' },
12836
+ return (React.createElement(Container$k, { "$nodeWidth": nodeWidth, className: 'nowheel nodrag' },
12835
12837
  isPending ? (React.createElement(Fragment, null,
12836
12838
  React.createElement(TitleWrapper, null,
12837
12839
  React.createElement(FadeLoader, null),
@@ -12848,7 +12850,7 @@ const AddNode = memo(({ id: nodeId, data }) => {
12848
12850
  React.createElement(Handle, { type: 'source', position: Position.Right, style: { visibility: 'hidden' } })));
12849
12851
  });
12850
12852
 
12851
- const Container$h = styled.div `
12853
+ const Container$j = styled.div `
12852
12854
  width: ${({ $nodeWidth }) => `${$nodeWidth}px`};
12853
12855
  `;
12854
12856
  const BaseNode = memo(({ id: nodeId, data }) => {
@@ -12881,7 +12883,7 @@ const BaseNode = memo(({ id: nodeId, data }) => {
12881
12883
  }
12882
12884
  setSelectedSources(namespaces);
12883
12885
  };
12884
- return (React.createElement(Container$h, { "data-id": nodeId, "$nodeWidth": nodeWidth, className: 'nowheel nodrag' },
12886
+ return (React.createElement(Container$j, { "data-id": nodeId, "$nodeWidth": nodeWidth, className: 'nowheel nodrag' },
12885
12887
  React.createElement(DataTab, { title: title, subTitle: subTitle, onClick: () => { }, renderActions: renderActions, iconProps: {
12886
12888
  icon: icon,
12887
12889
  icons: icons,
@@ -12901,19 +12903,19 @@ const BaseNode = memo(({ id: nodeId, data }) => {
12901
12903
  React.createElement(Handle, { type: 'source', position: Position.Right, style: { visibility: 'hidden' } })));
12902
12904
  });
12903
12905
 
12904
- const Container$g = styled.div `
12906
+ const Container$i = styled.div `
12905
12907
  width: ${({ $nodeWidth }) => `${$nodeWidth}px`};
12906
12908
  height: ${({ $nodeHeight }) => `${$nodeHeight}px`};
12907
12909
  opacity: 0;
12908
12910
  `;
12909
12911
  const EdgedNode = memo(({ data }) => {
12910
12912
  const { nodeWidth, nodeHeight } = data;
12911
- return (React.createElement(Container$g, { "$nodeWidth": nodeWidth, "$nodeHeight": nodeHeight, className: 'nowheel nodrag' },
12913
+ return (React.createElement(Container$i, { "$nodeWidth": nodeWidth, "$nodeHeight": nodeHeight, className: 'nowheel nodrag' },
12912
12914
  React.createElement(Handle, { type: 'source', position: Position.Right, style: { visibility: 'hidden' } }),
12913
12915
  React.createElement(Handle, { type: 'target', position: Position.Left, style: { visibility: 'hidden' } })));
12914
12916
  });
12915
12917
 
12916
- const Container$f = styled.div `
12918
+ const Container$h = styled.div `
12917
12919
  width: ${({ $nodeWidth }) => $nodeWidth}px;
12918
12920
  height: ${({ $nodeHeight }) => $nodeHeight}px;
12919
12921
  background: transparent;
@@ -12922,7 +12924,7 @@ const Container$f = styled.div `
12922
12924
  `;
12923
12925
  const FrameNode = memo(({ data }) => {
12924
12926
  const { nodeWidth, nodeHeight } = data;
12925
- return (React.createElement(Container$f, { "$nodeWidth": nodeWidth, "$nodeHeight": nodeHeight, className: 'nowheel nodrag' },
12927
+ return (React.createElement(Container$h, { "$nodeWidth": nodeWidth, "$nodeHeight": nodeHeight, className: 'nowheel nodrag' },
12926
12928
  React.createElement(Handle, { type: 'source', position: Position.Right, style: { visibility: 'hidden' } }),
12927
12929
  React.createElement(Handle, { type: 'target', position: Position.Left, style: { visibility: 'hidden' } })));
12928
12930
  });
@@ -12937,7 +12939,7 @@ const nodeConfig = {
12937
12939
  };
12938
12940
 
12939
12941
  const { framePadding: framePadding$3 } = nodeConfig;
12940
- const Container$e = styled.div `
12942
+ const Container$g = styled.div `
12941
12943
  position: relative;
12942
12944
  z-index: 1;
12943
12945
  width: fit-content;
@@ -12985,7 +12987,7 @@ const ScrollNode = memo(({ data, ...rest }) => {
12985
12987
  current?.addEventListener('scroll', handleScroll);
12986
12988
  return () => current?.removeEventListener('scroll', handleScroll);
12987
12989
  }, [onScroll]);
12988
- return (React.createElement(Container$e, { ref: containerRef, "$nodeHeight": nodeHeight, className: 'nowheel nodrag' },
12990
+ return (React.createElement(Container$g, { ref: containerRef, "$nodeHeight": nodeHeight, className: 'nowheel nodrag' },
12989
12991
  items.map((item) => (React.createElement(BaseNodeWrapper, { key: item.id, onClick: (e) => {
12990
12992
  e.stopPropagation();
12991
12993
  // @ts-ignore
@@ -12995,7 +12997,7 @@ const ScrollNode = memo(({ data, ...rest }) => {
12995
12997
  React.createElement(BottomOverlay, { "$hide": isBottomOfList })));
12996
12998
  });
12997
12999
 
12998
- const Container$d = styled.div `
13000
+ const Container$f = styled.div `
12999
13001
  position: relative;
13000
13002
  width: ${({ $nodeWidth }) => `${$nodeWidth}px`};
13001
13003
  padding: 12px 0px 16px 0px;
@@ -13013,7 +13015,7 @@ const SelectorWrapper = styled(FlexRow) `
13013
13015
  const ActionsWrapper = styled(FlexRow) `
13014
13016
  margin-left: auto;
13015
13017
  `;
13016
- const AddButton$1 = styled(Button) `
13018
+ const AddButton = styled(Button) `
13017
13019
  width: 24px;
13018
13020
  height: 24px;
13019
13021
  padding: 0;
@@ -13064,7 +13066,7 @@ const HeaderNode = memo(({ id: nodeId, data }) => {
13064
13066
  setSelectedSources({});
13065
13067
  }
13066
13068
  };
13067
- return (React.createElement(Container$d, { "$nodeWidth": nodeWidth, className: 'nowheel nodrag' },
13069
+ return (React.createElement(Container$f, { "$nodeWidth": nodeWidth, className: 'nowheel nodrag' },
13068
13070
  entityType === EntityTypes.Source && (React.createElement(SelectorWrapper, null,
13069
13071
  React.createElement(Checkbox, { partiallyChecked: hasSelected && sources?.length !== totalSelectedSources, value: hasSelected && sources?.length === totalSelectedSources, onChange: onSelect, disabled: !sources?.length }))),
13070
13072
  React.createElement(IconTitleBadge, { icon: Icon, title: title, badge: isSourceAwaitingInstrumentation ? `${instrumentingPercent}%` : badge, badgeTooltip: badgeTooltip, loading: isFetching && !isSourceAwaitingInstrumentation }),
@@ -13075,7 +13077,7 @@ const Actions$1 = memo(({ entityType }) => {
13075
13077
  const theme = Theme.useTheme();
13076
13078
  const { onClickNode } = useClickNode();
13077
13079
  return (React.createElement(ActionsWrapper, null,
13078
- React.createElement(AddButton$1, { "data-id": `add-${entityType}`, variant: 'primary', onClick: (e) => {
13080
+ React.createElement(AddButton, { "data-id": `add-${entityType}`, variant: 'primary', onClick: (e) => {
13079
13081
  e.stopPropagation();
13080
13082
  // @ts-ignore
13081
13083
  onClickNode(undefined, {
@@ -13126,12 +13128,12 @@ const LabeledEdge = memo(({ id, sourceX, sourceY, targetX, targetY, sourcePositi
13126
13128
  React.createElement(Tooltip, { text: 'Heads up! The data-flow metrics you see are calculated over 10-second intervals.' }, data?.label)))));
13127
13129
  });
13128
13130
 
13129
- const Container$c = styled.div `
13131
+ const Container$e = styled.div `
13130
13132
  width: ${({ $nodeWidth }) => `${$nodeWidth}px`};
13131
13133
  `;
13132
13134
  const SkeletonNode = memo(({ id: nodeId, data }) => {
13133
13135
  const { nodeWidth } = data;
13134
- return (React.createElement(Container$c, { "data-id": nodeId, "$nodeWidth": nodeWidth, className: 'nowheel nodrag' },
13136
+ return (React.createElement(Container$e, { "data-id": nodeId, "$nodeWidth": nodeWidth, className: 'nowheel nodrag' },
13135
13137
  React.createElement(SkeletonLoader, { size: 3 })));
13136
13138
  });
13137
13139
 
@@ -13173,7 +13175,7 @@ const Flow = ({ nodes, edges, onNodesChange, onEdgesChange }) => {
13173
13175
  return (React.createElement(FlowWrapper, null,
13174
13176
  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
13177
  React.createElement(ControllerWrapper, null,
13176
- React.createElement(Controls$1, { position: 'bottom-right', orientation: 'horizontal', showInteractive: false, showZoom: true, showFitView: true, fitViewOptions: {
13178
+ React.createElement(Controls, { position: 'bottom-right', orientation: 'horizontal', showInteractive: false, showZoom: true, showFitView: true, fitViewOptions: {
13177
13179
  duration: 300,
13178
13180
  padding: 0.02,
13179
13181
  includeHiddenNodes: true,
@@ -13253,7 +13255,7 @@ const buildRuleNodes = ({ loading, entities, positions, unfilteredCount }) => {
13253
13255
  },
13254
13256
  data: {
13255
13257
  nodeWidth: nodeWidth$4,
13256
- title: DISPLAY_TITLES.InstrumentationRules,
13258
+ title: DISPLAY_TITLES.INSTRUMENTATION_RULES,
13257
13259
  icon: getEntityIcon(EntityTypes.InstrumentationRule),
13258
13260
  badge: unfilteredCount,
13259
13261
  isFetching: loading,
@@ -13296,8 +13298,8 @@ const buildRuleNodes = ({ loading, entities, positions, unfilteredCount }) => {
13296
13298
  data: {
13297
13299
  nodeWidth: nodeWidth$4,
13298
13300
  type: AddNodeTypes.AddRule,
13299
- title: 'ADD RULE',
13300
- subTitle: 'To modify OpenTelemetry data',
13301
+ title: DISPLAY_TITLES.ADD_INSTRUMENTATION_RULE,
13302
+ subTitle: DISPLAY_TITLES.TO_MODIFY_OTEL_DATA,
13301
13303
  },
13302
13304
  });
13303
13305
  }
@@ -13333,7 +13335,7 @@ const buildActionNodes = ({ loading, entities, positions, unfilteredCount }) =>
13333
13335
  },
13334
13336
  data: {
13335
13337
  nodeWidth: nodeWidth$3,
13336
- title: DISPLAY_TITLES.Actions,
13338
+ title: DISPLAY_TITLES.ACTIONS,
13337
13339
  icon: getEntityIcon(EntityTypes.Action),
13338
13340
  badge: unfilteredCount,
13339
13341
  isFetching: loading,
@@ -13390,8 +13392,8 @@ const buildActionNodes = ({ loading, entities, positions, unfilteredCount }) =>
13390
13392
  data: {
13391
13393
  nodeWidth: nodeWidth$3,
13392
13394
  type: AddNodeTypes.AddAction,
13393
- title: 'ADD Action',
13394
- subTitle: 'To modify OpenTelemetry data',
13395
+ title: DISPLAY_TITLES.ADD_ACTION,
13396
+ subTitle: DISPLAY_TITLES.TO_MODIFY_OTEL_DATA,
13395
13397
  },
13396
13398
  });
13397
13399
  }
@@ -13431,7 +13433,7 @@ const buildSourceNodes = ({ loading, entities, positions, unfilteredCount, conta
13431
13433
  },
13432
13434
  data: {
13433
13435
  nodeWidth: nodeWidth$2,
13434
- title: DISPLAY_TITLES.Sources,
13436
+ title: DISPLAY_TITLES.SOURCES,
13435
13437
  icon: getEntityIcon(EntityTypes.Source),
13436
13438
  badge: hasFiltersApplied ? `${entities.length}/${unfilteredCount}` : unfilteredCount,
13437
13439
  badgeTooltip: hasFiltersApplied ? DISPLAY_TITLES.FILTERED_COUNT_TOOLTIP : undefined,
@@ -13501,8 +13503,8 @@ const buildSourceNodes = ({ loading, entities, positions, unfilteredCount, conta
13501
13503
  data: {
13502
13504
  nodeWidth: nodeWidth$2,
13503
13505
  type: AddNodeTypes.AddSource,
13504
- title: 'ADD Source',
13505
- subTitle: 'To collect OpenTelemetry data',
13506
+ title: DISPLAY_TITLES.ADD_SOURCE,
13507
+ subTitle: DISPLAY_TITLES.TO_COLLECT_OTEL_DATA,
13506
13508
  },
13507
13509
  });
13508
13510
  }
@@ -13559,7 +13561,7 @@ const mapToNodeData = (entity) => {
13559
13561
  subTitle: entity.destinationType.displayName,
13560
13562
  icon,
13561
13563
  iconSrc,
13562
- monitors: Object.keys(entity.exportedSignals).filter((signal) => entity.exportedSignals[signal] === true),
13564
+ monitors: mapExportedSignals(entity.exportedSignals),
13563
13565
  raw: entity,
13564
13566
  };
13565
13567
  };
@@ -13575,7 +13577,7 @@ const buildDestinationNodes = ({ loading, entities, positions, unfilteredCount }
13575
13577
  },
13576
13578
  data: {
13577
13579
  nodeWidth,
13578
- title: DISPLAY_TITLES.Destinations,
13580
+ title: DISPLAY_TITLES.DESTINATIONS,
13579
13581
  icon: getEntityIcon(EntityTypes.Destination),
13580
13582
  badge: unfilteredCount,
13581
13583
  isFetching: loading,
@@ -13618,15 +13620,15 @@ const buildDestinationNodes = ({ loading, entities, positions, unfilteredCount }
13618
13620
  data: {
13619
13621
  nodeWidth,
13620
13622
  type: AddNodeTypes.AddDestination,
13621
- title: 'ADD Destination',
13622
- subTitle: 'To monitor OpenTelemetry data',
13623
+ title: DISPLAY_TITLES.ADD_DESTINATION,
13624
+ subTitle: DISPLAY_TITLES.TO_MONITOR_OTEL_DATA,
13623
13625
  },
13624
13626
  });
13625
13627
  }
13626
13628
  return nodes;
13627
13629
  };
13628
13630
 
13629
- const Container$b = styled.div `
13631
+ const Container$d = styled.div `
13630
13632
  width: 100%;
13631
13633
  height: ${({ $heightToRemove }) => `calc(100vh - ${$heightToRemove})`};
13632
13634
  position: relative;
@@ -13634,6 +13636,7 @@ const Container$b = styled.div `
13634
13636
  const DataFlow = ({ heightToRemove, metrics }) => {
13635
13637
  const theme = Theme.useTheme();
13636
13638
  const filters = useFilterStore();
13639
+ const { selectedStreamName } = useDataStreamStore();
13637
13640
  const { isAwaitingInstrumentation } = useInstrumentStore();
13638
13641
  const { containerRef, containerWidth, containerHeight } = useContainerSize();
13639
13642
  const { sources, sourcesLoading, destinations, destinationsLoading, actions, actionsLoading, instrumentationRules, instrumentationRulesLoading } = useEntityStore();
@@ -13661,25 +13664,27 @@ const DataFlow = ({ heightToRemove, metrics }) => {
13661
13664
  })), prevNodes));
13662
13665
  };
13663
13666
  useEffect(() => {
13667
+ const sourcesByStream = filterSourcesByStream(sources, selectedStreamName);
13664
13668
  const sourceNodes = buildSourceNodes({
13665
- entities: filterSources(sources, filters),
13669
+ entities: filterSources(sourcesByStream, filters),
13666
13670
  loading: sourcesLoading || isAwaitingInstrumentation,
13667
- unfilteredCount: sources.length,
13671
+ unfilteredCount: sourcesByStream.length,
13668
13672
  positions,
13669
13673
  containerHeight,
13670
13674
  onScroll: ({ scrollTop }) => handleNodesScrolled(sourceNodes, EntityTypes.Source, scrollTop),
13671
13675
  });
13672
13676
  handleNodesChanged(sourceNodes, EntityTypes.Source);
13673
- }, [sources, sourcesLoading, isAwaitingInstrumentation, positions[EntityTypes.Source], filters, containerHeight]);
13677
+ }, [selectedStreamName, sources, sourcesLoading, isAwaitingInstrumentation, positions[EntityTypes.Source], filters, containerHeight]);
13674
13678
  useEffect(() => {
13679
+ const destinationsByStream = filterDestinationsByStream(destinations, selectedStreamName);
13675
13680
  const destinationNodes = buildDestinationNodes({
13676
- entities: filterDestinations(destinations, filters),
13681
+ entities: filterDestinations(destinationsByStream, filters),
13677
13682
  loading: destinationsLoading,
13678
- unfilteredCount: destinations.length,
13683
+ unfilteredCount: destinationsByStream.length,
13679
13684
  positions,
13680
13685
  });
13681
13686
  handleNodesChanged(destinationNodes, EntityTypes.Destination);
13682
- }, [destinations, destinationsLoading, positions[EntityTypes.Destination], filters]);
13687
+ }, [selectedStreamName, destinations, destinationsLoading, positions[EntityTypes.Destination], filters]);
13683
13688
  useEffect(() => {
13684
13689
  const actionNodes = buildActionNodes({
13685
13690
  entities: filterActions(actions, filters),
@@ -13699,15 +13704,15 @@ const DataFlow = ({ heightToRemove, metrics }) => {
13699
13704
  });
13700
13705
  handleNodesChanged(ruleNodes, EntityTypes.InstrumentationRule);
13701
13706
  }, [instrumentationRules, instrumentationRulesLoading, positions[EntityTypes.InstrumentationRule]]);
13702
- return (React.createElement(Container$b, { ref: containerRef, "$heightToRemove": heightToRemove },
13707
+ return (React.createElement(Container$d, { ref: containerRef, "$heightToRemove": heightToRemove },
13703
13708
  React.createElement(Flow, { nodes: nodes, edges: edges, onNodesChange: onNodesChange, onEdgesChange: onEdgesChange })));
13704
13709
  };
13705
13710
 
13706
- const RelativeContainer$1 = styled.div `
13711
+ const RelativeContainer$2 = styled.div `
13707
13712
  position: relative;
13708
13713
  max-width: 200px;
13709
13714
  `;
13710
- const AbsoluteContainer$1 = styled.div `
13715
+ const AbsoluteContainer$2 = styled.div `
13711
13716
  position: absolute;
13712
13717
  top: calc(100% + 8px);
13713
13718
  left: 0;
@@ -13784,26 +13789,21 @@ const HorizontalScroll = styled.div `
13784
13789
  border-bottom: ${({ theme }) => `1px solid ${theme.colors.border}`};
13785
13790
  overflow-x: scroll;
13786
13791
  `;
13787
- const VerticalScroll = styled.div `
13788
- display: flex;
13789
- flex-direction: column;
13790
- padding: 12px;
13791
- overflow-y: scroll;
13792
- `;
13793
13792
  const SearchResults = ({ searchText, onClose }) => {
13794
13793
  const theme = Theme.useTheme();
13795
13794
  const { onClickNode } = useClickNode();
13795
+ const { selectedStreamName } = useDataStreamStore();
13796
13796
  const { sources, destinations, actions, instrumentationRules } = useEntityStore();
13797
13797
  const [selectedCategory, setSelectedCategory] = useState('all');
13798
13798
  const { categories, searchResults } = useMemo(() => buildSearchResults({
13799
13799
  instrumentationRules,
13800
- sources,
13800
+ sources: filterSourcesByStream(sources, selectedStreamName),
13801
13801
  actions,
13802
- destinations,
13802
+ destinations: filterDestinationsByStream(destinations, selectedStreamName),
13803
13803
  searchText,
13804
13804
  selectedCategory,
13805
- }), [instrumentationRules, sources, actions, destinations, searchText, selectedCategory]);
13806
- return (React.createElement(AbsoluteContainer$1, null,
13805
+ }), [instrumentationRules, sources, actions, destinations, selectedStreamName, searchText, selectedCategory]);
13806
+ return (React.createElement(AbsoluteContainer$2, null,
13807
13807
  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
13808
  searchResults.map(({ category, label, entities }, catIdx) => !!entities.length && (React.createElement(Fragment, { key: `category-list-${category}` },
13809
13809
  React.createElement(VerticalScroll, { style: { maxHeight: selectedCategory !== 'all' ? '240px' : '140px' } },
@@ -13827,7 +13827,7 @@ const Search = () => {
13827
13827
  const containerRef = useRef(null);
13828
13828
  useOnClickOutside(containerRef, () => setFocused(false));
13829
13829
  useKeyDown({ key: 'Escape', active: !!input || focused }, onClose);
13830
- return (React.createElement(RelativeContainer$1, { ref: containerRef },
13830
+ return (React.createElement(RelativeContainer$2, { ref: containerRef },
13831
13831
  React.createElement(Input, { placeholder: 'Search', icon: SearchIcon, value: input, onChange: (e) => setInput(e.target.value.toLowerCase()), onFocus: () => setFocused(true) }),
13832
13832
  !!input || focused ? React.createElement(SearchResults, { searchText: input, onClose: onClose }) : null));
13833
13833
  };
@@ -13867,19 +13867,22 @@ const getFilterCount = (params) => {
13867
13867
  };
13868
13868
  const Filters$1 = () => {
13869
13869
  const theme = Theme.useTheme();
13870
- const { namespaces, kinds, monitors, languages, errors, onlyErrors, setAll, clearAll, getEmptyState } = useFilterStore();
13870
+ const { namespaces, sources } = useEntityStore();
13871
+ const { selectedStreamName } = useDataStreamStore();
13872
+ const { namespaces: namespaceFilters, kinds, monitors, languages, errors, onlyErrors, setAll, clearAll, getEmptyState } = useFilterStore();
13873
+ const sourcesByStream = useMemo(() => filterSourcesByStream(sources, selectedStreamName), [sources, selectedStreamName]);
13871
13874
  // 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 });
13875
+ const [filters, setFilters] = useState({ namespaces: namespaceFilters, kinds, monitors, languages, errors, onlyErrors });
13873
13876
  const [filterCount, setFilterCount] = useState(getFilterCount(filters));
13874
13877
  const [focused, setFocused] = useState(false);
13875
13878
  const toggleFocused = () => setFocused((prev) => !prev);
13876
13879
  useEffect(() => {
13877
13880
  if (!focused) {
13878
- const payload = { namespaces, kinds, monitors, languages, errors, onlyErrors };
13881
+ const payload = { namespaces: namespaceFilters, kinds, monitors, languages, errors, onlyErrors };
13879
13882
  setFilters(payload);
13880
13883
  setFilterCount(getFilterCount(payload));
13881
13884
  }
13882
- }, [focused, namespaces, kinds, monitors, errors, onlyErrors]);
13885
+ }, [focused, namespaceFilters, kinds, monitors, errors, onlyErrors]);
13883
13886
  const onApply = () => {
13884
13887
  // TODO: remove trycatch after debugging
13885
13888
  try {
@@ -13903,17 +13906,17 @@ const Filters$1 = () => {
13903
13906
  const ref = useRef(null);
13904
13907
  useOnClickOutside(ref, onCancel);
13905
13908
  useKeyDown({ key: 'Escape', active: focused }, onCancel);
13906
- return (React.createElement(RelativeContainer$1, { ref: ref },
13909
+ return (React.createElement(RelativeContainer$2, { ref: ref },
13907
13910
  React.createElement(SelectionButton, { label: 'Filters', icon: FilterIcon, badgeLabel: filterCount, badgeFilled: !!filterCount, withBorder: true, color: 'transparent', onClick: toggleFocused }),
13908
- React.createElement(AbsoluteContainer$1, { "$hidden": !focused },
13911
+ React.createElement(AbsoluteContainer$2, { "$hidden": !focused },
13909
13912
  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 }),
13913
+ 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 }),
13914
+ 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 }),
13915
+ 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
13916
  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
13917
  React.createElement(ToggleWrapper, null,
13915
13918
  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 })),
13919
+ 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
13920
  React.createElement(Actions, null,
13918
13921
  React.createElement(ActionButton$1, { variant: 'primary', onClick: onApply }, "Apply"),
13919
13922
  React.createElement(ActionButton$1, { variant: 'secondary', onClick: onCancel }, "Cancel"),
@@ -13921,7 +13924,60 @@ const Filters$1 = () => {
13921
13924
  React.createElement(ActionButton$1, { variant: 'tertiary', onClick: onReset, "$color": theme.text.error }, "Reset"))))));
13922
13925
  };
13923
13926
 
13924
- const Container$a = styled.div `
13927
+ const RelativeContainer$1 = styled.div `
13928
+ position: relative;
13929
+ `;
13930
+ const Container$c = styled(FlexRow) `
13931
+ border: 1px solid ${({ theme }) => theme.colors.border};
13932
+ border-radius: 32px;
13933
+
13934
+ & button {
13935
+ max-height: 28px;
13936
+ }
13937
+ `;
13938
+ const AbsoluteContainer$1 = styled.div `
13939
+ position: absolute;
13940
+ top: calc(100% + 8px);
13941
+ left: 0;
13942
+ z-index: 1;
13943
+ background-color: ${({ theme }) => theme.colors.dropdown_bg};
13944
+ border: ${({ theme }) => `1px solid ${theme.colors.border}`};
13945
+ border-radius: 24px;
13946
+ width: 420px;
13947
+ `;
13948
+ const SelectionMenuHeadWrap = styled.div `
13949
+ border-bottom: ${({ theme }) => `1px solid ${theme.colors.border}`};
13950
+ padding: 12px;
13951
+ `;
13952
+ const SelectionWrap = styled(VerticalScroll) `
13953
+ max-height: 240px;
13954
+ `;
13955
+ const DataStreamSelect = ({ onClickNewDataStream }) => {
13956
+ const theme = Theme.useTheme();
13957
+ const { dataStreams, selectedStreamName, setSelectedStreamName } = useDataStreamStore();
13958
+ const containerRef = useRef(null);
13959
+ const [popupOpen, setPopupOpen] = useState(false);
13960
+ useOnClickOutside(containerRef, () => setPopupOpen(false));
13961
+ const [searchText, setSearchText] = useState('');
13962
+ const filteredDataStreams = useMemo(() => dataStreams.filter(({ name }) => !searchText || name.toLowerCase().includes(searchText.toLowerCase())), [dataStreams, searchText]);
13963
+ return (React.createElement(RelativeContainer$1, null,
13964
+ React.createElement(Container$c, { "$gap": 0 },
13965
+ React.createElement(Button, { variant: 'tertiary', onClick: () => setPopupOpen((prev) => !prev) },
13966
+ React.createElement(DataStreamsIcon, { fill: theme.text.info }),
13967
+ React.createElement(Text, null, selectedStreamName),
13968
+ React.createElement(ExtendArrow, { extend: popupOpen })),
13969
+ React.createElement(Divider, { orientation: 'vertical', length: '32px', thickness: 2, margin: '0' }),
13970
+ React.createElement(AddButton$1, { onClick: onClickNewDataStream, label: BUTTON_TEXTS.NEW })),
13971
+ popupOpen && (React.createElement(AbsoluteContainer$1, { ref: containerRef },
13972
+ React.createElement(SelectionMenuHeadWrap, null,
13973
+ React.createElement(Input, { placeholder: 'Search...', icon: SearchIcon, value: searchText, onChange: (e) => setSearchText(e.target.value) })),
13974
+ React.createElement(SelectionWrap, null, filteredDataStreams.map(({ name }) => (React.createElement(SelectionButton, { key: `stream-${name}`, label: name, isSelected: selectedStreamName === name, onClick: () => {
13975
+ setSelectedStreamName(name);
13976
+ setPopupOpen(false);
13977
+ }, color: 'transparent', style: { width: '100%', justifyContent: 'flex-start' } }))))))));
13978
+ };
13979
+
13980
+ const Container$b = styled.div `
13925
13981
  display: flex;
13926
13982
  align-items: center;
13927
13983
  margin: 20px 0;
@@ -13932,28 +13988,32 @@ const Container$a = styled.div `
13932
13988
  const PushToEnd = styled.div `
13933
13989
  margin-left: auto;
13934
13990
  `;
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();
13991
+ const DataFlowActionsMenu = ({ addEntity, onClickNewDataStream }) => {
13945
13992
  const { setCurrentModal } = useModalStore();
13946
- return (React.createElement(Container$a, null,
13993
+ return (React.createElement(Container$b, null,
13994
+ onClickNewDataStream && React.createElement(DataStreamSelect, { onClickNewDataStream: onClickNewDataStream }),
13947
13995
  React.createElement(Search, null),
13948
13996
  React.createElement(Filters$1, null),
13949
13997
  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))))));
13998
+ React.createElement(AddButton$1, { "data-id": `add-${addEntity}`, onClick: () => setCurrentModal(addEntity), label: `${BUTTON_TEXTS.ADD} ${addEntity}`, variant: 'primary' })))));
13955
13999
  };
13956
14000
 
14001
+ const DataStreamSelectionForm = forwardRef(({ isModal, onClickSummary }, ref) => {
14002
+ const { dataStreams } = useDataStreamStore();
14003
+ const [nameInput, setNameInput] = useState('');
14004
+ useImperativeHandle(ref, () => ({
14005
+ getFormValues: () => ({
14006
+ name: nameInput,
14007
+ }),
14008
+ }));
14009
+ const dataStreamOptions = useMemo(() => dataStreams.map(({ name }) => ({ label: name })), [dataStreams]);
14010
+ return (React.createElement(ModalBody, { "$isNotModal": !isModal, "$minHeight": '70vh' },
14011
+ React.createElement(FlexColumn, { "$gap": 24 },
14012
+ onClickSummary && React.createElement(NoteBackToSummary, { onClick: onClickSummary }),
14013
+ React.createElement(SectionTitle, { title: DISPLAY_TITLES.NAME_YOUR_STREAM, description: DISPLAY_TITLES.STREAM_DESCRIPTION }),
14014
+ React.createElement(AutocompleteInput, { placeholder: DISPLAY_TITLES.NAME_YOUR_STREAM_PLACEHOLDER, autoFocus: true, options: dataStreamOptions, defaultText: nameInput, onTextChange: setNameInput }))));
14015
+ });
14016
+
13957
14017
  const buildMonitorsList = (exportedSignals) => Object.keys(exportedSignals)
13958
14018
  .filter((key) => exportedSignals[key])
13959
14019
  .join(', ');
@@ -13962,7 +14022,7 @@ const buildCard$2 = (destination, yamlFields) => {
13962
14022
  const arr = [
13963
14023
  { title: DISPLAY_TITLES.NAME, value: destinationType.displayName },
13964
14024
  { title: DISPLAY_TITLES.TYPE, value: destinationType.type },
13965
- { type: DataCardFieldTypes.Monitors, title: DISPLAY_TITLES.Monitors, value: buildMonitorsList(exportedSignals) },
14025
+ { type: DataCardFieldTypes.Monitors, title: DISPLAY_TITLES.MONITORS, value: buildMonitorsList(exportedSignals) },
13966
14026
  ];
13967
14027
  const parsedFields = safeJsonParse(fields, {});
13968
14028
  const sortedParsedFields = yamlFields.map((field) => ({ key: field.name, value: parsedFields[field.name] ?? null })).filter((item) => item.value !== null) ||
@@ -14027,7 +14087,7 @@ const ActionButton = styled(Button) `
14027
14087
  align-items: center;
14028
14088
  gap: 8px;
14029
14089
 
14030
- ${({ $status, theme }) => $status === 'success'
14090
+ ${({ $status, theme }) => $status === StatusType.Success
14031
14091
  ? css `
14032
14092
  border-color: transparent;
14033
14093
  background-color: ${theme.colors.success};
@@ -14041,27 +14101,26 @@ const ActionButton = styled(Button) `
14041
14101
  background-color: transparent;
14042
14102
  `}
14043
14103
  `;
14044
- const TestConnection = ({ destination, disabled, status, onError, onSuccess, validateForm, testConnection, testLoading, testResult }) => {
14104
+ const TestConnection = ({ destination, disabled, validateForm, status, testConnection, onSuccess, onError }) => {
14045
14105
  const theme = Theme.useTheme();
14046
- useEffect(() => {
14047
- if (testResult) {
14048
- if (testResult.succeeded)
14049
- onSuccess();
14050
- else
14051
- onError();
14052
- }
14053
- }, [testResult]);
14106
+ const [loading, setLoading] = useState(false);
14054
14107
  const onClick = async () => {
14055
- if (validateForm())
14056
- await testConnection(destination);
14108
+ if (validateForm()) {
14109
+ setLoading(true);
14110
+ const testResult = await testConnection(destination);
14111
+ if (testResult) {
14112
+ testResult.succeeded ? onSuccess(testResult) : onError(testResult);
14113
+ }
14114
+ setLoading(false);
14115
+ }
14057
14116
  };
14058
14117
  const Icon = !!status ? getStatusIcon(status, theme) : undefined;
14059
14118
  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')));
14119
+ loading ? React.createElement(FadeLoader, null) : Icon ? React.createElement(Icon, null) : null,
14120
+ 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
14121
  };
14063
14122
 
14064
- const Container$9 = styled(FlexColumn) `
14123
+ const Container$a = styled(FlexColumn) `
14065
14124
  align-items: unset;
14066
14125
  padding: 0 4px;
14067
14126
  `;
@@ -14070,11 +14129,11 @@ const NotesWrapper = styled.div `
14070
14129
  flex-direction: column;
14071
14130
  gap: 12px;
14072
14131
  `;
14073
- const DestinationForm = ({ isUpdate, categoryItem, formData, formErrors, validateForm, handleFormChange, dynamicFields, setDynamicFields, testConnection, testLoading, testResult, }) => {
14132
+ const DestinationForm = ({ isUpdate, categoryItem, formData, formErrors, validateForm, handleFormChange, dynamicFields, setDynamicFields, testConnection }) => {
14074
14133
  const { supportedSignals, testConnectionSupported, displayName } = categoryItem || {};
14075
14134
  const [autoFilled, setAutoFilled] = useState(false);
14076
14135
  const [isFormDirty, setIsFormDirty] = useState(false);
14077
- const [connectionStatus, setConnectionStatus] = useState(undefined);
14136
+ const [connection, setConnection] = useState(undefined);
14078
14137
  const autoFillCheckRef = useRef(false);
14079
14138
  useEffect(() => {
14080
14139
  if (!!dynamicFields.length && !autoFillCheckRef.current) {
@@ -14097,7 +14156,7 @@ const DestinationForm = ({ isUpdate, categoryItem, formData, formErrors, validat
14097
14156
  }, [dynamicFields, isFormDirty]);
14098
14157
  const dirtyForm = () => {
14099
14158
  setIsFormDirty(true);
14100
- setConnectionStatus(undefined);
14159
+ setConnection(undefined);
14101
14160
  };
14102
14161
  const supportedMonitors = useMemo(() => {
14103
14162
  const { logs, metrics, traces } = supportedSignals || {};
@@ -14129,19 +14188,28 @@ const DestinationForm = ({ isUpdate, categoryItem, formData, formErrors, validat
14129
14188
  traces: signals.includes(SignalType.Traces),
14130
14189
  });
14131
14190
  };
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
- } })) }),
14191
+ const onTestConnectionError = (testResult) => {
14192
+ setIsFormDirty(false);
14193
+ setConnection({
14194
+ type: StatusType.Error,
14195
+ title: testResult?.reason || 'Connection failed',
14196
+ message: testResult?.message || 'Please check your input and try again.',
14197
+ });
14198
+ };
14199
+ const onTestConnectionSuccess = (testResult) => {
14200
+ setIsFormDirty(false);
14201
+ setConnection({
14202
+ type: StatusType.Success,
14203
+ title: testResult?.reason || 'Connection succeeded',
14204
+ message: testResult?.message || '',
14205
+ });
14206
+ };
14207
+ return (React.createElement(Container$a, { "$gap": 24 },
14208
+ React.createElement(Container$a, { "$gap": 12 },
14209
+ 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
14210
  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.` })),
14211
+ testConnectionSupported && connection && React.createElement(NotificationNote, { type: connection.type, title: connection.title, message: connection.message }),
14212
+ autoFilled && !connection && !isUpdate && React.createElement(NotificationNote, { type: StatusType.Default, message: `Odigos autocompleted ${displayName} destination details.` })),
14145
14213
  React.createElement(Divider, null)),
14146
14214
  React.createElement(MonitorsCheckboxes, { title: isUpdate ? '' : 'This connection will monitor:', required: true, allowedSignals: supportedMonitors, selectedSignals: selectedMonitors, setSelectedSignals: handleSelectedSignals, errorMessage: formErrors['exportedSignals'] }),
14147
14215
  !isUpdate && (React.createElement(Input, { title: 'Destination name', placeholder: 'Enter destination name', value: formData['name'], onChange: (e) => {
@@ -14173,9 +14241,11 @@ const DataContainer$2 = styled.div `
14173
14241
  flex-direction: column;
14174
14242
  gap: 12px;
14175
14243
  `;
14176
- const DestinationDrawer = ({ categories, updateDestination, deleteDestination, testConnection, testLoading, testResult }) => {
14244
+ const DestinationDrawer = ({ categories, updateDestination, deleteDestination, testConnection }) => {
14177
14245
  const { destinations } = useEntityStore();
14246
+ const { selectedStreamName } = useDataStreamStore();
14178
14247
  const { drawerType, drawerEntityId } = useDrawerStore();
14248
+ const destinationsByStream = useMemo(() => filterDestinationsByStream(destinations, selectedStreamName), [destinations, selectedStreamName]);
14179
14249
  const drawerRef = useRef(null);
14180
14250
  const isOpen = drawerType !== EntityTypes.Destination;
14181
14251
  const [isEditing, setIsEditing] = useState(false);
@@ -14189,7 +14259,7 @@ const DestinationDrawer = ({ categories, updateDestination, deleteDestination, t
14189
14259
  const thisItem = useMemo(() => {
14190
14260
  if (isOpen)
14191
14261
  return null;
14192
- const found = destinations?.find((x) => x.id === drawerEntityId);
14262
+ const found = destinationsByStream?.find((x) => x.id === drawerEntityId);
14193
14263
  if (!!found) {
14194
14264
  loadFormWithDrawerItem(found);
14195
14265
  const fields = [];
@@ -14207,7 +14277,7 @@ const DestinationDrawer = ({ categories, updateDestination, deleteDestination, t
14207
14277
  setYamlFields(fields);
14208
14278
  }
14209
14279
  return found;
14210
- }, [isOpen, drawerEntityId, destinations]);
14280
+ }, [isOpen, drawerEntityId, destinationsByStream]);
14211
14281
  if (!thisItem)
14212
14282
  return null;
14213
14283
  const thisOptionType = categories.flatMap((category) => category.items).find((option) => option.type === thisItem.destinationType.type);
@@ -14237,32 +14307,34 @@ const DestinationDrawer = ({ categories, updateDestination, deleteDestination, t
14237
14307
  setIsFormDirty(false);
14238
14308
  }
14239
14309
  };
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,
14310
+ 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
14311
  React.createElement(DestinationForm, { isUpdate: true, categoryItem: thisOptionType, formData: formData, formErrors: formErrors, handleFormChange: (...params) => {
14242
14312
  setIsFormDirty(true);
14243
14313
  handleFormChange(...params);
14244
14314
  }, dynamicFields: dynamicFields, setDynamicFields: (...params) => {
14245
14315
  setIsFormDirty(true);
14246
14316
  setDynamicFields(...params);
14247
- }, validateForm: validateForm, testConnection: testConnection, testLoading: testLoading, testResult: testResult }))) : (React.createElement(DataContainer$2, null,
14317
+ }, validateForm: validateForm, testConnection: testConnection }))) : (React.createElement(DataContainer$2, null,
14248
14318
  React.createElement(ConditionDetails, { conditions: thisItem.conditions || [] }),
14249
14319
  React.createElement(DataCard, { title: DISPLAY_TITLES.DESTINATION_DETAILS, data: !!thisItem ? buildCard$2(thisItem, yamlFields) : [] })))));
14250
14320
  };
14251
14321
 
14252
- const ListsWrapper$1 = styled.div `
14322
+ const ListsWrapper = styled.div `
14253
14323
  display: flex;
14254
14324
  flex-direction: column;
14255
14325
  gap: 12px;
14256
14326
  `;
14257
- const DestinationsList = ({ items, setSelectedItem }) => {
14327
+ const DestinationsList = ({ items, onSelectOption, onSelectConfigured }) => {
14258
14328
  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) => {
14329
+ const isAlreadyExisting = category.name === DESTINATION_CATEGORIES['EXISTS']['TITLE'];
14330
+ return (React.createElement(ListsWrapper, { key: `category-${category.name}` },
14331
+ React.createElement(SectionTitle, { size: 'small', icon: category.icon, title: capitalizeFirstLetter(category.name), description: category.description }),
14332
+ category.items.map((item) => {
14262
14333
  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,
14334
+ 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: {
14335
+ withCheckbox: isAlreadyExisting,
14336
+ isChecked: item.selected,
14337
+ onCheckboxChange: () => onSelectConfigured(item.id),
14266
14338
  }, visualProps: {
14267
14339
  monitors: Object.keys(item.supportedSignals).filter((signal) => item.supportedSignals[signal].supported),
14268
14340
  monitorsWithLabels: true,
@@ -14271,29 +14343,7 @@ const DestinationsList = ({ items, setSelectedItem }) => {
14271
14343
  });
14272
14344
  };
14273
14345
 
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 `
14346
+ const Container$9 = styled.div `
14297
14347
  display: flex;
14298
14348
  flex-direction: column;
14299
14349
  gap: 24px;
@@ -14304,7 +14354,7 @@ const Filters = styled.div `
14304
14354
  gap: 12px;
14305
14355
  `;
14306
14356
  const WidthConstraint = styled.div `
14307
- width: 160px;
14357
+ width: 170px;
14308
14358
  margin-right: 8px;
14309
14359
  `;
14310
14360
  const ListsContainer = styled.div `
@@ -14319,22 +14369,60 @@ const ListsContainer = styled.div `
14319
14369
  max-height: calc(100vh - 400px);
14320
14370
  }
14321
14371
  `;
14322
- const NoDataFoundWrapper$1 = styled(Container$8) `
14372
+ const NoDataFoundWrapper = styled(Container$9) `
14323
14373
  margin-top: 80px;
14324
14374
  `;
14375
+ const { MANAGED, SELF_HOSTED, DETECTED, EXISTS } = DESTINATION_CATEGORIES;
14325
14376
  const DROPDOWN_OPTIONS = [
14326
14377
  { value: 'All types', id: 'all' },
14327
- { value: 'Managed', id: 'managed' },
14328
- { value: 'Self-hosted', id: 'self hosted' },
14378
+ { value: MANAGED.TITLE, id: MANAGED.TITLE },
14379
+ { value: SELF_HOSTED.TITLE, id: SELF_HOSTED.TITLE },
14380
+ { value: DETECTED.TITLE, id: DETECTED.TITLE },
14381
+ { value: EXISTS.TITLE, id: EXISTS.TITLE },
14329
14382
  ];
14330
14383
  const DEFAULT_CATEGORY = DROPDOWN_OPTIONS[0];
14331
14384
  const DEFAULT_MONITORS = [SignalType.Logs, SignalType.Metrics, SignalType.Traces];
14332
- const ChooseDestinationBody = ({ hidden, categories, potentialDestinations, onSelect }) => {
14385
+ const createConfiguredItems = (destinations, selectedStreamName, configuredDestinationIds) => destinations.map((dest) => {
14386
+ const { type, displayName } = dest.destinationType;
14387
+ const isInSelectedStream = dest.dataStreamNames?.includes(selectedStreamName);
14388
+ const isConfigured = configuredDestinationIds.has(dest.id);
14389
+ return {
14390
+ id: dest.id,
14391
+ type,
14392
+ displayName,
14393
+ selected: isInSelectedStream || isConfigured,
14394
+ fields: [],
14395
+ testConnectionSupported: false,
14396
+ supportedSignals: {
14397
+ [SignalType.Logs]: { supported: dest.exportedSignals.logs },
14398
+ [SignalType.Metrics]: { supported: dest.exportedSignals.metrics },
14399
+ [SignalType.Traces]: { supported: dest.exportedSignals.traces },
14400
+ },
14401
+ };
14402
+ });
14403
+ const ChooseDestinationBody = ({ hidden, categories, potentialDestinations, onSelectOption, onSelectConfigured }) => {
14404
+ const { destinations } = useEntityStore();
14405
+ const { selectedStreamName } = useDataStreamStore();
14406
+ const { configuredDestinations, configuredDestinationsUpdateOnly } = useSetupStore();
14333
14407
  const [search, setSearch] = useState('');
14334
14408
  const [selectedCategory, setSelectedCategory] = useState(DEFAULT_CATEGORY);
14335
14409
  const [selectedMonitors, setSelectedMonitors] = useState(DEFAULT_MONITORS);
14336
14410
  const filteredDestinations = useMemo(() => {
14337
- return categories
14411
+ const clonedDestinationsCategories = deepClone(categories);
14412
+ clonedDestinationsCategories.unshift({
14413
+ name: EXISTS.TITLE,
14414
+ description: EXISTS.DESCRIPTION,
14415
+ icon: CheckIcon,
14416
+ // !! do not "filterDestinationsByStream" here, because we need all destinations to select already configured
14417
+ items: createConfiguredItems(destinations, selectedStreamName, new Set(configuredDestinations.concat(configuredDestinationsUpdateOnly).map((d) => d.id))),
14418
+ });
14419
+ clonedDestinationsCategories.unshift({
14420
+ name: DETECTED.TITLE,
14421
+ description: DETECTED.DESCRIPTION,
14422
+ icon: OdigosLogo,
14423
+ items: potentialDestinations,
14424
+ });
14425
+ return clonedDestinationsCategories
14338
14426
  .map((category) => {
14339
14427
  const filteredItems = category.items.filter((item) => {
14340
14428
  const matchesSearch = !search || item.displayName.toLowerCase().includes(search.toLowerCase());
@@ -14345,25 +14433,24 @@ const ChooseDestinationBody = ({ hidden, categories, potentialDestinations, onSe
14345
14433
  return { ...category, items: filteredItems };
14346
14434
  })
14347
14435
  .filter(({ items }) => !!items.length); // Filter out empty categories
14348
- }, [categories, search, selectedCategory, selectedMonitors]);
14436
+ }, [categories, potentialDestinations, destinations, search, selectedCategory, selectedMonitors, selectedStreamName, configuredDestinations]);
14349
14437
  if (hidden)
14350
14438
  return null;
14351
- return (React.createElement(Container$8, null,
14439
+ return (React.createElement(Container$9, null,
14352
14440
  React.createElement(SectionTitle, { title: 'Choose destination', description: 'Add backend destination you want to connect with Odigos.' }),
14353
14441
  React.createElement(Filters, null,
14354
14442
  React.createElement(WidthConstraint, null,
14355
14443
  React.createElement(Input, { placeholder: 'Search...', icon: SearchIcon, value: search, onChange: ({ target: { value } }) => setSearch(value) })),
14356
14444
  React.createElement(WidthConstraint, null,
14357
- React.createElement(Dropdown, { options: DROPDOWN_OPTIONS, value: selectedCategory, onSelect: (opt) => setSelectedCategory(opt), onDeselect: () => { } })),
14445
+ React.createElement(Dropdown, { options: DROPDOWN_OPTIONS, value: selectedCategory, onSelect: setSelectedCategory, onDeselect: () => { } })),
14358
14446
  React.createElement(MonitorsCheckboxes, { title: '', selectedSignals: selectedMonitors, setSelectedSignals: setSelectedMonitors })),
14359
14447
  React.createElement(Divider, null),
14360
- !filteredDestinations.length && !potentialDestinations.length ? (React.createElement(NoDataFoundWrapper$1, null,
14448
+ !filteredDestinations.length ? (React.createElement(NoDataFoundWrapper, null,
14361
14449
  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 })))));
14450
+ React.createElement(DestinationsList, { items: filteredDestinations, onSelectOption: onSelectOption, onSelectConfigured: onSelectConfigured })))));
14364
14451
  };
14365
14452
 
14366
- const Container$7 = styled.div `
14453
+ const Container$8 = styled.div `
14367
14454
  display: flex;
14368
14455
  `;
14369
14456
  const SideMenuWrapper = styled.div `
@@ -14374,15 +14461,53 @@ const SideMenuWrapper = styled.div `
14374
14461
  display: none;
14375
14462
  }
14376
14463
  `;
14377
- const DestinationModal = ({ isOnboarding, categories, potentialDestinations, createDestination, testConnection, testLoading, testResult }) => {
14378
- const { addConfiguredDestination } = useSetupStore();
14464
+ const DestinationModal = ({ isOnboarding, categories, potentialDestinations, createDestination, testConnection }) => {
14465
+ const { destinations } = useEntityStore();
14466
+ const { selectedStreamName } = useDataStreamStore();
14379
14467
  const { currentModal, setCurrentModal } = useModalStore();
14468
+ const { addConfiguredDestination, addConfiguredDestinationUpdateOnly } = useSetupStore();
14380
14469
  const isOpen = currentModal === EntityTypes.Destination;
14381
14470
  const [selectedItem, setSelectedItem] = useState(undefined);
14382
14471
  const { formData, formErrors, handleFormChange, resetFormData, validateForm, setYamlFields, dynamicFields, setDynamicFields } = useDestinationFormData({
14383
14472
  supportedSignals: selectedItem?.supportedSignals,
14384
14473
  preLoadedFields: selectedItem?.fields,
14385
14474
  });
14475
+ const getDestPayload = (alreadyConfigDest) => {
14476
+ const fields = alreadyConfigDest ? safeJsonParse(alreadyConfigDest.fields, {}) : {};
14477
+ if (!alreadyConfigDest) {
14478
+ dynamicFields.forEach((f) => {
14479
+ fields[f.name] = (f.componentType === FieldTypes.Dropdown ? f.value?.value || '' : f.value);
14480
+ });
14481
+ }
14482
+ return {
14483
+ id: alreadyConfigDest?.id || formData.type,
14484
+ name: alreadyConfigDest?.name || formData.name,
14485
+ dataStreamNames: alreadyConfigDest?.dataStreamNames || [],
14486
+ conditions: alreadyConfigDest?.conditions || [],
14487
+ exportedSignals: alreadyConfigDest?.exportedSignals || formData.exportedSignals,
14488
+ fields: JSON.stringify(fields),
14489
+ destinationType: alreadyConfigDest?.destinationType || {
14490
+ type: selectedItem.type,
14491
+ displayName: selectedItem.displayName,
14492
+ supportedSignals: {
14493
+ logs: { supported: false },
14494
+ metrics: { supported: false },
14495
+ traces: { supported: false },
14496
+ },
14497
+ },
14498
+ };
14499
+ };
14500
+ const handleAdd = (alreadyConfigDest) => {
14501
+ // Handle case from already configured
14502
+ if (alreadyConfigDest)
14503
+ return addConfiguredDestinationUpdateOnly(getDestPayload(alreadyConfigDest));
14504
+ // Handle new cases from onboarding
14505
+ if (isOnboarding)
14506
+ return addConfiguredDestination(getDestPayload());
14507
+ // Handle new cases from overview
14508
+ else
14509
+ return createDestination(formData);
14510
+ };
14386
14511
  const handleClose = () => {
14387
14512
  resetFormData();
14388
14513
  setSelectedItem(undefined);
@@ -14392,36 +14517,25 @@ const DestinationModal = ({ isOnboarding, categories, potentialDestinations, cre
14392
14517
  resetFormData();
14393
14518
  setSelectedItem(undefined);
14394
14519
  };
14395
- const handleSelect = (item) => {
14520
+ const handleSelectOption = (item) => {
14396
14521
  resetFormData();
14397
14522
  handleFormChange('type', item?.type || '');
14523
+ handleFormChange('currentStreamName', selectedStreamName);
14398
14524
  setYamlFields(item?.fields || []);
14399
14525
  setSelectedItem(item);
14400
14526
  };
14527
+ const handleSelectConfigured = (id) => {
14528
+ // !! do not "filterDestinationsByStream" here, because we need all destinations to select already configured
14529
+ const foundConfigured = destinations.find((dest) => dest.id === id);
14530
+ if (foundConfigured)
14531
+ handleAdd(foundConfigured);
14532
+ };
14401
14533
  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);
14534
+ if (selectedItem) {
14535
+ const isFormValid = validateForm({ withAlert: !isOnboarding, alertTitle: Crud.Create });
14536
+ if (!isFormValid)
14537
+ return null;
14538
+ handleAdd();
14425
14539
  }
14426
14540
  handleClose();
14427
14541
  };
@@ -14431,10 +14545,9 @@ const DestinationModal = ({ isOnboarding, categories, potentialDestinations, cre
14431
14545
  label: 'DONE',
14432
14546
  variant: 'primary',
14433
14547
  onClick: handleSubmit,
14434
- disabled: !selectedItem,
14435
14548
  },
14436
14549
  ];
14437
- if (!!selectedItem) {
14550
+ if (selectedItem) {
14438
14551
  buttons.unshift({
14439
14552
  label: 'BACK',
14440
14553
  icon: ArrowIcon,
@@ -14445,105 +14558,104 @@ const DestinationModal = ({ isOnboarding, categories, potentialDestinations, cre
14445
14558
  return buttons;
14446
14559
  };
14447
14560
  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,
14561
+ return (React.createElement(Modal, { isOpen: isOpen, onClose: handleClose, header: { title: DISPLAY_TITLES.ADD_DESTINATION }, actionComponent: React.createElement(NavigationButtons, { buttons: renderHeaderButtons() }) },
14562
+ React.createElement(Container$8, null,
14450
14563
  React.createElement(SideMenuWrapper, null,
14451
- React.createElement(Stepper, { currentStep: !!selectedItem ? 2 : 1, data: [
14452
- { stepNumber: 1, title: 'Destinations' },
14453
- { stepNumber: 2, title: 'CONNECTION' },
14564
+ React.createElement(Stepper, { currentStep: selectedItem ? 2 : 1, data: [
14565
+ { stepNumber: 1, title: DISPLAY_TITLES.DESTINATIONS },
14566
+ { stepNumber: 2, title: DISPLAY_TITLES.CONNECTION },
14454
14567
  ] })),
14455
14568
  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 }))))));
14569
+ React.createElement(ChooseDestinationBody, { hidden: selectedItem !== undefined, categories: categories, potentialDestinations: potentialDestinations, onSelectOption: handleSelectOption, onSelectConfigured: handleSelectConfigured }),
14570
+ selectedItem && (React.createElement(DestinationForm, { categoryItem: selectedItem, formData: formData, formErrors: formErrors, handleFormChange: handleFormChange, dynamicFields: dynamicFields, setDynamicFields: setDynamicFields, validateForm: validateForm, testConnection: testConnection }))))));
14458
14571
  };
14459
14572
 
14460
- const Container$6 = styled.div `
14573
+ const Container$7 = styled.div `
14461
14574
  display: flex;
14462
14575
  flex-direction: column;
14463
- align-items: flex-start;
14576
+ align-items: center;
14464
14577
  gap: 12px;
14465
- margin-top: 24px;
14466
- max-height: calc(100vh - 400px);
14467
- height: 100%;
14468
- overflow-x: hidden;
14578
+ width: 100%;
14579
+ max-height: calc(100vh - 310px);
14580
+ height: fit-content;
14469
14581
  overflow-y: scroll;
14470
14582
  `;
14471
- const ConfiguredList = () => {
14472
- 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 })))));
14583
+ const DestinationList = ({ withDelete }) => {
14584
+ const { configuredDestinations, configuredDestinationsUpdateOnly } = useSetupStore();
14585
+ if (!configuredDestinations.length && !configuredDestinationsUpdateOnly.length) {
14586
+ return (React.createElement(CenterThis, null,
14587
+ React.createElement(NoDataFound, { title: 'No destinations', subTitle: 'Please add a destination' })));
14588
+ }
14589
+ return (React.createElement(Container$7, null, configuredDestinations.concat(configuredDestinationsUpdateOnly).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 + configuredDestinationsUpdateOnly.length === 1, withDelete: withDelete })))));
14474
14590
  };
14475
- const ListItem = ({ item, isLastItem }) => {
14591
+ const ListItem = ({ item, isLastItem, withDelete }) => {
14476
14592
  const { removeConfiguredDestination } = useSetupStore();
14477
14593
  const [deleteWarning, setDeleteWarning] = useState(false);
14478
- const { icon, iconSrc } = getDestinationIcon(item.type);
14594
+ const { icon, iconSrc } = getDestinationIcon(item.destinationType.type);
14595
+ const mappedFields = useMemo(() => Object.entries(safeJsonParse(item.fields, {})).map(([k, v]) => ({ title: k, value: v })) || [], [item.fields]);
14479
14596
  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),
14597
+ React.createElement(DataTab, { title: item.destinationType.displayName || item.name, subTitle: item.destinationType.type, iconProps: { icon, iconSrc }, visualProps: {
14598
+ monitors: mapExportedSignals(item.exportedSignals),
14485
14599
  monitorsWithLabels: true,
14486
14600
  }, extendableProps: {
14487
14601
  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) })));
14602
+ renderExtended: () => React.createElement(DataCardFields, { data: mappedFields }),
14603
+ }, renderActions: withDelete
14604
+ ? () => (React.createElement(IconButton, { onClick: () => setDeleteWarning(true) },
14605
+ React.createElement(TrashIcon, null)))
14606
+ : undefined }),
14607
+ withDelete && (React.createElement(DeleteWarning, { isOpen: deleteWarning, name: item.destinationType.displayName || item.name, type: EntityTypes.Destination, isLastItem: isLastItem, onApprove: () => removeConfiguredDestination(item), onDeny: () => setDeleteWarning(false) }))));
14492
14608
  };
14493
14609
 
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) `
14610
+ const LargeAndWideAddButton = styled(Button) `
14506
14611
  display: flex;
14507
14612
  align-items: center;
14508
14613
  justify-content: center;
14509
14614
  gap: 8px;
14510
14615
  width: 100%;
14616
+ padding: 32px;
14617
+ border-radius: 16px;
14618
+ border-style: dashed !important;
14511
14619
  `;
14512
- const DestinationSelectionForm = ({ categories, potentialDestinations, createDestination, isLoading, testConnection, testLoading, testResult, isSourcesListEmpty, goToSources, }) => {
14620
+ const DestinationSelectionForm = ({ isSourcesListEmpty, goToSources, categories, potentialDestinations, testConnection, onClickSummary }) => {
14513
14621
  const theme = Theme.useTheme();
14514
14622
  const { setCurrentModal } = useModalStore();
14623
+ const { configuredDestinations, configuredDestinationsUpdateOnly } = useSetupStore();
14515
14624
  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))));
14625
+ return (React.createElement(React.Fragment, null,
14626
+ React.createElement(ModalBody, { "$isNotModal": true },
14627
+ React.createElement(FlexColumn, { "$gap": 12 },
14628
+ React.createElement(FlexColumn, { "$gap": 24 },
14629
+ onClickSummary && React.createElement(NoteBackToSummary, { onClick: onClickSummary }),
14630
+ React.createElement(SectionTitle, { title: DISPLAY_TITLES.ADD_DESTINATIONS, badgeLabel: configuredDestinations.length + configuredDestinationsUpdateOnly.length, description: DISPLAY_TITLES.ADD_DESTINATION_DESCRIPTION }),
14631
+ isSourcesListEmpty && (React.createElement(NotificationNote, { type: StatusType.Warning, message: DISPLAY_TITLES.NO_SOURCES_GO_BACK, action: {
14632
+ label: DISPLAY_TITLES.SELECT_SOURCES,
14633
+ onClick: goToSources,
14634
+ } })),
14635
+ React.createElement(LargeAndWideAddButton, { variant: 'secondary', onClick: onOpen },
14636
+ React.createElement(PlusIcon$1, null),
14637
+ React.createElement(Text, { color: theme.colors.secondary, size: 14, decoration: 'underline', family: 'secondary' }, DISPLAY_TITLES.ADD_DESTINATION))),
14638
+ React.createElement(DestinationList, { withDelete: true }))),
14639
+ React.createElement(DestinationModal, { isOnboarding: true, categories: categories, potentialDestinations: potentialDestinations, createDestination: () => { }, testConnection: testConnection })));
14530
14640
  };
14531
14641
 
14532
14642
  const columns$2 = [
14533
14643
  { key: 'icon', title: '' },
14534
14644
  { key: 'name', title: DISPLAY_TITLES.NAME, sortable: true },
14535
14645
  { key: 'type', title: DISPLAY_TITLES.TYPE, sortable: true },
14536
- { key: 'signals', title: DISPLAY_TITLES.Monitors },
14646
+ { key: 'signals', title: DISPLAY_TITLES.MONITORS },
14537
14647
  { key: 'conditions', title: 'Conditions' },
14538
14648
  { key: 'throughput', title: 'Throughput', sortable: true },
14539
14649
  ];
14540
14650
  const DestinationTable = ({ metrics, maxHeight, maxWidth }) => {
14541
14651
  const theme = Theme.useTheme();
14542
14652
  const filters = useFilterStore();
14543
- const { destinations, destinationsLoading } = useEntityStore();
14653
+ const { selectedStreamName } = useDataStreamStore();
14544
14654
  const { setDrawerType, setDrawerEntityId } = useDrawerStore();
14545
- const filtered = useMemo(() => filterDestinations(destinations, filters), [destinations, filters]);
14546
- const rows = useMemo(() => filtered.map((dest) => {
14655
+ const { destinations, destinationsLoading } = useEntityStore();
14656
+ const destinationsByStream = useMemo(() => filterDestinationsByStream(destinations, selectedStreamName), [destinations, selectedStreamName]);
14657
+ const filteredDestinations = useMemo(() => filterDestinations(destinationsByStream, filters), [destinationsByStream, filters]);
14658
+ const rows = useMemo(() => filteredDestinations.map((dest) => {
14547
14659
  const { hasErrors, hasWarnings, hasDisableds } = getConditionsBooleans(dest.conditions || []);
14548
14660
  const { icon, iconSrc } = getDestinationIcon(dest.destinationType.type);
14549
14661
  return {
@@ -14578,19 +14690,29 @@ const DestinationTable = ({ metrics, maxHeight, maxWidth }) => {
14578
14690
  },
14579
14691
  {
14580
14692
  columnKey: 'signals',
14581
- component: () => React.createElement(MonitorsIcons, { withLabels: true, monitors: Object.keys(dest.exportedSignals).filter((signal) => dest.exportedSignals[signal] === true) }),
14693
+ component: () => React.createElement(MonitorsIcons, { withLabels: true, monitors: mapExportedSignals(dest.exportedSignals) }),
14582
14694
  },
14583
14695
  ],
14584
14696
  };
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]);
14697
+ }), [filteredDestinations, metrics]);
14698
+ const { badge, badgeTooltip } = useMemo(() => {
14699
+ if (filteredDestinations.length !== destinationsByStream.length) {
14700
+ return {
14701
+ badge: `${filteredDestinations.length}/${destinationsByStream.length}`,
14702
+ badgeTooltip: DISPLAY_TITLES.FILTERED_COUNT_TOOLTIP,
14703
+ };
14704
+ }
14705
+ return {
14706
+ badge: destinationsByStream.length,
14707
+ badgeTooltip: undefined,
14708
+ };
14709
+ }, [filteredDestinations, destinationsByStream]);
14588
14710
  return (React.createElement(TableContainer, { "$maxWidth": maxWidth },
14589
14711
  React.createElement(TableTitleWrap, null,
14590
- React.createElement(IconTitleBadge, { icon: getEntityIcon(EntityTypes.Destination), title: DISPLAY_TITLES.Destinations, badge: badge, badgeTooltip: badgeTooltip, loading: destinationsLoading })),
14712
+ React.createElement(IconTitleBadge, { icon: getEntityIcon(EntityTypes.Destination), title: DISPLAY_TITLES.DESTINATIONS, badge: badge, badgeTooltip: badgeTooltip, loading: destinationsLoading })),
14591
14713
  React.createElement(TableWrap, { "$maxHeight": maxHeight },
14592
14714
  React.createElement(InteractiveTable, { columns: columns$2, rows: rows })),
14593
- !filtered.length && (React.createElement(CenterThis, { style: { marginTop: '2rem' } },
14715
+ !filteredDestinations.length && (React.createElement(CenterThis, { style: { marginTop: '2rem' } },
14594
14716
  React.createElement(NoDataFound, null)))));
14595
14717
  };
14596
14718
 
@@ -14791,7 +14913,7 @@ const CustomFields = ({ ruleType, value, setValue, formErrors }) => {
14791
14913
  return Component ? React.createElement(Component, { value: value, setValue: setValue, formErrors: formErrors }) : null;
14792
14914
  };
14793
14915
 
14794
- const Container$5 = styled.div `
14916
+ const Container$6 = styled.div `
14795
14917
  display: flex;
14796
14918
  flex-direction: column;
14797
14919
  gap: 24px;
@@ -14802,7 +14924,7 @@ const FieldTitle = styled(Text) `
14802
14924
  `;
14803
14925
  const InstrumentationRuleForm = ({ isUpdate, rule, formData, formErrors, handleFormChange }) => {
14804
14926
  const theme = Theme.useTheme();
14805
- return (React.createElement(Container$5, null,
14927
+ return (React.createElement(Container$6, null,
14806
14928
  isUpdate && (React.createElement("div", null,
14807
14929
  React.createElement(FieldTitle, null, "Status"),
14808
14930
  React.createElement(Segment, { options: [
@@ -15024,14 +15146,14 @@ const InstrumentationRuleTable = ({ maxHeight, maxWidth }) => {
15024
15146
  }), [instrumentationRules]);
15025
15147
  return (React.createElement(TableContainer, { "$maxWidth": maxWidth },
15026
15148
  React.createElement(TableTitleWrap, null,
15027
- React.createElement(IconTitleBadge, { icon: getEntityIcon(EntityTypes.Action), title: DISPLAY_TITLES.InstrumentationRules, badge: instrumentationRules.length, loading: instrumentationRulesLoading })),
15149
+ React.createElement(IconTitleBadge, { icon: getEntityIcon(EntityTypes.Action), title: DISPLAY_TITLES.INSTRUMENTATION_RULES, badge: instrumentationRules.length, loading: instrumentationRulesLoading })),
15028
15150
  React.createElement(TableWrap, { "$maxHeight": maxHeight },
15029
15151
  React.createElement(InteractiveTable, { columns: columns$1, rows: rows })),
15030
15152
  !instrumentationRules.length && (React.createElement(CenterThis, { style: { marginTop: '2rem' } },
15031
15153
  React.createElement(NoDataFound, null)))));
15032
15154
  };
15033
15155
 
15034
- const Container$4 = styled.div `
15156
+ const Container$5 = styled.div `
15035
15157
  position: fixed;
15036
15158
  bottom: 0;
15037
15159
  left: 50%;
@@ -15048,7 +15170,7 @@ const Container$4 = styled.div `
15048
15170
  const MultiSourceControl = ({ totalSourceCount, uninstrumentSources }) => {
15049
15171
  const theme = Theme.useTheme();
15050
15172
  const Transition = useTransition({
15051
- container: Container$4,
15173
+ container: Container$5,
15052
15174
  animateIn: Theme.animations.slide.in['center'],
15053
15175
  animateOut: Theme.animations.slide.out['center'],
15054
15176
  });
@@ -15065,7 +15187,14 @@ const MultiSourceControl = ({ totalSourceCount, uninstrumentSources }) => {
15065
15187
  setSelectedSources({});
15066
15188
  };
15067
15189
  const onDelete = () => {
15068
- uninstrumentSources(selectedSources);
15190
+ const payload = {};
15191
+ Object.entries(selectedSources).forEach(([ns, sources]) => {
15192
+ payload[ns] = sources.map((source) => ({
15193
+ ...source,
15194
+ selected: false,
15195
+ }));
15196
+ });
15197
+ uninstrumentSources(payload);
15069
15198
  setIsWarnModalOpen(false);
15070
15199
  onDeselect();
15071
15200
  };
@@ -15227,6 +15356,126 @@ const NotificationListItem = ({ id, seen, type, title, message, time, crdType, t
15227
15356
  React.createElement(Text, { size: 10, color: theme.colors.orange_soft }, "new")))))));
15228
15357
  };
15229
15358
 
15359
+ const Container$4 = styled.div `
15360
+ display: flex;
15361
+ flex-direction: column;
15362
+ align-items: center;
15363
+
15364
+ gap: 12px;
15365
+ width: 100%;
15366
+ max-height: ${({ $isModal }) => ($isModal ? 'calc(100vh - 510px)' : 'calc(100vh - 310px)')};
15367
+ height: fit-content;
15368
+ overflow-y: scroll;
15369
+ `;
15370
+ const Group = styled.div `
15371
+ width: 100%;
15372
+ padding-bottom: ${({ $isOpen }) => ($isOpen ? '18px' : '0')};
15373
+ border-radius: 16px;
15374
+ background-color: ${({ $selected, theme }) => ($selected ? theme.colors.majestic_blue + Theme.opacity.hex['024'] : theme.colors.dropdown_bg_2 + Theme.opacity.hex['040'])};
15375
+ `;
15376
+ const NamespaceItem = styled.div `
15377
+ display: flex;
15378
+ justify-content: space-between;
15379
+ gap: 12px;
15380
+ margin: 0;
15381
+ padding: 18px;
15382
+ border-radius: 16px;
15383
+ cursor: ${({ $withClick }) => ($withClick ? 'pointer' : 'unset')};
15384
+ &:hover {
15385
+ background-color: ${({ $withClick, $selected, theme }) => $withClick && ($selected ? theme.colors.majestic_blue + Theme.opacity.hex['040'] : theme.colors.dropdown_bg_2 + Theme.opacity.hex['080'])};
15386
+ transition: background-color 0.3s;
15387
+ }
15388
+ `;
15389
+ const SourceItem = styled(NamespaceItem) `
15390
+ width: calc(100% - 50px);
15391
+ margin-left: auto;
15392
+ padding: 8px;
15393
+ `;
15394
+ const RelativeWrapper = styled.div `
15395
+ position: relative;
15396
+ padding-bottom: ${({ $addPadding }) => ($addPadding ? '16px' : '0')};
15397
+ `;
15398
+ const AbsoluteWrapper = styled.div `
15399
+ position: absolute;
15400
+ top: 6px;
15401
+ left: 18px;
15402
+ `;
15403
+ const NotSourcesWrapper = styled(CenterThis) `
15404
+ padding-bottom: ${({ $addPadding }) => ($addPadding ? '16px' : '0')};
15405
+ `;
15406
+ const SelectionCount = styled(Text) `
15407
+ width: 18px;
15408
+ `;
15409
+ const SourceList = ({ isModal = false, withInstances = true, filteredNamespacesAndSources, selectedNamespace, onSelectNamespace, selectedSources, onSelectSource }) => {
15410
+ const theme = Theme.useTheme();
15411
+ const { namespacesLoading } = useEntityStore();
15412
+ const matrix = Object.entries(filteredNamespacesAndSources || {});
15413
+ if (!matrix?.length) {
15414
+ 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 }))));
15415
+ }
15416
+ return (React.createElement(Container$4, { "$isModal": isModal }, matrix.map(([namespace, sources]) => {
15417
+ const sourcesForNamespace = selectedSources?.[namespace] || [];
15418
+ const onlySelectedSources = sourcesForNamespace.filter(({ selected }) => selected);
15419
+ const isNamespaceLoaded = sourcesForNamespace.length > 0;
15420
+ const isNamespaceSelected = selectedNamespace === namespace;
15421
+ const isNamespaceAllSourcesSelected = onlySelectedSources.length > 0 && onlySelectedSources.length === sources.length;
15422
+ const isNamespacePartiallySourcesSelected = onlySelectedSources.length > 0 && onlySelectedSources.length !== sources.length;
15423
+ const hasSources = sources.length > 0;
15424
+ if (!onSelectNamespace && !hasSources)
15425
+ return null;
15426
+ return (React.createElement(Group, { key: `namespace-${namespace}`, "data-id": `namespace-${namespace}`, "$selected": isNamespaceAllSourcesSelected, "$isOpen": isNamespaceSelected },
15427
+ React.createElement(NamespaceItem, { "$selected": isNamespaceAllSourcesSelected, "$withClick": !!onSelectNamespace, onClick: () => onSelectNamespace?.(namespace) },
15428
+ React.createElement(FlexRow, { "$gap": 12 },
15429
+ onSelectNamespace && React.createElement(Checkbox, { partiallyChecked: isNamespacePartiallySourcesSelected, value: isNamespaceAllSourcesSelected, onChange: (bool) => onSelectNamespace(namespace, bool) }),
15430
+ React.createElement(Text, null, namespace)),
15431
+ React.createElement(FlexRow, { "$gap": 12 },
15432
+ React.createElement(SelectionCount, { size: 10, color: theme.text.grey }, isNamespaceLoaded ? `${onlySelectedSources.length}/${sources.length}` : null),
15433
+ onSelectNamespace && React.createElement(ExtendArrow, { extend: isNamespaceSelected }))),
15434
+ (isNamespaceSelected || !onSelectNamespace) &&
15435
+ (hasSources ? (React.createElement(RelativeWrapper, { "$addPadding": !onSelectSource },
15436
+ React.createElement(AbsoluteWrapper, null,
15437
+ React.createElement(Divider, { orientation: 'vertical', length: `${(sources.length || 0) * 36}px` })),
15438
+ sources.map((source) => {
15439
+ const isSourceSelected = onlySelectedSources.some(({ name }) => name === source.name);
15440
+ return React.createElement(SourceRow, { key: `source-${source.name}`, withInstances: withInstances, source: source, namespace: namespace, isSelected: isSourceSelected, onSelect: onSelectSource });
15441
+ }))) : (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 }))))));
15442
+ })));
15443
+ };
15444
+ const SourceRow = ({ withInstances, source, namespace, isSelected, onSelect, }) => {
15445
+ return (React.createElement(SourceItem, { "data-id": `source-${source.name}`, "$selected": isSelected, "$withClick": !!onSelect, onClick: () => onSelect?.(source) },
15446
+ React.createElement(FlexRow, { "$gap": 12 },
15447
+ onSelect && React.createElement(Checkbox, { value: isSelected, onChange: () => onSelect(source, namespace) }),
15448
+ React.createElement(Text, null, source.name),
15449
+ React.createElement(Text, { opacity: 0.8, size: 10 },
15450
+ withInstances ? `${source.numberOfInstances || 0} running instance${source.numberOfInstances !== 1 ? 's' : ''} • ` : '',
15451
+ source.kind))));
15452
+ };
15453
+
15454
+ const Container$3 = styled.div `
15455
+ display: flex;
15456
+ flex-direction: column;
15457
+ align-items: center;
15458
+ gap: 12px;
15459
+ width: 100%;
15460
+ max-height: calc(100vh - 200px);
15461
+ height: fit-content;
15462
+ overflow-y: scroll;
15463
+ `;
15464
+ const SetupSummary = ({ onEditStream, onEditSources, onEditDestinations }) => {
15465
+ const { selectedStreamName } = useDataStreamStore();
15466
+ const { configuredSources, configuredDestinations, configuredDestinationsUpdateOnly } = useSetupStore();
15467
+ const sourceCount = useMemo(() => Object.values(configuredSources).reduce((total, sourceList) => total + sourceList.filter((s) => s.selected).length, 0), [configuredSources]);
15468
+ return (React.createElement(ModalBody, { "$isNotModal": true },
15469
+ React.createElement(FlexColumn, { "$gap": 12 },
15470
+ React.createElement(SectionTitle, { title: DISPLAY_TITLES.SUMMARY, description: DISPLAY_TITLES.STREAM_CONFIRM }),
15471
+ React.createElement(Container$3, null,
15472
+ React.createElement(DataCard, { title: DISPLAY_TITLES.STREAM_NAME, action: () => React.createElement(EditButton, { onClick: onEditStream }), data: [{ title: '', value: selectedStreamName }] }),
15473
+ React.createElement(DataCard, { title: DISPLAY_TITLES.SELECTED_SOURCES, titleBadge: sourceCount, action: () => React.createElement(EditButton, { onClick: onEditSources }) },
15474
+ React.createElement(SourceList, { filteredNamespacesAndSources: configuredSources, withInstances: false })),
15475
+ React.createElement(DataCard, { title: DISPLAY_TITLES.SELECTED_DESTINATIONS, titleBadge: configuredDestinations.length + configuredDestinationsUpdateOnly.length, action: () => React.createElement(EditButton, { onClick: onEditDestinations }) },
15476
+ React.createElement(DestinationList, null))))));
15477
+ };
15478
+
15230
15479
  var NavIconIds;
15231
15480
  (function (NavIconIds) {
15232
15481
  NavIconIds["Overview"] = "overview";
@@ -15390,21 +15639,21 @@ const Describe$1 = ({ source, fetchDescribeSource }) => {
15390
15639
  const buildCard = (source) => {
15391
15640
  const { name, kind, namespace } = source;
15392
15641
  const arr = [
15393
- { title: DISPLAY_TITLES.Namespace, value: namespace },
15642
+ { title: DISPLAY_TITLES.NAMESPACE, value: namespace },
15394
15643
  { title: DISPLAY_TITLES.KIND, value: kind },
15395
15644
  { title: DISPLAY_TITLES.NAME, value: name, tooltip: 'K8s resource name' },
15396
15645
  ];
15397
15646
  return arr;
15398
15647
  };
15399
15648
 
15400
- const Container$3 = styled.div `
15649
+ const Container$2 = styled.div `
15401
15650
  display: flex;
15402
15651
  flex-direction: column;
15403
15652
  gap: 24px;
15404
15653
  padding: 4px;
15405
15654
  `;
15406
15655
  const SourceForm = ({ formData, handleFormChange }) => {
15407
- return (React.createElement(Container$3, null,
15656
+ return (React.createElement(Container$2, null,
15408
15657
  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
15658
  };
15410
15659
 
@@ -15427,7 +15676,9 @@ const DataContainer$1 = styled.div `
15427
15676
  `;
15428
15677
  const SourceDrawer = ({ persistSources, updateSource, fetchDescribeSource }) => {
15429
15678
  const { sources } = useEntityStore();
15679
+ const { selectedStreamName } = useDataStreamStore();
15430
15680
  const { drawerType, drawerEntityId } = useDrawerStore();
15681
+ const sourcesByStream = useMemo(() => filterSourcesByStream(sources, selectedStreamName), [sources, selectedStreamName]);
15431
15682
  const drawerRef = useRef(null);
15432
15683
  const isOpen = drawerType !== EntityTypes.Source;
15433
15684
  const [isEditing, setIsEditing] = useState(false);
@@ -15437,11 +15688,11 @@ const SourceDrawer = ({ persistSources, updateSource, fetchDescribeSource }) =>
15437
15688
  const thisItem = useMemo(() => {
15438
15689
  if (isOpen)
15439
15690
  return null;
15440
- const found = sources?.find((x) => x.namespace === drawerEntityId.namespace && x.name === drawerEntityId.name && x.kind === drawerEntityId.kind);
15691
+ const found = sourcesByStream?.find((x) => x.namespace === drawerEntityId.namespace && x.name === drawerEntityId.name && x.kind === drawerEntityId.kind);
15441
15692
  if (!!found)
15442
15693
  loadFormWithDrawerItem(found);
15443
15694
  return found;
15444
- }, [isOpen, drawerEntityId, sources]);
15695
+ }, [isOpen, drawerEntityId, sourcesByStream]);
15445
15696
  if (!thisItem)
15446
15697
  return null;
15447
15698
  const containersData = thisItem.containers?.map((container) => ({
@@ -15458,7 +15709,7 @@ const SourceDrawer = ({ persistSources, updateSource, fetchDescribeSource }) =>
15458
15709
  };
15459
15710
  const handleDelete = async () => {
15460
15711
  const { namespace } = thisItem;
15461
- persistSources({ [namespace]: [{ ...thisItem, selected: false }] }, {});
15712
+ persistSources({ [namespace]: [{ ...thisItem, selected: false, currentStreamName: selectedStreamName }] }, {});
15462
15713
  setIsFormDirty(false);
15463
15714
  setIsEditing(false);
15464
15715
  resetFormData();
@@ -15472,7 +15723,7 @@ const SourceDrawer = ({ persistSources, updateSource, fetchDescribeSource }) =>
15472
15723
  setIsFormDirty(false);
15473
15724
  setIsEditing(false);
15474
15725
  };
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: [
15726
+ 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
15727
  {
15477
15728
  label: Tabs.Overview,
15478
15729
  onClick: () => setSelectedTab(Tabs.Overview),
@@ -15487,137 +15738,22 @@ const SourceDrawer = ({ persistSources, updateSource, fetchDescribeSource }) =>
15487
15738
  React.createElement(SourceForm, { formData: formData, handleFormChange: (...params) => {
15488
15739
  setIsFormDirty(true);
15489
15740
  handleFormChange(...params);
15741
+ handleFormChange('currentStreamName', selectedStreamName);
15490
15742
  } }))) : (React.createElement(DataContainer$1, null,
15491
15743
  React.createElement(ConditionDetails, { conditions: thisItem.conditions || [] }),
15492
15744
  React.createElement(DataCard, { title: DISPLAY_TITLES.SOURCE_DETAILS, data: !!thisItem ? buildCard(thisItem) : [] }),
15493
15745
  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
15746
  };
15495
15747
 
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;
15748
+ const ActionsRow = styled(FlexRow) `
15513
15749
  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
15750
  `;
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;
15600
- justify-content: space-between;
15601
- `;
15602
- // when bringin back the "Select all" checkbox, change the following width to 300px
15603
15751
  const SearchWrapper = styled.div `
15604
- width: 444px;
15752
+ width: 420px;
15605
15753
  `;
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;
15754
+ const SourceSelectionForm = forwardRef(({ isModal, fetchSingleNamespace, onClickSummary }, ref) => {
15755
+ const formState = useSourceSelectionFormData({ fetchSingleNamespace });
15756
+ const { recordedInitialSources, selectedSources, getApiSourcesPayload, getApiFutureAppsPayload, searchText, setSearchText, showSelectedOnly, setShowSelectedOnly } = formState;
15621
15757
  useImperativeHandle(ref, () => ({
15622
15758
  getFormValues: () => ({
15623
15759
  initial: recordedInitialSources,
@@ -15625,19 +15761,24 @@ const SourceSelectionForm = forwardRef((props, ref) => {
15625
15761
  futureApps: getApiFutureAppsPayload(),
15626
15762
  }),
15627
15763
  }));
15764
+ const selectedCount = Object.values(selectedSources).reduce((prev, curr) => prev + curr.filter((s) => s.selected).length, 0);
15628
15765
  return (React.createElement(ModalBody, { "$isNotModal": !isModal },
15629
- React.createElement(Controls, { ...props, ...formState }),
15630
- React.createElement(List, { ...props, ...formState })));
15766
+ React.createElement(FlexColumn, { "$gap": 12 },
15767
+ React.createElement(FlexColumn, { "$gap": 24 },
15768
+ onClickSummary && React.createElement(NoteBackToSummary, { onClick: onClickSummary }),
15769
+ React.createElement(SectionTitle, { title: DISPLAY_TITLES.SELECT_SOURCES, badgeLabel: selectedCount, description: DISPLAY_TITLES.SELECT_SOURCES_DESCRIPTION }),
15770
+ React.createElement(ActionsRow, null,
15771
+ React.createElement(SearchWrapper, null,
15772
+ React.createElement(Input, { placeholder: DISPLAY_TITLES.SEARCH_NAMESPACES, icon: SearchIcon, value: searchText, onChange: (e) => setSearchText(e.target.value.toLowerCase()) })),
15773
+ React.createElement(Toggle, { title: DISPLAY_TITLES.SHOW_SELECTED_ONLY, initialValue: showSelectedOnly, onChange: setShowSelectedOnly }))),
15774
+ React.createElement(Divider, null),
15775
+ React.createElement(SourceList, { isModal: isModal, ...formState }))));
15631
15776
  });
15632
15777
 
15633
- const SourceModal = ({ selectedNamespace, setSelectedNamespace, namespace, persistSources }) => {
15778
+ const SourceModal = ({ fetchSingleNamespace, persistSources }) => {
15634
15779
  const { currentModal, setCurrentModal } = useModalStore();
15635
15780
  const isOpen = currentModal === EntityTypes.Source;
15636
- const onSelectNamespace = (ns) => {
15637
- setSelectedNamespace((prev) => (prev === ns ? '' : ns));
15638
- };
15639
15781
  const handleClose = () => {
15640
- setSelectedNamespace('');
15641
15782
  setCurrentModal('');
15642
15783
  };
15643
15784
  const handleSubmit = async () => {
@@ -15656,14 +15797,14 @@ const SourceModal = ({ selectedNamespace, setSelectedNamespace, namespace, persi
15656
15797
  onClick: handleSubmit,
15657
15798
  },
15658
15799
  ] }) },
15659
- React.createElement(SourceSelectionForm, { ref: formRef, isModal: true, selectedNamespace: selectedNamespace, onSelectNamespace: onSelectNamespace, namespace: namespace })));
15800
+ React.createElement(SourceSelectionForm, { ref: formRef, isModal: true, fetchSingleNamespace: fetchSingleNamespace })));
15660
15801
  };
15661
15802
 
15662
15803
  const columns = [
15663
15804
  { key: 'checkbox-and-icon', title: '' },
15664
15805
  { key: 'name', title: DISPLAY_TITLES.NAME, sortable: true },
15665
15806
  { key: 'type', title: 'Kubernetes Type', sortable: true },
15666
- { key: 'namespace', title: DISPLAY_TITLES.Namespace, sortable: true },
15807
+ { key: 'namespace', title: DISPLAY_TITLES.NAMESPACE, sortable: true },
15667
15808
  { key: 'containers', title: DISPLAY_TITLES.DETECTED_CONTAINERS },
15668
15809
  { key: 'conditions', title: 'Conditions' },
15669
15810
  { key: 'throughput', title: 'Throughput', sortable: true },
@@ -15672,6 +15813,7 @@ const SourceTable = ({ metrics, maxHeight, maxWidth }) => {
15672
15813
  const theme = Theme.useTheme();
15673
15814
  const filters = useFilterStore();
15674
15815
  const { isThisPending } = usePendingStore();
15816
+ const { selectedStreamName } = useDataStreamStore();
15675
15817
  const { sources, sourcesLoading } = useEntityStore();
15676
15818
  const { setDrawerType, setDrawerEntityId } = useDrawerStore();
15677
15819
  const { selectedSources, setSelectedSources } = useSelectedStore();
@@ -15684,7 +15826,8 @@ const SourceTable = ({ metrics, maxHeight, maxWidth }) => {
15684
15826
  return calculateProgress(sourcesToDelete, sourcesDeleted);
15685
15827
  return 1;
15686
15828
  }, [sourcesToCreate, sourcesCreated, sourcesToDelete, sourcesDeleted]);
15687
- const filtered = useMemo(() => filterSources(sources, filters), [sources, filters]);
15829
+ const sourcesByStream = useMemo(() => filterSourcesByStream(sources, selectedStreamName), [sources, selectedStreamName]);
15830
+ const filteredSources = useMemo(() => filterSources(sourcesByStream, filters), [sourcesByStream, filters]);
15688
15831
  const [hasSelected, totalSelectedSources] = useMemo(() => {
15689
15832
  let num = 0;
15690
15833
  Object.values(selectedSources).forEach((selectedSources) => {
@@ -15695,7 +15838,7 @@ const SourceTable = ({ metrics, maxHeight, maxWidth }) => {
15695
15838
  const onSelectAll = useCallback((bool) => {
15696
15839
  if (bool) {
15697
15840
  const payload = {};
15698
- filtered.forEach((source) => {
15841
+ filteredSources.forEach((source) => {
15699
15842
  const id = { namespace: source.namespace, name: source.name, kind: source.kind };
15700
15843
  const isPending = isThisPending({ entityType: EntityTypes.Source, entityId: id });
15701
15844
  if (!isPending) {
@@ -15712,7 +15855,7 @@ const SourceTable = ({ metrics, maxHeight, maxWidth }) => {
15712
15855
  else {
15713
15856
  setSelectedSources({});
15714
15857
  }
15715
- }, [filtered]);
15858
+ }, [filteredSources]);
15716
15859
  const onSelectOne = useCallback((source) => {
15717
15860
  const { namespace, name, kind } = source;
15718
15861
  const payload = { ...selectedSources };
@@ -15727,7 +15870,7 @@ const SourceTable = ({ metrics, maxHeight, maxWidth }) => {
15727
15870
  }
15728
15871
  setSelectedSources(payload);
15729
15872
  }, [selectedSources]);
15730
- const rows = useMemo(() => filtered.map((source) => {
15873
+ const rows = useMemo(() => filteredSources.map((source) => {
15731
15874
  const id = getWorkloadId(source);
15732
15875
  const idString = JSON.stringify(id);
15733
15876
  const { hasErrors, hasWarnings, hasDisableds } = getConditionsBooleans(source.conditions || []);
@@ -15777,13 +15920,23 @@ const SourceTable = ({ metrics, maxHeight, maxWidth }) => {
15777
15920
  },
15778
15921
  ],
15779
15922
  };
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]);
15923
+ }), [filteredSources, selectedSources, metrics, onSelectOne]);
15924
+ const { badge, badgeTooltip } = useMemo(() => {
15925
+ if (filteredSources.length !== sourcesByStream.length) {
15926
+ return {
15927
+ badge: `${filteredSources.length}/${sourcesByStream.length}`,
15928
+ badgeTooltip: DISPLAY_TITLES.FILTERED_COUNT_TOOLTIP,
15929
+ };
15930
+ }
15931
+ return {
15932
+ badge: sourcesByStream.length,
15933
+ badgeTooltip: undefined,
15934
+ };
15935
+ }, [filteredSources, sourcesByStream]);
15783
15936
  return (React.createElement(TableContainer, { "$maxWidth": maxWidth },
15784
15937
  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 })),
15938
+ React.createElement(Checkbox, { partiallyChecked: hasSelected && filteredSources?.length !== totalSelectedSources, value: hasSelected && filteredSources?.length === totalSelectedSources, onChange: onSelectAll, disabled: !filteredSources?.length }),
15939
+ React.createElement(IconTitleBadge, { icon: getEntityIcon(EntityTypes.Source), title: DISPLAY_TITLES.SOURCES, badge: badge, badgeTooltip: badgeTooltip, loading: sourcesLoading && !isAwaitingInstrumentation })),
15787
15940
  React.createElement(TableWrap, { "$maxHeight": maxHeight },
15788
15941
  React.createElement(InteractiveTable, { columns: columns, rows: isAwaitingInstrumentation ? [] : rows })),
15789
15942
  isAwaitingInstrumentation ? (React.createElement(CenterThis, { style: { marginTop: '2rem', gap: '24px' } },
@@ -15792,7 +15945,7 @@ const SourceTable = ({ metrics, maxHeight, maxWidth }) => {
15792
15945
  React.createElement(Text, { color: theme.text.info },
15793
15946
  !!sourcesToCreate ? 'Instrumenting' : 'Uninstrumenting',
15794
15947
  " workloads..."),
15795
- React.createElement(Badge, { label: `${instrumentingPercent}%` })))) : !filtered.length ? (React.createElement(CenterThis, { style: { marginTop: '2rem' } },
15948
+ React.createElement(Badge, { label: `${instrumentingPercent}%` })))) : !filteredSources.length ? (React.createElement(CenterThis, { style: { marginTop: '2rem' } },
15796
15949
  React.createElement(NoDataFound, null))) : null));
15797
15950
  };
15798
15951
 
@@ -16044,4 +16197,4 @@ const ToggleDarkMode = () => {
16044
16197
  React.createElement(Background, { "$darkMode": darkMode })));
16045
16198
  };
16046
16199
 
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 };
16200
+ 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 };