@oneuptime/common 12.0.11 → 12.0.13

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 (251) hide show
  1. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +32 -5
  2. package/Models/DatabaseModels/NetworkDevice.ts +64 -0
  3. package/Models/DatabaseModels/StatusPage.ts +59 -0
  4. package/Models/DatabaseModels/StatusPageOidc.ts +2 -0
  5. package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +19 -2
  6. package/Server/API/AIChatAPI.ts +55 -56
  7. package/Server/API/CommonAPI.ts +89 -0
  8. package/Server/API/MicrosoftTeamsAPI.ts +20 -9
  9. package/Server/API/SlackAPI.ts +13 -10
  10. package/Server/API/StatusPageAPI.ts +2197 -2128
  11. package/Server/API/TelemetryAPI.ts +72 -3
  12. package/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.ts +30 -0
  13. package/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.ts +47 -0
  14. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
  15. package/Server/Middleware/UserAuthorization.ts +11 -2
  16. package/Server/Services/ApiKeyPermissionService.ts +116 -2
  17. package/Server/Services/DatabaseService.ts +17 -6
  18. package/Server/Services/LogAggregationService.ts +34 -0
  19. package/Server/Services/LogService.ts +21 -0
  20. package/Server/Services/NetworkSiteService.ts +12 -0
  21. package/Server/Services/SpanService.ts +21 -0
  22. package/Server/Services/TraceAggregationService.ts +15 -0
  23. package/Server/Services/WorkspaceNotificationRuleService.ts +172 -220
  24. package/Server/Types/AnalyticsDatabase/ModelPermission.ts +9 -0
  25. package/Server/Types/Database/Permissions/AccessControlPermission.ts +47 -16
  26. package/Server/Types/Workflow/Components/Conditions/IfElse.ts +9 -0
  27. package/Server/Types/Workflow/Components/JavaScript.ts +9 -0
  28. package/Server/Utils/APIKey/AccessPermission.ts +16 -40
  29. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +144 -0
  30. package/Server/Utils/LogRedaction.ts +576 -0
  31. package/Server/Utils/Logger.ts +123 -46
  32. package/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts +94 -23
  33. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +12 -0
  34. package/Server/Utils/Monitor/MonitorResource.ts +29 -9
  35. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +28 -7
  36. package/Server/Utils/SessionReplay/SessionReplayGateCacheStore.ts +56 -10
  37. package/Server/Utils/StartServer.ts +30 -9
  38. package/Server/Utils/StatusPageSearchEngineIndexing.ts +33 -0
  39. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +441 -0
  40. package/Server/Utils/VM/VMRunner.ts +693 -874
  41. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +488 -46
  42. package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +300 -0
  43. package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +130 -0
  44. package/Tests/Models/DatabaseModels/DatabaseBaseModelToJSONObjectCache.test.ts +180 -0
  45. package/Tests/Models/StatusPageEnableSearchEngineIndexing.test.ts +157 -0
  46. package/Tests/Server/API/AIChatCancelAndFeedback.test.ts +23 -1
  47. package/Tests/Server/API/AIChatRouteAuthorization.test.ts +785 -0
  48. package/Tests/Server/API/BaseAPIApiKeyAuth.test.ts +21 -8
  49. package/Tests/Server/API/CommonAPIAuthGuard.test.ts +290 -0
  50. package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +7 -1
  51. package/Tests/Server/API/StatusPageOverviewCache.test.ts +474 -0
  52. package/Tests/Server/API/StatusPageSeoSearchEngineIndexing.test.ts +189 -0
  53. package/Tests/Server/Infrastructure/InMemoryTTLCache.test.ts +158 -0
  54. package/Tests/Server/Infrastructure/Postgres/DeviceRoleAndDeclaredLinkParentMigration.test.ts +9 -60
  55. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +24 -15
  56. package/Tests/Server/Middleware/UserAuthorization.test.ts +79 -0
  57. package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +332 -0
  58. package/Tests/Server/Services/ApiKeyPermissionService.test.ts +347 -0
  59. package/Tests/Server/Services/DatabaseServiceUpdateDebugLogging.test.ts +282 -0
  60. package/Tests/Server/Services/NetworkSiteService.test.ts +56 -2
  61. package/Tests/Server/Services/TelemetryResourceFacetFilters.test.ts +267 -0
  62. package/Tests/Server/Services/WorkspaceNotificationRuleTestRuleChannels.test.ts +702 -0
  63. package/Tests/Server/Types/Database/Permissions/AccessControlPermission.test.ts +165 -0
  64. package/Tests/Server/Types/Workflow/Components/CustomCodeScriptError.test.ts +121 -0
  65. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +48 -36
  66. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +213 -0
  67. package/Tests/Server/Utils/LogRedaction.test.ts +415 -0
  68. package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +245 -0
  69. package/Tests/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.test.ts +374 -4
  70. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorJavascriptExpression.test.ts +92 -0
  71. package/Tests/Server/Utils/Monitor/MonitorResourceIngestedStepSelection.test.ts +455 -0
  72. package/Tests/Server/Utils/Monitor/NetworkDeviceReachabilityRoundTrip.test.ts +369 -0
  73. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +86 -8
  74. package/Tests/Server/Utils/PrivacyFilterUtil.test.ts +64 -0
  75. package/Tests/Server/Utils/SessionReplay/SessionReplayGateCacheStore.test.ts +207 -0
  76. package/Tests/Server/Utils/StartServerBodyVerify.test.ts +335 -0
  77. package/Tests/Server/Utils/StatusPageSearchEngineIndexing.test.ts +60 -0
  78. package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +435 -0
  79. package/Tests/Server/Utils/VM/VMRunnerIsolation.test.ts +385 -0
  80. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +3 -0
  81. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +607 -62
  82. package/Tests/Server/Utils/Workspace/MicrosoftTeamsInstalledTeamIdSpace.test.ts +778 -0
  83. package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +44 -10
  84. package/Tests/Types/API/HostnameFromAuthority.test.ts +164 -0
  85. package/Tests/Types/Database/AccessControl/ColumnAccessControlCache.test.ts +344 -0
  86. package/Tests/Types/Database/DatabasePropertyFindOperator.test.ts +518 -0
  87. package/Tests/Types/Database/TableColumnMetadataCache.test.ts +286 -0
  88. package/Tests/Types/Monitor/MonitorStep.test.ts +100 -0
  89. package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +360 -0
  90. package/Tests/Types/StatusPage/SearchEngineIndexing.test.ts +86 -0
  91. package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +254 -0
  92. package/Tests/UI/Components/CardSelect.test.tsx +1021 -0
  93. package/Tests/UI/Components/MasterPage.test.tsx +36 -1
  94. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +66 -1
  95. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +115 -6
  96. package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +610 -0
  97. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +114 -45
  98. package/Types/API/Hostname.ts +79 -0
  99. package/Types/Database/AccessControl/ColumnAccessControl.ts +33 -11
  100. package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +33 -11
  101. package/Types/Database/DatabaseProperty.ts +38 -0
  102. package/Types/Database/TableColumn.ts +34 -7
  103. package/Types/Events/Recurring.ts +16 -1
  104. package/Types/Monitor/CustomCodeMonitor/CustomCodeMonitorResponse.ts +14 -2
  105. package/Types/Monitor/MonitorStep.ts +13 -1
  106. package/Types/Monitor/MonitorType.ts +345 -40
  107. package/Types/Monitor/SSLMonitor/SslMonitorResponse.ts +43 -0
  108. package/Types/StatusPage/SearchEngineIndexing.ts +61 -0
  109. package/Types/Telemetry/ResourceEntityFacet.ts +211 -0
  110. package/UI/Components/CardSelect/CardSelect.tsx +714 -105
  111. package/UI/Components/EmptyState/EmptyState.tsx +8 -1
  112. package/UI/Components/Footer/Footer.tsx +32 -6
  113. package/UI/Components/Forms/Fields/FormField.tsx +3 -0
  114. package/UI/Components/Forms/Types/Field.ts +8 -0
  115. package/UI/Components/Loader/PageLoader.tsx +29 -8
  116. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +26 -4
  117. package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +17 -1
  118. package/UI/Components/MasterPage/MasterPage.tsx +24 -11
  119. package/Utils/Monitor/MonitorMetricType.ts +16 -1
  120. package/Utils/Monitor/NetworkTopologyUtil.ts +60 -8
  121. package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +262 -0
  122. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +41 -24
  123. package/Utils/Telemetry/CrossSignalScope.ts +75 -4
  124. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +20 -4
  125. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  126. package/build/dist/Models/DatabaseModels/NetworkDevice.js +66 -0
  127. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  128. package/build/dist/Models/DatabaseModels/StatusPage.js +60 -0
  129. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  130. package/build/dist/Models/DatabaseModels/StatusPageOidc.js +2 -0
  131. package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
  132. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
  133. package/build/dist/Server/API/AIChatAPI.js +48 -35
  134. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  135. package/build/dist/Server/API/CommonAPI.js +59 -0
  136. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  137. package/build/dist/Server/API/MicrosoftTeamsAPI.js +20 -6
  138. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  139. package/build/dist/Server/API/SlackAPI.js +13 -10
  140. package/build/dist/Server/API/SlackAPI.js.map +1 -1
  141. package/build/dist/Server/API/StatusPageAPI.js +745 -673
  142. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  143. package/build/dist/Server/API/TelemetryAPI.js +34 -3
  144. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  145. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js +23 -0
  146. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js.map +1 -0
  147. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js +34 -0
  148. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js.map +1 -0
  149. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
  150. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  151. package/build/dist/Server/Middleware/UserAuthorization.js +6 -2
  152. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  153. package/build/dist/Server/Services/ApiKeyPermissionService.js +90 -1
  154. package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
  155. package/build/dist/Server/Services/DatabaseService.js +15 -6
  156. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  157. package/build/dist/Server/Services/LogAggregationService.js +2 -0
  158. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  159. package/build/dist/Server/Services/LogService.js +16 -0
  160. package/build/dist/Server/Services/LogService.js.map +1 -1
  161. package/build/dist/Server/Services/NetworkSiteService.js +12 -0
  162. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  163. package/build/dist/Server/Services/SpanService.js +16 -0
  164. package/build/dist/Server/Services/SpanService.js.map +1 -1
  165. package/build/dist/Server/Services/TraceAggregationService.js +2 -0
  166. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  167. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +137 -164
  168. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
  169. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +9 -0
  170. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
  171. package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js +21 -13
  172. package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js.map +1 -1
  173. package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js +8 -0
  174. package/build/dist/Server/Types/Workflow/Components/Conditions/IfElse.js.map +1 -1
  175. package/build/dist/Server/Types/Workflow/Components/JavaScript.js +8 -0
  176. package/build/dist/Server/Types/Workflow/Components/JavaScript.js.map +1 -1
  177. package/build/dist/Server/Utils/APIKey/AccessPermission.js +9 -32
  178. package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
  179. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +87 -0
  180. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  181. package/build/dist/Server/Utils/LogRedaction.js +449 -0
  182. package/build/dist/Server/Utils/LogRedaction.js.map +1 -0
  183. package/build/dist/Server/Utils/Logger.js +98 -45
  184. package/build/dist/Server/Utils/Logger.js.map +1 -1
  185. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js +65 -13
  186. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js.map +1 -1
  187. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +12 -1
  188. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  189. package/build/dist/Server/Utils/Monitor/MonitorResource.js +20 -3
  190. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  191. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +27 -7
  192. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  193. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js +29 -10
  194. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js.map +1 -1
  195. package/build/dist/Server/Utils/StartServer.js +10 -7
  196. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  197. package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js +24 -0
  198. package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js.map +1 -0
  199. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +311 -0
  200. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -0
  201. package/build/dist/Server/Utils/VM/VMRunner.js +402 -525
  202. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  203. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +366 -37
  204. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  205. package/build/dist/Types/API/Hostname.js +63 -0
  206. package/build/dist/Types/API/Hostname.js.map +1 -1
  207. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +20 -6
  208. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
  209. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +20 -6
  210. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
  211. package/build/dist/Types/Database/DatabaseProperty.js +38 -0
  212. package/build/dist/Types/Database/DatabaseProperty.js.map +1 -1
  213. package/build/dist/Types/Database/TableColumn.js +24 -6
  214. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  215. package/build/dist/Types/Events/Recurring.js +13 -1
  216. package/build/dist/Types/Events/Recurring.js.map +1 -1
  217. package/build/dist/Types/Monitor/MonitorStep.js +9 -1
  218. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  219. package/build/dist/Types/Monitor/MonitorType.js +330 -31
  220. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  221. package/build/dist/Types/StatusPage/SearchEngineIndexing.js +55 -0
  222. package/build/dist/Types/StatusPage/SearchEngineIndexing.js.map +1 -0
  223. package/build/dist/Types/Telemetry/ResourceEntityFacet.js +156 -0
  224. package/build/dist/Types/Telemetry/ResourceEntityFacet.js.map +1 -0
  225. package/build/dist/UI/Components/CardSelect/CardSelect.js +360 -40
  226. package/build/dist/UI/Components/CardSelect/CardSelect.js.map +1 -1
  227. package/build/dist/UI/Components/EmptyState/EmptyState.js +1 -1
  228. package/build/dist/UI/Components/EmptyState/EmptyState.js.map +1 -1
  229. package/build/dist/UI/Components/Footer/Footer.js +7 -4
  230. package/build/dist/UI/Components/Footer/Footer.js.map +1 -1
  231. package/build/dist/UI/Components/Forms/Fields/FormField.js +1 -1
  232. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  233. package/build/dist/UI/Components/Loader/PageLoader.js +15 -5
  234. package/build/dist/UI/Components/Loader/PageLoader.js.map +1 -1
  235. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +16 -3
  236. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  237. package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js +13 -1
  238. package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
  239. package/build/dist/UI/Components/MasterPage/MasterPage.js +10 -2
  240. package/build/dist/UI/Components/MasterPage/MasterPage.js.map +1 -1
  241. package/build/dist/Utils/Monitor/MonitorMetricType.js +13 -1
  242. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  243. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +34 -7
  244. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  245. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +177 -0
  246. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -0
  247. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +23 -27
  248. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
  249. package/build/dist/Utils/Telemetry/CrossSignalScope.js +44 -4
  250. package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
  251. package/package.json +1 -1
@@ -0,0 +1,156 @@
1
+ /*
2
+ * The resource facets of the telemetry explorers (Logs / Traces), split by
3
+ * how a selection has to be turned into a predicate.
4
+ *
5
+ * A signal row names exactly one *primary* entity (`primaryEntityId` +
6
+ * `primaryEntityType`) and, since the entity model shipped, the full
7
+ * membership set it belongs to (`entityKeys`). Which of the two a facet
8
+ * selection has to be matched against depends on the ingestion path:
9
+ *
10
+ * - Agent-ingested resource telemetry (Infrastructure / Docker / Podman /
11
+ * Kubernetes agents) has no `service.name`, so the resource IS the
12
+ * primary entity and `primaryEntityId` holds its Postgres id.
13
+ * - OTLP telemetry that carries a `service.name` is primary-keyed on its
14
+ * Service (`OtelIngestBaseService.selectPrimaryEntity`); the host /
15
+ * cluster it runs on is recorded only in `entityKeys`.
16
+ *
17
+ * The second case is why coalescing every resource facet into one
18
+ * `primaryEntityId IN (...)` list returned nothing for a Kubernetes cluster
19
+ * ingested through an OpenTelemetry Collector: the cluster id was compared
20
+ * against a column that only ever held the Service id. Selections on these
21
+ * facets therefore compile to a per-facet OR of both memberships, and the
22
+ * per-facet groups AND with each other so "cluster X" + "service Y"
23
+ * intersects instead of unioning.
24
+ */
25
+ /**
26
+ * Facets whose values are Service ids — the ids that legitimately live in
27
+ * `primaryEntityId` for OTLP telemetry. `serviceId` is the pre-rename alias
28
+ * kept for stale clients (see ResourceFacetResolver).
29
+ */
30
+ export const SERVICE_FACET_KEYS = [
31
+ "primaryEntityId",
32
+ "serviceId",
33
+ ];
34
+ /**
35
+ * Facets whose values are ids of a NON-Service resource row. These are the
36
+ * ones that need the entity-key treatment; the value is a Postgres id
37
+ * (Host / DockerHost / PodmanHost / KubernetesCluster) which the server
38
+ * resolves to the resource's identifying value and then to its entity key.
39
+ */
40
+ export const RESOURCE_ENTITY_FACET_KEYS = [
41
+ "hostId",
42
+ "dockerHostId",
43
+ "podmanHostId",
44
+ "kubernetesClusterId",
45
+ ];
46
+ const RESOURCE_ENTITY_FACET_KEY_SET = new Set(RESOURCE_ENTITY_FACET_KEYS);
47
+ const SERVICE_FACET_KEY_SET = new Set(SERVICE_FACET_KEYS);
48
+ /**
49
+ * Every facet key that names a resource, in either group. Kept so call
50
+ * sites that only need "is this a resource chip?" (chip rendering, scope
51
+ * hand-off) do not have to consult both sets.
52
+ */
53
+ export const ALL_RESOURCE_FACET_KEYS = [
54
+ ...SERVICE_FACET_KEYS,
55
+ ...RESOURCE_ENTITY_FACET_KEYS,
56
+ ];
57
+ export function isServiceFacetKey(facetKey) {
58
+ return SERVICE_FACET_KEY_SET.has(facetKey);
59
+ }
60
+ export function isResourceEntityFacetKey(facetKey) {
61
+ return RESOURCE_ENTITY_FACET_KEY_SET.has(facetKey);
62
+ }
63
+ export function isResourceFacetKey(facetKey) {
64
+ return isServiceFacetKey(facetKey) || isResourceEntityFacetKey(facetKey);
65
+ }
66
+ /**
67
+ * Collect the non-Service resource selections out of applied facet filters.
68
+ * Accepts anything entry-iterable so the Logs explorer can pass a
69
+ * `Map<string, Set<string>>` and the Traces explorer a plain record via
70
+ * `Object.entries`.
71
+ *
72
+ * Values are de-duplicated and empty facets are dropped, so an emptied chip
73
+ * group never becomes a `[]` that a reader might read as "match nothing".
74
+ */
75
+ export function collectResourceEntityFacetSelections(entries) {
76
+ const selections = {};
77
+ for (const [facetKey, values] of entries) {
78
+ if (!isResourceEntityFacetKey(facetKey)) {
79
+ continue;
80
+ }
81
+ const unique = new Set(selections[facetKey] || []);
82
+ for (const value of values) {
83
+ if (typeof value === "string" && value.length > 0) {
84
+ unique.add(value);
85
+ }
86
+ }
87
+ if (unique.size > 0) {
88
+ selections[facetKey] = Array.from(unique);
89
+ }
90
+ }
91
+ return selections;
92
+ }
93
+ /** Collect the Service-facet selections, same rules as the helper above. */
94
+ export function collectServiceFacetSelections(entries) {
95
+ const unique = new Set();
96
+ for (const [facetKey, values] of entries) {
97
+ if (!isServiceFacetKey(facetKey)) {
98
+ continue;
99
+ }
100
+ for (const value of values) {
101
+ if (typeof value === "string" && value.length > 0) {
102
+ unique.add(value);
103
+ }
104
+ }
105
+ }
106
+ return Array.from(unique);
107
+ }
108
+ /*
109
+ * Ids are ObjectID (UUID) strings. Validating the shape here means a
110
+ * malformed filter is dropped at the edge instead of reaching a lookup or a
111
+ * SQL parameter.
112
+ */
113
+ const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
114
+ /** Upper bound on ids per facet, so a crafted request cannot send an unbounded list. */
115
+ export const MAX_RESOURCE_IDS_PER_FACET = 200;
116
+ /**
117
+ * Parse an untrusted `resourceFilters` value (request body field or a
118
+ * persisted saved-view query) into the canonical selection shape.
119
+ *
120
+ * Deliberately lenient: anything that is not `{ <known facet key>:
121
+ * <uuid>[] }` is dropped rather than turned into a predicate, because a
122
+ * malformed filter must mean "no constraint" — never "match nothing", which
123
+ * would show an empty explorer with no explanation.
124
+ */
125
+ export function parseResourceEntityFacetSelections(source) {
126
+ const selections = {};
127
+ if (!source || typeof source !== "object" || Array.isArray(source)) {
128
+ return selections;
129
+ }
130
+ const record = source;
131
+ for (const facetKey of Object.keys(record)) {
132
+ if (!isResourceEntityFacetKey(facetKey)) {
133
+ continue;
134
+ }
135
+ const raw = record[facetKey];
136
+ if (!Array.isArray(raw)) {
137
+ continue;
138
+ }
139
+ const ids = Array.from(new Set(raw.filter((value) => {
140
+ return typeof value === "string" && UUID_PATTERN.test(value);
141
+ }))).slice(0, MAX_RESOURCE_IDS_PER_FACET);
142
+ if (ids.length > 0) {
143
+ selections[facetKey] = ids;
144
+ }
145
+ }
146
+ return selections;
147
+ }
148
+ export function hasResourceEntityFacetSelections(selections) {
149
+ if (!selections) {
150
+ return false;
151
+ }
152
+ return Object.keys(selections).some((key) => {
153
+ return (selections[key] || []).length > 0;
154
+ });
155
+ }
156
+ //# sourceMappingURL=ResourceEntityFacet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResourceEntityFacet.js","sourceRoot":"","sources":["../../../../Types/Telemetry/ResourceEntityFacet.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,98 @@
1
1
  import IconProp from "../../../Types/Icon/IconProp";
2
2
  import Icon, { SizeProp } from "../Icon/Icon";
3
- import React from "react";
3
+ import React, { useMemo, useRef, useState, } from "react";
4
4
  export function isCardSelectOptionGroup(option) {
5
5
  return (option.label !== undefined &&
6
6
  Array.isArray(option.options));
7
7
  }
8
- const CardSelect = (props) => {
9
- // Normalize options into render groups
8
+ export const getCardSelectSearchTokens = (search) => {
9
+ return search
10
+ .trim()
11
+ .toLowerCase()
12
+ .split(/\s+/)
13
+ .filter((token) => {
14
+ return token.length > 0;
15
+ });
16
+ };
17
+ const getHaystack = (option, groupLabel) => {
18
+ return `${option.title} ${option.description} ${groupLabel || ""} ${(option.keywords || []).join(" ")}`.toLowerCase();
19
+ };
20
+ export const cardSelectOptionMatchesSearch = (option, tokens, groupLabel) => {
21
+ if (tokens.length === 0) {
22
+ return true;
23
+ }
24
+ const haystack = getHaystack(option, groupLabel || null);
25
+ return tokens.every((token) => {
26
+ return haystack.includes(token);
27
+ });
28
+ };
29
+ const getSearchScoreForToken = (option, groupLabel, searchTerm) => {
30
+ const title = option.title.toLowerCase();
31
+ const description = option.description.toLowerCase();
32
+ const label = (groupLabel || "").toLowerCase();
33
+ const keywords = (option.keywords || []).map((keyword) => {
34
+ return keyword.toLowerCase();
35
+ });
36
+ let score = 0;
37
+ if (title === searchTerm) {
38
+ score += 200;
39
+ }
40
+ else if (title.startsWith(searchTerm)) {
41
+ score += 140;
42
+ }
43
+ else if (title.includes(searchTerm)) {
44
+ score += 100;
45
+ }
46
+ /*
47
+ * An exact keyword hit is the strongest signal there is after the title
48
+ * itself: someone who types "k8s" or "postgres" has named the thing, they
49
+ * just have not named it the way the card does.
50
+ */
51
+ if (keywords.some((keyword) => {
52
+ return keyword === searchTerm;
53
+ })) {
54
+ score += 120;
55
+ }
56
+ else if (keywords.some((keyword) => {
57
+ return keyword.startsWith(searchTerm);
58
+ })) {
59
+ score += 80;
60
+ }
61
+ else if (keywords.some((keyword) => {
62
+ return keyword.includes(searchTerm);
63
+ })) {
64
+ score += 50;
65
+ }
66
+ if (label.startsWith(searchTerm)) {
67
+ score += 75;
68
+ }
69
+ else if (label.includes(searchTerm)) {
70
+ score += 55;
71
+ }
72
+ if (description.includes(searchTerm)) {
73
+ score += 35;
74
+ }
75
+ if (title.split(" ").some((word) => {
76
+ return word.trim().startsWith(searchTerm);
77
+ })) {
78
+ score += 15;
79
+ }
80
+ return score;
81
+ };
82
+ export const getCardSelectOptionSearchScore = (option, tokens, groupLabel) => {
83
+ return tokens.reduce((total, token) => {
84
+ return total + getSearchScoreForToken(option, groupLabel || null, token);
85
+ }, 0);
86
+ };
87
+ /*
88
+ * Flat options and groups can be interleaved by the caller, so a run of flat
89
+ * options becomes its own unlabelled group wherever it appears.
90
+ */
91
+ export const normalizeCardSelectGroups = (options) => {
10
92
  const groups = [];
11
93
  let ungroupedOptions = [];
12
- for (const option of props.options) {
94
+ for (const option of options) {
13
95
  if (isCardSelectOptionGroup(option)) {
14
- // Flush any accumulated ungrouped options first
15
96
  if (ungroupedOptions.length > 0) {
16
97
  groups.push({ label: null, options: ungroupedOptions });
17
98
  ungroupedOptions = [];
@@ -25,42 +106,281 @@ const CardSelect = (props) => {
25
106
  if (ungroupedOptions.length > 0) {
26
107
  groups.push({ label: null, options: ungroupedOptions });
27
108
  }
28
- let cardIndex = 0;
109
+ return groups;
110
+ };
111
+ const CardSelect = (props) => {
112
+ const [search, setSearch] = useState("");
113
+ const searchInputRef = useRef(null);
114
+ const containerRef = useRef(null);
115
+ /*
116
+ * Groups the user has toggled by hand, by label. Anything absent falls back
117
+ * to the default below, so a group does not spring shut again the moment
118
+ * the selection moves elsewhere.
119
+ */
120
+ const [toggledGroups, setToggledGroups] = useState({});
121
+ const groups = useMemo(() => {
122
+ return normalizeCardSelectGroups(props.options);
123
+ }, [props.options]);
124
+ const tokens = useMemo(() => {
125
+ return getCardSelectSearchTokens(search);
126
+ }, [search]);
127
+ const isSearching = tokens.length > 0;
128
+ const totalOptionCount = useMemo(() => {
129
+ return groups.reduce((total, group) => {
130
+ return total + group.options.length;
131
+ }, 0);
132
+ }, [groups]);
133
+ /*
134
+ * A search flattens the groups. Ranked results in nine separate headed
135
+ * sections would bury the best match under whichever heading happens to
136
+ * come first, which is the problem the search is there to solve.
137
+ */
138
+ const { searchResults, isShowingClosestMatches } = useMemo(() => {
139
+ if (!isSearching) {
140
+ return { searchResults: [], isShowingClosestMatches: false };
141
+ }
142
+ const collect = (requireEveryWord) => {
143
+ const scored = [];
144
+ for (const group of groups) {
145
+ for (const option of group.options) {
146
+ const matches = requireEveryWord
147
+ ? cardSelectOptionMatchesSearch(option, tokens, group.label)
148
+ : tokens.some((token) => {
149
+ return cardSelectOptionMatchesSearch(option, [token], group.label);
150
+ });
151
+ if (!matches) {
152
+ continue;
153
+ }
154
+ scored.push({
155
+ option: option,
156
+ groupLabel: group.label,
157
+ score: getCardSelectOptionSearchScore(option, tokens, group.label),
158
+ });
159
+ }
160
+ }
161
+ return scored.sort((a, b) => {
162
+ const scoreDifference = b.score - a.score;
163
+ if (scoreDifference !== 0) {
164
+ return scoreDifference;
165
+ }
166
+ return a.option.title.localeCompare(b.option.title);
167
+ });
168
+ };
169
+ const everyWord = collect(true);
170
+ if (everyWord.length > 0) {
171
+ return { searchResults: everyWord, isShowingClosestMatches: false };
172
+ }
173
+ /*
174
+ * Nothing contains every word. Rather than a dead end, fall back to the
175
+ * cards matching any of them, ranked the same way - someone who typed
176
+ * "postgres uptime" gets SQL Query rather than an empty panel. With a
177
+ * single word this is the same query, so it correctly stays empty.
178
+ */
179
+ const anyWord = collect(false);
180
+ return {
181
+ searchResults: anyWord,
182
+ isShowingClosestMatches: anyWord.length > 0,
183
+ };
184
+ }, [groups, tokens, isSearching]);
185
+ const isGroupExpanded = (group, groupIndex) => {
186
+ // Unlabelled groups have no header to collapse behind.
187
+ if (!props.collapsibleGroups || !group.label) {
188
+ return true;
189
+ }
190
+ const toggled = toggledGroups[group.label];
191
+ if (toggled !== undefined) {
192
+ return toggled;
193
+ }
194
+ // The group holding the current selection, so re-entering a form shows it.
195
+ if (props.value &&
196
+ group.options.some((option) => {
197
+ return option.value === props.value;
198
+ })) {
199
+ return true;
200
+ }
201
+ /*
202
+ * The first group is the common case in every catalog that bothers to
203
+ * order itself, so it is the one worth opening for a user who has not
204
+ * told us anything yet.
205
+ */
206
+ return groupIndex === 0;
207
+ };
208
+ const gridClassName = props.singleColumn
209
+ ? "grid grid-cols-1 gap-4"
210
+ : "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3";
211
+ /*
212
+ * The cards on screen, in the order they are rendered. A search reorders
213
+ * them and a folded group removes them, so this is recomputed rather than
214
+ * taken from props.
215
+ */
216
+ const visibleOptionValues = useMemo(() => {
217
+ if (isSearching) {
218
+ return searchResults.map((result) => {
219
+ return result.option.value;
220
+ });
221
+ }
222
+ const values = [];
223
+ groups.forEach((group, groupIndex) => {
224
+ if (!isGroupExpanded(group, groupIndex)) {
225
+ return;
226
+ }
227
+ for (const option of group.options) {
228
+ values.push(option.value);
229
+ }
230
+ });
231
+ return values;
232
+ /*
233
+ * isGroupExpanded is read here rather than listed: it is rebuilt every
234
+ * render, and everything it actually depends on - the groups, the manual
235
+ * toggles and the current value - is in the list.
236
+ */
237
+ }, [groups, isSearching, searchResults, toggledGroups, props.value]);
238
+ /*
239
+ * One tab stop for the whole group, which is what a radiogroup is supposed
240
+ * to be. Every card used to get its own increasing tabIndex - with the 0
241
+ * that FormField passes, that produced 1, 2, 3 ... 28: positive values,
242
+ * which jump ahead of every other control on the page in tab order. Arrow
243
+ * keys move between the cards once the group has focus.
244
+ */
245
+ const activeOptionValue = props.value && visibleOptionValues.includes(props.value)
246
+ ? props.value
247
+ : visibleOptionValues[0];
248
+ const focusCard = (value) => {
249
+ var _a;
250
+ const card = ((_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.querySelector(`[data-card-select-value="${CSS.escape(value)}"]`)) || null;
251
+ card === null || card === void 0 ? void 0 : card.focus();
252
+ };
253
+ const moveFocus = (fromValue, offset) => {
254
+ const currentIndex = visibleOptionValues.indexOf(fromValue);
255
+ if (currentIndex < 0) {
256
+ return;
257
+ }
258
+ /*
259
+ * Clamped rather than wrapping: running off the end of a 29 card grid and
260
+ * landing back at the top reads as a glitch, not as navigation.
261
+ */
262
+ const nextIndex = Math.min(Math.max(currentIndex + offset, 0), visibleOptionValues.length - 1);
263
+ const nextValue = visibleOptionValues[nextIndex];
264
+ if (!nextValue || nextValue === fromValue) {
265
+ return;
266
+ }
267
+ focusCard(nextValue);
268
+ };
269
+ const renderCard = (option) => {
270
+ const isSelected = props.value === option.value;
271
+ return (React.createElement("div", { key: option.value, tabIndex: option.value === activeOptionValue ? props.tabIndex || 0 : -1, "data-card-select-value": option.value, onClick: () => {
272
+ props.onChange(option.value);
273
+ }, onKeyDown: (e) => {
274
+ /*
275
+ * Manual activation: arrows move focus, Enter or Space chooses.
276
+ * Selecting on focus would fire onChange for every card arrowed
277
+ * past, and on this form that resets the criteria below.
278
+ */
279
+ if (e.key === "Enter" || e.key === " ") {
280
+ e.preventDefault();
281
+ props.onChange(option.value);
282
+ return;
283
+ }
284
+ if (e.key === "ArrowRight" || e.key === "ArrowDown") {
285
+ e.preventDefault();
286
+ moveFocus(option.value, 1);
287
+ return;
288
+ }
289
+ if (e.key === "ArrowLeft" || e.key === "ArrowUp") {
290
+ e.preventDefault();
291
+ moveFocus(option.value, -1);
292
+ }
293
+ }, className: `relative flex cursor-pointer rounded-lg border p-4 shadow-sm transition-all duration-200 hover:border-indigo-400 hover:shadow-md focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500 focus-visible:ring-offset-2 ${isSelected
294
+ ? "border-indigo-500 bg-indigo-50/50"
295
+ : "border-gray-200 bg-white"}`, role: "radio", "aria-checked": isSelected, "data-testid": `card-select-option-${option.value}` },
296
+ React.createElement("div", { className: "flex w-full items-start" },
297
+ React.createElement("div", { className: `flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-lg ${isSelected ? "bg-indigo-100" : "bg-gray-100"}` },
298
+ React.createElement(Icon, { icon: option.icon, size: SizeProp.Large, className: `h-5 w-5 ${isSelected ? "text-indigo-600" : "text-gray-600"}` })),
299
+ React.createElement("div", { className: "ml-4 flex-1" },
300
+ React.createElement("span", { className: `block text-sm font-semibold ${isSelected ? "text-gray-900" : "text-gray-900"}` }, option.title),
301
+ React.createElement("span", { className: `mt-1 block text-sm ${isSelected ? "text-gray-600" : "text-gray-500"}` }, option.description)),
302
+ isSelected && (React.createElement("div", { className: "flex-shrink-0 ml-2" },
303
+ React.createElement(Icon, { icon: IconProp.CheckCircle, size: SizeProp.Large, className: "h-5 w-5 text-indigo-500" }))))));
304
+ };
29
305
  return (React.createElement("div", { "data-testid": props.dataTestId },
30
- React.createElement("div", { role: "radiogroup", "aria-label": "Select an option", "aria-labelledby": props.ariaLabelledby }, groups.map((group, groupIndex) => {
31
- return (React.createElement("div", { key: groupIndex, className: groupIndex > 0 ? "mt-8" : "" },
32
- group.label && (React.createElement("div", { className: "relative mb-4" },
33
- React.createElement("div", { className: "absolute inset-0 flex items-center", "aria-hidden": "true" },
34
- React.createElement("div", { className: "w-full border-t border-gray-200" })),
35
- React.createElement("div", { className: "relative flex justify-start" },
36
- React.createElement("span", { className: "bg-white pr-3 text-xs font-semibold uppercase tracking-wider text-gray-400" }, group.label)))),
37
- React.createElement("div", { className: props.singleColumn
38
- ? "grid grid-cols-1 gap-4"
39
- : "grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3" }, group.options.map((option) => {
40
- const isSelected = props.value === option.value;
41
- const currentIndex = cardIndex++;
42
- return (React.createElement("div", { key: option.value, tabIndex: props.tabIndex
43
- ? props.tabIndex + currentIndex
44
- : currentIndex, onClick: () => {
45
- props.onChange(option.value);
46
- }, onKeyDown: (e) => {
47
- if (e.key === "Enter" || e.key === " ") {
48
- e.preventDefault();
49
- props.onChange(option.value);
50
- }
51
- }, className: `relative flex cursor-pointer rounded-lg border p-4 shadow-sm focus:outline-none transition-all duration-200 hover:border-indigo-400 hover:shadow-md ${isSelected
52
- ? "border-indigo-500 bg-indigo-50/50"
53
- : "border-gray-200 bg-white"}`, role: "radio", "aria-checked": isSelected, "data-testid": `card-select-option-${option.value}` },
54
- React.createElement("div", { className: "flex w-full items-start" },
55
- React.createElement("div", { className: `flex h-10 w-10 flex-shrink-0 items-center justify-center rounded-lg ${isSelected ? "bg-indigo-100" : "bg-gray-100"}` },
56
- React.createElement(Icon, { icon: option.icon, size: SizeProp.Large, className: `h-5 w-5 ${isSelected ? "text-indigo-600" : "text-gray-600"}` })),
57
- React.createElement("div", { className: "ml-4 flex-1" },
58
- React.createElement("span", { className: `block text-sm font-semibold ${isSelected ? "text-gray-900" : "text-gray-900"}` }, option.title),
59
- React.createElement("span", { className: `mt-1 block text-sm ${isSelected ? "text-gray-600" : "text-gray-500"}` }, option.description)),
60
- isSelected && (React.createElement("div", { className: "flex-shrink-0 ml-2" },
61
- React.createElement(Icon, { icon: IconProp.CheckCircle, size: SizeProp.Large, className: "h-5 w-5 text-indigo-500" }))))));
62
- }))));
63
- })),
306
+ props.searchable && (React.createElement("div", { className: "mb-5" },
307
+ React.createElement("div", { className: "relative flex items-center gap-3 rounded-lg border border-gray-300 bg-white px-3 py-2 shadow-sm transition-all duration-200 focus-within:border-indigo-500 focus-within:ring-1 focus-within:ring-indigo-500" },
308
+ React.createElement(Icon, { icon: IconProp.Search, className: "h-4 w-4 flex-shrink-0 text-gray-400" }),
309
+ React.createElement("input", { ref: searchInputRef, type: "text", value: search, placeholder: props.searchPlaceholder || "Search", autoComplete: "off", "aria-label": props.searchPlaceholder || "Search", "data-testid": "card-select-search", className: "block w-full border-0 bg-transparent p-0 text-sm text-gray-900 placeholder:text-gray-400 focus:outline-none focus:ring-0", onChange: (event) => {
310
+ setSearch(event.target.value);
311
+ }, onKeyDown: (event) => {
312
+ if (event.key === "Escape" && search.length > 0) {
313
+ /*
314
+ * Stops the keypress reaching a modal or side over that
315
+ * would take a clear-the-search Escape as close-the-form.
316
+ */
317
+ event.stopPropagation();
318
+ event.preventDefault();
319
+ setSearch("");
320
+ return;
321
+ }
322
+ /*
323
+ * Type a couple of letters, press Enter, done - the whole
324
+ * point of the search box for someone who already knows what
325
+ * they want. Left alone when there is nothing to choose.
326
+ */
327
+ if (event.key === "Enter" && searchResults[0]) {
328
+ event.preventDefault();
329
+ props.onChange(searchResults[0].option.value);
330
+ return;
331
+ }
332
+ // The only way into the grid without reaching for the mouse.
333
+ if (event.key === "ArrowDown" && activeOptionValue) {
334
+ event.preventDefault();
335
+ focusCard(activeOptionValue);
336
+ }
337
+ } }),
338
+ search.length > 0 && (React.createElement("button", { type: "button", "aria-label": "Clear search", "data-testid": "card-select-search-clear", className: "flex flex-shrink-0 items-center text-gray-400 hover:text-gray-600", onClick: () => {
339
+ var _a;
340
+ setSearch("");
341
+ (_a = searchInputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
342
+ } },
343
+ React.createElement(Icon, { icon: IconProp.Close, className: "h-4 w-4" })))),
344
+ React.createElement("p", { className: "mt-2 text-xs text-gray-500", "data-testid": "card-select-search-summary", role: "status" }, isSearching
345
+ ? isShowingClosestMatches
346
+ ? `Showing ${searchResults.length} closest of ${totalOptionCount}`
347
+ : `Showing ${searchResults.length} of ${totalOptionCount}`
348
+ : `${totalOptionCount} to choose from. Search by name, category, or what you want to watch.`))),
349
+ React.createElement("div", { ref: containerRef, role: "radiogroup", "aria-label": "Select an option", "aria-labelledby": props.ariaLabelledby },
350
+ isSearching && isShowingClosestMatches && (React.createElement("p", { className: "mb-4 text-sm text-gray-500", "data-testid": "card-select-closest-matches" }, "Nothing matches every word you typed. Closest matches:")),
351
+ isSearching && (React.createElement("div", { className: gridClassName }, searchResults.map((result) => {
352
+ return renderCard(result.option);
353
+ }))),
354
+ isSearching && searchResults.length === 0 && (React.createElement("div", { className: "rounded-lg border border-dashed border-gray-300 bg-gray-50 p-6 text-center", "data-testid": "card-select-no-results" },
355
+ React.createElement("p", { className: "text-sm font-medium text-gray-900" }, "Nothing matches every word you typed."),
356
+ React.createElement("p", { className: "mt-1 text-sm text-gray-500" }, "Try fewer words, or a protocol or product name."),
357
+ React.createElement("button", { type: "button", className: "mt-3 text-sm font-medium text-indigo-600 hover:text-indigo-500", onClick: () => {
358
+ var _a;
359
+ setSearch("");
360
+ (_a = searchInputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
361
+ } }, "Clear search"))),
362
+ !isSearching &&
363
+ groups.map((group, groupIndex) => {
364
+ const expanded = isGroupExpanded(group, groupIndex);
365
+ const canCollapse = Boolean(props.collapsibleGroups && group.label);
366
+ return (React.createElement("div", { key: groupIndex, className: groupIndex > 0 ? "mt-8" : "" },
367
+ group.label && !canCollapse && (React.createElement("div", { className: "relative mb-4" },
368
+ React.createElement("div", { className: "absolute inset-0 flex items-center", "aria-hidden": "true" },
369
+ React.createElement("div", { className: "w-full border-t border-gray-200" })),
370
+ React.createElement("div", { className: "relative flex justify-start" },
371
+ React.createElement("span", { className: "bg-white pr-3 text-xs font-semibold uppercase tracking-wider text-gray-400" }, group.label)))),
372
+ group.label && canCollapse && (React.createElement("button", { type: "button", "aria-expanded": expanded, "data-testid": `card-select-group-${group.label}`, className: "mb-4 flex w-full items-center gap-2 border-b border-gray-200 pb-2 text-left", onClick: () => {
373
+ setToggledGroups((previous) => {
374
+ return Object.assign(Object.assign({}, previous), { [group.label]: !expanded });
375
+ });
376
+ } },
377
+ React.createElement(Icon, { icon: expanded ? IconProp.ChevronDown : IconProp.ChevronRight, className: "h-4 w-4 flex-shrink-0 text-gray-400" }),
378
+ React.createElement("span", { className: "text-xs font-semibold uppercase tracking-wider text-gray-500" }, group.label),
379
+ React.createElement("span", { className: "rounded-full bg-gray-100 px-2 py-0.5 text-xs font-medium text-gray-500" }, group.options.length))),
380
+ expanded && (React.createElement("div", { className: gridClassName }, group.options.map((option) => {
381
+ return renderCard(option);
382
+ })))));
383
+ })),
64
384
  props.error && (React.createElement("p", { className: "mt-2 text-sm text-red-600", role: "alert" }, props.error))));
65
385
  };
66
386
  export default CardSelect;
@@ -1 +1 @@
1
- {"version":3,"file":"CardSelect.js","sourceRoot":"","sources":["../../../../../UI/Components/CardSelect/CardSelect.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CardSelect.js","sourceRoot":"","sources":["../../../../../UI/Components/CardSelect/CardSelect.tsx"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ import React from "react";
4
4
  const EmptyState = (props) => {
5
5
  const { translateValue } = useTranslateValue();
6
6
  return (React.createElement(React.Fragment, null,
7
- React.createElement("div", { id: props.id, className: `flex pt-52 pb-52 ${props.showSolidBackground ? "bg-white rounded shadow" : ""}` },
7
+ React.createElement("div", { id: props.id, className: `flex ${props.paddingClassName || "pt-52 pb-52"} ${props.showSolidBackground ? "bg-white rounded shadow" : ""}` },
8
8
  React.createElement("div", { className: "m-auto text-center" },
9
9
  props.icon && (React.createElement(Icon, { icon: props.icon, className: props.iconClassName || `mx-auto h-12 w-12 text-gray-400` })),
10
10
  React.createElement("h3", { className: "mt-2 text-sm font-medium text-gray-900" }, translateValue(props.title)),
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyState.js","sourceRoot":"","sources":["../../../../../UI/Components/EmptyState/EmptyState.tsx"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,cAAc,CAAC;AAEhC,OAAO,iBAAiB,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAA0C,MAAM,OAAO,CAAC;AAY/D,MAAM,UAAU,GAAsC,CACpD,KAAqB,EACP,EAAE;IAChB,MAAM,EAAE,cAAc,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAC/C,OAAO,CACL,oBAAC,KAAK,CAAC,QAAQ;QACb,6BACE,EAAE,EAAE,KAAK,CAAC,EAAE,EACZ,SAAS,EAAE,oBACT,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAC1D,EAAE;YAEF,6BAAK,SAAS,EAAC,oBAAoB;gBAChC,KAAK,CAAC,IAAI,IAAI,CACb,oBAAC,IAAI,IACH,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,SAAS,EACP,KAAK,CAAC,aAAa,IAAI,iCAAiC,GAE1D,CACH;gBAED,4BAAI,SAAS,EAAC,wCAAwC,IACnD,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CACzB;gBACL,2BAAG,SAAS,EAAC,4BAA4B,IACtC,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,CAChC;gBACH,KAAK,CAAC,MAAM,IAAI,6BAAK,SAAS,EAAC,MAAM,IAAE,KAAK,CAAC,MAAM,CAAO,CACvD,CACF,CACS,CAClB,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"EmptyState.js","sourceRoot":"","sources":["../../../../../UI/Components/EmptyState/EmptyState.tsx"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,cAAc,CAAC;AAEhC,OAAO,iBAAiB,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAA0C,MAAM,OAAO,CAAC;AAmB/D,MAAM,UAAU,GAAsC,CACpD,KAAqB,EACP,EAAE;IAChB,MAAM,EAAE,cAAc,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAC/C,OAAO,CACL,oBAAC,KAAK,CAAC,QAAQ;QACb,6BACE,EAAE,EAAE,KAAK,CAAC,EAAE,EACZ,SAAS,EAAE,QAAQ,KAAK,CAAC,gBAAgB,IAAI,aAAa,IACxD,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAC1D,EAAE;YAEF,6BAAK,SAAS,EAAC,oBAAoB;gBAChC,KAAK,CAAC,IAAI,IAAI,CACb,oBAAC,IAAI,IACH,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,SAAS,EACP,KAAK,CAAC,aAAa,IAAI,iCAAiC,GAE1D,CACH;gBAED,4BAAI,SAAS,EAAC,wCAAwC,IACnD,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC,CACzB;gBACL,2BAAG,SAAS,EAAC,4BAA4B,IACtC,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,CAChC;gBACH,KAAK,CAAC,MAAM,IAAI,6BAAK,SAAS,EAAC,MAAM,IAAE,KAAK,CAAC,MAAM,CAAO,CACvD,CACF,CACS,CAClB,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}