@splunk/visualizations 28.5.3 → 28.6.0

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 (356) hide show
  1. package/Area/Area.d.ts.map +1 -1
  2. package/Area/areaUtils.d.ts +1 -1
  3. package/Area/areaUtils.d.ts.map +1 -1
  4. package/Area/config.d.ts.map +1 -1
  5. package/Area.config.js +93 -25
  6. package/Area.config.js.map +3 -3
  7. package/Area.js +708 -319
  8. package/Area.js.map +4 -4
  9. package/Bar/Bar.d.ts.map +1 -1
  10. package/Bar.config.js +81 -24
  11. package/Bar.config.js.map +3 -3
  12. package/Bar.js +528 -297
  13. package/Bar.js.map +4 -4
  14. package/Bubble.config.js +80 -23
  15. package/Bubble.config.js.map +2 -2
  16. package/Bubble.js +375 -208
  17. package/Bubble.js.map +4 -4
  18. package/CHANGELOG.external.md +56 -10
  19. package/ChoroplethSvg/PureChoroplethSvg/PureChoroplethSvg.d.ts +1 -0
  20. package/ChoroplethSvg/PureChoroplethSvg/PureChoroplethSvg.d.ts.map +1 -1
  21. package/ChoroplethSvg/PureChoroplethSvg/SvgChoroplethDynamic.d.ts +12 -25
  22. package/ChoroplethSvg/PureChoroplethSvg/SvgChoroplethDynamic.d.ts.map +1 -1
  23. package/ChoroplethSvg/PureChoroplethSvg/SvgMutator.d.ts +11 -4
  24. package/ChoroplethSvg/PureChoroplethSvg/SvgMutator.d.ts.map +1 -1
  25. package/ChoroplethSvg.js +1133 -253
  26. package/ChoroplethSvg.js.map +4 -4
  27. package/Column/Column.d.ts.map +1 -1
  28. package/Column.config.js +81 -24
  29. package/Column.config.js.map +3 -3
  30. package/Column.js +531 -300
  31. package/Column.js.map +4 -4
  32. package/Ellipse.config.js +1 -1
  33. package/Ellipse.config.js.map +2 -2
  34. package/Ellipse.js +277 -161
  35. package/Ellipse.js.map +4 -4
  36. package/Events/config.d.ts.map +1 -1
  37. package/Events.config.js +13 -3
  38. package/Events.config.js.map +2 -2
  39. package/Events.js +330 -194
  40. package/Events.js.map +4 -4
  41. package/FillerGauge/FillerGauge.d.ts.map +1 -1
  42. package/FillerGauge/config.d.ts.map +1 -1
  43. package/FillerGauge.config.js +76 -24
  44. package/FillerGauge.config.js.map +2 -2
  45. package/FillerGauge.js +512 -271
  46. package/FillerGauge.js.map +4 -4
  47. package/Image/config.d.ts.map +1 -1
  48. package/Image.config.js +7 -0
  49. package/Image.config.js.map +2 -2
  50. package/Image.js +282 -149
  51. package/Image.js.map +4 -4
  52. package/LICENSE +13 -0
  53. package/Line/Line.d.ts.map +1 -1
  54. package/Line/config.d.ts.map +1 -1
  55. package/Line/lineUtils.d.ts.map +1 -1
  56. package/Line/mockdata/LineData.d.ts +21 -0
  57. package/Line/mockdata/LineData.d.ts.map +1 -1
  58. package/Line.config.js +86 -25
  59. package/Line.config.js.map +3 -3
  60. package/Line.js +638 -382
  61. package/Line.js.map +4 -4
  62. package/LinkGraph/PureLinkGraph/PureLinkGraph.d.ts +47 -73
  63. package/LinkGraph/PureLinkGraph/PureLinkGraph.d.ts.map +1 -1
  64. package/LinkGraph/PureLinkGraph/PureLinkGraphUtils.d.ts +11 -2
  65. package/LinkGraph/PureLinkGraph/PureLinkGraphUtils.d.ts.map +1 -1
  66. package/LinkGraph/PureLinkGraph/components/Graph.d.ts +5 -5
  67. package/LinkGraph/PureLinkGraph/components/Node.d.ts +2 -2
  68. package/LinkGraph/PureLinkGraph/components/Nodes.d.ts +2 -2
  69. package/LinkGraph.js +886 -759
  70. package/LinkGraph.js.map +4 -4
  71. package/Map/PureMap/BubbleLayer.d.ts.map +1 -1
  72. package/Map/PureMap/Tooltip.d.ts.map +1 -1
  73. package/Map/config.d.ts.map +1 -1
  74. package/Map.config.js +4 -1
  75. package/Map.config.js.map +2 -2
  76. package/Map.js +296 -169
  77. package/Map.js.map +4 -4
  78. package/Markdown/Markdown.d.ts.map +1 -1
  79. package/Markdown.config.js.map +1 -1
  80. package/Markdown.js +283 -157
  81. package/Markdown.js.map +4 -4
  82. package/MarkerGauge/MarkerGauge.d.ts +1 -47
  83. package/MarkerGauge/MarkerGauge.d.ts.map +1 -1
  84. package/MarkerGauge/PureMarkerGauge/MarkerGauge.d.ts +22 -68
  85. package/MarkerGauge/PureMarkerGauge/MarkerGauge.d.ts.map +1 -1
  86. package/MarkerGauge/config.d.ts.map +1 -1
  87. package/MarkerGauge.config.js +75 -23
  88. package/MarkerGauge.config.js.map +2 -2
  89. package/MarkerGauge.js +560 -375
  90. package/MarkerGauge.js.map +4 -4
  91. package/NetworkGraph.config.js.map +1 -1
  92. package/NetworkGraph.js +544 -417
  93. package/NetworkGraph.js.map +4 -4
  94. package/ParallelCoordinates.config.js.map +1 -1
  95. package/ParallelCoordinates.js +288 -172
  96. package/ParallelCoordinates.js.map +4 -4
  97. package/Pie/Pie.d.ts.map +1 -1
  98. package/Pie/pieUtils.d.ts +2 -2
  99. package/Pie.config.js +74 -22
  100. package/Pie.config.js.map +2 -2
  101. package/Pie.js +522 -296
  102. package/Pie.js.map +4 -4
  103. package/ProcessTree/ProcessTree.d.ts +21 -0
  104. package/ProcessTree/ProcessTree.d.ts.map +1 -0
  105. package/ProcessTree/PureProcessTree/PureProcessTree.d.ts +32 -0
  106. package/ProcessTree/PureProcessTree/PureProcessTree.d.ts.map +1 -0
  107. package/ProcessTree/PureProcessTree/components/DirectionalBytes.d.ts +8 -0
  108. package/ProcessTree/PureProcessTree/components/DirectionalBytes.d.ts.map +1 -0
  109. package/ProcessTree/PureProcessTree/components/ProcessTreeLeftPanel.d.ts +44 -0
  110. package/ProcessTree/PureProcessTree/components/ProcessTreeLeftPanel.d.ts.map +1 -0
  111. package/ProcessTree/PureProcessTree/components/ProcessTreeRightPanel.d.ts +20 -0
  112. package/ProcessTree/PureProcessTree/components/ProcessTreeRightPanel.d.ts.map +1 -0
  113. package/ProcessTree/PureProcessTree/hooks/useProcessTreeExpansionState.d.ts +20 -0
  114. package/ProcessTree/PureProcessTree/hooks/useProcessTreeExpansionState.d.ts.map +1 -0
  115. package/ProcessTree/PureProcessTree/hooks/useProcessTreeGraphData.d.ts +44 -0
  116. package/ProcessTree/PureProcessTree/hooks/useProcessTreeGraphData.d.ts.map +1 -0
  117. package/ProcessTree/PureProcessTree/hooks/useProcessTreeLinkOverlay.d.ts +23 -0
  118. package/ProcessTree/PureProcessTree/hooks/useProcessTreeLinkOverlay.d.ts.map +1 -0
  119. package/ProcessTree/PureProcessTree/mockdata/data.d.ts +235 -0
  120. package/ProcessTree/PureProcessTree/mockdata/data.d.ts.map +1 -0
  121. package/ProcessTree/PureProcessTree/utils/iconLoader.d.ts +9 -0
  122. package/ProcessTree/PureProcessTree/utils/iconLoader.d.ts.map +1 -0
  123. package/ProcessTree/PureProcessTree/utils/processTreeLinkOverlayUtils.d.ts +36 -0
  124. package/ProcessTree/PureProcessTree/utils/processTreeLinkOverlayUtils.d.ts.map +1 -0
  125. package/ProcessTree/PureProcessTree/utils/processTreeUtils.d.ts +80 -0
  126. package/ProcessTree/PureProcessTree/utils/processTreeUtils.d.ts.map +1 -0
  127. package/ProcessTree/config.d.ts +4 -0
  128. package/ProcessTree/config.d.ts.map +1 -0
  129. package/ProcessTree/index.d.ts +3 -0
  130. package/ProcessTree/index.d.ts.map +1 -0
  131. package/ProcessTree.config.js +192 -0
  132. package/ProcessTree.config.js.map +7 -0
  133. package/ProcessTree.js +5058 -0
  134. package/ProcessTree.js.map +7 -0
  135. package/Punchcard/Punchcard.d.ts +1 -5
  136. package/Punchcard/Punchcard.d.ts.map +1 -1
  137. package/Punchcard/PurePunchcard/Punchcard.d.ts +28 -32
  138. package/Punchcard/PurePunchcard/Punchcard.d.ts.map +1 -1
  139. package/Punchcard/PurePunchcard/src/PunchcardAxis.d.ts +7 -12
  140. package/Punchcard/PurePunchcard/src/PunchcardAxis.d.ts.map +1 -1
  141. package/Punchcard/PurePunchcard/src/PunchcardBubble.d.ts +14 -19
  142. package/Punchcard/PurePunchcard/src/PunchcardBubble.d.ts.map +1 -1
  143. package/Punchcard/PurePunchcard/src/PunchcardChartArea.d.ts +22 -27
  144. package/Punchcard/PurePunchcard/src/PunchcardChartArea.d.ts.map +1 -1
  145. package/Punchcard/PurePunchcard/src/PunchcardGridLines.d.ts +3 -8
  146. package/Punchcard/PurePunchcard/src/PunchcardGridLines.d.ts.map +1 -1
  147. package/Punchcard/PurePunchcard/src/PunchcardLegend.d.ts +9 -14
  148. package/Punchcard/PurePunchcard/src/PunchcardLegend.d.ts.map +1 -1
  149. package/Punchcard/PurePunchcard/src/PunchcardRow.d.ts.map +1 -1
  150. package/Punchcard.config.js.map +1 -1
  151. package/Punchcard.js +444 -631
  152. package/Punchcard.js.map +4 -4
  153. package/Rectangle.config.js +1 -1
  154. package/Rectangle.config.js.map +2 -2
  155. package/Rectangle.js +289 -173
  156. package/Rectangle.js.map +4 -4
  157. package/RichText/PureRichText/Editor/EditorPanel.d.ts +20 -0
  158. package/RichText/PureRichText/Editor/EditorPanel.d.ts.map +1 -0
  159. package/RichText/PureRichText/Editor/EditorPanelStyles.d.ts +17 -0
  160. package/RichText/PureRichText/Editor/EditorPanelStyles.d.ts.map +1 -0
  161. package/RichText/PureRichText/Editor/FontSelector.d.ts +15 -0
  162. package/RichText/PureRichText/Editor/FontSelector.d.ts.map +1 -0
  163. package/RichText/PureRichText/Editor/FormatButton.d.ts +23 -0
  164. package/RichText/PureRichText/Editor/FormatButton.d.ts.map +1 -0
  165. package/RichText/PureRichText/Editor/editorPanelUtils.d.ts +19 -0
  166. package/RichText/PureRichText/Editor/editorPanelUtils.d.ts.map +1 -0
  167. package/RichText/PureRichText/Editor/hooks/useLineSpacing.d.ts +11 -0
  168. package/RichText/PureRichText/Editor/hooks/useLineSpacing.d.ts.map +1 -0
  169. package/RichText/PureRichText/Editor/hooks/useLinkHandlers.d.ts +26 -0
  170. package/RichText/PureRichText/Editor/hooks/useLinkHandlers.d.ts.map +1 -0
  171. package/RichText/PureRichText/Editor/index.d.ts +9 -0
  172. package/RichText/PureRichText/Editor/index.d.ts.map +1 -0
  173. package/RichText/PureRichText/InnerEditor.d.ts +41 -0
  174. package/RichText/PureRichText/InnerEditor.d.ts.map +1 -0
  175. package/RichText/PureRichText/PureRichText.d.ts +19 -0
  176. package/RichText/PureRichText/PureRichText.d.ts.map +1 -0
  177. package/RichText/PureRichText/PureRichTextContext.d.ts +64 -0
  178. package/RichText/PureRichText/PureRichTextContext.d.ts.map +1 -0
  179. package/RichText/PureRichText/RichTextStyles.d.ts +25 -0
  180. package/RichText/PureRichText/RichTextStyles.d.ts.map +1 -0
  181. package/RichText/PureRichText/activeInstance.d.ts +23 -0
  182. package/RichText/PureRichText/activeInstance.d.ts.map +1 -0
  183. package/RichText/PureRichText/config.d.ts +17 -0
  184. package/RichText/PureRichText/config.d.ts.map +1 -0
  185. package/RichText/PureRichText/hooks/index.d.ts +12 -0
  186. package/RichText/PureRichText/hooks/index.d.ts.map +1 -0
  187. package/RichText/PureRichText/hooks/useContentSave.d.ts +25 -0
  188. package/RichText/PureRichText/hooks/useContentSave.d.ts.map +1 -0
  189. package/RichText/PureRichText/hooks/useContentSync.d.ts +28 -0
  190. package/RichText/PureRichText/hooks/useContentSync.d.ts.map +1 -0
  191. package/RichText/PureRichText/hooks/useDashboardKeyboardNav.d.ts +33 -0
  192. package/RichText/PureRichText/hooks/useDashboardKeyboardNav.d.ts.map +1 -0
  193. package/RichText/PureRichText/hooks/useEditModeEffect.d.ts +10 -0
  194. package/RichText/PureRichText/hooks/useEditModeEffect.d.ts.map +1 -0
  195. package/RichText/PureRichText/hooks/useEditorSetup.d.ts +36 -0
  196. package/RichText/PureRichText/hooks/useEditorSetup.d.ts.map +1 -0
  197. package/RichText/PureRichText/hooks/useFakeHighlight.d.ts +33 -0
  198. package/RichText/PureRichText/hooks/useFakeHighlight.d.ts.map +1 -0
  199. package/RichText/PureRichText/hooks/useFocusHandlers.d.ts +35 -0
  200. package/RichText/PureRichText/hooks/useFocusHandlers.d.ts.map +1 -0
  201. package/RichText/PureRichText/hooks/useKeyboardShortcuts.d.ts +18 -0
  202. package/RichText/PureRichText/hooks/useKeyboardShortcuts.d.ts.map +1 -0
  203. package/RichText/PureRichText/hooks/useMouseHandlers.d.ts +24 -0
  204. package/RichText/PureRichText/hooks/useMouseHandlers.d.ts.map +1 -0
  205. package/RichText/PureRichText/hooks/useRichTextState.d.ts +38 -0
  206. package/RichText/PureRichText/hooks/useRichTextState.d.ts.map +1 -0
  207. package/RichText/PureRichText/hooks/useStepFontSize.d.ts +17 -0
  208. package/RichText/PureRichText/hooks/useStepFontSize.d.ts.map +1 -0
  209. package/RichText/PureRichText/hooks/useStepLineSpacing.d.ts +18 -0
  210. package/RichText/PureRichText/hooks/useStepLineSpacing.d.ts.map +1 -0
  211. package/RichText/PureRichText/hooks/useTokenMap.d.ts +45 -0
  212. package/RichText/PureRichText/hooks/useTokenMap.d.ts.map +1 -0
  213. package/RichText/PureRichText/index.d.ts +16 -0
  214. package/RichText/PureRichText/index.d.ts.map +1 -0
  215. package/RichText/PureRichText/renderers/ElementRenderer.d.ts +8 -0
  216. package/RichText/PureRichText/renderers/ElementRenderer.d.ts.map +1 -0
  217. package/RichText/PureRichText/renderers/LeafRenderer.d.ts +8 -0
  218. package/RichText/PureRichText/renderers/LeafRenderer.d.ts.map +1 -0
  219. package/RichText/PureRichText/types.d.ts +111 -0
  220. package/RichText/PureRichText/types.d.ts.map +1 -0
  221. package/RichText/PureRichText/utils/a11yUtils.d.ts +9 -0
  222. package/RichText/PureRichText/utils/a11yUtils.d.ts.map +1 -0
  223. package/RichText/PureRichText/utils/fontSize.d.ts +6 -0
  224. package/RichText/PureRichText/utils/fontSize.d.ts.map +1 -0
  225. package/RichText/PureRichText/utils/slateUtils.d.ts +99 -0
  226. package/RichText/PureRichText/utils/slateUtils.d.ts.map +1 -0
  227. package/RichText/RichText.d.ts +17 -0
  228. package/RichText/RichText.d.ts.map +1 -0
  229. package/RichText/config.d.ts +4 -0
  230. package/RichText/config.d.ts.map +1 -0
  231. package/RichText/index.d.ts +7 -0
  232. package/RichText/index.d.ts.map +1 -0
  233. package/RichText.config.js +268 -0
  234. package/RichText.config.js.map +7 -0
  235. package/RichText.js +7674 -0
  236. package/RichText.js.map +7 -0
  237. package/Sankey/PureSankey/PureSankey.d.ts.map +1 -1
  238. package/Sankey/PureSankey/SankeyLink.d.ts.map +1 -1
  239. package/Sankey/PureSankey/SankeyNode.d.ts +10 -3
  240. package/Sankey/PureSankey/SankeyNode.d.ts.map +1 -1
  241. package/Sankey/PureSankey/SankeyTooltip.d.ts.map +1 -1
  242. package/Sankey/PureSankey/SankeyUtils.d.ts +10 -0
  243. package/Sankey/PureSankey/SankeyUtils.d.ts.map +1 -1
  244. package/Sankey.config.js.map +1 -1
  245. package/Sankey.js +562 -290
  246. package/Sankey.js.map +4 -4
  247. package/Scatter/Scatter.d.ts.map +1 -1
  248. package/Scatter.config.js +81 -24
  249. package/Scatter.config.js.map +3 -3
  250. package/Scatter.js +528 -297
  251. package/Scatter.js.map +4 -4
  252. package/SingleValue/SingleValue.d.ts.map +1 -1
  253. package/SingleValue/config.d.ts.map +1 -1
  254. package/SingleValue.config.js +76 -24
  255. package/SingleValue.config.js.map +2 -2
  256. package/SingleValue.js +534 -314
  257. package/SingleValue.js.map +4 -4
  258. package/SingleValueBasic.js.map +1 -1
  259. package/SingleValueIcon/SingleValueIcon.d.ts.map +1 -1
  260. package/SingleValueIcon/config.d.ts.map +1 -1
  261. package/SingleValueIcon.config.js +76 -24
  262. package/SingleValueIcon.config.js.map +2 -2
  263. package/SingleValueIcon.js +512 -287
  264. package/SingleValueIcon.js.map +4 -4
  265. package/SingleValueRadial/PureSingleValueRadial/utils/gaugeUtils.d.ts +0 -8
  266. package/SingleValueRadial/PureSingleValueRadial/utils/gaugeUtils.d.ts.map +1 -1
  267. package/SingleValueRadial/SingleValueRadial.d.ts.map +1 -1
  268. package/SingleValueRadial/config.d.ts.map +1 -1
  269. package/SingleValueRadial.config.js +76 -24
  270. package/SingleValueRadial.config.js.map +2 -2
  271. package/SingleValueRadial.js +543 -326
  272. package/SingleValueRadial.js.map +4 -4
  273. package/TRELLIS.md +48 -0
  274. package/Table/PureTable.d.ts +1 -0
  275. package/Table/PureTable.d.ts.map +1 -1
  276. package/Table/Table.d.ts.map +1 -1
  277. package/Table/cells/ArrayCell.d.ts.map +1 -1
  278. package/Table/config.d.ts.map +1 -1
  279. package/Table/hooks.d.ts.map +1 -1
  280. package/Table/tableUtils.d.ts +14 -0
  281. package/Table/tableUtils.d.ts.map +1 -0
  282. package/Table.config.js +4 -10
  283. package/Table.config.js.map +2 -2
  284. package/Table.js +769 -355
  285. package/Table.js.map +4 -4
  286. package/Timeline/PureTimeline/src/TimelineYAxis.d.ts.map +1 -1
  287. package/Timeline/PureTimeline/src/utils/timelineUtils.d.ts +5 -0
  288. package/Timeline/PureTimeline/src/utils/timelineUtils.d.ts.map +1 -1
  289. package/Timeline/Timeline.d.ts +2 -0
  290. package/Timeline/Timeline.d.ts.map +1 -1
  291. package/Timeline/config.d.ts.map +1 -1
  292. package/Timeline/mockdata/timelineDataSource.d.ts +34 -0
  293. package/Timeline/mockdata/timelineDataSource.d.ts.map +1 -1
  294. package/Timeline.config.js +15 -0
  295. package/Timeline.config.js.map +2 -2
  296. package/Timeline.js +348 -186
  297. package/Timeline.js.map +4 -4
  298. package/common/Charting.d.ts.map +1 -1
  299. package/common/Charting.js +50 -28
  300. package/common/Charting.js.map +2 -2
  301. package/common/ChartingApi.d.ts +1 -1
  302. package/common/ChartingApi.d.ts.map +1 -1
  303. package/common/ChartingApi.js.map +2 -2
  304. package/common/DocExampleWithVizSandbox.js.map +1 -1
  305. package/common/OptionsDoc.js.map +1 -1
  306. package/common/OverviewDoc.js.map +1 -1
  307. package/common/SplunkVisualization.d.ts +1 -1
  308. package/common/SplunkVisualization.d.ts.map +1 -1
  309. package/common/SplunkVisualization.js +6 -4
  310. package/common/SplunkVisualization.js.map +2 -2
  311. package/common/StyledSkipLink.d.ts +2 -0
  312. package/common/StyledSkipLink.d.ts.map +1 -0
  313. package/common/StyledSkipLink.js +81 -0
  314. package/common/StyledSkipLink.js.map +7 -0
  315. package/common/TimeSeriesChartWrapper.d.ts.map +1 -1
  316. package/common/TimeSeriesChartWrapper.js +228 -107
  317. package/common/TimeSeriesChartWrapper.js.map +4 -4
  318. package/common/chartingUtils.d.ts +32 -6
  319. package/common/chartingUtils.d.ts.map +1 -1
  320. package/common/chartingUtils.js +166 -39
  321. package/common/chartingUtils.js.map +4 -4
  322. package/common/components/TrellisTitle.d.ts.map +1 -1
  323. package/common/docUtils.js +1 -1
  324. package/common/docUtils.js.map +2 -2
  325. package/common/editorConfig/AxesChartDataDisplay.d.ts.map +1 -1
  326. package/common/editorConfig/AxesChartYGridAndLabels.d.ts.map +1 -1
  327. package/common/editorConfig/BackgroundColor.d.ts +2 -2
  328. package/common/editorConfig/TrellisEditors.d.ts +33 -5
  329. package/common/editorConfig/TrellisEditors.d.ts.map +1 -1
  330. package/common/hocs/mockdata/trellisData.d.ts +54 -0
  331. package/common/hocs/mockdata/trellisData.d.ts.map +1 -1
  332. package/common/hocs/withTrellis.d.ts +9 -0
  333. package/common/hocs/withTrellis.d.ts.map +1 -1
  334. package/common/hooks/useSorting.d.ts +2 -2
  335. package/common/hooks/useSorting.d.ts.map +1 -1
  336. package/common/shapeUtils.d.ts +1 -1
  337. package/common/shapeUtils.d.ts.map +1 -1
  338. package/common/shapeUtils.js.map +2 -2
  339. package/common/utils/dataUtils.js +2 -1
  340. package/common/utils/dataUtils.js.map +2 -2
  341. package/common/utils/focusUtils.d.ts +4 -0
  342. package/common/utils/focusUtils.d.ts.map +1 -0
  343. package/common/utils/focusUtils.js +101 -0
  344. package/common/utils/focusUtils.js.map +7 -0
  345. package/common/utils/mapUtils.js +2 -6
  346. package/common/utils/mapUtils.js.map +2 -2
  347. package/common/utils/singleValueUtils.js +14 -26
  348. package/common/utils/singleValueUtils.js.map +2 -2
  349. package/common/utils/trellisUtils.d.ts.map +1 -1
  350. package/common/utils/trellisUtils.js +76 -70
  351. package/common/utils/trellisUtils.js.map +2 -2
  352. package/common/withDashboardViz.d.ts.map +1 -1
  353. package/common/withDashboardViz.js +276 -151
  354. package/common/withDashboardViz.js.map +4 -4
  355. package/package.json +32 -27
  356. package/LICENSE.md +0 -449
package/Table.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["src/Table/index.ts", "esm-externals:lodash", "esm-externals:@splunk/visualizations-shared/colorUtils", "esm-externals:react", "esm-externals:@splunk/ui-utils/id", "esm-externals:@splunk/ui-utils/i18n", "esm-externals:@splunk/visualization-schemas", "esm-externals:@splunk/visualization-color-palettes/editors/PresetPalettes", "esm-externals:@splunk/visualizations-shared/colorConstants", "esm-externals:@splunk/visualization-icons", "esm-externals:@splunk/visualization-icons/placeholders", "esm-externals:@splunk/themes/variables", "esm-externals:@splunk/themes/pick", "esm-externals:@splunk/react-icons/TextAlignCenter", "esm-externals:@splunk/react-icons/TextAlignLeft", "esm-externals:@splunk/react-icons/TextAlignRight", "esm-externals:@splunk/visualizations-shared/configUtils", "src/common/utils/configUtils.ts", "src/common/ThemedDefaults.tsx", "src/Table/config.ts", "src/common/utils/tableUtils.ts", "esm-externals:@splunk/themes/getSettingsFromThemedProps", "esm-externals:@splunk/visualization-encoding/Options", "esm-externals:@splunk/visualizations-shared/SanitizeProps", "esm-externals:@splunk/visualization-context/TimezoneContext", "esm-externals:@splunk/moment", "esm-externals:@splunk/visualization-context/FeatureFlagContext", "esm-externals:styled-components", "esm-externals:@splunk/visualizations-shared/hocUtils", "esm-externals:@splunk/visualizations-shared/JSONSchemaUtils", "esm-externals:@splunk/async-dynamic-options-evaluator", "esm-externals:prop-types", "src/common/interfaces/VizActionHandler.ts", "src/common/SplunkVisualization.tsx", "src/common/interfaces/DataSource.ts", "src/common/hooks/useSorting.ts", "src/common/hooks/usePagination.ts", "src/common/hooks/useDeepMemo.ts", "esm-externals:@splunk/visualizations-shared/Message", "esm-externals:@splunk/visualizations-shared/SizeAwareWrapper", "src/common/components/MissingPropsMessage.tsx", "src/common/utils/hocUtils.ts", "src/common/hocs/withEditModeCover.tsx", "esm-externals:@splunk/visualizations-shared/style", "src/common/hocs/FixedSizeContainer.tsx", "src/common/components/IconPlaceholder.tsx", "src/common/hocs/withPlaceholder.tsx", "esm-externals:@splunk/visualizations-shared/numberUtils", "src/common/utils/dataUtils.ts", "src/common/hooks/usePrevious.ts", "src/common/hooks/useGetXAndYFields.tsx", "src/common/hooks/useDownsampleDataSources.tsx", "esm-externals:@splunk/visualization-context/FeatureFlags", "src/common/utils/featureFlagUtils.ts", "esm-externals:@splunk/visualizations-shared/trellisUtils", "src/common/utils/trellisUtils.ts", "esm-externals:@splunk/visualization-canvas", "src/common/components/VizStyleWrapper.jsx", "esm-externals:@splunk/react-icons/Triangle", "src/common/chartingUtils.ts", "src/common/hooks/useTrellisEnabled.ts", "src/common/components/TrellisTitle.tsx", "src/common/TimeSeriesChartWrapper.tsx", "src/common/withDashboardViz.tsx", "esm-externals:lodash/debounce", "esm-externals:@splunk/react-ui/Table", "esm-externals:@splunk/react-ui/Paginator", "esm-externals:@splunk/react-ui/Message", "src/Table/hooks.tsx", "src/Table/cells/SwitchTableCell.tsx", "src/Table/cells/TextCell.tsx", "src/Table/cells/ArrayCell.tsx", "esm-externals:@splunk/react-ui/Popover", "src/SparkLine/SparkLine.jsx", "src/Table/cells/SparklineCell.tsx", "src/common/utils/textUtils.ts", "src/Table/PureTable.tsx", "src/Table/Table.tsx"],
4
- "sourcesContent": ["// NOTE: wildcard syntax only works for named exports\n// for some reason, omitting the default export worked before TS v4\n// see: https://stackoverflow.com/a/34445175\nexport * from './Table';\nexport { default } from './Table';\n", "\nimport * as defaultImport from \"lodash\";\nexport * from \"lodash\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/colorUtils\";\nexport * from \"@splunk/visualizations-shared/colorUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"react\";\nexport * from \"react\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/ui-utils/id\";\nexport * from \"@splunk/ui-utils/id\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/ui-utils/i18n\";\nexport * from \"@splunk/ui-utils/i18n\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualization-schemas\";\nexport * from \"@splunk/visualization-schemas\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualization-color-palettes/editors/PresetPalettes\";\nexport * from \"@splunk/visualization-color-palettes/editors/PresetPalettes\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/colorConstants\";\nexport * from \"@splunk/visualizations-shared/colorConstants\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualization-icons\";\nexport * from \"@splunk/visualization-icons\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualization-icons/placeholders\";\nexport * from \"@splunk/visualization-icons/placeholders\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/themes/variables\";\nexport * from \"@splunk/themes/variables\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/themes/pick\";\nexport * from \"@splunk/themes/pick\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/TextAlignCenter\";\nexport * from \"@splunk/react-icons/TextAlignCenter\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/TextAlignLeft\";\nexport * from \"@splunk/react-icons/TextAlignLeft\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/TextAlignRight\";\nexport * from \"@splunk/react-icons/TextAlignRight\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/configUtils\";\nexport * from \"@splunk/visualizations-shared/configUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import { get, range } from 'lodash';\nimport { isDynamicOption } from '@splunk/visualizations-shared/configUtils';\nimport { VizConfig } from '../interfaces/VizConfig';\nimport { EditorLayoutConfig, EditorConfig } from '../interfaces/Editor';\n\n// included for backwards compatibility\nexport { enhanceOptionsSchemaWithDynamicOptions } from '@splunk/visualization-schemas';\n\nexport interface PresetEntry {\n name: string;\n value: any;\n label: string;\n}\n\n/**\n * Helper function to enhance a Visualization Config as needed based on behaviors specified in supports block\n * this function also collapse all editor panels\n * @param vizConfig a Visualization Config\n * @returns an enhanced Visualization Config containing updated config entries based on behaviors it supports\n * and containing `open: false` for all editor panels in editorConfig\n */\nfunction enhanceConfig(vizConfig: VizConfig): VizConfig {\n const enhancedConfig: VizConfig = { ...vizConfig };\n\n enhancedConfig.editorConfig = vizConfig.editorConfig.map((config: EditorConfig): EditorConfig => {\n return { ...config, open: config.open || false };\n });\n return enhancedConfig;\n}\n\n/**\n * Helper function to uncollapse all editor panels by adding `open: true` to the editorConfig\n * Created for editor unit tests\n * @param vizConfig a Visualization Config\n * @returns a Visualization Config containing `open: true` for all editor panels in editorConfig\n */\nfunction uncollapseEditorConfig(vizConfig: VizConfig): VizConfig {\n const editorPanelUncollapsedConfig: VizConfig = { ...vizConfig };\n editorPanelUncollapsedConfig.editorConfig = vizConfig.editorConfig.map(\n (config: EditorConfig): EditorConfig => {\n return { ...config, open: true };\n }\n );\n return editorPanelUncollapsedConfig;\n}\n\n// private helpers to improve readability of getInitialPreset\n// this shouldn't be tested since this util isn't something that we expect to use outside of getInitialPreset\n\n/**\n * this checks to make sure that all values within vizContext are compatible with the given preset's context to determine the initialPreset\n * if a preset has explicitly specified a key as being undefined, the vizContext must also has that key as undefined, or else this CANNOT be the initialPreset\n * the inverse is true; if a preset has key is NOT undefined, it must also be NOT undefined in the corresponding vizContext\n * the internal config contents are irrelevant (as the user could customize them in source), just as long as the presence of `undefined`s match up\n *\n * Since the presetConfigs have explicit undefined keys to override the existing config, we need to explicitly check the undefined values\n */\nfunction hasCompatibleContexts(\n vizContext: { [configKey: string]: any },\n presetContext: { [configKey: string]: any }\n): boolean {\n const presetContextKeys = Object.keys(presetContext);\n return presetContextKeys.every(\n (contextKey): boolean =>\n (presetContext[contextKey] === undefined && vizContext[contextKey] === undefined) ||\n (presetContext[contextKey] !== undefined && vizContext[contextKey] !== undefined)\n );\n}\n\n/**\n * Checks to make sure that dynamic (non-dynamic) options in a given preset are also dynamic (non-dynamic) in the vizOptions\n */\nfunction hasCompatibleOptions(\n vizOptions: { [configKey: string]: any },\n presetOptions: { [configKey: string]: any }\n): boolean {\n const presetOptionKeys = Object.keys(presetOptions);\n return presetOptionKeys.every(\n (optionKey): boolean =>\n isDynamicOption(presetOptions[optionKey]) === isDynamicOption(vizOptions[optionKey])\n );\n}\n\n/**\n * Evaluates whether there is an initialPreset that fits the current state of vizContext + vizOptions\n * This function ignores extraneous vizOptions or vizContext keys, as they could be outside the scope of what the preset is intended to configure\n *\n * @param {Object} vizContext - the current vizContext definition\n * @param {Object} vizOptions - the current vizOptions definition\n * @param {PresetEntry[]} presets - the list of presets, one of which can be considered an initialPreset\n */\nfunction getInitialPreset(\n vizContext: { [configKey: string]: any },\n vizOptions: { [configKey: string]: any },\n presets: PresetEntry[]\n): PresetEntry | null {\n return presets.find((preset): boolean => {\n const presetContext = get(preset, ['value', 'context'], {});\n const presetOptions = get(preset, ['value', 'options'], {});\n const presetContextKeys = Object.keys(presetContext);\n const presetOptionKeys = Object.keys(presetOptions);\n\n // all presets have to explicitly specify which options to reset (i.e. need explicitly undefined keys)\n // if not, then the preset is invalid in config.ts\n if (presetContextKeys.length === 0 || presetOptionKeys.length === 0) return false;\n\n return (\n hasCompatibleContexts(vizContext, presetContext) &&\n hasCompatibleOptions(vizOptions, presetOptions)\n );\n });\n}\n\ninterface PrecisionOption {\n label: string;\n value: number;\n}\n\n/**\n * generates number precision values for a Select editor\n *\n * @param {Number} numPrecisionValues - number of integer precision values to generate\n * @returns {{ label: string; value; string }[]} array of { label, value } tuples\n */\nfunction generatePrecisionValues(numPrecisionValues: number): PrecisionOption[] {\n return range(0, numPrecisionValues + 1).map(\n (i): PrecisionOption => ({\n label: `${i} (0${i > 0 ? '.' : ''}${'0'.repeat(i)})`, // e.g. 0.000 for numPrecisionValues = 3\n value: i,\n })\n );\n}\n\nexport { enhanceConfig, getInitialPreset, generatePrecisionValues, uncollapseEditorConfig, isDynamicOption };\n\n/**\n * insert layout in layout array, return a new layout array instead of updating the original\n *\n * @param {EditorLayoutConfig[][]} layout - editor layout\n * @param {Number} index - the index to insert layout item(s)\n * @param {EditorLayoutConfig[][]} layoutItems - the item(s) to insert\n * @returns {EditorLayoutConfig[][]} new editor layout with insertion\n */\nexport const insertLayout = (\n layout: EditorLayoutConfig[][],\n index: number,\n ...layoutItems: EditorLayoutConfig[][]\n): EditorLayoutConfig[][] => [\n // copy part of the array before the specified index\n ...layout.slice(0, index),\n // inserted layout item\n ...layoutItems,\n // copy part of the array after the specified index\n ...layout.slice(index),\n];\n", "import pick from '@splunk/themes/pick';\nimport variables from '@splunk/themes/variables';\n\nexport const defaultBackgroundColor = props =>\n pick({\n enterprise: {\n dark: variables.black(props),\n light: variables.white(props),\n },\n prisma: variables.backgroundColorSection(props),\n })(props);\n", "import { _ } from '@splunk/ui-utils/i18n';\nimport { tableOptionsSchema as optionsSchema } from '@splunk/visualization-schemas';\nimport { defaultPalettesConfig } from '@splunk/visualization-color-palettes/editors/PresetPalettes';\nimport { COLOR_EDITOR_PALETTE } from '@splunk/visualizations-shared/colorConstants';\nimport { Table as TableIcon } from '@splunk/visualization-icons';\nimport { Table as TablePlaceholderIcon } from '@splunk/visualization-icons/placeholders';\nimport variables from '@splunk/themes/variables';\nimport pick from '@splunk/themes/pick';\nimport TextAlignCenter from '@splunk/react-icons/TextAlignCenter';\nimport TextAlignLeft from '@splunk/react-icons/TextAlignLeft';\nimport TextAlignRight from '@splunk/react-icons/TextAlignRight';\n\nimport { enhanceConfig, generatePrecisionValues } from '../common/utils/configUtils';\nimport { VizConfig } from '../common/interfaces/VizConfig';\nimport { DataContract } from '../common/interfaces/DataContract';\nimport { VizSize } from '../common/interfaces/VizSize';\nimport { DefaultContext } from '../common/interfaces/DefaultContext';\nimport { EditorConfig } from '../common/interfaces/Editor';\nimport { VizBehavior } from '../common/interfaces/VizBehavior';\nimport { ThemedDefaults } from '../common/interfaces/ThemedDefaults';\nimport { VizCategory } from '../common/interfaces/VizCategory';\nimport { defaultBackgroundColor } from '../common/ThemedDefaults';\n\nconst dataContract: DataContract = {\n requiredDataSources: [\n {\n name: 'primary',\n description: 'DataSource that powers the visualization',\n },\n ],\n optionalDataSources: [],\n initialRequestParams: {\n primary: (options: { count?: number } = {}): Record<string, unknown> => ({\n offset: 0,\n count: options.count ? options.count : 10,\n requestTotalCount: true,\n add_summary_to_metadata: true,\n }),\n },\n};\n\nconst size: VizSize = {\n initialWidth: 300,\n initialHeight: 300,\n};\n\nconst defaultContext: DefaultContext = {\n // color context configs\n colorRangeConfig: [\n { to: 20, value: '#D41F1F' },\n { from: 20, to: 40, value: '#D94E17' },\n { from: 40, to: 60, value: '#CBA700' },\n { from: 60, to: 80, value: '#669922' },\n { from: 80, value: '#118832' },\n ],\n colorMatchConfig: [{ match: '', value: '#5C33FF' }],\n colorGradientConfig: { colors: ['#252214', '#B846BB'] },\n tableAlignByType: [\n { match: 'string', value: 'left' },\n { match: 'number', value: 'right' },\n { match: 'time', value: 'left' },\n { match: 'color', value: 'left' },\n { match: 'array', value: 'left' },\n { match: 'sparkline', value: 'center' },\n { match: 'unknown', value: 'left' },\n { match: 'null', value: 'left' },\n ],\n tableCellTypeByType: [\n { match: 'string', value: 'TextCell' },\n { match: 'number', value: 'TextCell' },\n { match: 'time', value: 'TextCell' },\n { match: 'color', value: 'TextCell' },\n { match: 'array', value: 'ArrayCell' },\n { match: 'sparkline', value: 'SparklineCell' },\n { match: 'unknown', value: 'TextCell' },\n { match: 'null', value: 'TextCell' },\n ],\n\n // NOTE: These contexts are used by the table background color editor.\n // Please be careful removing/renaming/altering them.\n // There are unit tests and visual test that will capture breakages.\n tableRowColorMaxContrast: {\n colors: ['> themes.textColor', '> themes.inverseTextColor'],\n default: '> themes.textColor',\n },\n tableRowBackgroundColorEvenConfig: {\n channel: 'hsv.v',\n value: '*0.96',\n },\n tableHeaderBackgroundColorConfig: {\n channel: 'hsv.v',\n value: '*0.9',\n },\n tableRowBackgroundColorsByTheme: ['> themes.rowBackgroundColorOdd'],\n tableAltRowBackgroundColorsByTheme: ['> themes.rowBackgroundColorOdd', '> themes.rowBackgroundColorEven'],\n tableRowBackgroundColorsByBackgroundColor: ['> backgroundColor'],\n tableAltRowBackgroundColorsByBackgroundColor: [\n '> backgroundColor',\n '> backgroundColor | setColorChannel(tableRowBackgroundColorEvenConfig)',\n ],\n};\n\nconst headerAlignConfigTable = {\n label: _('Header alignment'),\n editor: 'editor.radioBar',\n option: 'tableFormat.headerAlign',\n editorProps: {\n values: [\n { label: _('Left'), value: 'left', icon: TextAlignLeft },\n { label: _('Center'), value: 'center', icon: TextAlignCenter },\n { label: _('Right'), value: 'right', icon: TextAlignRight },\n ],\n },\n};\n\nconst headerAlignConfigColumn = {\n ...headerAlignConfigTable,\n option: 'headerAlign',\n editorProps: {\n values: [\n { label: _('Auto'), value: 'auto' },\n { label: _('Left'), value: 'left', icon: TextAlignLeft },\n { label: _('Center'), value: 'center', icon: TextAlignCenter },\n { label: _('Right'), value: 'right', icon: TextAlignRight },\n ],\n },\n};\n\nconst textOverflowConfigColumn = {\n label: _('Text wrapping'),\n editor: 'editor.radioBar',\n option: 'textOverflow',\n editorProps: {\n values: [\n { label: _('Standard'), value: 'break-word' },\n { label: _('Anywhere'), value: 'anywhere' },\n { label: _('Trim'), value: 'ellipsis' },\n ],\n },\n};\n\nconst textAlignConfigTable = {\n label: _('Cells alignment'),\n editor: 'editor.radioBar',\n option: 'tableFormat.align',\n editorProps: {\n values: [\n {\n label: _('Auto'),\n value: '> table | type() | matchValue(tableAlignByType)',\n },\n { label: _('Left'), value: 'left', icon: TextAlignLeft },\n { label: _('Center'), value: 'center', icon: TextAlignCenter },\n { label: _('Right'), value: 'right', icon: TextAlignRight },\n ],\n },\n};\n\nconst textAlignConfigColumn = {\n ...textAlignConfigTable,\n option: 'align',\n editorProps: {\n values: [\n { label: _('Auto'), value: 'auto' },\n { label: _('Left'), value: 'left', icon: TextAlignLeft },\n { label: _('Center'), value: 'center', icon: TextAlignCenter },\n { label: _('Right'), value: 'right', icon: TextAlignRight },\n ],\n },\n};\n\nconst unitPositionConfig = {\n label: _('Units position'),\n editor: 'editor.select',\n option: 'unitPosition',\n editorProps: {\n values: [\n { label: _('Before'), value: 'before' },\n { label: _('After'), value: 'after' },\n ],\n },\n};\n\nconst unitLabelConfig = {\n label: _('Unit label'),\n option: 'unit',\n editor: 'editor.text',\n};\n\nconst timeFormattingConfig = {\n label: _('Date & Time formatting'),\n option: 'format',\n editor: 'editor.text',\n editorProps: {\n tooltip: _('For example: DD-MM-YYYY'),\n },\n};\n\nconst themes: ThemedDefaults = {\n defaultBackgroundColor,\n defaultHeaderBackgroundColor: props =>\n pick({\n enterprise: {\n dark: variables.gray20(props),\n light: variables.gray92(props),\n },\n prisma: variables.backgroundColor(props),\n })(props),\n rowBackgroundColorEven: props =>\n pick({\n enterprise: {\n dark: variables.black(props),\n light: variables.gray96(props),\n },\n prisma: variables.backgroundColorPage(props),\n })(props),\n rowBackgroundColorOdd: props =>\n pick({\n enterprise: {\n dark: '#0D1012',\n light: variables.backgroundColor(props),\n },\n prisma: { dark: variables.backgroundColorSidebar(props), light: variables.white(props) },\n })(props),\n textColor: props =>\n pick({\n enterprise: variables.textColor(props),\n prisma: variables.contentColorDefault(props),\n })(props),\n inverseTextColor: props =>\n pick({\n enterprise: {\n dark: variables.contentColorInverted(props), // equal to textColor in enterprise\n light: variables.white(props), // equal to textColor in enterpriseDark\n },\n prisma: variables.contentColorInverted(props),\n })(props),\n};\n\nconst backgroundColorPaletteSet = new Set([...COLOR_EDITOR_PALETTE]);\n\nconst EDITOR_LABEL_WIDTH = 100;\nconst editorConfig: EditorConfig[] = [\n {\n label: _('Data display'),\n layout: [\n [\n {\n label: _('Rows displayed'),\n option: 'count',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n labelWidth: EDITOR_LABEL_WIDTH,\n },\n },\n ],\n [\n {\n label: _('Row numbers'),\n option: 'showRowNumbers',\n editor: 'editor.checkbox',\n editorProps: {\n labelWidth: EDITOR_LABEL_WIDTH,\n },\n },\n ],\n [\n {\n label: _('Internal fields'),\n option: 'showInternalFields',\n editor: 'editor.checkbox',\n editorProps: {\n labelWidth: EDITOR_LABEL_WIDTH,\n },\n },\n ],\n [\n {\n label: _('Header row'),\n option: 'headerVisibility',\n editor: 'editor.select',\n editorProps: {\n values: [\n { label: _('Inline'), value: 'inline' },\n { label: _('Fixed'), value: 'fixed' },\n { label: _('Hidden'), value: 'none' },\n ],\n labelWidth: EDITOR_LABEL_WIDTH,\n },\n },\n ],\n [\n {\n label: _('Footer totals row'),\n option: 'showFooterTotals',\n editor: 'editor.checkbox',\n editorProps: {\n labelWidth: EDITOR_LABEL_WIDTH,\n },\n },\n ],\n [\n {\n label: _('Footer percentages row'),\n option: 'showFooterPercentages',\n editor: 'editor.checkbox',\n editorProps: {\n labelWidth: EDITOR_LABEL_WIDTH,\n },\n },\n ],\n ],\n },\n {\n label: _('Color and style'),\n layout: [\n [\n {\n key: 'backgroundColor',\n editor: 'editor.tableBackgroundColor',\n editorProps: {\n themes,\n labelPosition: 'top',\n labelWidth: EDITOR_LABEL_WIDTH,\n palette: [...backgroundColorPaletteSet],\n },\n },\n ],\n [\n {\n option: 'font',\n label: _('Font'),\n editor: 'editor.select',\n editorProps: {\n values: [\n {\n label: _('Proportional (Default)'),\n value: 'proportional',\n },\n { label: _('Monospace'), value: 'monospace' },\n ],\n labelPosition: 'top',\n labelWidth: EDITOR_LABEL_WIDTH,\n },\n },\n ],\n [\n {\n option: 'fontSize',\n label: _('Font size'),\n editor: 'editor.select',\n editorProps: {\n values: [\n {\n label: _('Extra Small (font 10px, row 24px)'),\n value: 'extraSmall',\n },\n {\n label: _('Small (font 12px, row 24px)'),\n value: 'small',\n },\n {\n label: _('Default (font 14px, row 32px)'),\n value: 'default',\n },\n {\n label: _('Large (font 16px, row 36px)'),\n value: 'large',\n },\n ],\n labelPosition: 'top',\n labelWidth: EDITOR_LABEL_WIDTH,\n },\n },\n ],\n [\n {\n ...headerAlignConfigTable,\n },\n ],\n [\n {\n ...textAlignConfigTable,\n },\n ],\n [\n {\n key: 'tableDynamicColor',\n editor: 'editor.tableDynamicColor',\n context: 'colorGradientConfig',\n option: 'tableFormat',\n label: _('Data colors'),\n filterKeywords: ['range', 'match', 'gradient', 'dynamic coloring'],\n editorProps: {\n labelPosition: 'top',\n formatters: [\n {\n label: _('Gradient'),\n value: 'gradient',\n isDefault: true,\n defaults: {\n table: defaultContext.colorGradientConfig,\n },\n },\n {\n label: _('Ranges'),\n value: 'rangeValue',\n defaults: {\n table: defaultContext.colorRangeConfig,\n },\n },\n {\n label: _('Matches'),\n value: 'matchValue',\n defaults: {\n table: defaultContext.colorMatchConfig,\n },\n },\n ],\n dataSelectors: [\n {\n label: _('Table'),\n value: 'table',\n },\n ],\n defaultPalettesConfig,\n },\n },\n ],\n [\n {\n label: _('Column-specific formatting'),\n editor: 'editor.tableColumnFormatter',\n editorProps: {\n // popover: {sections: [textFormatConfig, formatByTypeConfig, columnColoringConfig]}\n // Table column coloring does not adhere to same DSL structure as other dynamically colored options\n // we use the FormatterEditor directly and not the DynamicColorEditor's provided DSL builders\n columnColoringConfig: {\n coloringTypes: [\n {\n label: _('Text'),\n value: 'rowColors',\n },\n {\n label: _('Background'),\n value: 'rowBackgroundColors',\n },\n ],\n formatters: [\n {\n label: _('Ranges'),\n value: 'rangeValue',\n defaults: {\n rowBackgroundColors: defaultContext.colorRangeConfig,\n rowColors: defaultContext.colorRangeConfig,\n },\n },\n {\n label: _('Matches'),\n value: 'matchValue',\n defaults: {\n rowBackgroundColors: defaultContext.colorMatchConfig,\n rowColors: defaultContext.colorMatchConfig,\n },\n },\n ],\n themes,\n },\n defaultOptionsByType: {\n number: {\n thousandSeparated: false,\n unitPosition: 'after',\n },\n string: {\n unitPosition: 'after',\n },\n text: {\n align: 'auto',\n headerAlign: 'auto',\n textOverflow: 'break-word',\n },\n },\n textFormatConfig: [\n [\n {\n ...headerAlignConfigColumn,\n },\n ],\n [\n {\n ...textAlignConfigColumn,\n },\n ],\n [\n {\n ...textOverflowConfigColumn,\n },\n ],\n ],\n flyoutConfig: {\n number: [\n [\n {\n ...unitPositionConfig,\n },\n {\n ...unitLabelConfig,\n },\n ],\n [\n {\n label: _('Precision'),\n option: 'precision',\n editor: 'editor.select',\n editorProps: {\n values: generatePrecisionValues(20),\n },\n },\n {\n label: _('Thousand separators'),\n option: 'thousandSeparated',\n editor: 'editor.radioBar',\n editorProps: {\n values: [\n {\n label: _('Off'),\n value: false,\n },\n { label: _('On'), value: true },\n ],\n },\n },\n ],\n ],\n sparkline: [], // Configure via columnFormat.sparklineNullValueDisplay\n string: [\n [\n {\n ...unitPositionConfig,\n },\n {\n ...unitLabelConfig,\n },\n ],\n ],\n time: [\n [\n {\n ...timeFormattingConfig,\n },\n ],\n ],\n },\n value: ({ context, options }) => {\n return {\n context,\n columnFormat: options.columnFormat,\n tableFormat: options.tableFormat,\n };\n },\n },\n key: 'TableColumnFormatterEditor',\n },\n ],\n ],\n },\n];\n\n/**\n * visualization configuration\n */\nconst config: VizConfig = {\n /**\n * unique viz key\n */\n key: 'splunk.table',\n /**\n * viz name\n */\n name: _('Table'),\n category: VizCategory.TABLE,\n /**\n * viz icon\n */\n icon: TableIcon,\n placeholderIcon: TablePlaceholderIcon,\n dataContract,\n size,\n defaultContext,\n optionsSchema,\n editorConfig,\n events: {\n 'cell.click': {\n description: 'triggered when user clicks a table cell',\n },\n },\n supports: [\n VizBehavior.DYNAMIC_OPTIONS,\n VizBehavior.EVENTS,\n VizBehavior.PAGE_AND_SORT,\n VizBehavior.PLACEHOLDER,\n ],\n themes,\n};\n\nexport default enhanceConfig(config);\n", "// extractUnitFromFormattedString removed; footer formatting will use columnFormat options\n\n// Build a map of totals keyed by field name from fields metadata\nexport const buildTotalsByFieldFromFieldsMeta = (\n fieldsMeta: Array<Record<string, unknown>> | undefined | null\n): Record<string, number> => {\n const totalsByField: Record<string, number> = {};\n const fields = Array.isArray(fieldsMeta) ? fieldsMeta : [];\n fields.forEach(f => {\n if (f && typeof f === 'object' && Object.prototype.hasOwnProperty.call(f, 'summary.sum')) {\n const name = (f as { name?: string }).name ?? '';\n if (name) {\n const raw = f['summary.sum'];\n const isEmptyString = typeof raw === 'string' && raw.trim() === '';\n if (raw !== null && raw !== undefined && !isEmptyString) {\n const n = Number(raw);\n if (Number.isFinite(n)) totalsByField[name] = n;\n }\n }\n }\n });\n return totalsByField;\n};\n\n// Build footer DataFrames from field metadata for DSL usage\nexport const buildFooterDataFrames = (fieldsMeta: Array<Record<string, unknown>> | undefined | null) => {\n const totalsByField = buildTotalsByFieldFromFieldsMeta(fieldsMeta);\n // Build a percentage map from totals to support default footer percentages\n const entries = Object.entries(totalsByField).filter(([, v]) => Number.isFinite(v));\n const grandTotal = entries.reduce((acc, [, v]) => acc + Number(v), 0);\n const percentagesByField: Record<string, string> = {};\n if (grandTotal > 0) {\n entries.forEach(([k, v]) => {\n const pct = ((Number(v) / grandTotal) * 100).toFixed(2);\n percentagesByField[k] = `${pct}%`;\n });\n }\n\n // Get all field names from metadata\n const fields = Array.isArray(fieldsMeta) ? fieldsMeta : [];\n const fieldNames = fields.map(f => (f as { name?: string }).name).filter(Boolean);\n\n // Build combined footer frame with per-column series each having [total, percentage]\n const combinedFooterFields = fieldNames.map(name => ({ name }));\n const combinedFooterColumns = fieldNames.map(name => {\n const total = totalsByField[name];\n const pct = percentagesByField[name];\n return [typeof total === 'number' ? total : '', pct || ''];\n });\n\n return {\n footer: { fields: combinedFooterFields, columns: combinedFooterColumns },\n };\n};\n", "\nimport * as defaultImport from \"@splunk/themes/getSettingsFromThemedProps\";\nexport * from \"@splunk/themes/getSettingsFromThemedProps\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualization-encoding/Options\";\nexport * from \"@splunk/visualization-encoding/Options\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/SanitizeProps\";\nexport * from \"@splunk/visualizations-shared/SanitizeProps\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualization-context/TimezoneContext\";\nexport * from \"@splunk/visualization-context/TimezoneContext\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/moment\";\nexport * from \"@splunk/moment\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualization-context/FeatureFlagContext\";\nexport * from \"@splunk/visualization-context/FeatureFlagContext\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"styled-components\";\nexport * from \"styled-components\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/hocUtils\";\nexport * from \"@splunk/visualizations-shared/hocUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/JSONSchemaUtils\";\nexport * from \"@splunk/visualizations-shared/JSONSchemaUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/async-dynamic-options-evaluator\";\nexport * from \"@splunk/async-dynamic-options-evaluator\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"prop-types\";\nexport * from \"prop-types\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "/* eslint-disable class-methods-use-this */\nexport interface VizActionHandler {\n /**\n * put focus on the visualization\n */\n focus(): void;\n\n /**\n * compute snapshot of this visualization\n */\n snapshot(): Record<string, unknown>; // (This is for pdf export)\n}\n\nexport class DefaultVizActionHandler {\n focus(): void {\n // noop\n }\n\n snapshot(): Record<string, unknown> {\n return null; // noop\n }\n}\n", "/* eslint-disable react/no-unused-prop-types,react/prefer-stateless-function */\nimport * as T from 'prop-types';\nimport { noop } from 'lodash';\nimport { DashboardVizProps } from './interfaces/DashboardVizProps';\nimport { DefaultVizActionHandler } from './interfaces/VizActionHandler';\n\n// this is identical to the initial height and width we use in BaseVisualization in dashboard-visualizations\nexport const INITIAL_WIDTH = 250;\nexport const INITIAL_HEIGHT = 250;\n\n/**\n * A Splunk visualization\n */\nclass SplunkVisualization {\n static propTypes: Record<keyof DashboardVizProps, T.Validator<any>> = {\n /**\n * display mode\n */\n mode: T.oneOf(['view', 'edit', 'export']).isRequired,\n /**\n * width in pixel or string, defaults to 100%\n */\n width: T.oneOfType([T.string, T.number]).isRequired,\n /**\n * height in pixel or string\n */\n height: T.oneOfType([T.string, T.number]).isRequired,\n /**\n * visualization context used for dynamic option evaluation\n */\n context: T.object,\n /**\n * visualization formatting options\n */\n options: T.object,\n /**\n * A callback to update formatting options\n */\n onOptionsChange: T.func,\n /**\n * datasource state which include data and request params, object key indicate the datasource type.\n */\n dataSources: T.objectOf(\n T.shape({\n /**\n * current request params\n */\n requestParams: T.object,\n /**\n * current dataset\n */\n data: T.shape({\n fields: T.array,\n columns: T.array,\n }),\n /**\n * error\n */\n error: T.shape({\n level: T.string,\n message: T.string,\n }),\n /**\n * meta data that came with the dataset\n */\n meta: T.object,\n })\n ),\n /**\n * A callback to trigger event\n */\n onEventTrigger: T.func,\n /**\n * Inform viz if there are handlers listening to events\n */\n hasEventHandlers: T.bool,\n /**\n * A callback to communicate computed props to a consumer\n */\n onComputedProps: T.func,\n /**\n * A callback to obtain visualization api\n */\n vizActionHandlerRef: T.func,\n\n loading: T.bool,\n theme: T.object,\n /**\n * A callback to request new data with updated request params\n */\n onRequestParamsChange: T.func,\n };\n\n /**\n *\n */\n public static readonly defaults: DashboardVizProps = {\n // BaseVisualization in dashboard-visualizations uses 100% for width but 250 for height\n width: '100%',\n height: INITIAL_HEIGHT,\n dataSources: {},\n onEventTrigger: (): Record<string, unknown> => ({}),\n mode: 'view',\n hasEventHandlers: false,\n options: {},\n context: {},\n onOptionsChange: (): Record<string, unknown> => ({}),\n vizActionHandlerRef: (): DefaultVizActionHandler => new DefaultVizActionHandler(),\n onComputedProps: (): Record<string, unknown> => ({}),\n loading: false,\n onRequestParamsChange: noop,\n };\n}\n\nexport default SplunkVisualization;\n", "import { FieldEntry } from '@splunk/visualizations-shared/dataSourceUtils';\nimport { validSegmentationModes } from '@splunk/visualization-schemas';\n\nexport interface JsonColumnData {\n fields: FieldEntry[] | string[];\n columns: (string | number | null)[][];\n}\n\nexport type HighlightedSourceMap = Record<string, Record<string, boolean>>;\nexport type TagsMap = Record<string, Record<string, string[]>>;\n\nexport interface Meta {\n totalCount: number;\n sid: string;\n app: string;\n highlighted?: HighlightedSourceMap;\n tags?: TagsMap;\n}\n\nexport const validSortDirs = ['asc', 'desc', 'none'] as const;\nexport type SortDirType = (typeof validSortDirs)[number];\nexport type SegmentationType = (typeof validSegmentationModes)[number];\nexport const validOutputModes = ['json_cols', 'json'] as const;\nexport type OutputModeType = (typeof validOutputModes)[number];\n\nexport interface RequestParams {\n count?: number;\n offset?: number;\n sort?: {\n [sortKey: string]: SortDirType;\n };\n segmentation?: SegmentationType;\n // eslint-disable-next-line camelcase\n output_mode?: OutputModeType;\n}\n\nexport interface DataSource {\n requestParams: Partial<RequestParams>;\n onRequestParamsChange?: (p: Record<string, unknown>) => void;\n data: JsonColumnData;\n error?: { level: string; message: string };\n meta: Partial<Meta>;\n}\n\nexport interface DataSourceMeta {\n requestParams: Partial<RequestParams>;\n meta: Partial<Meta>;\n onRequestParamsChange: (payload: RequestParams) => void;\n}\n", "import * as T from 'prop-types';\nimport { has } from 'lodash';\nimport { DataSourceMeta, SortDirType, validSortDirs } from '../interfaces/DataSource';\n\nexport interface SortParams {\n currentSortKey?: undefined | string;\n currentSortDir?: undefined | SortDirType;\n onSort?: (e: MouseEvent, { sortKey, sortDir }: { sortKey: string; sortDir: SortDirType }) => void;\n}\n\nexport const SortParamsPropTypes = T.shape({\n currentSortKey: T.string,\n currentSortDir: T.oneOf(validSortDirs),\n onSort: T.func,\n});\n\nexport const useSortingParams = ({ requestParams, onRequestParamsChange }: DataSourceMeta): SortParams => {\n let currentSortKey;\n let currentSortDir;\n\n const nextSortDirMap = {\n asc: 'desc',\n desc: 'asc',\n none: 'asc',\n };\n\n let onSort;\n if (typeof onRequestParamsChange === 'function') {\n if (requestParams && has(requestParams, 'sort')) {\n currentSortKey = Object.keys(requestParams.sort).shift();\n currentSortDir = requestParams.sort[currentSortKey];\n }\n\n // undid memoization since there is a dependency on requestParams, which is a deeply nested object\n onSort = (e, { sortKey, sortDir }): void => {\n if (typeof sortKey === 'string') {\n const nextSortDir = has(nextSortDirMap, sortDir) ? nextSortDirMap[sortDir] : 'none';\n onRequestParamsChange({\n ...requestParams,\n ...{ offset: 0, sort: { [sortKey]: nextSortDir } },\n });\n } else {\n onRequestParamsChange(requestParams);\n }\n };\n }\n\n return {\n currentSortKey,\n currentSortDir,\n onSort,\n };\n};\n", "import * as T from 'prop-types';\nimport { cloneDeep, noop } from 'lodash';\nimport * as React from 'react';\nimport { DataSourceMeta, RequestParams } from '../interfaces/DataSource';\n\nexport interface OnChangeParams {\n page?: number;\n count?: number;\n}\nexport interface PaginatorParams {\n isPaging?: boolean;\n current?: number;\n totalPages?: number;\n onChange?: (event: React.MouseEvent<HTMLButtonElement>, data: OnChangeParams) => void;\n}\n\nexport const PaginatorParamsPropTypes = T.shape({\n isPaging: T.bool,\n current: T.number,\n totalPages: T.number,\n onChange: T.func,\n});\n\nexport const usePaginationParams = ({\n requestParams,\n meta,\n onRequestParamsChange,\n}: DataSourceMeta): PaginatorParams => {\n const totalCount = (meta && meta.totalCount) || 0;\n const offset = (requestParams && requestParams.offset) || 0;\n const count = requestParams && requestParams.count;\n const totalPages = typeof count === 'number' && count > 0 ? Math.ceil(totalCount / count) : 0;\n const current = typeof count === 'number' && count > 0 ? Math.floor(offset / count) + 1 : 0;\n const isPaging = totalPages > 1 && typeof onRequestParamsChange === 'function';\n\n const onChangeHandler = (e, { page, count: countArg }: OnChangeParams): void => {\n const newParams: RequestParams = cloneDeep(requestParams);\n\n if (typeof countArg === 'number') {\n newParams.count = countArg;\n newParams.offset = 0;\n }\n\n const pageCount = typeof newParams.count === 'number' ? newParams.count : 10;\n if (typeof page === 'number' && page > 0) {\n newParams.count = pageCount;\n newParams.offset = (page - 1) * pageCount;\n }\n\n onRequestParamsChange(newParams);\n };\n\n return {\n isPaging,\n current,\n totalPages,\n onChange: typeof onRequestParamsChange === 'function' ? onChangeHandler : noop,\n };\n};\n", "import { useRef } from 'react';\nimport { isEqual } from 'lodash';\n\n/**\n * This hook evaluates and stores the result of a passed function and only\n * re-evaluates the function when passed dependencies change.\n *\n * It is different from the internal React useMemo in the following aspects:\n * - it only stores the last evaluated result\n * - it uses a deep equality check to determine if dependencies have changed\n *\n * Inspired by apollo-client's useDeepMemo\n *\n * @param fn the function to be executed and\n * @param dependencies an array of dependencies\n */\nexport const useDeepMemo = <FnReturnType, DepType>(\n fn: () => FnReturnType,\n dependencies: DepType\n): FnReturnType => {\n const ref = useRef<{ dependencies: DepType; value: FnReturnType }>();\n if (!ref.current || !isEqual(dependencies, ref.current.dependencies)) {\n ref.current = {\n dependencies,\n value: fn(),\n };\n }\n return ref.current.value;\n};\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/Message\";\nexport * from \"@splunk/visualizations-shared/Message\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/SizeAwareWrapper\";\nexport * from \"@splunk/visualizations-shared/SizeAwareWrapper\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import * as React from 'react';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport Message from '@splunk/visualizations-shared/Message';\nimport SizeAwareWrapper from '@splunk/visualizations-shared/SizeAwareWrapper';\nimport SplunkVisualization from '../SplunkVisualization';\n\n/**\n * @method isMissing\n * @param {any} v\n * @returns {boolean} true if the input value === null or undefined\n */\nexport const isMissing = (v): boolean => {\n return v === null || v === undefined;\n};\n\n/**\n * @method misskingKeys\n * @param {string[]} keys\n * @param {object} target\n * @returns {string[]} the keys of missing required props\n */\nexport const missingKeys = (keys: string[], target: Record<string, unknown>): string[] =>\n keys.filter(k => isMissing(target[k]));\n\nexport interface MissingPropsProps {\n width?: string | number;\n height?: string | number;\n missingProps: string[];\n backgroundColor?: string;\n}\n\n/**\n * @method MissingPropsMessage\n * @param {MissingPropsProps} props\n * @returns {React.ReactElement}\n */\nexport const MissingPropsMessage = (props: MissingPropsProps): React.ReactElement => {\n const {\n width = SplunkVisualization.defaults.width,\n height = SplunkVisualization.defaults.height,\n missingProps,\n backgroundColor,\n } = props;\n const cachedHandleResize = React.useCallback((w, h) => {\n setContainerWidth(w);\n setContainerHeight(h);\n }, []);\n const [containerWidth, setContainerWidth] = React.useState<number>(Number(width));\n const [containerHeight, setContainerHeight] = React.useState<number>(Number(height));\n return (\n <div style={{ width: containerWidth, height: containerHeight, background: backgroundColor }}>\n <SizeAwareWrapper width={width} height={height} onResize={cachedHandleResize} />\n <Message\n data-test=\"message\"\n width={width}\n height={height}\n message={_(`Missing property: ${missingProps.join(', ')}`)}\n level=\"error\"\n />\n </div>\n );\n};\n\nexport default MissingPropsMessage;\n", "import { DashboardVizProps } from '../interfaces/DashboardVizProps';\n\nexport type DashboardVizType = React.ComponentType<DashboardVizProps>;\n\n/**\n * @method extendStaticWrapperProps\n * @param {Object} props\n * @param {DashboardVizType} props.Wrapper\n * @param {DashboardVizType} props.Visualization\n */\nexport const extendStaticWrapperProps = ({\n Wrapper,\n Visualization,\n}: {\n [key: string]: DashboardVizType;\n}): void => {\n const extendProperties = ['propTypes', 'config'];\n extendProperties.forEach((prop: string): void => {\n if (Visualization[prop]) {\n // eslint-disable-next-line no-param-reassign\n Wrapper[prop] = Visualization[prop];\n }\n });\n};\n", "import * as React from 'react';\nimport styled from 'styled-components';\nimport { DashboardVizProps } from '../interfaces/DashboardVizProps';\nimport { ExtendedDashViz } from '../interfaces/ExtendedDashViz';\nimport { extendStaticWrapperProps } from '../utils/hocUtils';\n\n// Global provided via webpack\n// eslint-disable-next-line no-underscore-dangle\ndeclare const __VISION_VERSION__: string;\n\nconst Cover = styled.div`\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n`;\n\nconst Blocker = styled.div.attrs({\n 'data-splunk-visualization-version': __VISION_VERSION__,\n})`\n position: relative;\n width: 100%;\n height: 100%;\n`;\n\n/**\n * HOC that renders a cover layer in edit mode\n * @method withEditModeCover\n * @param {ExtendedDashViz} Visualization\n * @returns {ExtendedDashViz} Wrapper\n */\nconst withEditModeCover = (\n Visualization: ExtendedDashViz,\n disableEditModeCover?: boolean\n): ExtendedDashViz => {\n const Wrapper = (props: DashboardVizProps): React.ReactElement<DashboardVizProps> => {\n const { mode } = props;\n const showEditCover = mode === 'edit' && !disableEditModeCover;\n\n return (\n <Blocker>\n <Visualization {...props} />\n {showEditCover && <Cover data-test=\"edit-mode-cover\" />}\n </Blocker>\n );\n };\n extendStaticWrapperProps({ Wrapper, Visualization });\n return Wrapper as ExtendedDashViz;\n};\n\nexport default withEditModeCover;\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/style\";\nexport * from \"@splunk/visualizations-shared/style\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import * as React from 'react';\nimport styled from 'styled-components';\nimport { toPx } from '@splunk/visualizations-shared/style';\nimport { isColor } from '@splunk/visualizations-shared/colorUtils';\nimport SizeAwareWrapper from '@splunk/visualizations-shared/SizeAwareWrapper';\n\n// Global provided via webpack\n// eslint-disable-next-line no-underscore-dangle\ndeclare const __VISION_VERSION__: string;\n\ninterface ItemProps {\n backgroundColor?: string;\n width?: string | number;\n}\n\nconst Item = styled.div.attrs<ItemProps>(({ width }) => ({\n style: {\n width: toPx(width),\n },\n}))<ItemProps>`\n position: relative;\n background-color: ${(props): string =>\n (isColor(props.backgroundColor) && props.backgroundColor) || props.theme.defaultBackgroundColor}};\n`;\n\ninterface FixSizeItemProps {\n backgroundColor?: string;\n height?: string | number;\n width?: string | number;\n}\n\n// Use `.attrs()` for highly dynamic styles. Ref: https://github.com/styled-components/styled-components/issues/134#issuecomment-312415291\nconst FixSizeItem = styled.div.attrs<FixSizeItemProps>(\n ({\n width,\n height,\n }): {\n style: { width?: string; height?: string };\n } => {\n // Ensure height is never negative (browsers ignore negative height)\n const validHeight = typeof height === 'number' ? Math.max(height, 1) : height;\n return {\n style: {\n ...(width && { width: toPx(width) }),\n ...(validHeight && { height: toPx(validHeight) }),\n },\n };\n }\n)<FixSizeItemProps>`\n position: relative;\n flex-direction: column;\n flex: 1;\n display: flex;\n overflow: hidden !important;\n background-color: ${(props): string =>\n (isColor(props.backgroundColor) && props.backgroundColor) || props.theme.defaultBackgroundColor}};\n`;\n\nconst ItemContent = styled.div`\n position: relative;\n min-height: 100px;\n width: 100%;\n`;\n\nconst FixSizeItemContent = styled.div`\n min-height: 0px;\n flex: 1;\n position: relative;\n box-sizing: border-box;\n overflow: hidden !important;\n`;\n\ninterface HeightAndWidthProps {\n width?: string | number;\n height?: string | number;\n backgroundColor?: string;\n}\n\nconst withFixedSizeContainer = <P extends HeightAndWidthProps>(\n Viz: React.ComponentType<P>\n): React.ComponentType<P> => {\n const FixedSizeContainer = (props: P): React.ReactElement => {\n const { width, height, backgroundColor } = props;\n const cachedHandleResize = React.useCallback((w, h) => {\n setContainerWidth(w);\n setContainerHeight(h);\n }, []);\n const [containerWidth, setContainerWidth] = React.useState<number>(Number(props.width));\n const [containerHeight, setContainerHeight] = React.useState<number>(Number(props.height));\n if (!height) {\n return (\n <Item data-test=\"item\" width={width} backgroundColor={backgroundColor}>\n <ItemContent>\n <Viz {...props} />\n </ItemContent>\n </Item>\n );\n }\n return (\n <FixSizeItem\n data-test=\"fix-size-item\"\n data-splunk-visualization-version={__VISION_VERSION__}\n width={width}\n height={height}\n backgroundColor={backgroundColor}\n >\n <FixSizeItemContent>\n <SizeAwareWrapper width={width} height={height} onResize={cachedHandleResize} />\n <Viz {...props} width={containerWidth} height={containerHeight} />\n </FixSizeItemContent>\n </FixSizeItem>\n );\n };\n FixedSizeContainer.displayName = 'withFixedSizeContainer';\n return FixedSizeContainer;\n};\n\nexport default withFixedSizeContainer;\n", "import * as React from 'react';\nimport { get } from 'lodash';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport Message from '@splunk/visualizations-shared/Message';\nimport { DataSource } from '../interfaces/DataSource';\nimport withFixedSizeContainer from '../hocs/FixedSizeContainer';\nimport SplunkVisualization from '../SplunkVisualization';\n\n/**\n * @method shouldShowIconPlaceholder\n * @param {object} dataSources\n * @param {boolean} loading\n * @returns {boolean}\n */\nexport const shouldShowIconPlaceholder = (\n dataSources: { [name: string]: DataSource },\n loading = false\n): boolean => {\n const data = get(dataSources, 'primary.data.columns[0]', undefined);\n const noData = data === undefined;\n const fields = get(dataSources, 'primary.data.fields[0]', undefined);\n const noFields = fields === undefined;\n return loading || noData || noFields;\n};\n\nexport interface IconPlaceholderProps {\n icon?: React.ComponentType<any>;\n width?: string | number;\n height?: string | number;\n iconColor?: string;\n backgroundColor: string;\n}\n\n/**\n * @method IconPlaceholder\n * @param {IconPlaceholderProps} props\n * @returns {React.ReactElement}\n */\nconst IconPlaceholder = (props: IconPlaceholderProps): React.ReactElement => {\n const {\n width = SplunkVisualization.defaults.width,\n height = SplunkVisualization.defaults.height,\n icon,\n iconColor,\n backgroundColor,\n } = props;\n\n let content = (\n <Message width={width} height={height} level=\"warning\" message={_('No DataSource Connected')} />\n );\n if (icon) {\n content = React.createElement(icon, {\n style: {\n left: '50%',\n top: '50%',\n color: iconColor,\n opacity: 0.15,\n position: 'absolute',\n transform: 'translate(-50%, -50%)',\n },\n width: '50%',\n height: '50%',\n 'data-test': 'icon-placeholder',\n });\n }\n\n return <div style={{ width, height, background: backgroundColor }}>{content}</div>;\n};\n\nexport default withFixedSizeContainer(IconPlaceholder);\n", "import * as React from 'react';\nimport { isColor } from '@splunk/visualizations-shared/colorUtils';\nimport variables from '@splunk/themes/variables';\nimport IconPlaceholder, { shouldShowIconPlaceholder } from '../components/IconPlaceholder';\nimport { VizBehavior } from '../interfaces/VizBehavior';\nimport { DashboardVizProps } from '../interfaces/DashboardVizProps';\nimport { DataSource } from '../interfaces/DataSource';\nimport { ExtendedDashViz } from '../interfaces/ExtendedDashViz';\nimport { extendStaticWrapperProps } from '../utils/hocUtils';\nimport SplunkVisualization from '../SplunkVisualization';\n\ntype useIconPlaceholderType = (\n dataSources: { [name: string]: DataSource },\n loading: boolean,\n options: Record<string, unknown>\n) => boolean;\n\nconst withPlaceholder = (\n Visualization: ExtendedDashViz,\n useIconPlaceholder: useIconPlaceholderType = shouldShowIconPlaceholder\n): ExtendedDashViz => {\n const { config } = Visualization;\n const { themes } = config;\n\n const Wrapper = (props: DashboardVizProps): React.ReactElement<DashboardVizProps> => {\n const {\n dataSources,\n loading,\n options,\n height = SplunkVisualization.defaults.height,\n width = SplunkVisualization.defaults.width,\n } = props;\n\n const showPlaceholder = useIconPlaceholder(dataSources, loading, options);\n const icon = config.placeholderIcon ?? config.icon;\n const iconColor = variables.contentColorActive(props);\n const bgColorFromTheme = isColor(options?.backgroundColor)\n ? options?.backgroundColor\n : themes?.defaultBackgroundColor?.(props);\n\n if (config.supports.includes(VizBehavior.PLACEHOLDER) && showPlaceholder) {\n return (\n <IconPlaceholder\n data-test=\"icon-placeholder\"\n icon={icon}\n width={width}\n height={height}\n backgroundColor={bgColorFromTheme}\n iconColor={iconColor}\n />\n );\n }\n\n return <Visualization {...props} />;\n };\n extendStaticWrapperProps({ Wrapper, Visualization });\n return Wrapper as ExtendedDashViz;\n};\n\nexport default withPlaceholder;\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/numberUtils\";\nexport * from \"@splunk/visualizations-shared/numberUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import type { FieldEntry } from '@splunk/visualizations-shared/dataSourceUtils';\nimport { startsWithNumber } from '@splunk/visualizations-shared/numberUtils';\nimport type { DashboardVizProps, DataSource, VizConfig } from '../interfaces';\nimport { VizBehavior } from '../interfaces';\nimport { ChartEvent } from '../interfaces/ChartEvent';\n\nexport const convertToArrOfObjects = (columns: (string | any[])[], fields: any[]): any[] => {\n if (!columns || !columns[0] || !columns[0].length) return [];\n\n const data = [];\n\n for (let i = 0; i < columns[0].length; i += 1) {\n const newObj = {};\n fields.forEach((field, index) => {\n const fieldName = getFieldName(field);\n if (columns[index][i] === '') {\n newObj[fieldName] = null;\n } else {\n newObj[fieldName] = columns[index][i];\n }\n });\n data.push(newObj);\n }\n\n return data;\n};\n\nconst getFieldName = (field: FieldEntry | string): string => (typeof field === 'string' ? field : field.name);\n\n// LTTB algorithm which can be used to downsample time series data while striving to maintain\n// the spikes and overall shape of the chart\n// Copied from https://github.com/sveinn-steinarsson/flot-downsample/blob/0815010016fc94b1bbc6a010afb8aad13ada6d0d/jquery.flot.downsample.js\n// Modifications include:\n// 1) Convert to modern JavaScript(use const, let, and use array.push to push to last element of array)\n// 2) Convert to camel case\n// 3) Convert to TS and also return the indices of the points that are in the downsampled result.\n// 4) Add a new parameter preferredDownsampleIndices that correspond to the indices of points\n// that should be used in case of a tie of the max area in a bucket\nconst largestTriangleThreeBuckets = (\n data: [Date | number, number][],\n threshold: number,\n preferredDownsampleIndices: Set<number>\n): {\n downsampledData: [Date | number, number][];\n downsampledIndices: number[];\n} => {\n const dataLength = data.length;\n const downsampledIndices = [];\n if (threshold >= dataLength || threshold === 0) {\n const allIndices = data.map((values, index) => index);\n return { downsampledData: data, downsampledIndices: allIndices }; // Nothing to do\n }\n\n const sampled: [Date | number, number][] = [];\n let sampledIndex = 0;\n\n // Bucket size. Leave room for start and end data points\n const every = (dataLength - 2) / (threshold - 2);\n\n let a = 0; // Initially a is the first point in the triangle\n let maxAreaPoint: [Date | number, number];\n let maxArea: number | undefined;\n let area: number | undefined;\n let nextA: number | undefined;\n\n sampled.push(data[a]); // Always add the first point\n downsampledIndices.push(0);\n\n // eslint-disable-next-line no-plusplus\n for (let i = 0; i < threshold - 2; i++) {\n // Calculate point average for next bucket (containing c)\n let avgX = 0;\n let avgY = 0;\n let avgRangeStart = Math.floor((i + 1) * every) + 1;\n let avgRangeEnd = Math.floor((i + 2) * every) + 1;\n avgRangeEnd = avgRangeEnd < dataLength ? avgRangeEnd : dataLength;\n\n const avgRangeLength = avgRangeEnd - avgRangeStart;\n\n // eslint-disable-next-line no-plusplus\n for (; avgRangeStart < avgRangeEnd; avgRangeStart++) {\n avgX += Number(data[avgRangeStart][0]); // * 1 enforces Number (value may be Date)\n avgY += data[avgRangeStart][1] * 1;\n }\n avgX /= avgRangeLength;\n avgY /= avgRangeLength;\n\n // Get the range for this bucket\n let rangeOffs = Math.floor((i + 0) * every) + 1;\n const rangeTo = Math.floor((i + 1) * every) + 1;\n\n // Point a\n const pointAX = Number(data[a][0]); // Enforce Number (value may be Date)\n const pointAY = data[a][1] * 1;\n\n // eslint-disable-next-line no-multi-assign\n maxArea = area = -1;\n let maxAreaIndex = rangeOffs;\n\n // eslint-disable-next-line no-plusplus\n for (; rangeOffs < rangeTo; rangeOffs++) {\n // Calculate triangle area over three buckets\n area =\n Math.abs(\n (pointAX - avgX) * (data[rangeOffs][1] - pointAY) -\n (pointAX - Number(data[rangeOffs][0])) * (avgY - pointAY)\n ) * 0.5;\n // Modification: try to downsample the least amount of points possible when there are multiple series\n // If all points in a bucket have the same area, prioritize the one with an x index\n // that also existed from another series so we don't add another point unnecessarily.\n // By default LTTB picks the leftmost point in the bucket\n if (area > maxArea || (area === maxArea && preferredDownsampleIndices.has(rangeOffs))) {\n maxArea = area;\n maxAreaPoint = data[rangeOffs];\n nextA = rangeOffs; // Next a is this b\n // Modification: save the index of the point with the most area\n maxAreaIndex = rangeOffs;\n }\n }\n\n // eslint-disable-next-line no-plusplus\n sampled[sampledIndex++] = maxAreaPoint; // Pick this point from the bucket\n downsampledIndices.push(maxAreaIndex);\n a = nextA; // This a is the next a (chosen b)\n }\n\n // eslint-disable-next-line no-plusplus\n sampled[sampledIndex++] = data[dataLength - 1]; // Always add last\n downsampledIndices.push(dataLength - 1);\n\n return { downsampledData: sampled, downsampledIndices };\n};\n\nexport type DownsampleOptions = { threshold: number } & Pick<DashboardVizProps, 'dataSources' | 'options'>;\n\ntype CoerceYColumnResult = {\n canDownsampleColumn: boolean;\n canLooselyCoerceSomeValues: boolean;\n coercedColumn: number[];\n};\n\n/**\n * Strictly coerces the entire column to numbers if it only consists of numeric strings or numbers. Also determines\n * if at least one of the values in the column can be loosely coerced to a number.\n * If the column cannot be strictly downsampled (if it contains nulls or non-numeric strings), returns an empty array and\n * returns that it cannot downsample the column.\n */\nconst strictlyCoerceYColumn = (\n column: (string | number)[] | number[],\n options: DownsampleOptions['options']\n): CoerceYColumnResult => {\n const isNullCoercionEnabled = options.nullValueDisplay === 'zero';\n // Splunk charting allows for numbers in formats such as negative hex that\n // Number() does not support and also allows loose coercion of hex numbers (but not other formats)\n // We want to identify columns which contain at least one value that can be loosely coerced\n const canLooselyCoerceSomeValues =\n column.findIndex(\n value => startsWithNumber(`${value}`) || (isNullCoercionEnabled && value === null)\n ) >= 0;\n\n // If not all values in column can be strictly coerced to a number, we do not downsample\n const coercedColumn: number[] = [];\n const canDownsampleColumn = !column.some(value => {\n const coercedValue = Number(value);\n const coerceValueToZero = isNullCoercionEnabled && value === null;\n\n // if it can't be parsed or isn't safe, fail\n if (\n Number.isNaN(coercedValue) ||\n coercedValue <= Number.MIN_SAFE_INTEGER ||\n coercedValue >= Number.MAX_SAFE_INTEGER ||\n (typeof value !== 'string' && typeof value !== 'number' && !coerceValueToZero)\n ) {\n return true;\n }\n // save value and continue to next\n coercedColumn.push(coercedValue);\n return false;\n });\n\n return {\n canDownsampleColumn,\n canLooselyCoerceSomeValues,\n coercedColumn: canDownsampleColumn ? coercedColumn : [],\n };\n};\n\n/**\n * Tries to coerce the x-column to numbers or dates, if it is eligible for downsampling.\n * Only strictly increasing x-columns are eligible for downsampling.\n * If the column is not eligible for downsampling, returns an empty array.\n */\nconst strictlyCoerceXColumn = (column: (string | number)[], fieldType: string): Date[] | number[] => {\n if (fieldType === 'number') {\n const coercedXColumn = column.map(xValue => Number(xValue));\n if (isColumnStrictlyIncreasing(coercedXColumn, fieldType)) {\n return coercedXColumn;\n }\n } else if (fieldType === 'time') {\n const coercedXColumn = column.map(xValue => new Date(xValue));\n if (isColumnStrictlyIncreasing(coercedXColumn, fieldType)) {\n return coercedXColumn;\n }\n }\n return [];\n};\n\nexport const isDownsamplingEnabledForViz = ({ vizConfig }: { vizConfig: VizConfig }) => {\n return vizConfig.supports?.includes(VizBehavior.DOWNSAMPLING);\n};\n\nexport const calculateThresholdOnRangeSelect = ({\n firstIndex,\n lastIndex,\n dataSources,\n width,\n}: Pick<DashboardVizProps, 'dataSources'> & {\n firstIndex: number;\n lastIndex: number;\n width: number | string;\n}): number => {\n const window = lastIndex - firstIndex + 1;\n // eslint-disable-next-line no-unsafe-optional-chaining\n const ratio = Math.round(Number(dataSources?.primary?.data?.columns[0]?.length / window) * 10) / 10;\n return Math.round(ratio * Number(width));\n};\n\n/**\n * Calculates the downsampling threshold based on the range selection. If search zoom is enabled or there is no selection,\n * then returns the width of the visualization.\n *\n * Otherwise calculates the threshold based on the ratio of the window selected compared to the size of the non-downsampled\n * data sources. Returns null if the chart event's dataset does not match the passed in primary data source or if the chart is zoomed\n * in for a categorical chart.\n */\nexport const calculateDownsamplingThreshold = ({\n enableSearchZoom,\n dataSources,\n selectChartEvent,\n width,\n xField,\n}: {\n enableSearchZoom: boolean;\n dataSources: Record<string, DataSource> | null;\n selectChartEvent: ChartEvent<'chartRangeSelect'> | null;\n width: number;\n xField: string;\n}): number | null => {\n if (enableSearchZoom || !selectChartEvent) {\n return Number(width);\n }\n\n const primaryDataSource = dataSources?.primary;\n if (!primaryDataSource) {\n return null;\n }\n\n const { startXIndex, endXIndex, currentTarget } = selectChartEvent;\n\n try {\n const xFieldIndex = primaryDataSource?.data?.fields.findIndex(field => {\n const name = typeof field === 'string' ? field : field.name;\n return name === xField;\n });\n const downsampledXFieldIndex = currentTarget.dataSet?.fields.findIndex(field => field === xField);\n\n if (xFieldIndex === -1 || downsampledXFieldIndex === -1) {\n return null;\n }\n\n const fullSeries = primaryDataSource?.data?.columns[xFieldIndex];\n const downsampledSeries = currentTarget.dataSet.seriesList[downsampledXFieldIndex];\n\n const firstIndex = fullSeries.findIndex(x => {\n return downsampledSeries[startXIndex] === x;\n });\n const lastIndex = fullSeries.findIndex(x => {\n return downsampledSeries[endXIndex] === x;\n });\n\n if (firstIndex >= 0 && lastIndex >= 0 && firstIndex <= lastIndex) {\n return calculateThresholdOnRangeSelect({\n firstIndex,\n lastIndex,\n dataSources,\n width,\n });\n }\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Error occurred while setting downsample threshold on range select event', e);\n }\n\n return null;\n};\n\nconst isColumnStrictlyIncreasing = (column: (number | Date)[], fieldType: 'number' | 'time') => {\n return column.every((value, index) => {\n if (fieldType === 'number') {\n if (Number.isNaN(value)) {\n return false;\n }\n }\n\n if (fieldType === 'time') {\n if (Number.isNaN((value as Date).getTime())) {\n return false;\n }\n }\n if (index === 0) {\n return true;\n }\n return value > column[index - 1];\n });\n};\n\n/**\n * Verifies that all of the columns that are displayed in a chart can be downsampled. Valid columns that can be\n * displayed are those that contain at least one number. We can only downsample columns that only consist of numbers.\n *\n * If all columns can be downsampled, returns the x column coerced to time/number and y columns coerced to numbers.\n * If not all columns can be downsampled, then returns empty arrays for both x and y\n */\nconst tryToCoerceAllDisplayedFields = (\n ds: DataSource,\n xField: string,\n yFields: Set<string>,\n fieldTypes: string[],\n options: DownsampleOptions['options']\n): { xColumn: Date[] | number[]; yColumns: number[][] } => {\n let xColumn: Date[] | number[] = [];\n const yColumns: number[][] = [];\n\n const canDownsample = !ds.data.fields.some((field, index) => {\n const fieldName = getFieldName(field);\n const fieldType = fieldTypes[index] ?? 'unknown';\n const column = ds.data.columns[index];\n let hasDisplayedColumnThatCantBeDownsampled = false;\n\n if (fieldName === xField) {\n xColumn = strictlyCoerceXColumn(column, fieldType);\n } else if (yFields.has(fieldName)) {\n const { coercedColumn, canLooselyCoerceSomeValues, canDownsampleColumn } = strictlyCoerceYColumn(\n ds.data.columns[index],\n options\n );\n // do not perform downsampling if a column can possibly be displayed but cannot\n // be downsampled using LTTB\n hasDisplayedColumnThatCantBeDownsampled = canLooselyCoerceSomeValues && !canDownsampleColumn;\n if (hasDisplayedColumnThatCantBeDownsampled) {\n return true;\n }\n if (canDownsampleColumn) {\n yColumns.push(coercedColumn);\n }\n }\n return false;\n });\n\n if (canDownsample) {\n return { xColumn, yColumns };\n }\n return { xColumn: [], yColumns: [] };\n};\n\nconst pickIndicesFromDataSource = (ds: DataSource, indices: Set<number>): DataSource => {\n const sortedIndices = Array.from(indices).sort((a: number, b: number) => a - b);\n const slicedColumns = [];\n ds.data.columns.forEach(column => {\n const slicedColumn = [];\n sortedIndices.forEach(index => {\n slicedColumn.push(column[index]);\n });\n slicedColumns.push(slicedColumn);\n });\n\n // update data columns with downsampled columns\n return {\n ...ds,\n data: {\n ...ds.data,\n columns: slicedColumns,\n },\n };\n};\n\nexport const downsampleDataSources = ({ dataSources, threshold, options }: DownsampleOptions) => {\n const primaryDS = dataSources?.primary;\n // only downsample time series when number of data points are over threshold\n const numPoints = primaryDS?.data?.columns[0]?.length ?? 0;\n if (Number.isNaN(threshold) || numPoints <= threshold || threshold < 2) {\n return dataSources;\n }\n\n const { xField, yFields, fieldTypes } = options;\n if (!xField || !yFields?.length || !fieldTypes?.length) {\n return dataSources;\n }\n\n const nonInternalYFields = new Set<string>(yFields.filter(yField => !yField.startsWith('_')));\n const maxPointsInDownsample = Math.min(nonInternalYFields.size * threshold, numPoints);\n\n // Do not try to downsample if there are too many downsampled pts\n // At the worst case, each series has non-overlapping downsampled pts\n // which will mean that all points will be included in the downsampled result\n // This will just lead to additional overhead due to coercing each\n // x and y field to number\n if (maxPointsInDownsample >= numPoints) {\n return dataSources;\n }\n\n const { xColumn, yColumns } = tryToCoerceAllDisplayedFields(\n primaryDS,\n xField,\n nonInternalYFields,\n fieldTypes,\n options\n );\n\n if (!yColumns.length || !xColumn.length) {\n return dataSources;\n }\n\n const downsampledDataSources = { ...dataSources };\n const downsampledIndices = new Set<number>();\n\n yColumns.forEach((yColumn, columnIndex) => {\n // perform LTTB downsampling for current series, LTTB takes an [x, y] pair\n const xyPair: [Date | number, number][] = yColumn.map((yValue, index) => {\n return [xColumn[index], yValue];\n });\n\n try {\n const { downsampledIndices: downsampledIndicesForSeries } = largestTriangleThreeBuckets(\n xyPair,\n threshold,\n downsampledIndices\n );\n downsampledIndicesForSeries.forEach(downsampleIndex => downsampledIndices.add(downsampleIndex));\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(`Error occurred while downsampling column ${columnIndex}`, e);\n }\n });\n // update data columns with downsampled columns\n downsampledDataSources.primary = pickIndicesFromDataSource(primaryDS, downsampledIndices);\n\n return downsampledDataSources;\n};\n", "import { useEffect, useRef } from 'react';\n\nexport default function usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T>();\n useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}\n", "import { useMemo } from 'react';\nimport { Options as Opts } from '@splunk/visualization-encoding/Options';\nimport type { DashboardVizProps } from '../interfaces';\n\n/**\n * Hook that evaluates the DSL for subset of a viz's options needed to determine\n * its x and y fields as well as the types of all its fields.\n */\nconst useGetXAndYFields = ({\n shouldEvaluateDSL,\n options,\n context,\n dataSources,\n}: Pick<DashboardVizProps, 'dataSources' | 'options' | 'context'> & {\n shouldEvaluateDSL: boolean;\n}) => {\n const { dataSourcesWithOnlyOnePoint, dataFrameWithOnlyOnePoint } = useMemo(() => {\n if (!shouldEvaluateDSL) {\n return {\n dataSourcesWithOnlyOnePoint: null,\n dataFrameWithOnlyOnePoint: null,\n };\n }\n\n if (!dataSources?.primary?.data?.columns?.length) {\n return {\n dataSourcesWithOnlyOnePoint: null,\n dataFrameWithOnlyOnePoint: null,\n };\n }\n const { primary: primaryDS } = dataSources;\n\n const columnsWithOnlyOnePoint = primaryDS.data.columns.map(column => {\n return [column[0]];\n });\n\n const filteredDataSources = {\n primary: {\n ...primaryDS,\n data: {\n ...primaryDS.data,\n columns: columnsWithOnlyOnePoint,\n },\n },\n };\n\n return {\n dataSourcesWithOnlyOnePoint: filteredDataSources,\n dataFrameWithOnlyOnePoint: Opts.dataFrameFromDataSource(filteredDataSources),\n };\n }, [dataSources, shouldEvaluateDSL]);\n\n const xAndYFieldsWithTypes = useMemo(() => {\n try {\n if (!dataSourcesWithOnlyOnePoint || !dataFrameWithOnlyOnePoint) {\n return options;\n }\n\n if (!options?.x || (!options?.y && !options?.y2)) {\n return options;\n }\n\n const optionsToEvaluate = {\n x: options.x,\n xField: '> x | getField()',\n y: options.y,\n yFields: options.y ? '> y | getField()' : undefined,\n y2: options.y2,\n y2Fields: options.y2 ? '> y2 | getField()' : undefined,\n fieldTypes: '> primary | getType()',\n };\n\n const {\n xField = '',\n yFields = [],\n y2Fields = [],\n fieldTypes,\n } = Opts.evaluate(\n { options: optionsToEvaluate, context },\n dataSourcesWithOnlyOnePoint,\n () => {},\n dataFrameWithOnlyOnePoint\n );\n return {\n xField,\n yFields: [...yFields, ...y2Fields],\n fieldTypes,\n };\n } catch (e) {\n return {\n xField: undefined,\n yFields: [],\n fieldTypes: [],\n };\n }\n }, [options, context, dataSourcesWithOnlyOnePoint, dataFrameWithOnlyOnePoint]);\n\n return xAndYFieldsWithTypes;\n};\n\nexport default useGetXAndYFields;\n", "import { useRef, useMemo, useEffect, useState } from 'react';\nimport { debounce, isEqual, pick } from 'lodash';\nimport type { DashboardVizProps } from '../interfaces';\nimport type { DownsampleOptions } from '../utils/dataUtils';\nimport { downsampleDataSources } from '../utils/dataUtils';\nimport usePrevious from './usePrevious';\nimport useGetXAndYFields from './useGetXAndYFields';\n\n// Options properties which impact/require re-downsample on change.\nconst downsampleVizOptionProperties = ['nullValueDisplay'];\n\nconst useDownsampleDataSources = ({\n dataSources,\n options,\n context,\n threshold,\n isDownsamplingEnabled,\n}: Pick<DashboardVizProps, 'dataSources' | 'options' | 'context'> & {\n threshold: number;\n isDownsamplingEnabled?: boolean;\n}) => {\n const isFirstUseEffectCall = useRef(true);\n\n const xAndYFieldsWithTypes = useGetXAndYFields({\n shouldEvaluateDSL: isDownsamplingEnabled,\n options,\n context,\n dataSources,\n });\n\n // Extract viz options that impact downsampling.\n const downsampleVizOptions = useMemo(() => pick(options, downsampleVizOptionProperties), [options]);\n const downsampleDSOptions = useMemo(\n () => ({\n ...downsampleVizOptions,\n ...xAndYFieldsWithTypes,\n }),\n [xAndYFieldsWithTypes, downsampleVizOptions]\n );\n\n const previousDownsampleDSOptions = usePrevious(downsampleDSOptions);\n const previousDataSources = usePrevious(dataSources);\n const previousThreshold = usePrevious(threshold);\n\n const [downsampledDataSources, setDownsampledDataSources] = useState(() => {\n return isDownsamplingEnabled\n ? downsampleDataSources({\n dataSources,\n threshold,\n options: downsampleDSOptions,\n })\n : dataSources;\n });\n\n const debouncedDownsampleDataSources = useMemo(() => {\n return debounce(\n (downsampleOptions: DownsampleOptions) => {\n const downsampledResult = downsampleDataSources(downsampleOptions);\n setDownsampledDataSources(downsampledResult);\n },\n 100,\n { trailing: true }\n );\n }, []);\n\n useEffect(() => {\n // don't downsample again on the use effect call that happened due to the initial render\n // this is since we already downsampled as part of the useState call\n if (isFirstUseEffectCall.current) {\n isFirstUseEffectCall.current = false;\n return;\n }\n\n if (!isDownsamplingEnabled) {\n setDownsampledDataSources(dataSources);\n return;\n }\n\n if (\n isEqual(previousDownsampleDSOptions, downsampleDSOptions) &&\n previousDataSources === dataSources &&\n previousThreshold === threshold\n ) {\n return;\n }\n\n // Debounce the downsampling so we don't have to downsample and execute DSL multiple times\n // while the viz is being resized\n debouncedDownsampleDataSources({\n dataSources,\n options: downsampleDSOptions, // Dont want to re-downsample everytime the options change\n threshold,\n });\n\n // need to detect if this runs as part of the initial render\n }, [\n dataSources,\n downsampleDSOptions,\n debouncedDownsampleDataSources,\n xAndYFieldsWithTypes,\n threshold,\n isDownsamplingEnabled,\n previousDataSources,\n previousThreshold,\n previousDownsampleDSOptions,\n ]);\n\n return downsampledDataSources;\n};\n\nexport default useDownsampleDataSources;\n", "\nimport * as defaultImport from \"@splunk/visualization-context/FeatureFlags\";\nexport * from \"@splunk/visualization-context/FeatureFlags\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import * as React from 'react';\nimport FeatureFlags from '@splunk/visualization-context/FeatureFlags';\n\nexport const getFeatureFlag = (\n context: React.Context<any> | null | undefined | Record<keyof typeof FeatureFlags, boolean>,\n flagName: string\n): boolean => {\n // look for feature flag in context first\n if (context && Object.keys(context).find(key => key === flagName)) {\n return context[flagName];\n }\n\n // fall back to defaults\n if (Object.keys(FeatureFlags).find(key => key === flagName)) {\n return FeatureFlags[flagName];\n }\n\n // fall back to false\n return false;\n};\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/trellisUtils\";\nexport * from \"@splunk/visualizations-shared/trellisUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import { cloneDeep, omit } from 'lodash';\nimport { FieldEntry } from '@splunk/visualizations-shared/dataSourceUtils';\nimport {\n DataSplitMode,\n CHART,\n TIMECHART,\n STATS,\n UNKNOWN,\n extractDataSourceAggregationKeysChart,\n extractDataSourceAggregationKeysStats,\n extractSplitByFieldsChartFields,\n extractSplitByFieldsForStats,\n extractSplitByFieldsForUnknown,\n} from '@splunk/visualizations-shared/trellisUtils';\nimport { DataSource } from '../interfaces/DataSource';\n\nexport type SplitDataSource = { [key: string]: { [name: string]: DataSource } };\nexport interface DataSplitResult {\n splitDataSources: SplitDataSource;\n errorCode: 'UNKNOWN_DATA_SPLIT_MODE' | 'INVALID_SPLIT_BY_FIELD' | 'UNKNOWN';\n}\nexport const AGGREGATIONS = 'aggregations';\n\n/**\n * There can be certain SPL cmds that can produce dataSource without a specific field meta info (like group_by_rank, split_by_field etc),\n * to categorize it,\n * Example1:- `index = \"_internal\" | chart count`\n * Example2:- `index=_internal | chart avg(count), max(count)`\n * Example3:- `index = \"_internal\" | stats count`\n * Example4:- `index=_internal | stats avg(count), max(count)`\n */\nexport const dataSourcesSplitByAggregationsUnknown = (dataSource: {\n [name: string]: DataSource;\n}): DataSplitResult => {\n const fields = toFieldEntries(dataSource?.primary?.data?.fields);\n const columns = dataSource?.primary?.data?.columns;\n let splitDataSources = null;\n let errorCode = null;\n\n if (fields && fields.length) {\n splitDataSources = {};\n for (let i = 0; i < fields.length; i += 1) {\n const fieldName = fields[i].name;\n if (!fieldName?.startsWith('_')) {\n splitDataSources[fieldName] = cloneDeep(\n omit(dataSource, ['primary.data.fields', 'primary.data.columns'])\n );\n splitDataSources[fieldName].primary.data.fields = [fields[i]];\n splitDataSources[fieldName].primary.data.columns = [columns[i]];\n }\n }\n } else {\n errorCode = 'INVALID_SPLIT_BY_FIELD';\n }\n return { splitDataSources, errorCode };\n};\n\nconst toFieldEntries = (fields: FieldEntry[] | string[] = []): FieldEntry[] => {\n return fields.map(field => {\n if (typeof field === 'string') {\n return { name: field };\n }\n return field;\n });\n};\n\nexport const dataSourcesSplitByAggregationsTimechartAndChart = (dataSource: {\n [name: string]: DataSource;\n}): DataSplitResult => {\n const fields = toFieldEntries(dataSource?.primary?.data?.fields);\n const columns = dataSource?.primary?.data?.columns;\n let splitDataSources = null;\n let splitByFields = [];\n let errorCode = null;\n\n if (fields.length > 0) {\n splitByFields = extractDataSourceAggregationKeysChart(fields);\n }\n\n if (splitByFields && splitByFields.length > 0) {\n splitDataSources = {};\n splitByFields.forEach(splitByField => {\n splitDataSources[splitByField] = cloneDeep(\n omit(dataSource, ['primary.data.fields', 'primary.data.columns'])\n );\n splitDataSources[splitByField].primary.data.fields = [fields[0]];\n splitDataSources[splitByField].primary.data.columns = [columns[0]];\n fields.forEach((field: FieldEntry, idx) => {\n const fieldName = field?.name;\n if (\n fieldName !== '_time' &&\n !fieldName?.startsWith('_') &&\n field.data_source === splitByField\n ) {\n splitDataSources[splitByField].primary.data.fields.push(field);\n splitDataSources[splitByField].primary.data.columns.push(columns[idx]);\n }\n });\n });\n } else if ((!splitByFields || !splitByFields.length) && fields.length > 1) {\n // handle where data_source doesnot exist in fields\n // example1 :- index=_internal | timechart count\n // example2 :- index=_internal | timechart max(count) avg(count)\n splitDataSources = {};\n for (let i = 1; i < fields.length; i += 1) {\n const fieldName = fields[i].name;\n if (!fieldName?.startsWith('_')) {\n splitDataSources[fieldName] = cloneDeep(\n omit(dataSource, ['primary.data.fields', 'primary.data.columns'])\n );\n splitDataSources[fieldName].primary.data.fields = [fields[0], fields[i]];\n splitDataSources[fieldName].primary.data.columns = [columns[0], columns[i]];\n }\n }\n } else {\n errorCode = 'INVALID_SPLIT_BY_FIELD';\n }\n return { splitDataSources, errorCode };\n};\n\nexport const dataSourcesSplitByAggregationsStats = (dataSource: {\n [name: string]: DataSource;\n}): DataSplitResult => {\n const fields = toFieldEntries(dataSource?.primary?.data?.fields);\n const columns = dataSource?.primary?.data?.columns;\n let splitDataSources = null;\n let splitByFields = [];\n let errorCode = null;\n if (fields.length > 0) {\n splitByFields = extractDataSourceAggregationKeysStats(fields);\n }\n\n if (splitByFields && splitByFields.length > 0) {\n splitDataSources = {};\n splitByFields.forEach(splitByField => {\n splitDataSources[splitByField] = cloneDeep(\n omit(dataSource, ['primary.data.fields', 'primary.data.columns'])\n );\n splitDataSources[splitByField].primary.data.fields = [fields[0]];\n splitDataSources[splitByField].primary.data.columns = [columns[0]];\n const idx = fields.findIndex(field => field.name === splitByField);\n if (idx > 0) {\n splitDataSources[splitByField].primary.data.fields.push(fields[idx]);\n splitDataSources[splitByField].primary.data.columns.push(columns[idx]);\n }\n });\n } else {\n errorCode = 'INVALID_SPLIT_BY_FIELD';\n }\n return { splitDataSources, errorCode };\n};\n\nexport const dataSourcesSplitByModeTimechart = (\n dataSource: { [name: string]: DataSource },\n splitBy: string\n): DataSplitResult => {\n const fields = toFieldEntries(dataSource?.primary?.data?.fields);\n const columns = dataSource?.primary?.data?.columns;\n let splitDataSources = null;\n let splitByFields = [];\n let errorCode = null;\n if (fields.length > 0) {\n splitByFields = extractSplitByFieldsChartFields(fields);\n }\n if (splitByFields && splitByFields.indexOf(splitBy) > -1) {\n splitDataSources = {};\n const dataSourceKeys = extractDataSourceAggregationKeysChart(fields);\n const valueKeys = [];\n for (let i = 1; i < fields.length; i += 1) {\n // not including internal fields\n if (!fields[i].name?.startsWith('_')) {\n valueKeys.push(fields[i].splitby_value ? fields[i].splitby_value : fields[i].name);\n }\n }\n valueKeys.forEach(val => {\n splitDataSources[val] = cloneDeep(\n omit(dataSource, ['primary.data.fields', 'primary.data.columns'])\n );\n splitDataSources[val].primary.data.fields = [{ name: fields[0].name }];\n splitDataSources[val].primary.data.columns = [[...columns[0]]];\n dataSourceKeys.forEach(dsKey => {\n fields.forEach((field, idx) => {\n if (field.data_source === dsKey && (field.splitby_value === val || field.name === val)) {\n // only push valid fields for the current split by valueKey, instead of all fields.\n splitDataSources[val].primary.data.fields.push({\n name: dsKey,\n });\n splitDataSources[val].primary.data.columns.push([...columns[idx]]);\n }\n });\n });\n });\n } else {\n errorCode = 'INVALID_SPLIT_BY_FIELD';\n }\n return { splitDataSources, errorCode };\n};\n\nexport const dataSourcesSplitByModeChart = (\n dataSource: { [name: string]: DataSource },\n splitBy: string\n): DataSplitResult => {\n const fields = toFieldEntries(dataSource?.primary?.data?.fields);\n const columns = dataSource?.primary?.data?.columns;\n let splitDataSources = null;\n let splitByFields = [];\n let errorCode = null;\n if (fields.length > 0) {\n splitByFields = extractSplitByFieldsChartFields(fields);\n }\n if (splitByFields && splitByFields.indexOf(splitBy) > -1) {\n splitDataSources = {};\n const splitByFieldIdx = splitByFields.findIndex(f => f === splitBy);\n const otherSplitBy = splitByFields.filter(f => f !== splitBy);\n const dataSourceKeys = extractDataSourceAggregationKeysChart(fields);\n const nonDataSourceAggregations = [];\n if (\n !dataSourceKeys.length &&\n fields[0].groupby_rank === '0' &&\n fields.length &&\n !fields[1].groupby_rank\n ) {\n /* check for another aggregation scenario where no key 'data_source' will be returned (applies for both chart and stats cmd)\n For example :-\n index=_internal | chart count by status\n index = \"_internal\" | chart max(count) avg(count) by status\n index = \"_internal\" | stats max(count) avg(count) by status\n where field meta info is in this format -\n \"fields\": [\n {\n \"name\": \"status\",\n \"groupby_rank\": \"0\"\n },\n {\n \"name\": \"max(count)\"\n },\n {\n \"name\": \"avg(count)\"\n }\n ]\n */\n\n for (let i = 1; i < fields.length; i += 1) {\n nonDataSourceAggregations.push(fields[i].name);\n }\n }\n if (splitByFieldIdx === 0) {\n // if splitBy is the first field, split row wise\n const valueKeys = cloneDeep(columns[0]);\n valueKeys.forEach((val, idx) => {\n splitDataSources[val] = cloneDeep(\n omit(dataSource, ['primary.data.fields', 'primary.data.columns'])\n );\n splitDataSources[val].primary.data.fields = [];\n if (otherSplitBy.length) {\n splitDataSources[val].primary.data.fields = [{ name: otherSplitBy[0] }]; // there can only be one otherSplitBy for chart cmd\n }\n if (dataSourceKeys.length) {\n const columnValues = [[]];\n splitDataSources[val].primary.data.fields = [\n ...splitDataSources[val].primary.data.fields,\n ...dataSourceKeys.map(k => ({\n name: k,\n })),\n ];\n dataSourceKeys.forEach(() => {\n columnValues.push([]);\n });\n /**\n * There can be chart SPL cmd where there are multiple data_source keys in the field meta info.\n * For eg - index = \"_internal\" | chart avg(count) max(count) by status , user) can result in fields and columns as below where \"data_source\" keys are \"avg(count)\" and \"max(count)\"\n * 'fields' : [\n {\n \"name\": \"status\",\n \"groupby_rank\": \"0\"\n },\n {\n \"name\": \"avg(count): userA\",\n \"data_source\": \"avg(count)\",\n \"splitby_field\": \"user\",\n \"splitby_value\": \"userA\"\n },\n {\n \"name\": \"avg(count): userB\",\n \"data_source\": \"avg(count)\",\n \"splitby_field\": \"user\",\n \"splitby_value\": \"userB\"\n },\n {\n \"name\": \"avg(count): userC\",\n \"data_source\": \"avg(count)\",\n \"splitby_field\": \"user\",\n \"splitby_value\": \"userC\"\n },\n {\n \"name\": \"max(count): userA\",\n \"data_source\": \"max(count)\",\n \"splitby_field\": \"user\",\n \"splitby_value\": \"userA\"\n },\n {\n \"name\": \"max(count): userB\",\n \"data_source\": \"max(count)\",\n \"splitby_field\": \"user\",\n \"splitby_value\": \"userB\"\n },\n {\n \"name\": \"max(count): userC\",\n \"data_source\": \"max(count)\",\n \"splitby_field\": \"user\",\n \"splitby_value\": \"userC\"\n },\n ]\n 'columns' : [['200','303','304','400'], ['1','2','3','4'], ['10','20','30','40'], ['100','200','300','400'], ['5','6','7','8'], ['50','60','70','80'],['500','600','700','800']]\n\n In this case when we split row wise, the data_source keys for userA appears in indices [1, 4, ..], the data_source keys for userB appears in indices [2, 5, ..]\n The resulting dataSplit for status '200', will have the fields => ['user','avg(count)', 'max(count)'] columns => [['userA', 'userB', 'userC'],['1','10','100'], ['5', '50', '500'] ]\n\n For the example above for..loop below will iterate from i= 1 to 3 (Math.ceil((fields.length - 1) / dataSourceKeys.length)). Exclude i = 0 as first column is the splitBy input.\n Since there are 2 data_source keys 'avg(count)' and 'max(count)', dataSourceKeys.forEach loop will collect individual arrays specific to the columnValues[indx] as below.\n columnValues[0] = ['userA', 'userB', 'userC']\n columnValues[1] = ['1','10','100']\n columnValues[2] = ['5', '50', '500']\n */\n for (let i = 1; i <= Math.ceil((fields.length - 1) / dataSourceKeys.length); i += 1) {\n columnValues[0].push(\n fields[i].splitby_value ? fields[i].splitby_value : fields[i].name\n );\n dataSourceKeys.forEach((dskey, dsIndx) => {\n const mul = (fields.length - 1) / dataSourceKeys.length; // This line does the index calculation\n columnValues[dsIndx + 1].push(columns[i + dsIndx * mul][idx]);\n });\n }\n splitDataSources[val].primary.data.columns = columnValues;\n } else if (nonDataSourceAggregations.length) {\n // There can be SPL where data_source field metainfo is not available and needs special handling\n // For eg :-\n // index=_internal | chart count by status\n // index = \"_internal\" | chart max(count) avg(count) by status\n // index = \"_internal\" | stats max(count) avg(count) by status\n const columnValues = [];\n fields.forEach((aggregationField, fieldIdx) => {\n if (fieldIdx > 0) {\n splitDataSources[val].primary.data.fields.push(aggregationField);\n columnValues.push([columns[fieldIdx][idx]]);\n }\n });\n splitDataSources[val].primary.data.columns = columnValues;\n }\n });\n } else {\n // split column wise\n const valueKeys = [];\n for (let i = 1; i < fields.length; i += 1) {\n valueKeys.push(fields[i].splitby_value ? fields[i].splitby_value : fields[i].name);\n }\n valueKeys.forEach(val => {\n splitDataSources[val] = cloneDeep(\n omit(dataSource, ['primary.data.fields', 'primary.data.columns'])\n );\n splitDataSources[val].primary.data.fields = [\n { name: otherSplitBy[0] },\n ...dataSourceKeys.map(k => ({\n name: k,\n })),\n ];\n splitDataSources[val].primary.data.columns = [[...columns[0]]];\n dataSourceKeys.forEach(dsKey => {\n fields.forEach((field, idx) => {\n if (\n field.data_source === dsKey &&\n (field.splitby_value === val || field.name === val)\n ) {\n splitDataSources[val].primary.data.columns.push([...columns[idx]]);\n }\n });\n });\n });\n }\n } else {\n errorCode = 'INVALID_SPLIT_BY_FIELD';\n }\n return { splitDataSources, errorCode };\n};\n\n/**\n * This method does datasplitting for 'stats' and generic cmds('makeresults','table' etc - categoried as 'unknown' splitMode).\n * The main difference is for 'stats' cmd possible splitBy fields have 'group_by_rank' in field meta info, whereas for 'unknown' cmd it can be any fieldnames\n */\nexport const dataSourcesSplitByModeStatsorUnknown = (\n dataSource: { [name: string]: DataSource },\n splitBy: string,\n splitMode?: DataSplitMode\n): DataSplitResult => {\n const fields = toFieldEntries(dataSource?.primary?.data?.fields);\n const columns = dataSource?.primary?.data?.columns;\n let splitDataSources = null;\n let splitByFields = [];\n let errorCode = null;\n if (fields.length > 0) {\n splitByFields =\n splitMode !== UNKNOWN\n ? extractSplitByFieldsForStats(fields)\n : extractSplitByFieldsForUnknown(fields);\n }\n const splitByIndex = fields.findIndex(field => field.name === splitBy);\n if (splitByFields && splitByFields.indexOf(splitBy) > -1) {\n const splitByColumn = dataSource?.primary?.data?.columns[splitByIndex];\n splitDataSources = {};\n splitByColumn.forEach((val, idx) => {\n if (!splitDataSources[val]) {\n splitDataSources[val] = [idx];\n } else {\n splitDataSources[val].push(idx);\n }\n });\n const cloneFields = cloneDeep(fields);\n cloneFields.splice(splitByIndex, 1);\n const valueKeys = Object.keys(splitDataSources);\n valueKeys.forEach(val => {\n const valIndices = cloneDeep(splitDataSources[val]);\n splitDataSources[val] = cloneDeep(\n omit(dataSource, ['primary.data.fields', 'primary.data.columns'])\n );\n splitDataSources[val].primary.data.fields = cloneFields;\n splitDataSources[val].primary.data.columns = [];\n columns.forEach((col, idx) => {\n if (idx !== splitByIndex) {\n const newCol = valIndices.map(valIdx => col[valIdx]);\n splitDataSources[val].primary.data.columns.push(newCol);\n }\n });\n });\n } else {\n errorCode = 'INVALID_SPLIT_BY_FIELD';\n }\n return { splitDataSources, errorCode };\n};\n\nexport const getTrellisDataSourcesBySplitMode = (\n splitMode: DataSplitMode,\n dataSources: { [name: string]: DataSource },\n trellisSplitBy: string\n): DataSplitResult => {\n let result: DataSplitResult = null;\n try {\n if (splitMode === TIMECHART) {\n result =\n trellisSplitBy === AGGREGATIONS\n ? dataSourcesSplitByAggregationsTimechartAndChart(dataSources)\n : dataSourcesSplitByModeTimechart(dataSources, trellisSplitBy);\n } else if (splitMode === STATS) {\n result =\n trellisSplitBy === AGGREGATIONS\n ? dataSourcesSplitByAggregationsStats(dataSources)\n : dataSourcesSplitByModeStatsorUnknown(dataSources, trellisSplitBy, STATS);\n } else if (splitMode === CHART) {\n result =\n trellisSplitBy === AGGREGATIONS\n ? dataSourcesSplitByAggregationsTimechartAndChart(dataSources)\n : dataSourcesSplitByModeChart(dataSources, trellisSplitBy);\n } else if (splitMode === UNKNOWN) {\n result =\n trellisSplitBy === AGGREGATIONS\n ? dataSourcesSplitByAggregationsUnknown(dataSources)\n : dataSourcesSplitByModeStatsorUnknown(dataSources, trellisSplitBy, UNKNOWN);\n }\n } catch (ex) {\n // eslint-disable-next-line no-console\n console.error('getTrellisDataSourcesBySplitMode ', ex);\n result = { splitDataSources: null, errorCode: 'UNKNOWN' };\n }\n return result;\n};\n\n/**\n * sets legendDisplay to off when a visualization is in trellis mode and not set by the user\n * @param {Boolean} isTrellisOn\n * @param {DashboardVizOpts} options\n * @param {DashboardVizOpts} defaultOptions\n * @returns { {'legendDisplay', 'off'} or {} }\n */\nexport const turnOffLegendDisplayWhenTrellisIsOn = (\n isTrellisOn: boolean,\n options: Record<string, any>\n): Record<string, string> => {\n if (isTrellisOn && !options.legendDisplay) {\n return {\n legendDisplay: 'off',\n };\n }\n return {};\n};\n\n/**\n * helper fn that calculates shared min and max from the split data in trellis mode\n * @param {splitData} SplitDataSource\n * @returns {Array<number>} [min, max]\n */\nconst calculateSharedMinMax = (splitData: SplitDataSource): Array<number> => {\n let max = -Infinity;\n let min = Infinity;\n\n Object.keys(splitData).forEach(splitByKey => {\n const datasources = splitData[splitByKey];\n Object.keys(datasources).forEach(datasourceName => {\n const dataColumns = datasources[datasourceName].data.columns;\n dataColumns.forEach(column => {\n column.forEach(point => {\n // Convert the string to a number. Non-numeric strings are converted to 'nan' and will be ignored.\n const pointNumber = Number(point);\n if (pointNumber > max) {\n max = pointNumber;\n }\n if (pointNumber < min) {\n min = pointNumber;\n }\n });\n });\n });\n });\n\n return [min, max];\n};\n\n/**\n * determines min and max to use in trellis mode\n * @param {splitData} SplitDataSource\n * @returns {Array<number | string>} [min, max]\n */\nexport const determineMinMax = (\n splitData: SplitDataSource,\n trellisSharedScale: boolean,\n yAxisMin: number | string,\n yAxisMax: number | string,\n stackMode?: string\n) => {\n if (!trellisSharedScale || stackMode === 'stacked100' || (yAxisMin !== 'auto' && yAxisMax !== 'auto'))\n return [yAxisMin, yAxisMax];\n\n const [sharedMin, sharedMax] = calculateSharedMinMax(splitData);\n\n const shouldUseSharedMax = sharedMax !== -Infinity && yAxisMax === 'auto';\n const shouldUseSharedMin = sharedMin !== Infinity && yAxisMin === 'auto';\n\n return [shouldUseSharedMin ? sharedMin : yAxisMin, shouldUseSharedMax ? sharedMax : yAxisMax];\n};\n", "\nimport * as defaultImport from \"@splunk/visualization-canvas\";\nexport * from \"@splunk/visualization-canvas\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import styled from 'styled-components';\n\nconst VizStyleWrapper = styled.div.attrs(({ dataTestKey }) => ({\n 'data-test': dataTestKey,\n 'data-testid': dataTestKey,\n}))`\n display: flex;\n justify-content: center;\n flex-direction: column;\n width: 100%;\n height: 100%;\n background-color: ${props => props.backgroundColor};\n`;\n\nVizStyleWrapper.displayName = 'VizStyleWrapper';\n\nexport default VizStyleWrapper;\n", "\nimport * as defaultImport from \"@splunk/react-icons/Triangle\";\nexport * from \"@splunk/react-icons/Triangle\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import { has, isArray, isUndefined } from 'lodash';\nimport React from 'react';\nimport styled from 'styled-components';\nimport variables from '@splunk/themes/variables';\nimport Triangle from '@splunk/react-icons/Triangle';\nimport {\n BottomLegendFactory,\n Legend,\n SideLegendFactory,\n LeftLegendFactory,\n TopLegendFactory,\n ScaleConfig,\n shortenNumber,\n SeriesConfig,\n EventAnnotation,\n EventAnnotationRendererProps,\n} from '@splunk/visualization-canvas';\nimport type { LegendTruncation } from '@splunk/visualization-canvas';\nimport type { JsonColumnData } from './interfaces/DataSource';\n\ninterface ChartOptions {\n [key: string]: any;\n}\n\nexport const DEFAULT_LINE_WIDTH = 2;\n/**\n * Get formatted annotations - highcharts expects annotations in a specific format\n * @method getAnnotations\n * @param {Object} options\n * @param {Array} options.annotationX\n * @param {Array} options.annotationColor\n * @param {Array} options.annotationLabel\n * @returns {Array}\n */\nexport const getAnnotations = ({ annotationX, annotationColor, annotationLabel }) =>\n annotationX && annotationX.length\n ? annotationX.map((timestamp, i) => ({\n color: annotationColor && annotationColor[i],\n label: annotationLabel && annotationLabel[i],\n time: timestamp,\n }))\n : [];\n\n/**\n * Get formatted annotations for canvas - viz-canvas timeseries expects annotations in a specific format\n * @method getAnnotationsForCanvas\n * @param {Object} options\n * @param {Array} options.annotationX\n * @param {Array} options.annotationColor\n * @param {Array} options.annotationLabel\n * @returns {Array}\n */\nexport const getAnnotationsForCanvas = ({\n annotationX,\n annotationColor,\n annotationLabel,\n}): EventAnnotation[] =>\n annotationX?.length\n ? annotationX.map((timestamp, i) => ({\n key: annotationLabel?.[i],\n time: timestamp,\n color: annotationColor?.[i],\n }))\n : [];\n\n/**\n * Styled Triangle component for event annotations with default severityColorNotice\n */\nconst StyledTriangle = styled(Triangle)<{ eventColor?: string }>`\n color: ${props => props.eventColor || variables.severityColorNotice(props)};\n`;\n\n/**\n * Custom event annotation renderer using Triangle icon from @splunk/react-icons\n * @method triangleEventAnnotationRenderer\n * @param {EventAnnotationRendererProps} props\n * @returns {ReactElement}\n */\nexport const triangleEventAnnotationRenderer: React.FC<EventAnnotationRendererProps> = ({\n event,\n dimensions,\n}) => {\n const eventWithColor = event as EventAnnotation & { color?: string };\n return React.createElement(StyledTriangle, {\n width: `${dimensions.width}px`,\n height: `${dimensions.height}px`,\n viewBox: '0 0 24 24',\n variant: 'filled',\n eventColor: eventWithColor.color,\n });\n};\n\n/**\n * Truncate the result set to given limit\n * @method truncateData\n * @param {Object} dataSet - dataSources.primary.data\n * @param {Number|String} truncationLimit - options['chart.resultTruncationLimit']\n * @returns {Object}\n */\nexport const truncateData = (dataSet, truncationLimit): Record<string, any[]> => {\n if (!dataSet) {\n return null;\n }\n\n const limit = parseInt(truncationLimit, 10);\n if (!limit || limit <= 0) {\n return dataSet;\n }\n\n const truncatedData: Record<string, Array<string[] | number[]>> = {\n ...dataSet,\n };\n truncatedData.columns = truncatedData.columns.map(columnData =>\n columnData && Array.isArray(columnData) ? columnData.slice(0, limit) : columnData\n );\n return truncatedData;\n};\n\n/**\n * Helper method to update the option values into the values that SC accepts\n * @method mapToValues\n * @param {Object} options\n * @returns {Object}\n */\nexport const mapToValues = (optionValuesSCMapping: Record<string, any>) => options => {\n const convertedOptions: Record<string, any> = { ...options };\n Object.keys(optionValuesSCMapping).forEach(key => {\n if (has(options, key)) {\n const updatedValue = optionValuesSCMapping[key][options[key]];\n if (!isUndefined(updatedValue)) {\n convertedOptions[key] = updatedValue;\n }\n }\n });\n return convertedOptions;\n};\n\ninterface y2AxisOptions extends ChartOptions {\n y2Fields?: string | string[];\n}\n\n/**\n * Helper method to process options related to y2Fields\n * @method convertY2AxisOptions\n * @param {Object} originalOptions\n * @returns {Object}\n */\nexport const convertY2AxisOptions = ({\n y2Fields,\n ...originalOptions\n}: y2AxisOptions): Record<string, any> => {\n const convertedOptions: Record<string, any> = {\n ...originalOptions,\n };\n if (y2Fields) {\n convertedOptions['axisY2.enabled'] = true;\n convertedOptions['axisY2.fields'] = isArray(y2Fields)\n ? y2Fields.filter(name => name).join(',')\n : y2Fields;\n }\n return convertedOptions;\n};\n\n/**\n * Helper method to format value for overlayFields\n * @method convertOverlayFields\n * @param {Object} originalOptions\n * @returns {Object}\n */\nexport const convertOverlayFields = (originalOptions: ChartOptions): ChartOptions => {\n const convertedOptions: ChartOptions = {\n ...originalOptions,\n };\n const { overlayFields } = originalOptions;\n if (overlayFields) {\n convertedOptions.overlayFields = Array.isArray(overlayFields)\n ? overlayFields\n .filter(field => field)\n .map(field => field.trim())\n .join(',')\n : overlayFields;\n }\n return convertedOptions;\n};\n\n/**\n * checks whether data is multi series data\n * @param {array} data array\n * @return {Boolean}\n */\nexport const isMultiSeriesData = (data: string[] | string[][]): boolean =>\n Array.isArray(data) && Array.isArray(data[0]);\n/**\n * checks whether data is multi series data and returns value as array\n * @param {array} data array\n * @param {*} value to return as array\n * @return {array}\n */\nexport const toArrayForSeries = (data, value): any[] => {\n if (isMultiSeriesData(data)) {\n return Array.isArray(value) ? value : [value];\n }\n return [value];\n};\ninterface ConstructFieldsAndColumnsParams {\n x: string[];\n y: string[] | string[][];\n xField: string;\n yFields: string | string[];\n y2?: string[] | string[][];\n y2Fields?: string | string[];\n}\nexport const constructFieldsAndColumns = ({\n x = [],\n y = [],\n xField,\n yFields,\n y2,\n y2Fields,\n}: ConstructFieldsAndColumnsParams): JsonColumnData => {\n const columns = [x.map(String), ...toArrayForSeries(y, y).map(series => series.map(String))];\n const yFieldsArray = toArrayForSeries(y, yFields);\n const fields = [{ name: xField }, ...yFieldsArray.map(field => ({ name: field }))];\n // splunk-charting requires y2 to be part of columns\n // when y & y2 options are configured with different (mutually exclusive) series\n // y2 columns need to be added to columns\n if (y2Fields) {\n const y2FieldsArray = toArrayForSeries(y2, y2Fields);\n const y2AsArray = toArrayForSeries(y2, y2).map(series => series?.map(String));\n y2FieldsArray.forEach((y2Field, index) => {\n if (yFieldsArray.indexOf(y2Field) === -1 && y2AsArray[index]) {\n fields.push({\n name: y2Field,\n });\n columns.push(y2AsArray[index]);\n }\n });\n }\n return {\n columns,\n fields,\n };\n};\n\nexport function constructAdditionalTooltipFieldsMap({ fields, columns, additionalTooltipFields }) {\n const map = {};\n\n additionalTooltipFields?.forEach(fieldName => {\n const index = fields.findIndex(f => f.name === fieldName);\n if (index !== -1) {\n map[fieldName] = columns[index];\n }\n });\n\n return map;\n}\n\n/**\n * Extracts additional tooltip values from columns and fields into an array of objects.\n * Each object in the array represents the values at a specific data point index.\n * This follows the same pattern used by Timeline visualization.\n *\n * @param columns - Array of column data\n * @param fields - Array of field definitions with name property\n * @param additionalTooltipFields - Array of field names to extract\n * @returns Array of objects, where each object maps field names to values at that index\n */\n// Type alias for a single tooltip field value record\ntype TooltipFieldRecord = Record<string, string | number | null>;\n\nexport function extractAdditionalTooltipValues(\n columns: (string | number | null)[][],\n fields: { name: string }[],\n additionalTooltipFields: string[]\n): TooltipFieldRecord[] {\n if (!additionalTooltipFields?.length || !columns?.length || !fields?.length) {\n return [];\n }\n\n // Create a mapping of field names to their column indices\n const fieldIndexMap = fields.reduce<Record<string, number>>((acc, field, index) => {\n acc[field.name] = index;\n return acc;\n }, {});\n\n const numRows = columns[0]?.length || 0;\n const additionalTooltipValuesArray: TooltipFieldRecord[] = [];\n\n for (let i = 0; i < numRows; i += 1) {\n const tooltipObject: TooltipFieldRecord = {};\n\n additionalTooltipFields.forEach(fieldName => {\n if (fieldName in fieldIndexMap) {\n const columnIndex = fieldIndexMap[fieldName];\n tooltipObject[fieldName] = columns[columnIndex]?.[i] ?? null;\n } else {\n tooltipObject[fieldName] = null;\n }\n });\n\n additionalTooltipValuesArray.push(tooltipObject);\n }\n\n return additionalTooltipValuesArray;\n}\n\n// Note: we are making the assumption that attaching a range.select listener means the user wants to enable search zoom\n// This is because we don't know if the time range tokens being updated by the drilldown is used by the current viz.\n// In the future we are considering using a shared context to pass this information from UDF to Viz.\ninterface OptionsProps {\n events?: string[];\n selectedItemId?: string;\n [key: string]: unknown;\n}\ninterface EventHandler {\n type: string;\n options: OptionsProps;\n}\n\nexport const shouldEnableSearchZoom = (eventHandlers: EventHandler[] = [], xField = '') => {\n const rangeSelectEventHandler = eventHandlers.find(eventHandler =>\n eventHandler.options.events?.includes('range.select')\n );\n // Check if xField is _time. This is how splunk-charting distinguishes a time chart from categorical.\n // Note: search zoom will be buggy if the x axis uses timestamp values but is not _time\n const xAxisIsTime = xField === '_time';\n\n return !!rangeSelectEventHandler && xAxisIsTime;\n};\n\nconst canvasSupportedTimeSeriesCharts = ['splunk.line'];\nexport const isTimeSeriesCanvasRenderSupported = (vizConfigKey: string): boolean => {\n return canvasSupportedTimeSeriesCharts.indexOf(vizConfigKey) > -1;\n};\n\ntype ChartData = {\n fields: (string | { name: string })[];\n columns: (string | number)[][];\n};\n\n// Filter all internal fields and columns except for _time fild\nexport const filterChartDataFromInternalFields = (chartData: ChartData): ChartData => {\n const { fields, columns } = chartData;\n\n // Determine the indexes to keep\n const keepIndexes = fields.reduce<number[]>((acc, field, index) => {\n const fieldName = typeof field === 'object' ? field?.name : field;\n if (!fieldName?.startsWith('_') || fieldName === '_time') {\n acc.push(index);\n }\n return acc;\n }, []);\n\n // Filter fields and columns\n const filteredFields = keepIndexes.map(index => fields[index]);\n const filteredColumns = keepIndexes.map(index => columns[index]);\n\n return { fields: filteredFields, columns: filteredColumns };\n};\n\nexport const isTimeField = (field): boolean => {\n return (\n (typeof field === 'object' && field?.name === '_time') ||\n (typeof field === 'string' && field === '_time')\n );\n};\n\nexport const convert2DArrayToNumbers = arr => {\n return arr.map(subArray => subArray.map(element => parseFloat(element)));\n};\n\nexport const convertTimeStringToUnix = arr => {\n return arr.map(timeStr => parseInt((new Date(timeStr).getTime() / 1000).toFixed(0), 10));\n};\n\n/**\n * Parses an axis value that may be 'auto', null, undefined, empty string, or a numeric value.\n * Returns undefined for non-numeric values, allowing the renderer to auto-calculate the range.\n * @param {any} val - The value to parse (string, number, null, undefined)\n * @returns {number | undefined} - Parsed number or undefined\n */\nexport const parseAxisValue = (val: any): number | undefined => {\n if (val === undefined || val === null || val === 'auto' || val === '') {\n return undefined;\n }\n const num = typeof val === 'number' ? val : Number.parseFloat(val);\n return Number.isNaN(num) ? undefined : num;\n};\n\n/**\n * Parses X-axis line visibility option from string to boolean or undefined.\n * @param {string | undefined} visibility - The visibility option ('hide', 'show', or other)\n * @returns {boolean | undefined} - false for 'hide', true for 'show', undefined otherwise\n */\nexport const parseXAxisLineVisibility = (visibility?: string): boolean | undefined => {\n if (visibility === 'hide') return false;\n if (visibility === 'show') return true;\n return undefined;\n};\n\n// Legend placement logic for canvas render, used in TimeseriesChartWrapper\nexport const getLegend = (props: {\n legendDisplay: string;\n isSeriesCompare: boolean;\n legendTruncation?: LegendTruncation;\n}): Legend | false => {\n const legendPlacement = props?.legendDisplay;\n const { isSeriesCompare, legendTruncation } = props;\n const commonLegendProps = {\n center: true,\n fontSize: 12,\n largerTiles: true,\n hideSeriesValue: !isSeriesCompare, // Show values if in seriesCompare mode\n legendTruncation,\n };\n\n // \"right\" | \"left\" | \"top\" | \"bottom\" | \"off\"\n switch (legendPlacement) {\n case 'off':\n return false;\n case 'left':\n return LeftLegendFactory({\n ...commonLegendProps,\n });\n case 'bottom':\n return BottomLegendFactory({\n wrap: true,\n ...commonLegendProps,\n });\n case 'top':\n return TopLegendFactory({\n wrap: true,\n ...commonLegendProps,\n });\n // Note: By default, use right legend\n default:\n return SideLegendFactory({\n ...commonLegendProps,\n });\n }\n};\n\nexport const getComputedAxisTitles = (\n inputAxisTitle: string,\n fields: string[],\n axisTitleVisibility: 'show' | 'collapsed'\n): string => {\n if (axisTitleVisibility === 'collapsed') {\n return '';\n }\n let fieldTitle = fields.length > 1 ? '' : fields[0]; // If more than one series (multi-series) default empty title\n if (!fieldTitle) {\n fieldTitle = '';\n }\n return inputAxisTitle?.length ? inputAxisTitle.trim() : fieldTitle;\n};\n\n/**\n * Truncates Y-axis title based on available container height and font metrics\n * @param axisTitle - The title text to potentially truncate\n * @param containerSpacing - Available height/ width in pixels depending on axis orientation\n * @param fontSize - Font size in pixels (default: 12)\n * @returns Truncated title with ellipsis if needed\n */\nexport const ellipsisAxisTitle = (axisTitle: string, containerSpacing: number, fontSize = 12): string => {\n if (!axisTitle) {\n return '';\n }\n if (Number.isNaN(containerSpacing) || containerSpacing <= 0) {\n return axisTitle;\n }\n // Calculate available height for text (leave 40% margin)\n const availableHeight = containerSpacing * 0.6;\n\n // Use a generic character width ratio that works across most fonts\n // 0.55 is a reasonable average for most fonts\n const avgCharWidth = fontSize * 0.55;\n\n // Calculate maximum characters that fit in available height\n const maxChars = Math.floor(availableHeight / avgCharWidth);\n\n // If title fits, return as-is\n if (axisTitle.length <= maxChars) {\n return axisTitle;\n }\n\n // Need to truncate - use middle ellipsis for better context\n if (maxChars <= 3) {\n return '...'; // Not enough space for meaningful text\n }\n\n // Reserve 3 characters for ellipsis\n const availableChars = maxChars - 3;\n const halfChars = Math.floor(availableChars / 2);\n\n // Create truncated title with middle ellipsis\n const start = axisTitle.slice(0, halfChars);\n const end = axisTitle.slice(-halfChars);\n\n return `${start}...${end}`;\n};\n\nexport type FieldObject = {\n name: string;\n};\n\nexport const getFieldName = (field: string | FieldObject): string => {\n const fieldName = typeof field === 'object' ? (field as unknown as FieldObject)?.name : field;\n return fieldName;\n};\n\nexport const getFieldNames = (fields: (string | FieldObject)[]): string[] => {\n return fields.map(field => getFieldName(field));\n};\n\n/**\n * Type alias for axis label visibility options\n */\nexport type AxisLabelVisibility = 'hide' | 'show' | 'auto';\n\n/**\n * Returns X scale config for viz-canvas charts\n * @param label\n * @param xAxisLabelVisibility\n * @returns\n */\nexport const getXScaleConfig = (\n label: string,\n xAxisLabelVisibility?: AxisLabelVisibility,\n xAxisLabelRotation?: -90 | -45 | 0 | 45 | 90\n): ScaleConfig => {\n const xConfig: ScaleConfig = { x: {} };\n xConfig.x.label = label;\n // Set hideLabels to true when xAxisLabelVisibility is \"hide\"\n if (xAxisLabelVisibility === 'hide') {\n xConfig.x.hideLabels = true;\n }\n // Set labelRotation if provided\n if (xAxisLabelRotation !== undefined) {\n xConfig.x.labelRotation = xAxisLabelRotation;\n }\n return xConfig;\n};\n\n/**\n * Returns Y scale config for viz-canvas charts\n * @param label\n * @param yAxisAbbreviation\n * @param yAxisScale\n * @param yAxisLabelVisibility\n * @param yAxisMin\n * @param yAxisMax\n * @returns\n */\nexport const getYScaleConfig = (\n label: string,\n yAxisAbbreviation: string,\n yAxisScale?: 'linear' | 'log',\n yAxisLabelVisibility?: AxisLabelVisibility,\n yAxisMin?: number,\n yAxisMax?: number\n): ScaleConfig => {\n const scaleType = yAxisScale ?? 'linear';\n const yConfig: ScaleConfig = { y: {} };\n yConfig.y.label = label;\n yConfig.y.type = scaleType;\n if (yAxisAbbreviation !== 'none') {\n yConfig.y.tickFmt = (v): string => shortenNumber(v, 1);\n }\n // Only set fixed width when abbreviation is ON\n // When abbreviation is OFF, width remains undefined to allow dynamic sizing in uplot-utils\n // based on actual data label lengths\n if (yAxisAbbreviation !== 'none') {\n yConfig.y.width = label && label.length > 0 ? 30 : 10;\n }\n if (yAxisLabelVisibility === 'hide') {\n yConfig.y.hideLabels = true;\n }\n if (yAxisMin !== undefined || yAxisMax !== undefined) {\n yConfig.y.range = (u, dataMin, dataMax) => {\n const min = yAxisMin ?? dataMin;\n const max = yAxisMax ?? dataMax;\n return [min, max];\n };\n }\n return yConfig;\n};\n/**\n * Returns Y2 scale config for viz-canvas charts\n * @param label\n * @param axisAbbreviation\n * @param axisScale\n * @param roundAxisLabelsToInteger\n * @param y2AxisLabelVisibility\n * @param y2AxisMin\n * @param y2AxisMax\n * @returns\n */\nexport const getY2ScaleConfig = (\n label: string,\n axisAbbreviation: string,\n axisScale?: 'linear' | 'log',\n roundAxisLabelsToInteger?: boolean,\n y2AxisLabelVisibility?: AxisLabelVisibility,\n y2AxisMin?: number,\n y2AxisMax?: number\n): ScaleConfig => {\n const y2Config: ScaleConfig = { y2: {} };\n const scaleType = axisScale ?? 'linear';\n y2Config.y2.label = label;\n y2Config.y2.side = 'right';\n // Note: showGrid is intentionally not set here so that the top-level\n // showY2MajorGridLines prop can control it (defaults to false)\n y2Config.y2.type = scaleType;\n if (axisAbbreviation !== 'none') {\n y2Config.y2.tickFmt = (v): string => shortenNumber(v, 1, roundAxisLabelsToInteger);\n // Set width for abbreviated Y2 axis\n // Y2 needs more width (50px) than Y-axis (30px) because of rotated title positioning\n // Width will be used to detect abbreviation setting in padding calculations\n y2Config.y2.width = label && label.length > 0 ? 50 : 10;\n } else if (roundAxisLabelsToInteger) {\n y2Config.y2.tickFmt = (v): string =>\n roundAxisLabelsToInteger ? Math.round(v).toString() : v.toString();\n }\n if (y2AxisLabelVisibility === 'hide') {\n y2Config.y2.hideLabels = true;\n }\n if (y2AxisMin !== undefined || y2AxisMax !== undefined) {\n y2Config.y2.range = (u, dataMin, dataMax) => {\n const min = y2AxisMin ?? dataMin;\n const max = y2AxisMax ?? dataMax;\n return [min, max];\n };\n }\n return y2Config;\n};\n\n/**\n * Add series overrides for viz-canvas charts (for eg:- line width)\n */\nexport const getSeriesOverrides = (\n yfields: string[],\n y2fields?: string[],\n lineWidth?: number,\n overlayFields?: string[],\n y2Enabled?: boolean,\n nullValueMode?: 'gaps' | 'connect' | 'zero',\n markerDisplay?: 'off' | 'filled' | 'outlined',\n lineDashStyle?: string,\n lineDashStylesByField?: Record<string, string>,\n stepPosition?: 'off' | 'before' | 'after',\n stepPositionsByField?: Record<string, 'off' | 'before' | 'after'>\n): SeriesConfig => {\n const seriesConfig: SeriesConfig = {};\n\n // Determine spanGaps based on nullValueMode\n let spanGaps: boolean | undefined;\n let replaceNullsWithZero: boolean | undefined;\n if (nullValueMode === 'gaps') {\n spanGaps = false;\n } else if (nullValueMode === 'connect' || nullValueMode === 'zero') {\n spanGaps = true;\n if (nullValueMode === 'zero') {\n replaceNullsWithZero = true;\n }\n }\n\n yfields.forEach(field => {\n seriesConfig[field] = {\n overrides: { width: lineWidth ?? DEFAULT_LINE_WIDTH },\n };\n\n // Add spanGaps if nullValueMode is provided\n if (spanGaps !== undefined) {\n seriesConfig[field].overrides.spanGaps = spanGaps;\n }\n\n // If y2Enabled is true, determine which fields go to y2 scale\n if (y2Enabled) {\n const shouldAssignToY2 =\n // If y2Fields are present, assign all y2Fields to y2 scale\n (y2fields?.length > 0 && y2fields.includes(field)) ||\n // Else, assign all overlayFields to y2 scale\n ((!y2fields || y2fields.length === 0) && overlayFields?.includes(field));\n\n if (shouldAssignToY2) {\n seriesConfig[field].overrides.scale = 'y2';\n } else {\n // Explicitly set scale to 'y' for fields not assigned to y2\n seriesConfig[field].overrides.scale = 'y';\n }\n }\n\n // If field is in overlayFields, set type to 'line'\n if (overlayFields?.includes(field)) {\n seriesConfig[field].type = 'line';\n }\n\n // Add markerDisplay if provided\n if (markerDisplay !== undefined) {\n seriesConfig[field].markerDisplay = markerDisplay;\n }\n\n // Add lineDashStyle - check per-field first, then fall back to global\n const fieldDashStyle = lineDashStylesByField?.[field] || lineDashStyle;\n if (fieldDashStyle) {\n seriesConfig[field].lineDashStyle = fieldDashStyle as any;\n }\n\n // Add stepPosition - check per-field first, then fall back to global.\n // Explicit \"off\" disables stepping for the field.\n const hasFieldStepPosition = Object.hasOwn(stepPositionsByField || {}, field);\n const fieldStepPosition = hasFieldStepPosition ? stepPositionsByField?.[field] : stepPosition;\n if (fieldStepPosition && fieldStepPosition !== 'off') {\n (seriesConfig[field] as SeriesConfig[string] & { stepPosition?: string }).stepPosition =\n fieldStepPosition;\n }\n\n // Add replaceNullsWithZero if nullValueMode is 'zero'\n if (replaceNullsWithZero !== undefined) {\n (\n seriesConfig[field] as SeriesConfig[string] & { replaceNullsWithZero?: boolean }\n ).replaceNullsWithZero = replaceNullsWithZero;\n }\n });\n\n return seriesConfig;\n};\n\n/**\n * Finds the start and end indices in time series data for a given range.\n * @param xData - Array of time values (can be ISO strings or epoch timestamps)\n * @param startValue - Start value of the range (epoch timestamp)\n * @param endValue - End value of the range (epoch timestamp)\n * @returns Object with startXIndex (first index where time >= startValue) and endXIndex (last index where time <= endValue)\n */\nexport const findRangeIndices = (\n xData: (string | number)[],\n startValue: number,\n endValue: number\n): { startXIndex: number; endXIndex: number } => {\n let startXIndex = -1;\n let endXIndex = -1;\n\n // Convert xData to epoch timestamps if they are ISO strings\n const xDataEpoch = xData.map(val => {\n if (typeof val === 'string') {\n return new Date(val).getTime() / 1000; // Convert to epoch seconds\n }\n return val;\n });\n\n // Find the closest time value >= startValue\n for (let i = 0; i < xDataEpoch.length; i += 1) {\n if (xDataEpoch[i] >= startValue) {\n startXIndex = i;\n break;\n }\n }\n\n // If no value >= startValue found, use the last index (all values are less)\n if (startXIndex === -1 && xDataEpoch.length > 0) {\n startXIndex = xDataEpoch.length - 1;\n }\n\n // Find the closest time value <= endValue\n for (let i = xDataEpoch.length - 1; i >= 0; i -= 1) {\n if (xDataEpoch[i] <= endValue) {\n endXIndex = i;\n break;\n }\n }\n\n // If no value <= endValue found, use the first index (all values are greater)\n if (endXIndex === -1 && xDataEpoch.length > 0) {\n endXIndex = 0;\n }\n\n return { startXIndex, endXIndex };\n};\n", "import { useContext } from 'react';\nimport FeatureFlagContext from '@splunk/visualization-context/FeatureFlagContext';\nimport { LAYOUT_TYPE } from '@splunk/visualization-schemas';\n\nexport const useTrellisFeatureFlagOn = (): boolean => {\n const context = useContext(FeatureFlagContext) as Record<string, unknown>;\n return Boolean(context?.visualizations_enableTrellis);\n};\n\nexport const useTrellisEnabled = (layoutType = LAYOUT_TYPE.Off): boolean => {\n const trellisFeatureEnabled = useTrellisFeatureFlagOn();\n return trellisFeatureEnabled && layoutType === LAYOUT_TYPE.Trellis;\n};\n", "import * as React from 'react';\nimport styled from 'styled-components';\n\nexport const TRELLIS_TITLE_HEIGHT = 28;\n\nconst TrellisTitleText = styled.div`\n margin-left: 10px;\n margin-right: 10px;\n padding-top: 8px;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n`;\n\nconst TrellisTitleDiv = styled.div<{\n fontColor: string;\n backgroundColor: string;\n}>`\n height: ${TRELLIS_TITLE_HEIGHT}px;\n font-size: 14px;\n font-weight: 700;\n color: ${props => props.fontColor};\n background-color: ${props => props.backgroundColor};\n box-shadow: 0 1px ${props => props.backgroundColor}; // this is added to avoid a 1px gap between title and viz divs that showed up intermittently because of pixel rounding error in chrome.\n`;\n\ninterface TrellisTitleProps {\n fontColor: string;\n backgroundColor: string;\n trellisKey: unknown;\n}\n\nexport const TrellisTitle = (props: TrellisTitleProps) => {\n const titleText = String(props.trellisKey).toString();\n return (\n <TrellisTitleDiv\n fontColor={props.fontColor}\n backgroundColor={props.backgroundColor}\n data-test=\"trellis-title\"\n title={titleText}\n >\n <TrellisTitleText>{titleText}</TrellisTitleText>\n </TrellisTitleDiv>\n );\n};\n", "import * as React from 'react';\nimport { useMemo, useRef } from 'react';\nimport { pick } from 'lodash';\nimport styled from 'styled-components';\nimport SizeAwareWrapper from '@splunk/visualizations-shared/SizeAwareWrapper';\nimport { TimeSeriesChart, RangeSelectionProvider } from '@splunk/visualization-canvas';\nimport { toDimension } from '@splunk/visualizations-shared/style';\nimport type { GenericDataSet } from '@splunk/visualization-canvas/types/types';\nimport VizStyleWrapper from './components/VizStyleWrapper';\nimport { ChartingProps } from './Charting';\nimport {\n convert2DArrayToNumbers,\n filterChartDataFromInternalFields,\n getComputedAxisTitles,\n getFieldName,\n getFieldNames,\n getLegend,\n getSeriesOverrides,\n getXScaleConfig,\n getYScaleConfig,\n getY2ScaleConfig,\n ellipsisAxisTitle,\n getAnnotationsForCanvas,\n triangleEventAnnotationRenderer,\n parseAxisValue,\n parseXAxisLineVisibility,\n findRangeIndices,\n shouldEnableSearchZoom,\n} from './chartingUtils';\nimport { useTrellisEnabled } from './hooks/useTrellisEnabled';\nimport { TrellisTitle, TRELLIS_TITLE_HEIGHT } from './components/TrellisTitle';\n\nconst TimeSeriesChartContainer = styled.div<{\n width: number | string;\n height: number | string;\n}>`\n overflow: hidden;\n ${props => toDimension(pick(props, ['width', 'height']))};\n\n canvas {\n position: absolute !important; // This is needed for canvas element export pdf/png to work correctly\n }\n`;\n\n/**\n * Adds trellis information to event payload\n * @param payload - The event payload object to modify\n * @param trellisKey - The current trellis key value (e.g., \"200\", \"404\")\n * @param trellisSplitBy - The field name being split by (e.g., \"status\")\n */\nexport const appendTrellisToPayload = (\n payload: Record<string, unknown>,\n trellisKey?: string,\n trellisSplitBy?: string\n): Record<string, unknown> => {\n const result = { ...payload };\n if (trellisSplitBy) {\n result['trellis.name'] = trellisSplitBy;\n }\n if (trellisKey) {\n result['trellis.value'] = trellisKey;\n }\n return result;\n};\n\n/**\n * Checks if the mouseover payload has changed compared to the previous payload\n * @param currentPayload - The current event payload\n * @param previousPayload - The previous event payload\n * @returns true if the payload has changed, false otherwise\n */\nexport const hasMouseoverPayloadChanged = (\n currentPayload: Record<string, unknown>,\n previousPayload: Record<string, unknown> | null\n): boolean => {\n if (!previousPayload) {\n return true;\n }\n\n // Check if data point index changed - this is the primary indicator of hovering a different point\n if (currentPayload.index !== previousPayload.index) {\n return true;\n }\n\n // Check if seriesIndex changed\n if (currentPayload.seriesIndex !== previousPayload.seriesIndex) {\n return true;\n }\n\n // Check if trellis fields changed (for trellis mode)\n if (currentPayload['trellis.name'] !== previousPayload['trellis.name']) {\n return true;\n }\n if (currentPayload['trellis.value'] !== previousPayload['trellis.value']) {\n return true;\n }\n\n return false;\n};\n\nexport const handleClick = (chartEvent, onClick, trellisKey?: string, trellisSplitBy?: string) => {\n const payload = {\n ...pick(chartEvent, 'value', 'seriesKey'),\n name: chartEvent.seriesKey,\n };\n delete payload.seriesKey;\n\n // Add row context fields in the format: row.${fieldName}.value\n if (chartEvent.rowContext) {\n Object.assign(\n payload,\n Object.keys(chartEvent.rowContext).reduce((acc, fieldName) => {\n acc[`row.${fieldName}.value`] = chartEvent.rowContext[fieldName];\n return acc;\n }, {})\n );\n }\n\n const updatedPayload = appendTrellisToPayload(payload, trellisKey, trellisSplitBy);\n\n if (onClick) {\n onClick({\n type: 'point.click',\n originalEvent: chartEvent,\n payload: updatedPayload,\n });\n }\n};\n\nexport const handleLegendClick = (chartEvent, onClick, trellisKey?: string, trellisSplitBy?: string) => {\n const payload = {\n name: chartEvent,\n };\n\n const updatedPayload = appendTrellisToPayload(payload, trellisKey, trellisSplitBy);\n\n if (onClick) {\n onClick({\n type: 'legend.click',\n originalEvent: chartEvent,\n payload: updatedPayload,\n });\n }\n};\n\nexport const handleRangeSelection = (\n rangeEvent,\n onSelect,\n chartData,\n trellisKey?: string,\n trellisSplitBy?: string\n) => {\n // Handle undefined range (clearing selection)\n if (!rangeEvent) {\n return;\n }\n\n // Find the indices in the data array that correspond to the start and end timestamps\n const xData = chartData?.columns?.[0] || [];\n const { startXIndex, endXIndex } = findRangeIndices(xData, rangeEvent.start, rangeEvent.end);\n\n const payload = {\n startXIndex,\n startXValue: rangeEvent.start,\n endXIndex,\n endXValue: rangeEvent.end,\n };\n\n const updatedPayload = appendTrellisToPayload(payload, trellisKey, trellisSplitBy);\n\n if (onSelect) {\n onSelect({\n type: 'range.selectBeforeZoom',\n originalEvent: rangeEvent,\n payload: updatedPayload,\n });\n }\n};\n\nexport const handleRangeZoom = (\n rangeEvent,\n onSelect,\n chartData,\n trellisKey?: string,\n trellisSplitBy?: string\n) => {\n // Find the indices in the data array that correspond to the start and end timestamps\n const xData = chartData?.columns?.[0] || [];\n const { startXIndex, endXIndex } = findRangeIndices(xData, rangeEvent.start, rangeEvent.end);\n\n const payload = {\n startXIndex,\n startXValue: rangeEvent.start,\n endXIndex,\n endXValue: rangeEvent.end,\n };\n\n const updatedPayload = appendTrellisToPayload(payload, trellisKey, trellisSplitBy);\n\n if (onSelect) {\n onSelect({\n type: 'range.select',\n originalEvent: rangeEvent,\n payload: updatedPayload,\n });\n }\n};\n\nexport const handleCrosshairChange = (\n chartEvent,\n onPointMouseOver,\n onPointMouseOut,\n trellisKey?: string,\n trellisSplitBy?: string,\n lastPayload = null,\n lastOriginalEvent = null\n) => {\n // Handle mouseout when chartEvent is undefined\n if (!chartEvent) {\n if (onPointMouseOut && lastPayload) {\n onPointMouseOut({\n type: 'point.mouseout',\n originalEvent: lastOriginalEvent,\n payload: lastPayload,\n });\n }\n return { payload: null, originalEvent: null };\n }\n\n // Handle mouseover\n const payload = {\n ...pick(chartEvent, 'value', 'seriesKey', 'time', 'index', 'seriesIndex'),\n name: chartEvent.seriesKey,\n };\n delete payload.seriesKey;\n\n // Add row context fields in the format: row.${fieldName}.value\n if (chartEvent.rowContext) {\n Object.assign(\n payload,\n Object.keys(chartEvent.rowContext).reduce((acc, fieldName) => {\n acc[`row.${fieldName}.value`] = chartEvent.rowContext[fieldName];\n return acc;\n }, {})\n );\n }\n\n const updatedPayload = appendTrellisToPayload(payload, trellisKey, trellisSplitBy);\n\n if (onPointMouseOver) {\n onPointMouseOver({\n type: 'point.mouseover',\n originalEvent: chartEvent,\n payload: updatedPayload,\n });\n }\n\n // Return payload and originalEvent for caller to store\n return { payload: updatedPayload, originalEvent: chartEvent };\n};\n\n/**\n * Helper function to parse array options that may be stringified JSON or already arrays\n */\nexport const parseArrayOption = (\n value: string[] | string | undefined | null\n): string[] | undefined | null => {\n if (Array.isArray(value)) {\n return value;\n }\n if (value) {\n return JSON.parse(value);\n }\n return undefined;\n};\n\nconst TimeSeriesChartWrapper = (props: ChartingProps) => {\n const {\n width,\n height,\n chartData,\n options,\n userLocale,\n annotationX,\n annotationLabel,\n annotationColor,\n legendDisplay,\n markerDisplay,\n onClick,\n onPointMouseOver,\n onPointMouseOut,\n onSelect,\n splitByLayout,\n trellisKey,\n trellisSplitBy,\n backgroundColor,\n defaultFontColor,\n additionalTooltipValues,\n // Extract axis line visibility options from props\n xAxisLineVisibility,\n yAxisLineVisibility,\n y2AxisLineVisibility,\n // Extract showYAxisWithZero directly from props for accelerated render mode\n showYAxisWithZero: showYAxisWithZeroFromProps,\n showY2AxisWithZero: showY2AxisWithZeroFromProps,\n ...otherOptions\n } = props as ChartingProps & {\n showYAxisWithZero?: boolean;\n showY2AxisWithZero?: boolean;\n xAxisLineVisibility?: string;\n yAxisLineVisibility?: string;\n y2AxisLineVisibility?: string;\n };\n const { eventHandlers, xField: xFieldFromProps } = otherOptions;\n const trellisEnabled = useTrellisEnabled(splitByLayout);\n const {\n backgroundColor: bgColorFromOptions,\n seriesColors: seriesColorsStr,\n fieldColors,\n legendLabels: legendLabelsStr,\n legendMode,\n legendTruncation,\n 'axisTitleX.text': xAxisTitleText,\n 'axisTitleY.text': yAxisTitleText,\n 'axisTitleY2.text': y2AxisTitleText,\n 'axisTitleX.visibility': xAxisTitleVisibility,\n 'axisTitleY.visibility': yAxisTitleVisibility,\n 'axisTitleY2.visibility': y2AxisTitleVisibility,\n 'axisLabelsX.majorLabelVisibility': xAxisLabelVisibility,\n 'axisLabelsX.majorLabelStyle.rotation': xAxisLabelRotation,\n 'axisLabelsX.maxLabelParts': xAxisMaxLabelParts,\n 'axisLabelsY.majorLabelVisibility': yAxisLabelVisibility,\n 'axisLabelsY.majorUnit': yAxisMajorUnitFromSimpleXML,\n 'axisLabelsY2.majorLabelVisibility': y2AxisLabelVisibility,\n 'axisLabelsY2.majorUnit': y2AxisMajorUnitFromSimpleXML,\n 'axisY.abbreviation': yAxisAbbreviation,\n 'axisY.scale': yAxisScale,\n 'axisY2.abbreviation': y2AxisAbbreviation,\n 'axisY2.fields': y2FieldsStr,\n 'axisY2.scale': y2AxisScale,\n 'axisY2.enabled': y2Enabled,\n 'axisLabelsY2.integerUnits': y2IntegerUnits,\n 'chart.overlayFields': overlayFieldsStr,\n 'chart.nullValueMode': nullValueMode,\n 'chart.showDataLabels': showDataLabels,\n lineWidth,\n lineDashStyle,\n fieldDashStyles: lineDashStylesByFieldStr,\n stepPosition,\n fieldStepPositions: stepPositionsByFieldStr,\n yAxisMin: yAxisMinRaw,\n yAxisMax: yAxisMaxRaw,\n y2AxisMin: y2AxisMinRaw,\n y2AxisMax: y2AxisMaxRaw,\n showXMajorGridLines,\n showYMajorGridLines,\n showY2MajorGridLines,\n showYMinorGridLines,\n showY2MinorGridLines,\n showLineSmoothing,\n xAxisMajorTickVisibility,\n xAxisMajorTickSize,\n yAxisMajorTickVisibility,\n y2AxisMajorTickVisibility,\n yAxisMajorTickSize,\n y2AxisMajorTickSize,\n yAxisMajorTickInterval,\n y2AxisMajorTickInterval,\n yAxisMinorTickVisibility,\n y2AxisMinorTickVisibility,\n yAxisMinorTickSize,\n y2AxisMinorTickSize,\n showYAxisWithZero: showYAxisWithZeroFromOptions,\n showY2AxisWithZero: showY2AxisWithZeroFromOptions,\n } = options;\n\n // Map showDataLabels back to dataValuesDisplay format for canvas mode\n const dataValuesDisplay = showDataLabels === 'none' ? 'off' : showDataLabels;\n\n // Get showYAxisWithZero from top-level props first (accelerated render mode),\n // then fall back to options object (non-accelerated render mode)\n const showYAxisWithZero = showYAxisWithZeroFromProps ?? showYAxisWithZeroFromOptions;\n const showY2AxisWithZero = showY2AxisWithZeroFromProps ?? showY2AxisWithZeroFromOptions;\n\n // Convert visibility to boolean for canvas renderer\n // X-axis ticks default to true (shown) when 'auto' or 'show', false when 'hide'\n const showXMajorTicks = xAxisMajorTickVisibility !== 'hide';\n const showYMajorTicks = yAxisMajorTickVisibility === 'show';\n const showY2MajorTicks = y2AxisMajorTickVisibility === 'show';\n const showYMinorTicks = yAxisMinorTickVisibility === 'show';\n const showY2MinorTicks = y2AxisMinorTickVisibility === 'show';\n // X-axis line defaults to true (shown) for backwards compatibility\n const showXAxisLine = parseXAxisLineVisibility(xAxisLineVisibility);\n const showYAxisLine = yAxisLineVisibility === 'show';\n const showY2AxisLine = y2AxisLineVisibility === 'show';\n\n // Parse axis values - convert strings to numbers\n const yAxisMin = parseAxisValue(yAxisMinRaw);\n const yAxisMax = parseAxisValue(yAxisMaxRaw);\n const y2AxisMin = parseAxisValue(y2AxisMinRaw);\n const y2AxisMax = parseAxisValue(y2AxisMaxRaw);\n\n // Parse tick interval and size values - convert strings to numbers\n // Priority: SimpleXML props (from transformed options) > canvas-specific props\n const parseTickInterval = (simpleXMLValue?: string | number, canvasValue?: number) => {\n if (simpleXMLValue) return Number(simpleXMLValue);\n if (canvasValue) return Number(canvasValue);\n return undefined;\n };\n const yAxisMajorTickIntervalNum = parseTickInterval(yAxisMajorUnitFromSimpleXML, yAxisMajorTickInterval);\n const y2AxisMajorTickIntervalNum = parseTickInterval(\n y2AxisMajorUnitFromSimpleXML,\n y2AxisMajorTickInterval\n );\n const xAxisMajorTickSizeNum = xAxisMajorTickSize != null ? Number(xAxisMajorTickSize) : undefined;\n const yAxisMajorTickSizeNum = yAxisMajorTickSize != null ? Number(yAxisMajorTickSize) : undefined;\n const y2AxisMajorTickSizeNum = y2AxisMajorTickSize != null ? Number(y2AxisMajorTickSize) : undefined;\n const yAxisMinorTickSizeNum = yAxisMinorTickSize != null ? Number(yAxisMinorTickSize) : undefined;\n const y2AxisMinorTickSizeNum = y2AxisMinorTickSize != null ? Number(y2AxisMinorTickSize) : undefined;\n const seriesColors = seriesColorsStr ? JSON.parse(seriesColorsStr) : undefined;\n const seriesColorsByField = fieldColors ? JSON.parse(fieldColors) : undefined;\n const lineDashStylesByField = lineDashStylesByFieldStr ? JSON.parse(lineDashStylesByFieldStr) : undefined;\n const stepPositionsByField = stepPositionsByFieldStr ? JSON.parse(stepPositionsByFieldStr) : undefined;\n const legendLabels = parseArrayOption(legendLabelsStr);\n const bgColor = backgroundColor || bgColorFromOptions;\n const [containerWidth, setContainerWidth] = React.useState(Number(props.width));\n const [containerHeight, setContainerHeight] = React.useState(Number(props.height));\n const cachedHandleResize = React.useCallback((w, h) => {\n setContainerWidth(w);\n setContainerHeight(h);\n }, []);\n const filteredChartData = filterChartDataFromInternalFields({\n fields: chartData.fields,\n columns: chartData.seriesList,\n });\n\n const xField = getFieldName(filteredChartData.fields[0]);\n const yFields = getFieldNames(\n filteredChartData.fields.length > 1 ? filteredChartData.fields.slice(1) : []\n );\n const y2Fields = useMemo(\n () => (y2FieldsStr ? y2FieldsStr.split(',').map(f => f.trim()) : []),\n [y2FieldsStr]\n );\n const overlayFields = useMemo(\n () => (overlayFieldsStr ? overlayFieldsStr.split(',').map(f => f.trim()) : []),\n [overlayFieldsStr]\n );\n\n let xAxisTitle = getComputedAxisTitles(xAxisTitleText, [xField], xAxisTitleVisibility);\n xAxisTitle = ellipsisAxisTitle(xAxisTitle, containerWidth);\n // Filter out y2 fields from yFields when computing y-axis title\n const yFieldsForTitle = y2Enabled ? yFields.filter(field => !y2Fields.includes(field)) : yFields;\n let yAxisTitle = getComputedAxisTitles(yAxisTitleText, yFieldsForTitle, yAxisTitleVisibility);\n yAxisTitle = ellipsisAxisTitle(yAxisTitle, containerHeight);\n const fieldsForY2Axis = y2Fields.length > 0 ? y2Fields : overlayFields;\n let y2AxisTitle = getComputedAxisTitles(y2AxisTitleText, fieldsForY2Axis, y2AxisTitleVisibility);\n y2AxisTitle = ellipsisAxisTitle(y2AxisTitle, containerHeight);\n\n const xScaleConfig = useMemo(\n () => getXScaleConfig(xAxisTitle, xAxisLabelVisibility, xAxisLabelRotation),\n [xAxisTitle, xAxisLabelVisibility, xAxisLabelRotation]\n );\n const yScaleConfig = useMemo(\n () =>\n getYScaleConfig(\n yAxisTitle,\n yAxisAbbreviation,\n yAxisScale,\n yAxisLabelVisibility,\n yAxisMin,\n yAxisMax\n ),\n [yAxisTitle, yAxisAbbreviation, yAxisScale, yAxisLabelVisibility, yAxisMin, yAxisMax]\n );\n const y2ScaleConfig = useMemo(() => {\n if (y2Enabled) {\n return getY2ScaleConfig(\n y2AxisTitle,\n y2AxisAbbreviation,\n y2AxisScale,\n y2IntegerUnits,\n y2AxisLabelVisibility,\n y2AxisMin,\n y2AxisMax\n );\n }\n return {};\n }, [\n y2Enabled,\n y2AxisTitle,\n y2AxisAbbreviation,\n y2AxisScale,\n y2IntegerUnits,\n y2AxisLabelVisibility,\n y2AxisMin,\n y2AxisMax,\n ]);\n const uplotContainerElement = useRef(null);\n\n const seriesDataFormatted = [\n filteredChartData.columns[0],\n ...convert2DArrayToNumbers(filteredChartData.columns.slice(1)),\n ];\n chartData.fields = filteredChartData.fields;\n chartData.columns = seriesDataFormatted;\n\n // Memoize seriesOverrides to prevent unnecessary recreations\n const seriesOverrides = useMemo(\n () =>\n getSeriesOverrides(\n yFields,\n y2Fields,\n lineWidth,\n overlayFields,\n y2Enabled,\n nullValueMode,\n markerDisplay,\n lineDashStyle,\n lineDashStylesByField,\n stepPosition,\n stepPositionsByField\n ),\n [\n yFields,\n y2Fields,\n lineWidth,\n overlayFields,\n y2Enabled,\n nullValueMode,\n markerDisplay,\n lineDashStyle,\n lineDashStylesByField,\n stepPosition,\n stepPositionsByField,\n ]\n );\n\n // Memoize annotations to prevent unnecessary recreations\n const chartingEventAnnotations = useMemo(\n () =>\n getAnnotationsForCanvas({\n annotationX,\n annotationColor,\n annotationLabel,\n }),\n [annotationX, annotationColor, annotationLabel]\n );\n\n // Memoize scaleConfig to prevent unnecessary recreations\n const scaleConfig = useMemo(\n () => ({ ...xScaleConfig, ...yScaleConfig, ...y2ScaleConfig }),\n [xScaleConfig, yScaleConfig, y2ScaleConfig]\n );\n\n // Memoize legend configuration\n // In seriesCompare mode, force the legend to the right side so that the legend's\n // fixed width (needed to prevent jitter when hover values appear/disappear) doesn't\n // affect layouts that would otherwise place it on the left.\n const isSeriesCompare = legendMode === 'seriesCompare';\n const legend = useMemo(\n () =>\n getLegend({\n legendDisplay: isSeriesCompare && legendDisplay !== 'off' ? 'right' : legendDisplay,\n isSeriesCompare,\n legendTruncation,\n }),\n [legendDisplay, isSeriesCompare, legendTruncation]\n );\n\n // Memoize click handlers to avoid recreating them on every render\n const handleChartClick = React.useCallback(\n event => {\n // Only invoke if onClick is defined to avoid unnecessary work\n if (onClick) {\n handleClick(event, onClick, trellisKey, trellisSplitBy);\n }\n },\n [onClick, trellisKey, trellisSplitBy]\n );\n\n const handleChartLegendClick = React.useCallback(\n event => {\n // Only invoke if onClick is defined to avoid unnecessary work\n if (onClick) {\n handleLegendClick(event, onClick, trellisKey, trellisSplitBy);\n }\n },\n [onClick, trellisKey, trellisSplitBy]\n );\n\n const handleChartRangeSelection = React.useCallback(\n range => {\n // Only invoke if onSelect is defined to avoid unnecessary work\n if (onSelect) {\n handleRangeSelection(range, onSelect, chartData, trellisKey, trellisSplitBy);\n }\n // Always allow range selection UI to appear, even if onSelect is undefined\n },\n [onSelect, chartData, trellisKey, trellisSplitBy]\n );\n\n const handleChartRangeZoom = React.useCallback(\n range => {\n // Only invoke if onSelect is defined to avoid unnecessary work\n if (onSelect) {\n handleRangeZoom(range, onSelect, chartData, trellisKey, trellisSplitBy);\n }\n },\n [onSelect, chartData, trellisKey, trellisSplitBy]\n );\n\n // Determine if search zoom should be enabled based on eventHandlers and xField\n // Use xFieldFromProps if available, otherwise fall back to computed xField from chartData\n const xFieldToUse = xFieldFromProps || xField;\n const enableSearchZoom = React.useMemo(\n () => shouldEnableSearchZoom(eventHandlers, xFieldToUse),\n [eventHandlers, xFieldToUse]\n );\n\n // Store the last payload and originalEvent to return on mouseout\n const lastPayloadRef = React.useRef<Record<string, any> | null>(null);\n const lastOriginalEventRef = React.useRef<any>(null);\n // Store the previous mouseover payload to check for changes\n const previousMouseoverPayloadRef = React.useRef<Record<string, unknown> | null>(null);\n // Store additionalTooltipValues in a ref to avoid chart remounts when it changes\n // The chart reads from this ref, so changes update the tooltip without remounting\n const additionalTooltipValuesRef = React.useRef(additionalTooltipValues);\n React.useEffect(() => {\n additionalTooltipValuesRef.current = additionalTooltipValues;\n }, [additionalTooltipValues]);\n\n const handleChartCrosshairChange = React.useCallback(\n event => {\n // Only invoke if onPointMouseOver or onPointMouseOut is defined to avoid unnecessary work\n if (onPointMouseOver || onPointMouseOut) {\n // Handle mouseout when event is undefined\n if (!event) {\n if (onPointMouseOut && lastPayloadRef.current) {\n onPointMouseOut({\n type: 'point.mouseout',\n originalEvent: lastOriginalEventRef.current,\n payload: lastPayloadRef.current,\n });\n }\n // Reset previous mouseover payload on mouseout\n previousMouseoverPayloadRef.current = null;\n return;\n }\n\n // Handle mouseover\n const payload = {\n ...pick(event, 'value', 'seriesKey', 'time', 'index', 'seriesIndex'),\n name: event.seriesKey,\n };\n delete payload.seriesKey;\n\n // Add row context fields in the format: row.${fieldName}.value\n if (event.rowContext) {\n Object.assign(\n payload,\n Object.keys(event.rowContext).reduce((acc, fieldName) => {\n acc[`row.${fieldName}.value`] = event.rowContext[fieldName];\n return acc;\n }, {})\n );\n }\n\n const updatedPayload = appendTrellisToPayload(payload, trellisKey, trellisSplitBy);\n\n // Check if the payload has actually changed to avoid emitting duplicate events\n if (!hasMouseoverPayloadChanged(updatedPayload, previousMouseoverPayloadRef.current)) {\n return;\n }\n\n // Store payload and originalEvent for mouseout\n lastPayloadRef.current = updatedPayload;\n lastOriginalEventRef.current = event;\n // Store current payload for next comparison\n previousMouseoverPayloadRef.current = { ...updatedPayload };\n\n if (onPointMouseOver) {\n onPointMouseOver({\n type: 'point.mouseover',\n originalEvent: event,\n payload: updatedPayload,\n });\n }\n }\n },\n [onPointMouseOver, onPointMouseOut, trellisKey, trellisSplitBy]\n );\n\n // Create a key to reset RangeSelectionProvider when data changes\n const dataKey = `${chartData.columns[0]?.[0]}-${chartData.columns[0]?.[chartData.columns[0].length - 1]}-${chartData.columns[0]?.length}`;\n\n const memoizedChart = useMemo(() => {\n // Always pass zoom handler when onSelect exists, serverSideZoom controls behavior\n const computedOnRangeZoom = onSelect ? handleChartRangeZoom : undefined;\n\n return (\n <RangeSelectionProvider key={dataKey}>\n <TimeSeriesChart\n data={chartData as GenericDataSet}\n width={containerWidth}\n height={containerHeight}\n seriesColors={seriesColors}\n seriesColorsByField={seriesColorsByField}\n seriesConfig={seriesOverrides}\n legend={legend}\n legendLabels={legendLabels}\n legendTruncation={legendTruncation}\n isSeriesCompare={legendMode === 'seriesCompare'}\n maxSeriesFocus={legendMode === 'seriesCompare' ? 0 : undefined}\n scaleConfig={scaleConfig}\n timestampFormat=\"expanded\"\n onCrosshairClick={onClick ? handleChartClick : undefined}\n onCrosshairChange={\n onPointMouseOver || onPointMouseOut ? handleChartCrosshairChange : undefined\n }\n onSeriesClick={onClick ? handleChartLegendClick : undefined}\n onRangeSelection={handleChartRangeSelection}\n onRangeZoom={computedOnRangeZoom}\n serverSideZoom={enableSearchZoom}\n userLocale={userLocale}\n events={chartingEventAnnotations}\n eventsConfig={{ renderer: triangleEventAnnotationRenderer }}\n additionalTooltipValuesRef={additionalTooltipValuesRef}\n showXMajorGridLines={showXMajorGridLines}\n showYMajorGridLines={showYMajorGridLines}\n showY2MajorGridLines={showY2MajorGridLines}\n showYMinorGridLines={showYMinorGridLines}\n showY2MinorGridLines={showY2MinorGridLines}\n showLineSmoothing={showLineSmoothing}\n dataValuesDisplay={dataValuesDisplay}\n showXMajorTicks={showXMajorTicks}\n xAxisMajorTickSize={xAxisMajorTickSizeNum}\n showYMajorTicks={showYMajorTicks}\n showY2MajorTicks={showY2MajorTicks}\n yAxisMajorTickSize={yAxisMajorTickSizeNum}\n y2AxisMajorTickSize={y2AxisMajorTickSizeNum}\n yAxisMajorTickInterval={yAxisMajorTickIntervalNum}\n y2AxisMajorTickInterval={y2AxisMajorTickIntervalNum}\n showYMinorTicks={showYMinorTicks}\n showY2MinorTicks={showY2MinorTicks}\n yAxisMinorTickSize={yAxisMinorTickSizeNum}\n y2AxisMinorTickSize={y2AxisMinorTickSizeNum}\n showYAxisWithZero={showYAxisWithZero}\n showY2AxisWithZero={showY2AxisWithZero}\n showXAxisLine={showXAxisLine}\n showYAxisLine={showYAxisLine}\n showY2AxisLine={showY2AxisLine}\n xAxisMaxLabelParts={xAxisMaxLabelParts}\n />\n </RangeSelectionProvider>\n );\n // Note: additionalTooltipValues passed via ref to avoid chart remount when switching stories.\n // The ref is updated via useEffect, so tooltip gets latest values without remounting chart.\n }, [\n onSelect,\n handleChartRangeZoom,\n dataKey,\n chartData,\n containerWidth,\n containerHeight,\n seriesColors,\n seriesColorsByField,\n seriesOverrides,\n legend,\n legendLabels,\n legendTruncation,\n scaleConfig,\n onClick,\n handleChartClick,\n onPointMouseOver,\n onPointMouseOut,\n handleChartCrosshairChange,\n handleChartLegendClick,\n handleChartRangeSelection,\n enableSearchZoom,\n userLocale,\n chartingEventAnnotations,\n showXMajorGridLines,\n showYMajorGridLines,\n showY2MajorGridLines,\n showYMinorGridLines,\n showY2MinorGridLines,\n showLineSmoothing,\n dataValuesDisplay,\n showXMajorTicks,\n xAxisMajorTickSizeNum,\n showYMajorTicks,\n showY2MajorTicks,\n yAxisMajorTickSizeNum,\n y2AxisMajorTickSizeNum,\n yAxisMajorTickIntervalNum,\n y2AxisMajorTickIntervalNum,\n showYMinorTicks,\n showY2MinorTicks,\n yAxisMinorTickSizeNum,\n y2AxisMinorTickSizeNum,\n showYAxisWithZero,\n showY2AxisWithZero,\n showXAxisLine,\n showYAxisLine,\n showY2AxisLine,\n legendMode,\n xAxisMaxLabelParts,\n ]);\n\n const memoizedVisualization = useMemo(() => {\n return <VizStyleWrapper backgroundColor={bgColor}>{memoizedChart}</VizStyleWrapper>;\n }, [bgColor, memoizedChart]);\n\n return (\n <>\n {trellisEnabled && (\n <TrellisTitle\n trellisKey={trellisKey}\n backgroundColor={bgColor}\n fontColor={defaultFontColor}\n />\n )}\n <TimeSeriesChartContainer\n height={trellisEnabled ? Number(height) - TRELLIS_TITLE_HEIGHT : height}\n width={width}\n ref={uplotContainerElement}\n data-test=\"timeseries-chart-wrapper\"\n >\n <SizeAwareWrapper width={width} height={height} onResize={cachedHandleResize} />\n {memoizedVisualization}\n </TimeSeriesChartContainer>\n </>\n );\n};\n\nexport default TimeSeriesChartWrapper;\n", "import * as React from 'react';\nimport { camelCase, has, get, defaultsDeep, noop } from 'lodash';\nimport getSettingsFromThemedProps from '@splunk/themes/getSettingsFromThemedProps';\nimport { Options as Opts } from '@splunk/visualization-encoding/Options';\nimport { withSanitizedProps } from '@splunk/visualizations-shared/SanitizeProps';\nimport type { TimezoneContextInterface } from '@splunk/visualization-context/TimezoneContext';\nimport TimezoneContext from '@splunk/visualization-context/TimezoneContext';\nimport moment from '@splunk/moment';\nimport FeatureFlagContext from '@splunk/visualization-context/FeatureFlagContext';\nimport { withTheme } from 'styled-components';\nimport { deepMergeWithArrayPrimitiveOverrides } from '@splunk/visualizations-shared/hocUtils';\nimport { pickFieldFromJSONSchema } from '@splunk/visualizations-shared/JSONSchemaUtils';\nimport AsyncDynamicOptionsEvaluator, {\n AsyncDynamicOptionsEvaluatorParams,\n} from '@splunk/async-dynamic-options-evaluator';\nimport { createGUID } from '@splunk/ui-utils/id';\nimport type { Frames } from '@splunk/visualization-encoding/EncodingExecutor';\nimport SplunkVisualization from './SplunkVisualization';\nimport type { DashboardVizProps, DataSource, VizConfig, VizProps } from './interfaces';\nimport { VizBehavior } from './interfaces/VizBehavior';\nimport { useSortingParams } from './hooks/useSorting';\nimport { usePaginationParams } from './hooks/usePagination';\nimport { useDeepMemo } from './hooks/useDeepMemo';\nimport MissingPropsMessage, { missingKeys } from './components/MissingPropsMessage';\nimport withEditModeCover from './hocs/withEditModeCover';\nimport withPlaceholder from './hocs/withPlaceholder';\nimport { ChartingProps } from './Charting';\nimport useDownsampleDataSources from './hooks/useDownsampleDataSources';\nimport { isDownsamplingEnabledForViz } from './utils/dataUtils';\nimport { getFeatureFlag } from '../common/utils/featureFlagUtils';\nimport { turnOffLegendDisplayWhenTrellisIsOn } from '../common/utils/trellisUtils';\nimport TimeSeriesChartWrapper from './TimeSeriesChartWrapper';\nimport { isTimeSeriesCanvasRenderSupported } from './chartingUtils';\n\n// Create the sanitized version once, outside the component to prevent remounting\nconst SanitizedTimeSeriesChartWrapper = withSanitizedProps(TimeSeriesChartWrapper);\n\ntype FeatureFlagContextValue = Record<string, boolean | undefined> | null;\n\ntype HOC = React.ComponentType<DashboardVizProps>;\nexport interface DashboardVizOpts {\n ReactViz: React.ComponentType<ChartingProps | VizProps>; // we will wrap this in DashboardViz (see const DashboardViz = ...)\n vizConfig: VizConfig;\n computeVizProps?: (props) => any;\n computeVizPropsBeforeEval?: (props) => any;\n computeDataFrames?: (args: {\n dataSources: { [key: string]: DataSource };\n options: Record<string, unknown>;\n }) => Partial<Frames>;\n disableEditModeCover?: boolean;\n useIconPlaceholder?: (\n dataSources: { [name: string]: DataSource },\n loading: boolean,\n options: Record<string, unknown>\n ) => boolean;\n}\n\n/**\n * hoc that wraps a pure react visualization in a Dashboard visualization\n * @param {DashboardVizOpts} opts\n * @returns {HOC}\n */\nconst withDashboardViz = (opts: DashboardVizOpts): HOC => {\n const {\n ReactViz,\n vizConfig,\n computeVizProps = () => {},\n computeVizPropsBeforeEval = () => {},\n computeDataFrames,\n disableEditModeCover,\n useIconPlaceholder,\n } = opts;\n\n // sanitizing props before sending them to reactviz.\n const SanitizedReactViz = withSanitizedProps(ReactViz); // Default assigned to ReactViz\n const defaultOptions = pickFieldFromJSONSchema(vizConfig.optionsSchema, 'default');\n\n const DashboardViz = (props: DashboardVizProps): React.ReactElement<DashboardVizProps> => {\n const {\n mode = 'view',\n hasEventHandlers,\n dataSources, // type of { [key: string]: DataSource }\n options = {},\n context = {},\n width,\n height,\n onComputedProps = noop,\n onEventTrigger = SplunkVisualization.defaults.onEventTrigger,\n theme,\n onRequestParamsChange = noop,\n } = props;\n const localeContext = React.useContext<TimezoneContextInterface>(TimezoneContext);\n if (localeContext.serializedTimezone) {\n /*\n @splunk/moment currently does not allow us to customize the timezone on a per visualization basis.\n This ensures that if a timezone was provided via TimezoneContext @splunk/moment time formatting\n will use it.\n */\n if (!moment.getDefaultSplunkTimezone()) {\n moment.setDefaultSplunkTimezone(localeContext.serializedTimezone);\n }\n }\n\n const themeFunc = themeVar => vizConfig.themes[themeVar]?.(props);\n const {\n family: currentThemeFamily,\n colorScheme: currentThemeColorScheme,\n density: currentThemeDensity,\n } = getSettingsFromThemedProps({ theme });\n let evaluatedOptions: Record<string, unknown> = {}; // evaluatedOptions need to be initialized as an empty object\n const [evaluatedOptionsAsync, setEvaluatedOptionsAsync] = React.useState({}); // evaluatedOptions need to be initialized as an empty object\n const featureFlagContext = React.useContext<FeatureFlagContextValue>(FeatureFlagContext);\n\n const [visualizationID] = React.useState(`${vizConfig.name} - ${createGUID()}`);\n\n const [dataSourcesInState, setDataSourcesInState] = React.useState({});\n const [dataFramesInState, setDataFramesInState] = React.useState<Frames | undefined>();\n\n const [useAsyncEvaluatedOptions, setUseAsyncEvaluatedOptions] = React.useState(\n Boolean(getFeatureFlag(featureFlagContext, 'visualizations_useWebWorkersForDSL'))\n );\n const isDownsamplingEnabledByFeatureFlag = Boolean(\n featureFlagContext?.visualizations_enableDownsampling\n );\n const isTrellisFeatureFlagOn = Boolean(\n featureFlagContext && featureFlagContext.visualizations_enableTrellis\n );\n const isTrellisOn =\n isTrellisFeatureFlagOn &&\n vizConfig?.supports?.includes(VizBehavior.TRELLIS) &&\n options?.splitByLayout === VizBehavior.TRELLIS;\n\n const isAcceleratedRenderFeatureFlagOn = Boolean(\n featureFlagContext?.visualizations_enableAcceleratedRender\n );\n const isAcceleratedRenderOn =\n isAcceleratedRenderFeatureFlagOn &&\n isTimeSeriesCanvasRenderSupported(vizConfig.key) &&\n options?.acceleratedRender === true;\n const isMounted = React.useRef(true);\n const optionsToEvaluate = React.useMemo(() => {\n const legendDisplay = turnOffLegendDisplayWhenTrellisIsOn(isTrellisOn, options);\n // computeVizPropsBeforeEval will run before DSL gets evaluated\n const computedOptions = computeVizPropsBeforeEval(options) ?? {};\n return {\n context: defaultsDeep({}, context, vizConfig.defaultContext),\n options: deepMergeWithArrayPrimitiveOverrides(\n {},\n legendDisplay,\n computedOptions,\n options,\n defaultOptions\n ),\n };\n }, [isTrellisOn, options, context]);\n\n const [threshold, setThreshold] = React.useState(Number(width));\n const onDownsamplingThresholdChange = React.useCallback((newThreshold: number) => {\n setThreshold(newThreshold);\n }, []);\n const isDownsamplingEnabled = React.useMemo(() => {\n return isDownsamplingEnabledByFeatureFlag && isDownsamplingEnabledForViz({ vizConfig });\n }, [isDownsamplingEnabledByFeatureFlag]);\n\n const downsamplingProps = React.useMemo(() => {\n if (!isDownsamplingEnabled) {\n return {};\n }\n return {\n onDownsamplingThresholdChange,\n originalDataSources: dataSources,\n };\n }, [dataSources, isDownsamplingEnabled, onDownsamplingThresholdChange]);\n const downsampledDataSources = useDownsampleDataSources({\n options: optionsToEvaluate.options,\n context: optionsToEvaluate.context,\n dataSources,\n threshold,\n isDownsamplingEnabled,\n });\n\n evaluatedOptions = useDeepMemo(() => {\n try {\n if (useAsyncEvaluatedOptions) {\n const asyncDynamicOptionsEvaluatorParams: AsyncDynamicOptionsEvaluatorParams = {\n visualizationID,\n props,\n options: optionsToEvaluate,\n dataSources: downsampledDataSources,\n theme: vizConfig.themes,\n bypassCloneDeepOptionScope: Boolean(\n getFeatureFlag(featureFlagContext, 'visualizations_bypassCloneDeepOptionScope')\n ),\n lazyLoadingDataFrame: Boolean(\n getFeatureFlag(featureFlagContext, 'visualizations_lazyLoadingDataFrame')\n ),\n };\n AsyncDynamicOptionsEvaluator.evaluate(asyncDynamicOptionsEvaluatorParams)\n .then(results => {\n setEvaluatedOptionsAsync(results.results);\n })\n .catch(() => {\n if (isMounted.current) {\n setUseAsyncEvaluatedOptions(false);\n }\n });\n } else {\n let dataFrames: Frames | undefined = dataFramesInState;\n if (downsampledDataSources !== dataSourcesInState) {\n setDataSourcesInState(downsampledDataSources);\n dataFrames = Opts.dataFrameFromDataSource(\n downsampledDataSources,\n getFeatureFlag(featureFlagContext, 'visualizations_lazyLoadingDataFrame')\n );\n setDataFramesInState(dataFrames);\n }\n // Merge derived frames when provided\n let mergedFrames = dataFrames;\n if (computeDataFrames && dataFrames) {\n const derivedFrames = computeDataFrames({\n dataSources: downsampledDataSources,\n options: optionsToEvaluate.options,\n });\n mergedFrames = { ...dataFrames, ...derivedFrames };\n }\n const result = Opts.evaluate(\n optionsToEvaluate,\n downsampledDataSources,\n themeFunc,\n mergedFrames,\n getFeatureFlag(featureFlagContext, 'visualizations_bypassCloneDeepOptionScope')\n );\n return result;\n }\n } catch (e) {\n if (e instanceof Error) {\n // eslint-disable-next-line no-console\n console.error(`unexpected error evaluating options: ${e.message}`);\n }\n return {};\n }\n return {};\n }, [\n currentThemeFamily,\n currentThemeColorScheme,\n currentThemeDensity,\n optionsToEvaluate,\n downsampledDataSources,\n localeContext.serializedTimezone,\n useAsyncEvaluatedOptions,\n ]);\n\n const evaluatedOptionsToUse = !useAsyncEvaluatedOptions ? evaluatedOptions : evaluatedOptionsAsync;\n\n /**\n * PAGE_AND_SORT behavior\n *\n * Some visualizations, like table, requires metadata about the datasource,\n * like total number of results, current count, offset, and sort, for rendering\n * paginator and sorting direction. In this approach, the visualization\n * allow users to set 'paginateDataSourceKey' to select which datasource\n * should the visualization extract the metadata from. It defaults to 'primary' datasource.\n * The visualization config should set the PAGE_AND_SORT behavior to receive\n * 'requestParams', 'meta' and onRequestParams callback as props.\n *\n * In future, we could automatically detect which all datasources are being used\n * and bind those magically to pagination/sorting behavior.\n */\n let dataSourceMetadata = {};\n const OptionKey = 'paginateDataSourceKey';\n const optsKey = has(evaluatedOptionsToUse, OptionKey) && evaluatedOptionsToUse[OptionKey];\n const paginateDataSourceKey = typeof optsKey === 'string' ? optsKey : 'primary';\n\n const requestParams = get(dataSources, [paginateDataSourceKey, 'requestParams'], {});\n const meta = get(dataSources, [paginateDataSourceKey, 'meta'], {});\n const handleRequestParamsChange = (payload: Record<string, unknown>): void =>\n onRequestParamsChange(paginateDataSourceKey, payload);\n\n const sortParams = useSortingParams({\n requestParams,\n meta,\n onRequestParamsChange: handleRequestParamsChange,\n });\n\n const paginatorParams = usePaginationParams({\n requestParams,\n meta,\n onRequestParamsChange: handleRequestParamsChange,\n });\n\n dataSourceMetadata = {\n sortParams,\n paginatorParams,\n };\n\n if (\n vizConfig.supports.indexOf(VizBehavior.PAGE_AND_SORT) === -1 &&\n !has(dataSources, paginateDataSourceKey)\n ) {\n dataSourceMetadata = {};\n }\n\n // trellis specific backgroundColor update for onComputedProps\n // if trellis is enabled following these three criteria - 1) trellis feature flag is enabled 2) vizConfig supports array has 'trellis' 3) option 'splitByLayout' is set to 'trellis\n // onComputedProps api should return back trellisBackgroundColor value for backgroundColor option to support coloring of sibling panels (for eg:- title/ description on UDF side)\n const clonedEvaluatedOptions: Record<string, unknown> = { ...evaluatedOptionsToUse };\n if (isTrellisOn) {\n clonedEvaluatedOptions.backgroundColor = clonedEvaluatedOptions?.trellisBackgroundColor;\n }\n // useEffect hook needs to be initialized before any early returns\n // this is in accordance with the order of hook calls being the same on each render https://reactjs.org/docs/hooks-rules.html#explanation\n React.useEffect((): void => {\n onComputedProps(clonedEvaluatedOptions);\n });\n\n React.useEffect((): (() => void) => {\n return () => {\n if (useAsyncEvaluatedOptions) {\n isMounted.current = false;\n AsyncDynamicOptionsEvaluator.reset(visualizationID);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // present warning message if any required props are missing\n const { requiredProps = [], supports } = vizConfig;\n const missing = missingKeys(requiredProps, evaluatedOptionsToUse);\n if (\n missing.length > 0 &&\n supports.includes(VizBehavior.PLACEHOLDER) &&\n vizConfig.key !== 'splunk.singlevalue' // For SV missing props msg is not displayed if required props majorValue is missing, instead this will be handled from the component, instead handled within component\n ) {\n return (\n <MissingPropsMessage\n data-test=\"missing-props-message\"\n width={width}\n height={height}\n missingProps={missing}\n backgroundColor={themeFunc('defaultBackgroundColor')}\n />\n );\n }\n\n // events\n const eventCallbackProps = {};\n if (hasEventHandlers && mode === 'view' && vizConfig.supports.indexOf(VizBehavior.EVENTS) > -1) {\n const supportedEvents = vizConfig.events;\n Object.keys(supportedEvents).forEach((eventName): void => {\n const { parentKeys, payloadKeys } = supportedEvents[eventName];\n const eventCallbackPropName = camelCase(`on.${eventName}`);\n\n // then remove these lines\n let payload = {};\n if (Array.isArray(payloadKeys) && payloadKeys.length) {\n payloadKeys.forEach(p => {\n payload[p] = evaluatedOptionsToUse[p];\n });\n }\n\n eventCallbackProps[eventCallbackPropName] = (ev): Record<string, unknown> => {\n if (ev?.payload) {\n payload = { ...ev.payload };\n }\n return onEventTrigger({\n originalEvent: ev,\n payload,\n type: eventName,\n });\n };\n\n if (parentKeys) {\n for (let i = parentKeys.length - 1; i >= 0; i -= 1) {\n const newObject = {};\n newObject[parentKeys[i]] = eventCallbackProps[eventCallbackPropName];\n eventCallbackProps[eventCallbackPropName] = newObject;\n }\n }\n });\n }\n\n // compute pure viz props which are not from options\n const computedVizProps = computeVizProps({\n ...props,\n ...evaluatedOptionsToUse,\n ...eventCallbackProps,\n themeFunc,\n });\n\n // if were using webworkers and this is the first render we dont want to show a viz with missing data so we return null\n if (useAsyncEvaluatedOptions && Object.keys(evaluatedOptionsToUse).length === 0) {\n return null;\n }\n\n // if acceleratedRender mode is on, then use canvas viz\n const SanitizedViz = isAcceleratedRenderOn ? SanitizedTimeSeriesChartWrapper : SanitizedReactViz;\n\n return (\n <SanitizedViz\n {...SplunkVisualization.defaults}\n mode={mode}\n width={width || SplunkVisualization.defaults.width}\n height={height || SplunkVisualization.defaults.height}\n userLocale={localeContext}\n {...downsamplingProps}\n {...evaluatedOptionsToUse}\n {...computedVizProps}\n {...eventCallbackProps}\n {...dataSourceMetadata}\n />\n );\n };\n\n DashboardViz.propTypes = {\n ...SplunkVisualization.propTypes,\n ...ReactViz.propTypes,\n };\n\n DashboardViz.defaultProps = {\n ...ReactViz.defaultProps, // we still need ReactViz.defaultProps for the visualizations that still have them\n onEventTrigger: SplunkVisualization.defaults.onEventTrigger,\n };\n\n // attach viz config\n DashboardViz.config = vizConfig;\n\n return withTheme(\n withPlaceholder(withEditModeCover(DashboardViz, disableEditModeCover), useIconPlaceholder)\n );\n};\n\nexport default withDashboardViz;\n", "\nimport * as defaultImport from \"lodash/debounce\";\nexport * from \"lodash/debounce\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-ui/Table\";\nexport * from \"@splunk/react-ui/Table\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-ui/Paginator\";\nexport * from \"@splunk/react-ui/Paginator\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-ui/Message\";\nexport * from \"@splunk/react-ui/Message\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import React from 'react';\nimport { has, includes, get } from 'lodash';\nimport { isColor } from '@splunk/visualizations-shared/colorUtils';\nimport {\n validCellRenderers,\n validSparklineTypes,\n validHeaderVisibilities,\n validAlignments,\n TextOverflow,\n TableHeaderVisibility,\n TableAlignment,\n CellRenderers,\n SparklineType,\n ColumnAlignment,\n} from '@splunk/visualization-schemas';\nimport { FieldEntry } from '@splunk/visualizations-shared/dataSourceUtils';\n\nconst isArray = (v: unknown): boolean => Array.isArray(v);\n\ninterface TextOverFlowStyles {\n maxWidth?: string;\n overflow?: React.CSSProperties['overflow'];\n overflowWrap?: React.CSSProperties['overflowWrap'];\n textOverflow?: React.CSSProperties['textOverflow'];\n whiteSpace?: React.CSSProperties['whiteSpace'];\n wordBreak?: React.CSSProperties['wordBreak'];\n wordWrap?: React.CSSProperties['wordWrap'];\n}\ninterface TableHeaderCell {\n /* unique key for the table header cell */\n key: string;\n /* value to be displayed in the table header cell */\n value: string;\n /* header align control */\n align: TableAlignment;\n /* original column field name, used for formatting */\n columnId: string;\n /* key that will be used for sorting */\n sortKey: string;\n truncate?: boolean;\n width?: number;\n style?: TextOverFlowStyles;\n textOverflowType?: string;\n showCell: boolean;\n}\n\nexport interface TableHeaderStyle extends TextOverFlowStyles {\n backgroundColor?: string;\n color?: string;\n}\nexport interface TableFooterStyle extends TableHeaderStyle {\n dividerColor?: string;\n}\nexport interface TableHeader {\n /* header visiibility control */\n visibility: TableHeaderVisibility;\n /* array containing table header cells */\n cells: TableHeaderCell[];\n /* styles to be applied to table */\n style: TableHeaderStyle;\n}\n\nexport interface TableFooter {\n /* collection of table rows */\n rows: TableRow[];\n}\n\nexport type TableCellValueType = string | number | (string | number)[];\n\ninterface TableRowStyles extends TextOverFlowStyles {\n backgroundColor?: string;\n color?: string;\n width?: number | 'auto';\n}\nexport type SparklineNullValueDisplay = 'gaps' | 'zero' | 'connect';\n\nexport interface TableRowCell {\n /* unique key for the row cell */\n key: string;\n /* value to be displayed in the row cell. This is a layered value columnFormat.[FieldName].data > tableFormat.data > table options */\n value: TableCellValueType;\n /* always the value from table options */\n rawValue: TableCellValueType;\n align: TableAlignment;\n cellType: CellRenderers;\n columnIndex: number;\n rowIndex: number;\n sparklineAreaColor?: string;\n sparklineColor?: string;\n sparklineType: SparklineType;\n sparklineNullValueDisplay: SparklineNullValueDisplay;\n header: string;\n style: TableRowStyles;\n showCell: boolean;\n}\n\ninterface TableRow {\n /* unique key for each row */\n key: string;\n /* row index */\n index: number;\n /* array of table cells to be displayed in the row */\n cells: TableRowCell[];\n}\n\nexport interface TableBody {\n /* collection of table rows */\n rows: TableRow[];\n}\n\nexport interface TableStructure {\n tableHeader: TableHeader;\n tableBody: TableBody;\n tableFooter?: TableFooter;\n}\n\nexport interface TableFormat {\n align: TableAlignment[][] | TableAlignment;\n cellTypes: CellRenderers[][];\n data: TableCellValueType[][];\n headerAlign: TableAlignment;\n /* header background color. NOTE: react table does not support background color for individual column headers */\n headerBackgroundColor: string;\n /* header text color. NOTE: react table does not support text color for individual column headers */\n headerColor: string;\n /* array of colors for the background color of each table row */\n rowBackgroundColors: string[] | string[][];\n /* array of colors for the text color of each table row */\n rowColors: string[] | string[][];\n sparklineAreaColors: string[][];\n sparklineColors: string[][];\n sparklineTypes: SparklineType[][];\n sparklineNullValueDisplay?: SparklineNullValueDisplay;\n textOverflow?: TextOverflow;\n}\n\ninterface ColumnFormatter {\n align: ColumnAlignment[] | ColumnAlignment;\n cellTypes: CellRenderers[];\n data: TableCellValueType[];\n headerAlign: ColumnAlignment;\n rowBackgroundColors: string[];\n rowColors: string[];\n sparklineAreaColors: string[];\n sparklineColors: string[];\n sparklineTypes: SparklineType[];\n sparklineNullValueDisplay?: SparklineNullValueDisplay;\n width: number | 'auto';\n textOverflow: TextOverflow;\n footer: string[];\n}\nexport interface ColumnFormat {\n [k: string]: Partial<ColumnFormatter>;\n}\n\nexport type ThemeFunc = (themeVar: string) => string | undefined;\n\nexport interface UseTableArgs {\n /* array of headers to be displayed */\n headers?: string[];\n /* metadata for each field */\n headersMetadata?: FieldEntry[];\n /* array of original data columns */\n columnIds?: string[];\n /* 2 dimensional array of table data to be displayed */\n table?: TableCellValueType[][];\n /* header visibility control */\n headerVisibility?: TableHeaderVisibility;\n /* adds row number column */\n showRowNumbers?: boolean;\n /* shows or hides internal fields */\n showInternalFields?: boolean;\n /* shows footer totals row */\n showFooterTotals?: boolean;\n /* shows footer percentages row */\n showFooterPercentages?: boolean;\n /* table wide formatting options */\n tableFormat?: Partial<TableFormat>;\n /* column format for individual columns */\n columnFormat?: Partial<ColumnFormat>;\n /* pagination offset */\n paginationOffset?: number;\n /* count */\n count?: number;\n /* theme function for getting theme colors as fallback */\n themeFunc?: ThemeFunc;\n}\n\ninterface GetOverflowStylesArgs {\n textOverflow: TextOverflow;\n}\n\nconst textOverflowStyles = {\n anywhere: {\n wordBreak: 'break-all',\n whiteSpace: 'pre-wrap',\n },\n 'break-word': {\n wordBreak: 'break-word',\n wordWrap: 'break-word',\n overflowWrap: 'break-word',\n whiteSpace: 'pre-wrap',\n },\n ellipsis: {\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n};\n\nexport const getOverflowStyles = ({ textOverflow }: GetOverflowStylesArgs): TextOverFlowStyles => {\n return (textOverflowStyles[textOverflow] || textOverflowStyles['break-word']) as TextOverFlowStyles;\n};\n\nconst generateKey = (i: string | number = '', value = ''): string => `${value}-${i}`;\n\nexport const getTextOverflowType = (\n columnFormat: Partial<ColumnFormat>,\n columnId: string,\n tableFormat?: Partial<TableFormat>,\n currentColumn?: string,\n defaultValue: TextOverflow = 'break-word'\n): string => {\n // Priority: columnFormat.textOverflow > tableFormat.textOverflow > defaultValue\n const columnTextOverflow = getAttributeFromColumnFormat(\n 'textOverflow',\n columnFormat,\n columnId,\n currentColumn\n );\n if (columnTextOverflow) {\n return columnTextOverflow;\n }\n return tableFormat?.textOverflow || defaultValue;\n};\n\n// Helper to check if textOverflow is explicitly set (returns undefined if not set)\nconst getTextOverflow = (\n columnFormat: Partial<ColumnFormat>,\n columnId: string,\n tableFormat?: Partial<TableFormat>,\n currentColumn?: string\n): string | undefined => {\n const columnTextOverflow = getAttributeFromColumnFormat(\n 'textOverflow',\n columnFormat,\n columnId,\n currentColumn\n );\n if (columnTextOverflow) {\n return columnTextOverflow;\n }\n return tableFormat?.textOverflow;\n};\n\nconst generateHeader = (\n value: string,\n columnId: string,\n i: number,\n columnFormat: Partial<ColumnFormat>,\n tableFormat: Partial<TableFormat>,\n showInternalFields: boolean\n): TableHeaderCell => {\n const ret: TableHeaderCell = {\n key: generateKey(value, String(i)),\n value,\n align: 'left',\n columnId,\n sortKey: value,\n showCell: true,\n };\n if (!showInternalFields && value.charAt(0) === '_' && value !== '_time') {\n ret.showCell = false;\n }\n\n const headerAlign =\n getColumnFormatHeaderAlign(columnFormat, columnId, value) ||\n getTableFormatHeaderAlign(tableFormat) ||\n 'left';\n ret.align = headerAlign;\n ret.truncate = true;\n\n // Only apply textOverflow to headers if explicitly set in columnFormat or tableFormat\n const textOverflow = getTextOverflow(columnFormat, columnId, tableFormat, value);\n if (textOverflow) {\n ret.textOverflowType = textOverflow;\n }\n\n return ret;\n};\n\nconst getColumnFormatAlign = (\n columnFormat: Partial<ColumnFormat> | undefined,\n currentColumn: TableHeaderCell,\n currentRow: number\n): TableAlignment | undefined => {\n let align;\n const alignOption = getAttributeFromColumnFormat(\n 'align',\n columnFormat,\n currentColumn.columnId,\n currentColumn.value\n );\n\n if (isArray(alignOption) && includes(validAlignments, alignOption[currentRow])) {\n align = alignOption[currentRow];\n } else if (typeof alignOption === 'string' && alignOption === 'auto') {\n align = undefined;\n } else if (typeof alignOption === 'string' && includes(validAlignments, alignOption)) {\n align = alignOption;\n } else if (typeof alignOption !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\n `columnFormat.${\n currentColumn.columnId\n }.align should be a string or an array containing (${validAlignments.join(\n ' | '\n )}). ${JSON.stringify(alignOption)} provided`\n );\n }\n return align;\n};\n\nconst getColumnFormatCellType = (\n columnFormat: Partial<ColumnFormat> | undefined,\n currentColumn: TableHeaderCell,\n currentRow: number\n): CellRenderers | undefined => {\n let cellType;\n const cellTypes = getAttributeFromColumnFormat(\n 'cellTypes',\n columnFormat,\n currentColumn.columnId,\n currentColumn.value\n );\n\n if (isArray(cellTypes) && includes(validCellRenderers, cellTypes[currentRow])) {\n cellType = cellTypes[currentRow];\n } else if (typeof cellTypes !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\n `columnFormat.${\n currentColumn.value\n }.cellType should be an array containing (${validCellRenderers.join(' | ')}). ${JSON.stringify(\n cellTypes\n )} provided`\n );\n }\n return cellType;\n};\n\nconst getColumnFormatSparklineType = (\n columnFormat: Partial<ColumnFormat> | undefined,\n currentColumn: TableHeaderCell,\n currentRow: number\n): SparklineType | undefined => {\n let sparklineType;\n const types = getAttributeFromColumnFormat(\n 'sparklineTypes',\n columnFormat,\n currentColumn.columnId,\n currentColumn.value\n );\n\n if (isArray(types) && includes(validSparklineTypes, types[currentRow])) {\n sparklineType = types[currentRow];\n } else if (typeof types !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\n `columnFormat.${currentColumn.value}.sparklineTypes should be one of (${validSparklineTypes.join(\n ' | '\n )}). ${JSON.stringify(types)} provided`\n );\n }\n return sparklineType;\n};\n\nconst getColumnFormatData = (\n columnFormat: Partial<ColumnFormat> | undefined,\n currentColumn: TableHeaderCell,\n currentRow: number\n): string | undefined => {\n let datum;\n const data = getAttributeFromColumnFormat(\n 'data',\n columnFormat,\n currentColumn.columnId,\n currentColumn.value\n );\n\n if (isArray(data)) {\n datum = data[currentRow];\n } else if (typeof data !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\n `columnFormat.${\n currentColumn.value\n }.data should be an array containing formatted data. ${typeof data} provided`\n );\n }\n return datum;\n};\n\nconst getColumnFormatColor = (\n columnFormat: Partial<ColumnFormat> | undefined,\n currentColumn: TableHeaderCell,\n currentRow: number,\n field: string\n): string | undefined => {\n let color;\n const colors = getAttributeFromColumnFormat(\n field,\n columnFormat,\n currentColumn.columnId,\n currentColumn.value\n );\n\n // Only use the color if it's a valid color value\n // When matchValue returns the original data value (no match, no default),\n // it won't be a valid color, so we silently fall back to table-level colors\n if (isArray(colors) && isColor(colors[currentRow])) {\n color = colors[currentRow];\n }\n return color;\n};\n\nconst getColumnFormatRowColor = (\n columnFormat: Partial<ColumnFormat> | undefined,\n currentColumn: TableHeaderCell,\n currentRow: number\n): string | undefined => {\n return getColumnFormatColor(columnFormat, currentColumn, currentRow, 'rowColors');\n};\n\nconst getColumnFormatRowBgColor = (\n columnFormat: Partial<ColumnFormat> | undefined,\n currentColumn: TableHeaderCell,\n currentRow: number\n): string | undefined => {\n return getColumnFormatColor(columnFormat, currentColumn, currentRow, 'rowBackgroundColors');\n};\n\nconst getColumnFormatSparklineColor = (\n columnFormat: Partial<ColumnFormat> | undefined,\n currentColumn: TableHeaderCell,\n currentRow: number\n): string | undefined => {\n return getColumnFormatColor(columnFormat, currentColumn, currentRow, 'sparklineColors');\n};\n\nconst getColumnFormatSparklineAreaColor = (\n columnFormat: Partial<ColumnFormat> | undefined,\n currentColumn: TableHeaderCell,\n currentRow: number\n): string | undefined => {\n return getColumnFormatColor(columnFormat, currentColumn, currentRow, 'sparklineAreaColors');\n};\n\nconst validSparklineNullValueDisplayOptions = ['gaps', 'zero', 'connect'] as const;\n\nconst getColumnFormatSparklineNullValueDisplay = (\n columnFormat: Partial<ColumnFormat> | undefined,\n currentColumn: TableHeaderCell\n): SparklineNullValueDisplay | undefined => {\n const nullValueDisplay = getAttributeFromColumnFormat(\n 'sparklineNullValueDisplay',\n columnFormat,\n currentColumn.columnId,\n currentColumn.value\n );\n\n if (\n typeof nullValueDisplay === 'string' &&\n validSparklineNullValueDisplayOptions.includes(nullValueDisplay as SparklineNullValueDisplay)\n ) {\n return nullValueDisplay as SparklineNullValueDisplay;\n }\n return undefined;\n};\n\nconst getColumnFormatHeaderAlign = (\n columnFormat: Partial<ColumnFormat> | undefined,\n columnId: string,\n columnValue: string\n): TableAlignment | undefined => {\n let headerAlign;\n const alignOption = getAttributeFromColumnFormat('headerAlign', columnFormat, columnId, columnValue);\n\n if (typeof alignOption === 'string' && alignOption === 'auto') {\n return undefined;\n }\n if (typeof alignOption === 'string' && includes(validAlignments, alignOption)) {\n headerAlign = alignOption;\n } else if (typeof alignOption !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\n `columnFormat.${columnId}.headerAlign should be a string containing (${validAlignments.join(\n ' | '\n )}). ${JSON.stringify(alignOption)} provided`\n );\n }\n return headerAlign;\n};\n\nconst getTableFormatAlign = (\n tableFormat: Partial<TableFormat>,\n currentColumn: number,\n currentRow: number\n): TableAlignment | undefined => {\n const alignOption = get(tableFormat, 'align');\n let align;\n if (\n isArray(alignOption) &&\n isArray(alignOption[currentColumn]) &&\n includes(validAlignments, alignOption[currentColumn][currentRow])\n ) {\n align = alignOption[currentColumn][currentRow];\n } else if (typeof alignOption === 'string' && includes(validAlignments, alignOption)) {\n align = alignOption;\n } else if (typeof alignOption !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\n `tableFormat.align should be a string or a 2 dimensional array containing (${validAlignments.join(\n ' | '\n )}). ${JSON.stringify(alignOption)} provided`\n );\n }\n return align;\n};\n\nconst getTableFormatCellType = (\n tableFormat: Partial<TableFormat>,\n currentColumn: number,\n currentRow: number\n): CellRenderers | undefined => {\n const cellTypes = get(tableFormat, 'cellTypes');\n let cellType;\n if (\n isArray(cellTypes) &&\n isArray(cellTypes[currentColumn]) &&\n includes(validCellRenderers, cellTypes[currentColumn][currentRow])\n ) {\n cellType = cellTypes[currentColumn][currentRow];\n } else if (typeof cellTypes !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\n `tableFormat.cellType should be a 2 dimensional array containing (${validCellRenderers.join(\n ' | '\n )}). ${JSON.stringify(cellTypes)} provided`\n );\n }\n return cellType;\n};\n\nconst getTableFormatSparklineType = (\n tableFormat: Partial<TableFormat>,\n currentColumn: number,\n currentRow: number\n): SparklineType | undefined => {\n const types = get(tableFormat, 'sparklineTypes');\n let sparklineType;\n if (\n isArray(types) &&\n isArray(types[currentColumn]) &&\n includes(validSparklineTypes, types[currentColumn][currentRow])\n ) {\n sparklineType = types[currentColumn][currentRow];\n } else if (typeof types !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\n `tableFormat.sparklineTypes should be a 2 dimensional array containing one of (${validSparklineTypes.join(\n ' | '\n )}). ${JSON.stringify(types)} provided`\n );\n }\n return sparklineType;\n};\n\nconst getTableFormatColor = (\n tableFormat: Partial<TableFormat>,\n currentColumn: number,\n currentRow: number,\n field: string\n): string | undefined => {\n const colors = get(tableFormat, field);\n let color;\n if (isArray(colors) && isArray(colors[currentColumn]) && isColor(colors[currentColumn][currentRow])) {\n color = colors[currentColumn][currentRow];\n } else if (isArray(colors) && isColor(colors[currentRow])) {\n color = colors[currentRow];\n } else if (\n typeof colors !== 'undefined' &&\n isArray(colors) &&\n isArray(colors[currentColumn]) &&\n colors[currentColumn][currentRow] !== undefined\n ) {\n // eslint-disable-next-line no-console\n console.warn(\n `tableFormat.${field} needs to be an array of colors, provided ${JSON.stringify(\n colors\n )}. Current value at [${currentColumn}][${currentRow}] is ${JSON.stringify(colors[currentRow])}`\n );\n }\n return color;\n};\n\nconst getTableFormatRowColor = (\n tableFormat: Partial<TableFormat>,\n currentCol: number,\n currentRow: number\n): string | undefined => {\n return getTableFormatColor(tableFormat, currentCol, currentRow, 'rowColors');\n};\n\nconst getTableFormatRowBgColor = (\n tableFormat: Partial<TableFormat>,\n currentCol: number,\n currentRow: number\n): string | undefined => {\n return getTableFormatColor(tableFormat, currentCol, currentRow, 'rowBackgroundColors');\n};\n\n/**\n * Get theme row background color as the final fallback.\n * Uses odd/even striping based on row index (row 1 = odd, row 2 = even, etc.)\n */\nconst getThemeRowBgColor = (themeFunc: ThemeFunc | undefined, currentRow: number): string | undefined => {\n if (!themeFunc) return undefined;\n // (currentRow + 1) % 2 because 'odd' refers to row number, so index 0 -> row 1 -> odd colored\n const themeVar = (currentRow + 1) % 2 === 0 ? 'rowBackgroundColorEven' : 'rowBackgroundColorOdd';\n return themeFunc(themeVar);\n};\n\n/**\n * Get theme text color as the final fallback.\n */\nconst getThemeRowColor = (themeFunc: ThemeFunc | undefined): string | undefined => {\n if (!themeFunc) return undefined;\n return themeFunc('textColor');\n};\n\nconst getTableFormatSparklineColor = (\n tableFormat: Partial<TableFormat>,\n currentCol: number,\n currentRow: number\n): string | undefined => {\n return getTableFormatColor(tableFormat, currentCol, currentRow, 'sparklineColors');\n};\n\nconst getTableFormatSparklineAreaColor = (\n tableFormat: Partial<TableFormat>,\n currentCol: number,\n currentRow: number\n): string | undefined => {\n return getTableFormatColor(tableFormat, currentCol, currentRow, 'sparklineAreaColors');\n};\n\nconst getTableFormatSparklineNullValueDisplay = (\n tableFormat: Partial<TableFormat>\n): SparklineNullValueDisplay | undefined => {\n const nullValueDisplay = get(tableFormat, 'sparklineNullValueDisplay');\n if (\n typeof nullValueDisplay === 'string' &&\n validSparklineNullValueDisplayOptions.includes(nullValueDisplay as SparklineNullValueDisplay)\n ) {\n return nullValueDisplay as SparklineNullValueDisplay;\n }\n return undefined;\n};\n\nconst getTableFormatData = (\n tableFormat: Partial<TableFormat>,\n currentCol: number,\n currentRow: number\n): string | undefined => {\n const data = get(tableFormat, 'data');\n let datum;\n if (isArray(data) && isArray(data[currentCol])) {\n datum = data[currentCol][currentRow];\n } else if (typeof data !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\n `tableFormat.data should be a 2 dimensional array containing formatted data to be displayed. ${typeof data} provided`\n );\n }\n return datum;\n};\n\nconst getTableFormatHeaderAlign = (tableFormat: Partial<TableFormat>): TableAlignment | undefined => {\n const alignOption = get(tableFormat, 'headerAlign');\n let headerAlign;\n if (typeof alignOption === 'string' && validAlignments.includes(alignOption)) {\n headerAlign = alignOption;\n } else if (typeof alignOption !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\n `tableFormat.headerAlign should be a string containing (${validAlignments.join(\n ' | '\n )}). ${JSON.stringify(alignOption)} provided`\n );\n }\n return headerAlign;\n};\n\nconst getAttributeFromColumnFormat = (attribute, columnFormat, columnId, columnValue) =>\n get(columnFormat, [columnId, attribute]) || get(columnFormat, [columnValue, attribute]);\n\nconst validValueSelector = (\n v1: TableCellValueType,\n v2: TableCellValueType,\n v3: TableCellValueType,\n defaultValue: TableCellValueType\n): TableCellValueType => {\n const validTypes = ['string', 'number'];\n if (validTypes.includes(typeof v1) || isArray(v1)) {\n return v1;\n }\n if (validTypes.includes(typeof v2) || isArray(v2)) {\n return v2;\n }\n if (validTypes.includes(typeof v3) || isArray(v3)) {\n return v3;\n }\n return defaultValue;\n};\n\nexport const useTable = (tableArgs: UseTableArgs = {}): TableStructure => {\n let { table = [], headers = [], columnIds = [] } = tableArgs;\n const {\n headerVisibility = 'inline',\n showRowNumbers = false,\n showInternalFields = true,\n tableFormat = {},\n columnFormat = {},\n paginationOffset = 0,\n count = 0,\n showFooterTotals = false,\n showFooterPercentages = false,\n themeFunc,\n } = tableArgs;\n const longestColumnLength: number = Math.max(...table.map((column): number => column.length));\n\n if (showRowNumbers) {\n const correctedPaginationOffset = Math.max(0, (paginationOffset - 1) * count);\n\n headers = ['#', ...headers];\n columnIds = ['#', ...columnIds];\n table = [\n Array.from({ length: longestColumnLength }, (v, i): number => correctedPaginationOffset + i + 1),\n ...table,\n ];\n if (isArray(tableFormat.align)) {\n tableFormat.align = [\n new Array(longestColumnLength).fill('left'),\n ...(tableFormat.align as TableAlignment[][]),\n ];\n }\n if (isArray(tableFormat.cellTypes)) {\n tableFormat.cellTypes = [\n new Array(longestColumnLength).fill('TextCell'),\n ...tableFormat.cellTypes,\n ];\n }\n if (isArray(tableFormat.data)) {\n tableFormat.data = [\n Array.from({ length: longestColumnLength }, (v, i): string => `${i + 1}`),\n ...tableFormat.data,\n ];\n }\n if (isArray(tableFormat.rowBackgroundColors)) {\n if (tableFormat.rowBackgroundColors.length > 0 && isArray(tableFormat.rowBackgroundColors[0])) {\n tableFormat.rowBackgroundColors = [\n new Array(longestColumnLength),\n ...tableFormat.rowBackgroundColors,\n ] as string[][];\n }\n }\n if (isArray(tableFormat.rowColors)) {\n if (tableFormat.rowColors.length > 0 && isArray(tableFormat.rowColors[0])) {\n tableFormat.rowColors = [\n new Array(longestColumnLength),\n ...tableFormat.rowColors,\n ] as string[][];\n }\n }\n if (isArray(tableFormat.sparklineColors)) {\n tableFormat.sparklineColors = [new Array(longestColumnLength), ...tableFormat.sparklineColors];\n }\n if (isArray(tableFormat.sparklineAreaColors)) {\n tableFormat.sparklineAreaColors = [\n new Array(longestColumnLength),\n ...tableFormat.sparklineAreaColors,\n ];\n }\n if (isArray(tableFormat.sparklineTypes)) {\n tableFormat.sparklineTypes = [\n new Array(longestColumnLength).fill('area'),\n ...tableFormat.sparklineTypes,\n ];\n }\n }\n\n const tableHeader: TableHeader = {\n visibility:\n validHeaderVisibilities.indexOf(headerVisibility as TableHeaderVisibility) >= 0\n ? (headerVisibility as TableHeaderVisibility)\n : 'inline',\n cells: table.map((f, i): TableHeaderCell => {\n if (i < headers.length) {\n return generateHeader(\n headers[i],\n columnIds[i],\n i,\n columnFormat,\n tableFormat,\n showInternalFields\n );\n }\n return generateHeader('', '', i, columnFormat, tableFormat, showInternalFields);\n }),\n style: {\n backgroundColor:\n (has(tableFormat, 'headerBackgroundColor') &&\n isColor(tableFormat.headerBackgroundColor) &&\n tableFormat.headerBackgroundColor) ||\n undefined,\n color:\n (has(tableFormat, 'headerColor') &&\n isColor(tableFormat.headerColor) &&\n tableFormat.headerColor) ||\n undefined,\n },\n };\n\n const tableBody: TableBody = { rows: [] };\n\n const tableFooter: TableFooter = {\n rows: [],\n };\n\n const computeBodyRows = (args: {\n table: TableCellValueType[][];\n tableHeader: TableHeader;\n columnFormat: Partial<ColumnFormat>;\n tableFormat: Partial<TableFormat>;\n columnIds: string[];\n showInternalFields: boolean;\n longestColumnLength: number;\n themeFunc?: ThemeFunc;\n }): TableRow[] => {\n const rows: TableRow[] = [];\n const {\n table: t,\n tableHeader: hdr,\n columnFormat: cfmt,\n tableFormat: tfmt,\n columnIds: cids,\n showInternalFields: showInternal,\n longestColumnLength: len,\n themeFunc: themeFn,\n } = args;\n for (let r = 0; r < len; r += 1) {\n const row: TableRow = { key: `row-${r}`, index: r, cells: [] };\n t.forEach((column, i): void => {\n const currentHeader = hdr.cells[i];\n const value = validValueSelector(\n getColumnFormatData(cfmt, currentHeader, r),\n getTableFormatData(tfmt, i, r),\n column[r],\n ''\n );\n const rawValue = column[r];\n // Color cascade: columnFormat -> tableFormat -> theme\n const rowBackgroundColor =\n getColumnFormatRowBgColor(cfmt, currentHeader, r) ||\n getTableFormatRowBgColor(tfmt, i, r) ||\n getThemeRowBgColor(themeFn, r);\n const rowColor =\n getColumnFormatRowColor(cfmt, currentHeader, r) ||\n getTableFormatRowColor(tfmt, i, r) ||\n getThemeRowColor(themeFn);\n const align =\n getColumnFormatAlign(cfmt, currentHeader, r) || getTableFormatAlign(tfmt, i, r) || 'left';\n const cellType =\n getColumnFormatCellType(cfmt, currentHeader, r) ||\n getTableFormatCellType(tfmt, i, r) ||\n 'TextCell';\n const sparklineColor =\n getColumnFormatSparklineColor(cfmt, currentHeader, r) ||\n getTableFormatSparklineColor(tfmt, i, r) ||\n undefined;\n const sparklineAreaColor =\n getColumnFormatSparklineAreaColor(cfmt, currentHeader, r) ||\n getTableFormatSparklineAreaColor(tfmt, i, r) ||\n undefined;\n const sparklineType =\n getColumnFormatSparklineType(cfmt, currentHeader, r) ||\n getTableFormatSparklineType(tfmt, i, r) ||\n 'area';\n const sparklineNullValueDisplay =\n getColumnFormatSparklineNullValueDisplay(cfmt, currentHeader) ||\n getTableFormatSparklineNullValueDisplay(tfmt) ||\n 'gaps';\n const key = generateKey(value as string, `${r}-${i}`);\n const textOverflowType = getTextOverflowType(cfmt, cids[i], tfmt, currentHeader.value);\n const textOverflowStyle = getOverflowStyles({\n textOverflow: textOverflowType as TextOverflow,\n });\n const showCell = !(\n !showInternal &&\n currentHeader.value.charAt(0) === '_' &&\n currentHeader.value !== '_time'\n );\n row.cells.push({\n key,\n value,\n rawValue,\n align,\n cellType,\n rowIndex: r,\n columnIndex: i,\n sparklineColor,\n sparklineAreaColor,\n sparklineType,\n sparklineNullValueDisplay,\n header: currentHeader.value,\n style: {\n backgroundColor: rowBackgroundColor,\n color: rowColor,\n ...textOverflowStyle,\n },\n showCell,\n } as TableRowCell);\n });\n rows.push(row);\n }\n return rows;\n };\n\n tableBody.rows = computeBodyRows({\n table,\n tableHeader,\n columnFormat,\n tableFormat,\n columnIds,\n showInternalFields,\n longestColumnLength,\n themeFunc,\n });\n\n // Build tableFooter from named maps if provided (minimal: value only)\n // FOOTER TOTALS & PERCENTAGES\n const resolveByField = <T extends number | string | TableAlignment>(\n fieldId: string,\n displayName: string,\n map?: Record<string, T>\n ): T | undefined => {\n if (!map) return undefined;\n if (Object.hasOwn(map, fieldId)) return map[fieldId];\n if (Object.hasOwn(map, displayName)) return map[displayName];\n return undefined;\n };\n\n const computeDerivedAlign = (\n colMeta: TableHeaderCell,\n colIdx: number,\n alignOverrides?: Record<string, TableAlignment>\n ): TableAlignment => {\n const fieldId = colMeta.columnId;\n const label = colMeta.value;\n const alignOverride = resolveByField(fieldId, label, alignOverrides);\n return (\n alignOverride ||\n getColumnFormatAlign(columnFormat, colMeta, Math.max(0, longestColumnLength - 1)) ||\n getTableFormatAlign(tableFormat, colIdx, Math.max(0, longestColumnLength - 1)) ||\n 'right'\n );\n };\n\n const buildFooterRow = (\n key: 'footer-totals' | 'footer-percentages',\n styleExtras: { bold?: boolean; opacity?: number },\n rowIndexBase: number\n ): TableRow => {\n const idx = rowIndexBase + tableFooter.rows.length;\n const row: TableRow = { key, index: idx, cells: [] };\n tableHeader.cells.forEach((colMeta, colIdx) => {\n const fieldId = colMeta.columnId;\n const label = colMeta.value;\n // Prefer column-level footer DSL value if present; try both id and label keys\n const columnFooterRaw = columnFormat?.[fieldId]?.footer ?? columnFormat?.[label]?.footer;\n let displayValue: string | number = '';\n if (Array.isArray(columnFooterRaw)) {\n // Expected shape: 1D series [total, percentage]\n displayValue =\n key === 'footer-percentages' ? (columnFooterRaw[1] ?? '') : (columnFooterRaw[0] ?? '');\n } else if (typeof columnFooterRaw !== 'undefined') {\n // Scalar footer: use for totals, blank for percentages\n displayValue = key === 'footer-percentages' ? '' : (columnFooterRaw as string | number);\n } else {\n // No column footer configured; leave blank\n displayValue = '';\n }\n const derivedAlign = computeDerivedAlign(colMeta, colIdx, undefined);\n row.cells.push({\n key: `${key}-${colIdx}`,\n value: displayValue,\n align: derivedAlign,\n style: {\n backgroundColor: tableHeader.style?.backgroundColor || tableHeader.style?.color,\n color: tableHeader.style?.color,\n ...(styleExtras.bold ? { fontWeight: 600 as React.CSSProperties['fontWeight'] } : {}),\n ...(typeof styleExtras.opacity === 'number'\n ? { opacity: styleExtras.opacity as React.CSSProperties['opacity'] }\n : {}),\n },\n } as TableRowCell);\n });\n return row;\n };\n\n if (showFooterTotals) {\n const totalsRow = buildFooterRow('footer-totals', { bold: true }, tableBody.rows.length);\n tableFooter.rows.push(totalsRow);\n }\n if (showFooterPercentages) {\n const percentagesRow = buildFooterRow('footer-percentages', {}, tableBody.rows.length);\n tableFooter.rows.push(percentagesRow);\n }\n\n return {\n tableHeader,\n tableBody,\n tableFooter,\n };\n};\n", "export const SwitchTableCell = ({ type, children }): React.ReactElement =>\n children.filter((child): boolean => child.type.displayName === type);\n", "import * as React from 'react';\nimport SUITable from '@splunk/react-ui/Table';\nimport { TableRowCell } from '../hooks';\n\ninterface TextCellProps {\n cell: TableRowCell;\n useMouseOverEffect: boolean;\n}\nconst noop = () => undefined;\n\nexport const TextCell = ({ cell, useMouseOverEffect }: TextCellProps): React.ReactElement => {\n const { cellStyle, textStyle } = React.useMemo(() => {\n const style = cell.style || {};\n const { whiteSpace, overflow, textOverflow, wordBreak, wordWrap, overflowWrap, ...rest } = style;\n return {\n cellStyle: rest,\n textStyle: { whiteSpace, overflow, textOverflow, wordBreak, wordWrap, overflowWrap },\n };\n }, [cell.style]);\n\n return (\n <SUITable.Cell\n style={cellStyle}\n align={cell.align}\n data-test-cell-type=\"TextCell\"\n data-test-align-value={cell.align}\n data-row-index={cell.rowIndex}\n data-col-index={cell.columnIndex}\n onClick={useMouseOverEffect ? noop : undefined}\n >\n <span style={textStyle}>{cell.value.toString()}</span>\n </SUITable.Cell>\n );\n};\n\nTextCell.displayName = 'TextCell';\n", "import * as React from 'react';\nimport styled from 'styled-components';\nimport SUITable from '@splunk/react-ui/Table';\nimport { createDOMID } from '@splunk/ui-utils/id';\nimport { noop } from 'lodash';\nimport { TableRowCell } from '../hooks';\n\nconst StyledTableCell = styled(SUITable.Cell)`\n & > div {\n flex-direction: column;\n }\n`;\n\nconst ArrayItemDiv = styled.div`\n min-width: 0;\n max-width: 100%;\n`;\ninterface ArrayCellProps {\n cell: TableRowCell;\n useMouseOverEffect: boolean;\n}\n\nexport const ArrayCell = ({ cell, useMouseOverEffect }: ArrayCellProps): React.ReactElement => {\n const value = React.useMemo(() => (Array.isArray(cell.value) ? cell.value : [cell.value]), [cell.value]);\n\n const { cellStyle, itemStyle } = React.useMemo(() => {\n const style = cell.style || {};\n const { whiteSpace, overflow, textOverflow, wordBreak, wordWrap, overflowWrap, ...rest } = style;\n return {\n cellStyle: rest,\n itemStyle: { whiteSpace, overflow, textOverflow, wordBreak, wordWrap, overflowWrap },\n };\n }, [cell.style]);\n\n return (\n <StyledTableCell\n style={cellStyle}\n align={cell.align}\n data-test-align-value={cell.align}\n data-test-cell-type=\"ArrayCell\"\n onClick={useMouseOverEffect ? noop : undefined}\n >\n {value\n .filter(v => v !== null)\n .map(\n (v, i): React.ReactElement => (\n <ArrayItemDiv\n key={createDOMID()}\n data-row-index={cell.rowIndex}\n data-col-index={cell.columnIndex}\n data-array-index={i}\n style={itemStyle}\n >\n {v.toString()}\n </ArrayItemDiv>\n )\n )}\n </StyledTableCell>\n );\n};\nArrayCell.displayName = 'ArrayCell';\n", "\nimport * as defaultImport from \"@splunk/react-ui/Popover\";\nexport * from \"@splunk/react-ui/Popover\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { isArray, isFinite, isNull, keys, max, min, omit } from 'lodash';\nimport styled from 'styled-components';\nimport Popover from '@splunk/react-ui/Popover';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport { createDOMID } from '@splunk/ui-utils/id';\n\nconst StyledSvg = styled.svg`\n /* For fixing IE11 shows overflow part line issue */\n overflow: hidden;\n`;\n\nconst StyledTooltip = styled.div`\n padding: 3px 8px;\n font-size: 12px;\n text-align: center;\n min-width: 20px;\n`;\n\nconst preventDefault = e => e.preventDefault();\n\nclass SparkLine extends Component {\n static propTypes = {\n /**\n * If true, data can contain `null` as a value and is treated as `0`. If false, this throws error when data contains `null`.\n */\n acceptNull: PropTypes.bool,\n /** Array of numbers. These data numbers are converted to points and show on sparkline. */\n data: props => {\n if (!isArray(props.data)) {\n return new Error('Data provided to Sparkline must be an array.');\n }\n\n if (props.acceptNull && !props.data.every(value => isNull(value) || isFinite(value))) {\n return new Error('Data provided to Sparkline must be finite numbers or null.');\n }\n\n if (!props.acceptNull && !props.data.every(value => isFinite(value))) {\n return new Error('Data provided to Sparkline must be finite numbers.');\n }\n return null;\n },\n /** A React ref which is set to the DOM element when the component mounts and `null` when it unmounts. */\n elementRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),\n /** Sets the number of end dots to display. When showEndDot is set to `true`, endDotCount is at least 1. If set to a positive value, this overrides showEndDot. */\n endDotCount: PropTypes.number,\n /** Fills color to the end dot. */\n endDotFillColor: PropTypes.string,\n /**\n * Sets end dot radius. End dot radius must be less than or equal to the margin. By default, its value equals the margin.\n */\n endDotRadius: PropTypes.number,\n /** Sets end dot circle stroke color. */\n endDotStroke: PropTypes.string,\n /** Sets end dot circle stroke width in pixels. */\n endDotStrokeWidth: PropTypes.number,\n /** Fills color to area. */\n fillColor: PropTypes.string,\n /** Fills opacity to area. Value must be in 0 ~ 1. */\n fillOpacity: PropTypes.string,\n /** Sets cursor stroke color. */\n cursorStroke: PropTypes.string,\n /** Sets cursor stroke width in pixels. */\n cursorStrokeWidth: PropTypes.number,\n /** Sets cursor line cap style. */\n cursorStrokeLinecap: PropTypes.oneOf(['butt', 'round', 'square']),\n /** Sets cursor dash array style. */\n cursorStrokeDasharray: PropTypes.string,\n /**\n * Container height. If this value is specified, sparkline calculates the size using this height. If height isn't specified,\n * sparkline figures out the container height by itself.\n */\n height: PropTypes.number.isRequired,\n /** When set to `true`, sparkline shows as area. */\n isArea: PropTypes.bool,\n /** The sparkline line color. */\n lineColor: PropTypes.string,\n /** Allows user to draw only the last data points for the line. */\n lineLength: PropTypes.number,\n /** The sparkline line stroke width in pixels. */\n lineStrokeWidth: PropTypes.number,\n /** Enable to show end dot. */\n showEndDot: PropTypes.bool,\n /** Enable to show tooltip. */\n showTooltip: PropTypes.bool,\n /** Sets the data value range and maximum value shown on sparkline. */\n yMax: PropTypes.number,\n /** Sets the data value range and minimum value shown on sparkline. */\n yMin: PropTypes.number,\n /**\n * The width of the container.\n */\n width: PropTypes.number.isRequired,\n /** Sets the a11y title text on sparkline. */\n title: PropTypes.string,\n };\n\n static defaultProps = {\n acceptNull: false,\n data: [],\n showTooltip: true,\n endDotCount: 0,\n showEndDot: false,\n endDotRadius: 0,\n endDotFillColor: 'white',\n endDotStroke: 'black',\n endDotStrokeWidth: 0,\n fillColor: '#65a637',\n fillOpacity: '.1',\n cursorStroke: '#5184AF',\n cursorStrokeWidth: 3,\n cursorStrokeLinecap: 'square',\n cursorStrokeDasharray: '1, 5',\n isArea: false,\n lineColor: '#65a637',\n lineStrokeWidth: 1,\n };\n\n constructor(props, ...rest) {\n super(props, ...rest);\n this.state = {\n anchor: null,\n activeIndex: 0,\n hoveredIndex: null,\n componentIsFocused: false,\n };\n this.titleId = createDOMID('sparkline-title');\n this.pointRefs = [];\n this.containerRef = React.createRef();\n\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleMouseOver = this.handleMouseOver.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleFocus = this.handleFocus.bind(this);\n this.handleBlur = this.handleBlur.bind(this);\n }\n\n handleFocus(event) {\n const { target } = event;\n const { pointIndex: pointIndexStr } = target.dataset || {};\n const { activeIndex, componentIsFocused, hoveredIndex } = this.state;\n\n if (pointIndexStr !== undefined) {\n // focus event propagated from a datapoint\n const pointIndex = Number.parseInt(pointIndexStr, 10);\n if (activeIndex !== pointIndex || !componentIsFocused || hoveredIndex !== null) {\n this.setState({\n activeIndex: pointIndex,\n hoveredIndex: null,\n componentIsFocused: true,\n });\n }\n } else if (this.pointRefs.length > 0) {\n // focus set programmatically or by user agent\n const indexToFocus = activeIndex ? Math.min(this.pointRefs.length - 1, activeIndex) : 0;\n this.pointRefs[indexToFocus].focus();\n }\n }\n\n handleBlur(event) {\n if (this.containerRef.current && !this.containerRef.current.contains(event.relatedTarget)) {\n this.setState({ componentIsFocused: false });\n }\n }\n\n handleKeyDown(event) {\n const { data } = this.props;\n const { activeIndex } = this.state;\n const numPoints = data.length;\n\n if (numPoints === 0) {\n return;\n }\n\n const allowedKeys = ['ArrowLeft', 'ArrowRight', 'Home', 'End'];\n if (!allowedKeys.includes(event.key)) {\n return;\n }\n\n let newIndex;\n\n switch (event.key) {\n case 'Home':\n newIndex = 0;\n break;\n case 'End':\n newIndex = numPoints - 1;\n break;\n case 'ArrowLeft':\n newIndex = Math.max(0, activeIndex - 1);\n break;\n case 'ArrowRight':\n newIndex = Math.min(numPoints - 1, activeIndex + 1);\n break;\n default:\n return;\n }\n\n if (newIndex !== activeIndex) {\n event.preventDefault();\n if (this.pointRefs[newIndex]) {\n this.pointRefs[newIndex].focus();\n }\n }\n }\n\n handleMouseOver(event) {\n const pointIndexStr = event.target.dataset && event.target.dataset.pointIndex;\n if (pointIndexStr !== undefined) {\n const pointIndex = Number.parseInt(pointIndexStr, 10);\n if (this.state.hoveredIndex !== pointIndex) {\n this.setState({ hoveredIndex: pointIndex });\n }\n }\n }\n\n handleMouseLeave() {\n if (this.state.hoveredIndex !== null) {\n this.setState({ hoveredIndex: null });\n }\n }\n\n getMax() {\n const { data, acceptNull, yMax } = this.props;\n const dataMax = () => (acceptNull ? max(this.fillNull()) : max(data));\n return yMax === undefined ? dataMax() : yMax;\n }\n\n getMin() {\n const { data, acceptNull, yMin } = this.props;\n const dataMin = () => (acceptNull ? min(this.fillNull()) : min(data));\n return yMin === undefined ? dataMin() : yMin;\n }\n\n /**\n * Gets unit value of x axis.\n * @param {Number} xMargin - margin of x axis.\n * @return {Number} unit value of x axis.\n * @private\n */\n getXUnit(xMargin) {\n const { data, width } = this.props;\n // Calculate xUnit. Width substract the left margin and right margin, then divide by data length.\n const xUnit = (width - xMargin * 2) / (data.length > 1 ? data.length - 1 : 1);\n return Math.max(0, xUnit);\n }\n\n /**\n * Gets unit value of y axis.\n * @param {String} yMargin - margin of y axis.\n * @return {Number} unit value of y axis.\n * @private\n */\n getYUnit(yMargin) {\n const { height } = this.props;\n const maxValue = this.getMax();\n const minValue = this.getMin();\n\n // Calculate yUnit. Height substract the upper margin and bottom margin, then divide by value range of values in data.\n // if the maxValue equals minValue, means all values in data are the same, then, we need to set the YUnit at the mid value of Height.\n // So, draws sparkline right in the mid of the container.\n const yUnit = (height - yMargin * 2) / (maxValue - minValue || 2);\n return Math.max(0, yUnit);\n }\n\n /**\n * Get a list of arrays of points for drawing lines, based on acceptNull property\n * @method getSegmentSets\n * @param {Array} data\n * @param {Array} points\n * @returns {Object} Object containing lines (arrays of points for polylines) and isolatedPoints (single points surrounded by nulls)\n */\n getSegmentSets(data, points) {\n const { acceptNull } = this.props;\n const lines = [];\n const isolatedPoints = [];\n let currentLine = [];\n // eslint-disable-next-line\n for (const [idx, p] of data.entries()) {\n // Found null data\n if (!acceptNull && isNull(p)) {\n // need at least 2 points to draw a segment\n if (currentLine.length > 1) {\n lines.push(currentLine);\n } else if (currentLine.length === 1) {\n // Single point surrounded by nulls - this is an isolated point\n isolatedPoints.push(currentLine[0]);\n }\n // reset for the next segment\n currentLine = [];\n } else {\n // data is good, add point data\n currentLine.push(points[idx]);\n }\n }\n\n // Add the last line or isolated point\n if (currentLine.length > 1) {\n lines.push(currentLine);\n } else if (currentLine.length === 1) {\n isolatedPoints.push(currentLine[0]);\n }\n\n return { lines, isolatedPoints };\n }\n\n handleCursorMount = el => {\n this.setState({\n anchor: el,\n });\n };\n\n /**\n * Utility for fill null value with number 0.\n * @private\n */\n fillNull() {\n const { data } = this.props;\n return data.map(value => (value === null ? 0 : value));\n }\n\n /**\n * Converts data to points in svg\n * @param {Number} xMargin - margin of x axis.\n * @param {Number} yMargin - margin of x axis.\n * @return {Array} points coordination.\n * @private\n */\n dataToPoints(xMargin, yMargin) {\n const { data } = this.props;\n const xUnit = this.getXUnit(xMargin);\n const yUnit = this.getYUnit(yMargin);\n const maxValue = this.getMax();\n const minValue = this.getMin();\n return data\n .map((val, idx) => ({\n x: idx * xUnit + xMargin,\n y: maxValue === minValue ? yUnit + yMargin : (maxValue - val) * yUnit + yMargin,\n }))\n .map(p => [p.x, p.y]);\n }\n\n /**\n * Renders rect area for each datapoint for interactions and screen reader support\n * @param {Array} points - array of points coordination.\n * @param {Number} xMargin - margin of x axis.\n * @return {Array} array of svg rect objects\n * @private\n */\n renderRect(points, xMargin) {\n const { data, height, showTooltip } = this.props;\n const xUnit = this.getXUnit(xMargin);\n\n return points.map((p, i) => (\n /* eslint-disable react/no-array-index-key */\n <rect\n key={`${i}_${p[0]}`}\n role=\"graphics-symbol\"\n aria-label={`Value: ${data[i] === null ? 'N/A' : data[i]}, point ${i + 1} of ${data.length}`}\n data-test={`rect-${i}`}\n data-point-index={i}\n tabIndex={showTooltip && this.state.activeIndex === i ? 0 : -1}\n ref={el => {\n this.pointRefs[i] = el;\n }}\n x={Math.max(0, p[0] - xUnit / 2)}\n y={0}\n width={i === 0 && data.length !== 1 ? xUnit / 2 : xUnit}\n height={height}\n style={{ fillOpacity: 0 }}\n onMouseDown={preventDefault} // do not take focus on click\n />\n /* eslint-enable react/no-array-index-key */\n ));\n }\n\n // Renders area chart\n renderArea(points) {\n const { data, fillColor, fillOpacity, height, isArea } = this.props;\n\n if (!isArea || points.length === 0) {\n return null;\n }\n\n const { lines } = this.getSegmentSets(data, points);\n const segments = lines.map(s =>\n s.concat([\n [s.at(-1)[0], height], // down to bottom of graph\n [s[0][0], height], // over to below first data point\n s[0], // up to first data point to close the box\n ])\n );\n\n return (\n <g data-test=\"area\">\n {segments.map(s => (\n <polyline\n key={`area${s.join('')}`}\n points={s.join(' ')}\n data-test=\"area-line\"\n style={{\n fill: fillColor,\n fillOpacity,\n strokeWidth: '0',\n }}\n />\n ))}\n </g>\n );\n }\n\n renderCursor(currentPointX, shouldRender) {\n const { cursorStroke, cursorStrokeWidth, cursorStrokeLinecap, cursorStrokeDasharray, height } =\n this.props;\n\n return (\n shouldRender && (\n <line\n data-test=\"cursor\"\n ref={this.handleCursorMount}\n x1={currentPointX}\n y1={0}\n x2={currentPointX}\n y2={height}\n style={{\n stroke: cursorStroke,\n strokeWidth: cursorStrokeWidth,\n strokeLinecap: cursorStrokeLinecap,\n strokeDasharray: cursorStrokeDasharray,\n }}\n />\n )\n );\n }\n\n renderTooltip(tooltipValue, isOpen) {\n const { anchor } = this.state;\n // Display '-' for null values, consistent with canvas chart tooltips\n const displayValue = tooltipValue === null ? '-' : tooltipValue;\n\n return (\n <Popover\n data-test=\"tooltip\"\n open={isOpen}\n anchor={anchor}\n data-test-value={tooltipValue}\n appearance=\"inverted\"\n defaultPlacement=\"above\"\n animation={false}\n >\n <StyledTooltip>{displayValue}</StyledTooltip>\n </Popover>\n );\n }\n\n /**\n * Renders one or more svg circles to highlight values on the sparkline\n * @method renderEndDots\n * @param {Array[Array[Number]]} points // x,y coordinates of values\n * @param {Number} dotsToShow // number of end dots to display\n * @param {Number} xMargin // used when calculating the dot radius\n * @returns {Object} React representation of SVG group\n * @private\n */\n renderEndDots(points, dotsToShow, xMargin) {\n const { endDotFillColor, endDotRadius, endDotStroke, endDotStrokeWidth } = this.props;\n\n return (\n <g>\n {points.slice(-dotsToShow).map(point => (\n <circle\n key={`end-dot${point[0]}${point[1]}`}\n data-test=\"end-dot\"\n cx={point[0]}\n cy={point[1]}\n r={endDotRadius === 0 ? xMargin : endDotRadius}\n style={{\n fill: endDotFillColor,\n stroke: endDotStroke,\n strokeWidth: endDotStrokeWidth,\n }}\n />\n ))}\n </g>\n );\n }\n\n /**\n * Renders circles for isolated points (single data points surrounded by nulls)\n * These would otherwise be invisible since a line requires at least 2 points\n * @method renderIsolatedPoints\n * @param {Array} isolatedPoints - Array of [x, y] coordinates for isolated points\n * @returns {Object} SVG Group of circles\n */\n renderIsolatedPoints(isolatedPoints) {\n const { lineColor, lineStrokeWidth } = this.props;\n\n if (!isolatedPoints || isolatedPoints.length === 0) {\n return null;\n }\n\n // Use a radius slightly larger than line width for visibility\n const radius = lineStrokeWidth + 0.5;\n\n return (\n <g data-test=\"isolated-points\">\n {isolatedPoints.map(point => (\n <circle\n key={`isolated-${point[0]}-${point[1]}`}\n data-test=\"isolated-point\"\n cx={point[0]}\n cy={point[1]}\n r={radius}\n style={{\n fill: lineColor,\n }}\n />\n ))}\n </g>\n );\n }\n\n /**\n * Renders the line(s) above the area graph\n * @method renderPolyline\n * @param {Array} points\n * @returns {Object} SVG Group of polylines and isolated points\n */\n renderPolyline(points) {\n const { data, lineColor, lineLength, lineStrokeWidth } = this.props;\n\n const linePoints = isFinite(lineLength) && lineLength > 0 ? lineLength : points.length;\n const { lines, isolatedPoints } = this.getSegmentSets(\n data.slice(-linePoints),\n points.slice(-linePoints)\n );\n\n return (\n <g data-test=\"sparkline\">\n {lines.map(lineData => (\n <polyline\n key={`line${lineData.join('')}`}\n data-test=\"polyline\"\n style={{\n fill: 'none',\n stroke: lineColor,\n strokeWidth: lineStrokeWidth,\n strokeLinejoin: 'round',\n strokeLinecap: 'round',\n }}\n points={lineData.join(' ')}\n />\n ))}\n {this.renderIsolatedPoints(isolatedPoints)}\n </g>\n );\n }\n\n getInteractionState({ data, points, showTooltip, activeIndex, hoveredIndex, componentIsFocused }) {\n if (!showTooltip) {\n return {\n currentPointX: null,\n tooltipValue: null,\n showCursorAndTooltip: false,\n interactiveProps: {},\n };\n }\n\n const interactiveProps = {\n onKeyDown: this.handleKeyDown,\n onMouseOver: this.handleMouseOver,\n onMouseLeave: this.handleMouseLeave,\n onFocus: this.handleFocus,\n onBlur: this.handleBlur,\n };\n\n const isHovered = hoveredIndex !== null;\n const shouldDisplayInteractiveElements = (isHovered || componentIsFocused) && data.length > 0;\n\n if (!shouldDisplayInteractiveElements) {\n return {\n currentPointX: null,\n tooltipValue: null,\n showCursorAndTooltip: false,\n interactiveProps,\n };\n }\n\n const displayIndex = isHovered ? hoveredIndex : activeIndex;\n const isValidIndex = displayIndex !== null && displayIndex >= 0;\n const withinBounds = isValidIndex && displayIndex < data.length && displayIndex < points.length;\n\n if (!withinBounds) {\n return {\n currentPointX: null,\n tooltipValue: null,\n showCursorAndTooltip: false,\n interactiveProps,\n };\n }\n\n const displayPointCoords = points[displayIndex];\n const currentPointX = displayPointCoords ? displayPointCoords[0] : null;\n const tooltipValue = data[displayIndex];\n\n return {\n currentPointX,\n tooltipValue,\n showCursorAndTooltip: currentPointX !== null,\n interactiveProps,\n };\n }\n\n render() {\n const {\n data,\n elementRef,\n showTooltip,\n showEndDot,\n endDotRadius,\n endDotStrokeWidth,\n endDotCount,\n height,\n isArea,\n lineStrokeWidth,\n width,\n title,\n } = this.props;\n const { activeIndex, hoveredIndex, componentIsFocused } = this.state;\n\n if (data.length === 0) {\n return null;\n }\n\n if (this.pointRefs.length !== data.length) {\n // remove stale point refs when data changes\n this.pointRefs.length = data.length;\n }\n\n // Calculate horizontal and vertical margin so that fit line or end dot.\n const xMargin = endDotRadius + endDotStrokeWidth / 2;\n const yMargin = Math.max(lineStrokeWidth / 2, endDotRadius + endDotStrokeWidth / 2);\n\n const points = this.dataToPoints(xMargin, yMargin);\n\n const dotsToShow = Math.max(showEndDot && 1, isFinite(endDotCount) && endDotCount > 0 && endDotCount);\n\n const { currentPointX, tooltipValue, showCursorAndTooltip, interactiveProps } =\n this.getInteractionState({\n data,\n points,\n showTooltip,\n activeIndex,\n hoveredIndex,\n componentIsFocused,\n });\n\n const ariaLabel = title || _('Source count over time sparkline trend');\n\n return (\n <div\n data-test=\"line\"\n data-test-type={isArea ? 'area' : 'line'}\n ref={el => {\n this.containerRef.current = el;\n if (typeof elementRef === 'function') {\n elementRef(el);\n } else if (elementRef && typeof elementRef === 'object') {\n elementRef.current = el;\n }\n }}\n {...interactiveProps}\n {...omit(this.props, keys(SparkLine.propTypes))}\n >\n <StyledSvg\n height={height}\n width={width}\n aria-labelledby={this.titleId}\n data-test=\"sparkline-svg\"\n >\n <title id={this.titleId} data-test=\"sparkline-title\">\n {ariaLabel}\n </title>\n <g>\n {showTooltip ? this.renderCursor(currentPointX, showCursorAndTooltip) : null}\n {this.renderPolyline(points)}\n {this.renderArea(points)}\n {dotsToShow ? this.renderEndDots(points, dotsToShow, xMargin) : null}\n {this.renderRect(points, xMargin)}\n {showTooltip ? this.renderTooltip(tooltipValue, showCursorAndTooltip) : null}\n </g>\n </StyledSvg>\n </div>\n );\n }\n}\n\nexport default SparkLine;\n", "import * as React from 'react';\nimport SUITable from '@splunk/react-ui/Table';\nimport SparkLine from '../../SparkLine/SparkLine';\nimport { TableRowCell, TableCellValueType, SparklineNullValueDisplay } from '../hooks';\n\ninterface SparklineCellProps {\n cell: TableRowCell;\n useMouseOverEffect: boolean;\n width: number | 'auto';\n}\n\nconst paddingLeftRight = 5;\nconst paddingTopBottom = 3;\n\nconst parseSparklineData = (data: TableCellValueType): (number | null)[] =>\n (Array.isArray(data) ? data : [data]).map((d): number | null => {\n const str = d?.toString() ?? '';\n if (str.trim() === '') {\n return null;\n }\n const num = Number(str);\n return Number.isNaN(num) ? null : num;\n });\n\nconst processDataForNullDisplay = (\n data: (number | null)[],\n nullValueDisplay: SparklineNullValueDisplay\n): (number | null)[] => {\n if (nullValueDisplay === 'connect') {\n return data.filter((d): d is number => d !== null);\n }\n return data;\n};\n\nconst getAcceptNull = (nullValueDisplay: SparklineNullValueDisplay): boolean => {\n return nullValueDisplay === 'zero';\n};\n\nconst noop = () => undefined;\nconst svgStyle = { height: 0 };\nconst dummySVG = <svg style={svgStyle} />;\n\nexport const SparklineCell = ({\n cell,\n useMouseOverEffect,\n width,\n}: SparklineCellProps): React.ReactElement => {\n const [cellEl, setEl] = React.useState<HTMLTableCellElement>();\n const [height, setHeight] = React.useState<number>();\n const nullValueDisplay = cell.sparklineNullValueDisplay || 'gaps';\n let data = React.useMemo<(number | null)[]>(() => {\n const parsed = parseSparklineData(cell.value);\n return processDataForNullDisplay(parsed, nullValueDisplay);\n }, [cell.value, nullValueDisplay]);\n if (cell.value[0] === '##__SPARKLINE__##') {\n data = data.slice(1);\n }\n const acceptNull = getAcceptNull(nullValueDisplay);\n\n React.useLayoutEffect(() => {\n setHeight(cellEl?.offsetHeight || 20);\n }, [cellEl]);\n\n const cellStyle = React.useMemo(\n () => ({\n ...cell.style,\n padding: 0,\n margin: 0,\n width,\n height: `${height}px`,\n }),\n [cell.style, width, height]\n );\n\n const lineStyle = React.useMemo(\n () => ({\n paddingLeft: `${paddingLeftRight}px`,\n paddingTop: `${paddingTopBottom}px`,\n // eslint-disable-next-line no-unsafe-optional-chaining\n width: width === 'auto' ? `${cellEl?.offsetWidth - paddingLeftRight * 2}px` : `${width}px`,\n height: `${height - paddingTopBottom * 2}px`,\n }),\n [height, width, cellEl]\n );\n\n return (\n <SUITable.Cell\n style={cellStyle}\n align=\"left\"\n elementRef={setEl}\n data-test-align-value=\"left\"\n data-test-cell-type=\"SparklineCell\"\n data-row-index={cell.rowIndex}\n data-col-index={cell.columnIndex}\n onClick={useMouseOverEffect ? noop : undefined}\n >\n {height ? (\n <SparkLine\n style={lineStyle}\n data={data}\n // eslint-disable-next-line no-unsafe-optional-chaining\n width={cellEl?.offsetWidth - paddingLeftRight * 2}\n height={height - paddingTopBottom * 2}\n isArea={cell.sparklineType === 'area'}\n acceptNull={acceptNull}\n lineColor={cell.sparklineColor}\n fillColor={cell.sparklineAreaColor}\n />\n ) : (\n dummySVG\n )}\n </SUITable.Cell>\n );\n};\n\nSparklineCell.displayName = 'SparklineCell';\n", "export const VIZ_FONT_FAMILY =\n \"'Splunk Platform Sans', 'Splunk Data Sans', Roboto, Droid, 'Helvetica Neue', Helvetica, Arial, sans-serif\";\n\n/**\n * Return text width\n * @method computeTextWidth\n * @param {String} text\n * @param {String} font\n * @returns {Number} width of text with font\n */\nexport const computeTextWidth = (text: string, font: string): number => {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n context.font = font;\n const measure = context.measureText(text);\n return measure.width;\n};\n\n/**\n * Return truncated text\n * @method truncateText\n * @param {String} text\n * @param {Number} maxWidth\n * @param {String} truncationType\n * @param {String} font\n * @returns {String} truncated text\n */\nexport const truncateText = (\n text: string,\n maxWidth: number,\n truncationType: 'ellipsisEnd' | 'ellipsisMiddle' | 'ellipsisStart',\n font = `10px ${VIZ_FONT_FAMILY}`\n): string => {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) return text;\n\n context.font = font;\n\n const ellipsis = '...';\n const ellipsisWidth = context.measureText(ellipsis).width;\n const fullTextWidth = context.measureText(text).width;\n\n if (fullTextWidth <= maxWidth) {\n return text;\n }\n\n if (truncationType === 'ellipsisEnd') {\n for (let i = text.length - 1; i > 0; i -= 1) {\n const truncatedText = text.slice(0, i) + ellipsis;\n if (context.measureText(truncatedText).width <= maxWidth) {\n return truncatedText;\n }\n }\n } else if (truncationType === 'ellipsisStart') {\n for (let i = 0; i < text.length; i += 1) {\n const truncatedText = ellipsis + text.slice(i);\n if (context.measureText(truncatedText).width <= maxWidth) {\n return truncatedText;\n }\n }\n } else if (truncationType === 'ellipsisMiddle') {\n for (let i = 0; i < text.length / 2; i += 1) {\n const left = text.slice(0, Math.floor(text.length / 2) - i);\n const right = text.slice(Math.ceil(text.length / 2) + i);\n const truncatedText = left + ellipsis + right;\n if (\n context.measureText(left).width + ellipsisWidth + context.measureText(right).width <=\n maxWidth\n ) {\n return truncatedText;\n }\n }\n }\n\n return ellipsis;\n};\n", "import * as React from 'react';\nimport * as T from 'prop-types';\nimport { cloneDeep, noop } from 'lodash';\nimport debounce from 'lodash/debounce';\nimport styled, { css } from 'styled-components';\n\nimport { _ } from '@splunk/ui-utils/i18n';\nimport SUITable from '@splunk/react-ui/Table';\nimport Paginator from '@splunk/react-ui/Paginator';\nimport Message from '@splunk/react-ui/Message';\nimport { isColor } from '@splunk/visualizations-shared/colorUtils';\nimport { toDimension } from '@splunk/visualizations-shared/style';\nimport variables from '@splunk/themes/variables';\nimport {\n validCellRenderers,\n validSparklineTypes,\n validAlignments,\n validHeaderVisibilities,\n TableHeaderVisibility,\n validColumnAlignments,\n} from '@splunk/visualization-schemas';\n\nimport { FieldEntry } from '@splunk/visualizations-shared/dataSourceUtils';\nimport {\n TableCellValueType,\n TableRowCell,\n useTable,\n TableHeaderStyle,\n TableBody,\n TableHeader,\n TableFooter,\n TableFormat,\n ColumnFormat,\n} from './hooks';\n\nimport { SwitchTableCell, TextCell, ArrayCell, SparklineCell } from './cells';\nimport { PaginatorParamsPropTypes, PaginatorParams } from '../common/hooks/usePagination';\nimport { SortParamsPropTypes, SortParams } from '../common/hooks/useSorting';\nimport withFixedSizeContainer from '../common/hocs/FixedSizeContainer';\nimport { VIZ_FONT_FAMILY } from '../common/utils/textUtils';\n\nexport const MINIMUM_COLUMN_SIZE = 60;\nexport const INITIAL_UNSET_COLUMN_WIDTH = 90;\nexport const COMPACT_PAGINATOR_WIDTH_THRESHOLD = 350;\ninterface TableCellClickPayload {\n /* user should be able to use value to drilldown */\n value: string | number;\n // other details user can use to for building complex drilldown/tokens\n\n /* nth - column. starts at 0. row number column is ignored */\n cellIndex: number;\n\n /* nth - row */\n rowIndex: number;\n\n /* field name from the table header */\n fieldValue: string;\n name: string;\n\n /* displayed table cell value. This could be formatted data */\n cellValue: TableCellValueType;\n\n /* Raw unformatted data */\n cellRawValue: TableCellValueType;\n\n /* cell values of all cells of clicked row with the field and value - in shape row.<field>.value */\n [key: string]: TableCellValueType | TableCellValueType[];\n}\n\nexport interface PureTableProps {\n backgroundColor?: string;\n count?: number;\n mode?: string;\n width?: number;\n height?: number;\n headers?: string[];\n columnIds?: string[];\n headersMetadata?: FieldEntry[];\n table?: TableCellValueType[][];\n headerVisibility?: TableHeaderVisibility;\n showRowNumbers?: boolean;\n showInternalFields?: boolean;\n showFooterTotals?: boolean;\n showFooterPercentages?: boolean;\n tableBody?: TableBody;\n tableHeader?: TableHeader;\n tableFooter?: TableFooter;\n tableFormat?: Partial<TableFormat>;\n columnFormat?: Partial<ColumnFormat>;\n sortParams?: SortParams;\n paginatorParams?: PaginatorParams;\n onCellClick?: ({ e, payload }: { e: Event; payload: TableCellClickPayload }) => void;\n onColumnFormatChange?: (columnFormat: Partial<ColumnFormat>) => void;\n font?: string;\n fontSize?: string;\n eventHandlers?: Array<{\n type: string;\n options: {\n url?: string;\n fields: string[];\n };\n }>;\n hasEventHandlers?: boolean;\n}\n\nconst NonVisibleTableHead = styled(SUITable.Head)`\n pointer-events: none;\n & [data-test='head-cell'] > div {\n display: none;\n }\n`;\n\nconst FixedTableHead = styled(SUITable.Head)`\n position: sticky;\n top: 0;\n`;\n\nconst headerTextOverflowStyles = {\n ellipsis: `\n word-break: inherit;\n word-wrap: inherit;\n white-space: nowrap;\n display: inline;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n anywhere: `\n word-break: break-all;\n white-space: inherit;\n display: inline;\n `,\n default: `\n word-break: inherit;\n word-wrap: inherit;\n white-space: inherit;\n display: inline;\n `,\n};\n\nconst TableHeadCell = styled(SUITable.HeadCell)<{\n textOverflowType?: string;\n}>`\n button > span {\n ${(props): string =>\n headerTextOverflowStyles[props.textOverflowType as keyof typeof headerTextOverflowStyles] ||\n headerTextOverflowStyles.default}\n }\n`;\n\nconst VizTableContainer = styled.div<{\n backgroundColor: string;\n}>`\n box-sizing: border-box;\n padding: ${variables.spacingSmall};\n background-color: ${(props): string =>\n (isColor(props.backgroundColor) && props.backgroundColor) || props.theme.defaultBackgroundColor};\n display: flex;\n flex-flow: column nowrap;\n overflow: hidden !important;\n height: 100%;\n\n /* footer totals row styling */\n tr[data-test='footer-row-totals'] td[data-test='cell'] {\n color: ${variables.contentColorActive} !important;\n cursor: default;\n font-weight: bold;\n }\n\n /* footer percentage row styling */\n tr[data-test='footer-row-percentages'] td[data-test='cell'] {\n color: ${variables.contentColorDefault} !important;\n cursor: default;\n }\n`;\nVizTableContainer.displayName = 'VizTableContainer';\n\nconst PAGINATOR_CONTAINER_HEIGHT = 38;\nconst PAGINATOR_SPACING = 5;\nconst SUITableContainer = styled.div<{\n headerStyle?: TableHeaderStyle;\n width: string | number;\n height: string | number;\n isPaging: boolean;\n font: string;\n fontSize: string;\n lineHeight: string;\n isFullyFixed: boolean;\n}>`\n & * {\n font-family: ${(props): string => props.font};\n font-size: ${(props): string => props.fontSize};\n line-height: ${(props): string => props.lineHeight};\n }\n box-sizing: border-box;\n flex-grow: 1;\n overflow: auto;\n\n ${({ width, height, isPaging, theme }: any): string => {\n const padding = variables.spacingSmall({ theme });\n const paddingOffset = parseInt(padding, 10) * 2;\n const calculatedHeight = isPaging\n ? height - PAGINATOR_CONTAINER_HEIGHT - PAGINATOR_SPACING - paddingOffset\n : height - paddingOffset;\n // Ensure height is never negative (minimum 1px to maintain valid CSS)\n const finalHeight = Math.max(calculatedHeight, 1);\n return toDimension({\n width: width - paddingOffset,\n height: finalHeight,\n });\n }};\n\n ${({ isPaging }): string =>\n isPaging &&\n `\n margin-bottom: ${PAGINATOR_SPACING}px;\n `};\n\n ${({ headerStyle }) =>\n headerStyle &&\n headerStyle.backgroundColor &&\n css`\n & [data-test='head-cell'] {\n background-color: ${headerStyle.backgroundColor};\n }\n `}\n\n ${({ headerStyle }) =>\n headerStyle &&\n headerStyle.color &&\n css`\n & [data-test='head-cell'] > div > button > span {\n color: ${headerStyle.color};\n }\n `}\n\n /* Footer cells should match header background for both totals and percentages */\n ${({ headerStyle }) =>\n headerStyle &&\n (headerStyle.backgroundColor || headerStyle.color) &&\n css`\n tr[data-test='footer-row-totals'] td[data-test='cell'],\n tr[data-test='footer-row-percentages'] td[data-test='cell'] {\n background-color: ${headerStyle.backgroundColor || headerStyle.color} !important;\n }\n `}\n\n /* To accomodate custom logic that diverges from default resizableFillLayout behavior - allows the columns to shrink beneath Table width when columns are fixed */\n [data-test=\"main-table\"] {\n ${({ isFullyFixed }) =>\n isFullyFixed &&\n css`\n width: fit-content;\n min-width: unset;\n `}\n td {\n white-space: pre-wrap; // css override to render text with newline/ line-breaks and tabs/ spaces properly\n }\n }\n` as any;\nSUITableContainer.displayName = 'SUITableContainer';\n\nconst PaginatorContainer = styled.div`\n position: relative;\n text-align: right;\n height: ${PAGINATOR_CONTAINER_HEIGHT}px;\n`;\nPaginatorContainer.displayName = 'PaginatorContainer';\n\n// allow for early return in case of empty tableBody while still following hook rules\nconst withEmptyTableMessage = (Viz): React.FunctionComponent<PureTableProps> => {\n const Wrapper = (props: PureTableProps): React.ReactElement => {\n const {\n headers,\n columnIds,\n table,\n headerVisibility,\n showRowNumbers,\n showInternalFields,\n tableFormat,\n columnFormat,\n paginatorParams,\n count,\n headersMetadata,\n } = props;\n const { tableHeader, tableBody, tableFooter } = useTable({\n headers,\n columnIds,\n table,\n headerVisibility,\n showRowNumbers,\n showInternalFields,\n headersMetadata,\n showFooterTotals: (props as any).showFooterTotals,\n showFooterPercentages: (props as any).showFooterPercentages,\n tableFormat: {\n ...tableFormat,\n ...(tableFormat?.headerAlign && {\n headerAlign: cloneDeep(tableFormat.headerAlign),\n }),\n ...(tableFormat?.align && {\n align: cloneDeep(tableFormat.align),\n }),\n ...(tableFormat?.cellTypes && {\n cellTypes: cloneDeep(tableFormat.cellTypes),\n }),\n ...(tableFormat?.data && { data: cloneDeep(tableFormat.data) }),\n ...(tableFormat?.rowBackgroundColors && {\n rowBackgroundColors: cloneDeep(tableFormat.rowBackgroundColors),\n }),\n ...(tableFormat?.rowColors && {\n rowColors: cloneDeep(tableFormat.rowColors),\n }),\n },\n columnFormat,\n paginationOffset: paginatorParams?.current,\n count,\n });\n\n if (tableBody.rows.length === 0) {\n return <Message type=\"warning\">{_('No data!')}</Message>;\n }\n\n return <Viz {...props} tableHeader={tableHeader} tableBody={tableBody} tableFooter={tableFooter} />;\n };\n\n Wrapper.displayName = 'PureTableWrapper';\n return Wrapper;\n};\n\nconst useTableHead = (visibility: TableHeaderVisibility) => {\n if (visibility === 'none') {\n return NonVisibleTableHead;\n }\n\n if (visibility === 'fixed') {\n return FixedTableHead;\n }\n\n return SUITable.Head;\n};\n\nconst HeadCell = ({ value, textOverflowType, ...props }: any) => {\n const cellRef = React.useRef(null);\n return (\n <TableHeadCell elementRef={cellRef} textOverflowType={textOverflowType} {...props}>\n {value}\n </TableHeadCell>\n );\n};\n\nconst fontMap: Record<string, string> = {\n proportional: VIZ_FONT_FAMILY,\n monospace: 'Splunk Platform Mono',\n};\n\nconst fontSizeMap: Record<string, string> = {\n extraSmall: '10px',\n small: '12px',\n default: '14px',\n large: '16px',\n};\n\nconst rowHeightMap: Record<string, string> = {\n extraSmall: '12px',\n small: '12px',\n default: '20px',\n large: '24px',\n};\n\nexport const getUseMouseOverEffect = (props, header: string): boolean => {\n if (!props.hasEventHandlers || props.mode === 'edit') {\n return false;\n }\n const eventHandlers = props.eventHandlers || [];\n\n // No handlers configured - apply to all columns\n if (eventHandlers.length === 0) {\n return true;\n }\n\n // Return true if any handler applies to this column\n return eventHandlers.some(handler => {\n const handlerFields = handler.options?.fields;\n if (!handlerFields?.length) {\n return true;\n }\n return handlerFields.includes(header);\n });\n};\n\nconst PureTable = (props: PureTableProps): React.ReactElement => {\n const {\n count,\n width,\n height,\n backgroundColor,\n tableHeader,\n tableBody,\n tableFooter,\n showRowNumbers,\n showFooterTotals,\n showFooterPercentages,\n sortParams: { currentSortKey, currentSortDir, onSort },\n paginatorParams: { isPaging, onChange: paginatorOnChange, ...paginatorProps },\n onCellClick,\n onColumnFormatChange,\n columnFormat,\n mode,\n headerVisibility,\n font,\n fontSize,\n } = props;\n const [columns, setColumns] = React.useState(columnFormat);\n const containerRef = React.useRef(null);\n const containerRefInner = React.useRef(null);\n // this state avoids unncessary column sorting when column resize ends\n const [isResizing, setResizing] = React.useState(false);\n\n const firstRenderCount = React.useRef(count);\n React.useEffect((): void => {\n if (firstRenderCount.current !== count) {\n firstRenderCount.current = count;\n paginatorOnChange(null, { count });\n }\n }, [count, paginatorOnChange, paginatorProps]);\n\n const stringifiedColumnFormat = JSON.stringify(columnFormat);\n const columnFormatRef = React.useRef(stringifiedColumnFormat);\n const modeRef = React.useRef(mode);\n React.useEffect((): void => {\n if (modeRef.current !== mode || columnFormatRef.current !== stringifiedColumnFormat) {\n columnFormatRef.current = stringifiedColumnFormat;\n modeRef.current = mode;\n setColumns(columnFormat);\n }\n }, [columnFormat, mode, stringifiedColumnFormat]);\n\n const TableHead = useTableHead(headerVisibility);\n\n const debouncedDrilldown = React.useMemo(\n () =>\n debounce((e: MouseEvent | KeyboardEvent, payload: TableCellClickPayload): void => {\n if (window.getSelection().toString() === '' || e?.ctrlKey || e?.metaKey) {\n if (typeof onCellClick === 'function') {\n onCellClick({ e, payload });\n }\n }\n }, 200),\n [onCellClick]\n );\n\n const drilldownHandler = React.useCallback(\n (e: React.SyntheticEvent): void => {\n // SUI added an additional div for styling, so we need this to ensure drilldowns still work.\n // Otherwise it only works when you click the border around a cell.\n const element = (e.target as Element)?.closest('[data-row-index]');\n if (!element) {\n return;\n }\n const row = element.getAttribute('data-row-index');\n const col = element.getAttribute('data-col-index');\n const arrayIndex = element.getAttribute('data-array-index') || -1;\n if (row && col) {\n const cellRefIndex = +col;\n let cellIndex = cellRefIndex;\n const rowIndex = +row;\n const fieldValue = tableHeader.cells[cellRefIndex].value;\n const cellValue = tableBody.rows[rowIndex].cells[cellRefIndex].value;\n const cellRawValue = tableBody.rows[rowIndex].cells[cellRefIndex].value;\n\n const value = arrayIndex === -1 ? cellValue : cellRawValue[+arrayIndex];\n\n // Wish we did not have these if statements for\n // showRowNumbers\n if (showRowNumbers === true) {\n if (cellIndex === 0) {\n // no click event for row numbers\n return;\n }\n cellIndex -= 1;\n }\n\n const payload = {\n cellIndex,\n rowIndex,\n fieldValue,\n cellValue,\n cellRawValue,\n value,\n name: fieldValue,\n };\n\n tableBody.rows[rowIndex].cells.forEach((c: TableRowCell, index: number) => {\n const rowToken = `row.${tableHeader.cells[index].value}.value`;\n payload[rowToken] = c.value;\n });\n debouncedDrilldown(e.nativeEvent as MouseEvent | KeyboardEvent, payload);\n }\n },\n [tableHeader.cells, tableBody.rows, showRowNumbers, debouncedDrilldown]\n );\n\n const tableCellClickHandler = React.useCallback(\n e => {\n setResizing(false); // The resizing state will be set back to false on any cell click\n return onCellClick ? drilldownHandler(e) : noop;\n },\n [onCellClick, drilldownHandler]\n );\n\n const debouncedOnColumnFormatChange = React.useMemo(\n () =>\n debounce((newFormat: Partial<ColumnFormat>): void => {\n onColumnFormatChange(newFormat);\n }, 300),\n [onColumnFormatChange]\n );\n\n const handleEventHeadCellMouseDown = React.useCallback(e => {\n // Hack to target the resize handlers, since the only button within a HeadCell is the resize handlers\n if (e.target.tagName.toLowerCase() === 'hr') {\n e.stopPropagation();\n }\n }, []);\n\n const handleKeyDown = e => {\n if (e.keyCode !== 13) {\n return;\n }\n drilldownHandler(e);\n };\n const handleKeyUp = React.useCallback(\n e => {\n if (['ArrowLeft', 'ArrowRight'].includes(e.key)) {\n setResizing(false);\n }\n },\n [setResizing]\n );\n\n const handleResizeColumn = (_event, payload) => {\n setResizing(true);\n const updatedCF = columns;\n const field = payload.columnId;\n updatedCF[field] = {\n ...updatedCF[field],\n width: Math.max(payload.width, MINIMUM_COLUMN_SIZE),\n };\n setColumns({ ...updatedCF });\n\n // Updates column json in edit mode\n if (mode === 'edit') {\n debouncedOnColumnFormatChange(updatedCF);\n }\n };\n\n const fontMapped = fontMap[font] || fontMap.proportional;\n const fontSizeMapped = fontSizeMap[fontSize] || fontSizeMap.default;\n const rowHeightMapped = rowHeightMap[fontSize] || rowHeightMap.default;\n const tableInnerStyle = { height: '100%' };\n const tableOuterStyle = { height: '100%' };\n const visibleHeaderCells = tableHeader.cells.filter(c => c.showCell);\n const numberOfFixedHeaders = visibleHeaderCells.filter(({ value }) => {\n return columns[value]?.width && columns[value]?.width !== 'auto';\n }).length;\n\n const isFullyFixed = visibleHeaderCells.length === numberOfFixedHeaders;\n const isHeaderHidden = headerVisibility === 'none';\n const onSortToUse = isResizing ? noop : onSort;\n\n const renderFooterRow = (\n key: 'footer-totals' | 'footer-percentages',\n dataAttr: string\n ): React.ReactNode => {\n const rows = (tableFooter?.rows || []).filter(r => r && r.key === key);\n if (rows.length === 0) return null;\n return rows.map(row => (\n <SUITable.Row\n key={row.key}\n data-test={dataAttr}\n data-row-index={key === 'footer-totals' ? '0' : '1'}\n >\n {(row.cells || []).map((c: any, idx: number) => (\n <SUITable.Cell\n key={`${key}-cell-${c.key || idx}`}\n data-test=\"cell\"\n style={{\n ...c.style,\n backgroundColor: tableHeader.style?.backgroundColor || tableHeader.style?.color,\n }}\n align={c.align || 'right'}\n >\n {c.value ?? ''}\n </SUITable.Cell>\n ))}\n </SUITable.Row>\n ));\n };\n return (\n <VizTableContainer backgroundColor={backgroundColor} ref={containerRef} data-test=\"table-container\">\n <SUITableContainer\n ref={containerRefInner}\n width={width}\n height={height}\n isPaging={isPaging}\n headerStyle={tableHeader.style}\n font={fontMapped}\n fontSize={fontSizeMapped}\n lineHeight={rowHeightMapped}\n isFullyFixed={isFullyFixed}\n >\n <SUITable\n resizableFillLayout\n headType={isHeaderHidden ? undefined : 'inline'}\n innerStyle={tableInnerStyle}\n outerStyle={tableOuterStyle}\n onClick={tableCellClickHandler}\n onKeyDown={onCellClick ? handleKeyDown : noop}\n onKeyUp={handleKeyUp}\n onRequestResizeColumn={handleResizeColumn}\n >\n <TableHead>\n {visibleHeaderCells.map(\n ({\n key,\n value,\n sortKey,\n style,\n align,\n textOverflowType,\n ...rest\n }): React.ReactElement => {\n return (\n <HeadCell\n {...{ sortKey, ...rest }}\n align={align}\n data-test-align-value={align}\n data-test-text-overflow-value={textOverflowType}\n key={key}\n columnId={value}\n sortDir={sortKey === currentSortKey ? currentSortDir : 'none'}\n width={columns[value]?.width ?? INITIAL_UNSET_COLUMN_WIDTH}\n onMouseDown={handleEventHeadCellMouseDown}\n value={value}\n onSort={\n (showRowNumbers && value === '#') || isHeaderHidden\n ? null\n : onSortToUse\n }\n resizable={!isHeaderHidden}\n style={\n showRowNumbers && value === '#'\n ? { ...style, cursor: 'auto' }\n : style\n }\n textOverflowType={textOverflowType}\n headerVisibility={headerVisibility}\n />\n );\n }\n )}\n </TableHead>\n <SUITable.Body>\n {tableBody.rows.map(\n (row): React.ReactElement => (\n <SUITable.Row key={row.key}>\n {row.cells\n .filter(c => c.showCell)\n .map((cell): React.ReactElement => {\n return (\n <SwitchTableCell key={cell.key} type={cell.cellType}>\n <TextCell\n cell={cell}\n useMouseOverEffect={getUseMouseOverEffect(\n props,\n cell.header\n )}\n />\n <SparklineCell\n cell={cell}\n useMouseOverEffect={getUseMouseOverEffect(\n props,\n cell.header\n )}\n width={columns[cell.header]?.width ?? 'auto'}\n />\n <ArrayCell\n cell={cell}\n useMouseOverEffect={getUseMouseOverEffect(\n props,\n cell.header\n )}\n />\n </SwitchTableCell>\n );\n })}\n </SUITable.Row>\n )\n )}\n {tableFooter &&\n showFooterTotals &&\n renderFooterRow('footer-totals', 'footer-row-totals')}\n {tableFooter &&\n showFooterPercentages &&\n renderFooterRow('footer-percentages', 'footer-row-percentages')}\n </SUITable.Body>\n </SUITable>\n </SUITableContainer>\n {isPaging ? (\n <PaginatorContainer>\n {width < COMPACT_PAGINATOR_WIDTH_THRESHOLD ? (\n <Paginator.Compact\n current={paginatorProps.current}\n totalPages={paginatorProps.totalPages}\n renderLabel={false}\n onChange={(e, { direction }) => {\n const newPage =\n direction === 'next'\n ? paginatorProps.current + 1\n : paginatorProps.current - 1;\n paginatorOnChange(e as React.MouseEvent<HTMLButtonElement>, {\n page: newPage,\n });\n }}\n />\n ) : (\n <Paginator\n totalPages={paginatorProps.totalPages}\n onChange={paginatorOnChange}\n {...paginatorProps}\n />\n )}\n </PaginatorContainer>\n ) : null}\n </VizTableContainer>\n );\n};\n\nconst cellDataType = T.oneOfType([T.string, T.number, T.arrayOf(T.oneOfType([T.string, T.number]))]);\n\nPureTable.propTypes = {\n backgroundColor: T.string,\n count: T.number,\n columnFormat: T.objectOf(\n T.shape({\n align: T.oneOfType([T.arrayOf(T.oneOf(validColumnAlignments)), T.oneOf(validColumnAlignments)]),\n cellTypes: T.arrayOf(T.oneOf(validCellRenderers)),\n data: T.arrayOf(cellDataType),\n headerAlign: T.oneOf(validColumnAlignments),\n rowBackgroundColors: T.arrayOf(T.string),\n rowColors: T.arrayOf(T.string),\n sparklineAreaColors: T.arrayOf(T.string),\n sparklineColors: T.arrayOf(T.string),\n sparklineTypes: T.arrayOf(T.oneOf(validSparklineTypes)),\n })\n ),\n headers: T.arrayOf(T.string),\n headerVisibility: T.oneOf(validHeaderVisibilities),\n height: T.oneOfType([T.number]),\n mode: T.string,\n onCellClick: T.func,\n paginatorParams: PaginatorParamsPropTypes,\n showRowNumbers: T.bool,\n showFooterTotals: T.bool,\n sortParams: SortParamsPropTypes,\n table: T.arrayOf(T.arrayOf(cellDataType)),\n tableFormat: T.shape({\n align: T.oneOfType([T.arrayOf(T.arrayOf(T.oneOf(validAlignments))), T.oneOf(validAlignments)]),\n cellTypes: T.arrayOf(T.arrayOf(T.oneOf(validCellRenderers))),\n data: T.arrayOf(T.arrayOf(cellDataType)),\n headerAlign: T.oneOf(validAlignments),\n headerBackgroundColor: T.string,\n headerColor: T.string,\n rowBackgroundColors: T.oneOfType([T.arrayOf(T.string), T.arrayOf(T.arrayOf(T.string))]),\n rowColors: T.oneOfType([T.arrayOf(T.string), T.arrayOf(T.arrayOf(T.string))]),\n sparklineAreaColors: T.arrayOf(T.arrayOf(T.string)),\n sparklineColors: T.arrayOf(T.arrayOf(T.string)),\n sparklineTypes: T.arrayOf(T.arrayOf(T.oneOf(validSparklineTypes))),\n }),\n theme: T.any,\n width: T.oneOfType([T.number]),\n onColumnFormatChange: T.func,\n font: T.string,\n fontSize: T.string,\n};\n\nPureTable.defaultProps = {\n columnFormat: {},\n headers: [],\n headerVisibility: 'inline' as const,\n height: 300,\n mode: 'view',\n onCellClick: null,\n paginatorParams: {\n isPaging: false,\n onChange: noop,\n },\n showRowNumbers: false,\n showFooterTotals: false,\n showFooterPercentages: false,\n sortParams: {\n onSort: noop,\n },\n table: [],\n tableFormat: {},\n theme: {},\n width: 300,\n onColumnFormatChange: noop,\n font: fontMap.proportional,\n fontSize: fontSizeMap.default,\n};\nPureTable.displayName = 'VizTable';\n\nexport default withEmptyTableMessage(withFixedSizeContainer(PureTable)) as any;\n", "import { get } from 'lodash';\n\nimport { sanitizeArrayOfColors } from '@splunk/visualizations-shared/colorUtils';\nimport * as React from 'react';\nimport { createDOMID } from '@splunk/ui-utils/id';\nimport config from './config';\nimport { buildFooterDataFrames } from '../common/utils/tableUtils';\nimport withDashboardViz, { DashboardVizOpts } from '../common/withDashboardViz';\nimport PureTable from './PureTable';\nimport type { ColumnFormat } from './hooks';\n\nexport const computeVizProps = ({ ...props }): Record<string, unknown> => {\n const vizProps = { ...props };\n vizProps.columnIds = vizProps.dataSources?.primary?.data?.fields.map(field => field.name ?? field) ?? [];\n if (vizProps.columnIds.length === 0) {\n vizProps.columnIds = vizProps.headers;\n }\n vizProps.headersMetadata = vizProps.dataSources?.primary?.data?.fields;\n\n if (vizProps.columnFormat) {\n const columns: Partial<ColumnFormat> = vizProps.columnFormat;\n\n // `columns` looks like { `column title`: { rowBackgroundColors, rowColors... }}\n Object.entries(columns).forEach(([columnKey, columnProperties]) => {\n let rowBackgroundColors;\n let rowColors;\n\n // If columns have `rowBackgroundColors` or `rowColors` arrays defined, sanitize them.\n // Keep undefined values as-is so they can fall back to tableFormat colors in hooks.tsx\n // This allows matchValue without a fallback to properly inherit table-level row colors\n if (columnProperties.rowBackgroundColors) {\n rowBackgroundColors = sanitizeArrayOfColors(columnProperties.rowBackgroundColors);\n }\n if (columnProperties.rowColors) {\n rowColors = sanitizeArrayOfColors(columnProperties.rowColors);\n }\n\n vizProps.columnFormat[columnKey] = {\n ...vizProps.columnFormat[columnKey],\n ...(columnProperties.rowBackgroundColors && {\n rowBackgroundColors,\n }),\n ...(columnProperties.rowColors && { rowColors }),\n };\n });\n }\n\n if (vizProps.onOptionsChange) {\n const handleColumnFormatChange = updatedColumnFormat => {\n const cloneOfExistingColumnFormat = {\n ...(vizProps?.options?.columnFormat || {}),\n };\n const keys = Object.keys(updatedColumnFormat);\n const values = Object.values(updatedColumnFormat);\n keys.forEach((key: string, index: number) => {\n if (!cloneOfExistingColumnFormat[key]) {\n cloneOfExistingColumnFormat[key] = {};\n }\n const newWidth = get(values[index], 'width');\n cloneOfExistingColumnFormat[key] = {\n ...cloneOfExistingColumnFormat[key],\n width: newWidth,\n };\n });\n vizProps.onOptionsChange({\n columnFormat: cloneOfExistingColumnFormat,\n });\n };\n vizProps.onColumnFormatChange = handleColumnFormatChange;\n }\n\n return vizProps;\n};\n\n// HOC for injecting a 'footer' datasource alongside 'primary'\nconst withTableFooter = Viz => {\n const VizWithTableFooter = ({\n dataSources,\n options = {},\n ...otherProps\n }: {\n dataSources?: any;\n options?: Record<string, any>;\n }) => {\n if (!dataSources?.primary?.data) {\n return <Viz dataSources={dataSources} options={options} {...otherProps} />;\n }\n const fieldsMeta = (dataSources.primary.data.fields || []) as unknown as Array<\n Record<string, unknown>\n >;\n const footerData = buildFooterDataFrames(fieldsMeta);\n // DSL doesnt accept dashes in keys\n // Generate a unique footer key that doesn't conflict with existing datasources\n let footerKey = `footer${createDOMID().replace(/-/g, '')}`;\n while (dataSources[footerKey]) {\n footerKey = `footer${createDOMID().replace(/-/g, '')}`;\n }\n const newDataSources = {\n ...dataSources,\n [footerKey]: { data: footerData.footer },\n };\n\n // Behind-the-scenes footer DSL injection per column when footer rows are enabled\n const showFooterTotals = Boolean(options?.showFooterTotals);\n const showFooterPercentages = Boolean(options?.showFooterPercentages);\n let newOptions = options;\n if (showFooterTotals || showFooterPercentages) {\n const columnFormat = { ...(options?.columnFormat || {}) } as Record<string, any>;\n const fieldNames = (fieldsMeta || [])\n .map((f: any) => (f && (f.name || f)) as string)\n .filter(Boolean);\n fieldNames.forEach(fieldName => {\n if (!fieldName || fieldName === '#') return;\n const existingFooter = columnFormat?.[fieldName]?.footer;\n if (typeof existingFooter === 'undefined') {\n // Try to reuse column data's formatByType config if present\n const dataDsl = columnFormat?.[fieldName]?.data;\n let configToken: string | null = null;\n if (typeof dataDsl === 'string') {\n const m = /formatByType\\(([^)]+)\\)/.exec(dataDsl);\n configToken = m ? m[1] : null;\n }\n let footerDsl = `> ${footerKey} | seriesByName(\"${fieldName}\")`;\n if (configToken) footerDsl += ` | formatByType(${configToken})`;\n columnFormat[fieldName] = {\n ...(columnFormat[fieldName] || {}),\n footer: footerDsl,\n };\n } else if (typeof existingFooter === 'string') {\n // Replace any \"> footer\" references with \"> ${footerKey}\" in existing DSL\n const updatedFooterDsl = existingFooter.replace(/>\\s*footer\\b/g, `> ${footerKey}`);\n if (updatedFooterDsl !== existingFooter) {\n columnFormat[fieldName] = {\n ...(columnFormat[fieldName] || {}),\n footer: updatedFooterDsl,\n };\n }\n }\n });\n newOptions = { ...(options || {}), columnFormat };\n }\n\n return <Viz dataSources={newDataSources} options={newOptions} {...otherProps} />;\n };\n // Inherit config and defaultProps from wrapped component\n VizWithTableFooter.defaultProps = Viz.defaultProps;\n VizWithTableFooter.config = Viz.config;\n return VizWithTableFooter;\n};\n\nconst Table = withTableFooter(\n withDashboardViz({\n ReactViz: PureTable,\n vizConfig: config,\n disableEditModeCover: true,\n computeVizProps,\n } as DashboardVizOpts)\n);\nconst { themes } = config;\n\nexport { themes, PureTable, config };\nexport default Table;\n"],
5
- "mappings": "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",
6
- "names": ["Table_exports", "Table_default", "themes", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "config", "TableIcon", "TablePlaceholderIcon", "optionsSchema", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "keys", "defaultImport", "config", "themes", "defaultImport", "Opts", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "getFieldName", "min", "max", "getFieldName", "range", "computeVizProps", "_a", "Opts", "defaultImport", "defaultImport", "defaultImport", "Message_exports", "Message_default", "defaultImport", "Message_exports", "Message_default", "isArray", "noop", "defaultImport", "noop", "Message_default", "_a", "_b", "_c", "_a", "keys", "_b", "themes", "Table_default"]
3
+ "sources": ["src/Table/index.ts", "esm-externals:lodash", "esm-externals:@splunk/visualizations-shared/colorUtils", "esm-externals:react", "esm-externals:@splunk/ui-utils/id", "esm-externals:@splunk/ui-utils/i18n", "esm-externals:@splunk/visualization-schemas", "esm-externals:@splunk/visualization-color-palettes/editors/PresetPalettes", "esm-externals:@splunk/visualizations-shared/colorConstants", "esm-externals:@splunk/visualization-icons", "esm-externals:@splunk/visualization-icons/placeholders", "esm-externals:@splunk/themes/variables", "esm-externals:@splunk/themes/pick", "esm-externals:@splunk/react-icons/TextAlignCenter", "esm-externals:@splunk/react-icons/TextAlignLeft", "esm-externals:@splunk/react-icons/TextAlignRight", "esm-externals:@splunk/visualizations-shared/configUtils", "src/common/utils/configUtils.ts", "src/common/ThemedDefaults.tsx", "src/Table/config.ts", "src/common/utils/tableUtils.ts", "esm-externals:@splunk/themes/getSettingsFromThemedProps", "esm-externals:@splunk/visualization-encoding/Options", "esm-externals:@splunk/visualizations-shared/SanitizeProps", "esm-externals:@splunk/visualization-context/TimezoneContext", "esm-externals:@splunk/moment", "esm-externals:@splunk/visualization-context/FeatureFlagContext", "esm-externals:styled-components", "esm-externals:@splunk/visualizations-shared/hocUtils", "esm-externals:@splunk/visualizations-shared/JSONSchemaUtils", "esm-externals:@splunk/async-dynamic-options-evaluator", "esm-externals:prop-types", "src/common/interfaces/VizActionHandler.ts", "src/common/SplunkVisualization.tsx", "src/common/interfaces/DataSource.ts", "src/common/hooks/useSorting.ts", "src/common/hooks/usePagination.ts", "src/common/hooks/useDeepMemo.ts", "esm-externals:@splunk/visualizations-shared/Message", "esm-externals:@splunk/visualizations-shared/SizeAwareWrapper", "src/common/components/MissingPropsMessage.tsx", "src/common/utils/hocUtils.ts", "src/common/hocs/withEditModeCover.tsx", "esm-externals:@splunk/visualizations-shared/style", "src/common/hocs/FixedSizeContainer.tsx", "src/common/components/IconPlaceholder.tsx", "src/common/hocs/withPlaceholder.tsx", "esm-externals:@splunk/visualizations-shared/numberUtils", "src/common/utils/dataUtils.ts", "src/common/hooks/usePrevious.ts", "src/common/hooks/useGetXAndYFields.tsx", "src/common/hooks/useDownsampleDataSources.tsx", "esm-externals:@splunk/visualization-context/FeatureFlags", "src/common/utils/featureFlagUtils.ts", "esm-externals:@splunk/visualizations-shared/trellisUtils", "src/common/utils/trellisUtils.ts", "esm-externals:@splunk/visualization-canvas", "src/common/components/VizStyleWrapper.jsx", "esm-externals:@splunk/react-icons/Triangle", "esm-externals:@splunk/visualizations-shared/propUtils", "esm-externals:@splunk/visualizations-shared/simpleXMLOptions", "src/common/chartingUtils.ts", "src/common/hooks/useTrellisEnabled.ts", "src/common/components/TrellisTitle.tsx", "src/common/TimeSeriesChartWrapper.tsx", "src/common/withDashboardViz.tsx", "esm-externals:lodash/debounce", "esm-externals:@splunk/react-ui/Table", "esm-externals:@splunk/react-ui/Paginator", "esm-externals:@splunk/react-ui/Message", "esm-externals:@splunk/react-ui/JSONTree", "src/Table/hooks.tsx", "esm-externals:@splunk/react-ui/Link", "esm-externals:@splunk/themes", "src/common/StyledSkipLink.tsx", "src/Table/cells/SwitchTableCell.tsx", "src/Table/cells/TextCell.tsx", "src/Table/cells/ArrayCell.tsx", "esm-externals:@splunk/react-ui/Popover", "src/SparkLine/SparkLine.jsx", "src/Table/cells/SparklineCell.tsx", "src/common/utils/textUtils.ts", "src/common/utils/focusUtils.ts", "src/Table/tableUtils.ts", "src/Table/PureTable.tsx", "src/Table/Table.tsx"],
4
+ "sourcesContent": ["// NOTE: wildcard syntax only works for named exports\n// for some reason, omitting the default export worked before TS v4\n// see: https://stackoverflow.com/a/34445175\nexport * from './Table';\nexport { default } from './Table';\n", "\nimport * as defaultImport from \"lodash\";\nexport * from \"lodash\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/colorUtils\";\nexport * from \"@splunk/visualizations-shared/colorUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"react\";\nexport * from \"react\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/ui-utils/id\";\nexport * from \"@splunk/ui-utils/id\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/ui-utils/i18n\";\nexport * from \"@splunk/ui-utils/i18n\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualization-schemas\";\nexport * from \"@splunk/visualization-schemas\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualization-color-palettes/editors/PresetPalettes\";\nexport * from \"@splunk/visualization-color-palettes/editors/PresetPalettes\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/colorConstants\";\nexport * from \"@splunk/visualizations-shared/colorConstants\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualization-icons\";\nexport * from \"@splunk/visualization-icons\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualization-icons/placeholders\";\nexport * from \"@splunk/visualization-icons/placeholders\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/themes/variables\";\nexport * from \"@splunk/themes/variables\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/themes/pick\";\nexport * from \"@splunk/themes/pick\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/TextAlignCenter\";\nexport * from \"@splunk/react-icons/TextAlignCenter\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/TextAlignLeft\";\nexport * from \"@splunk/react-icons/TextAlignLeft\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/TextAlignRight\";\nexport * from \"@splunk/react-icons/TextAlignRight\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/configUtils\";\nexport * from \"@splunk/visualizations-shared/configUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import { get, range } from 'lodash';\nimport { isDynamicOption } from '@splunk/visualizations-shared/configUtils';\nimport { VizConfig } from '../interfaces/VizConfig';\nimport { EditorLayoutConfig, EditorConfig } from '../interfaces/Editor';\n\n// included for backwards compatibility\nexport { enhanceOptionsSchemaWithDynamicOptions } from '@splunk/visualization-schemas';\n\nexport interface PresetEntry {\n name: string;\n value: any;\n label: string;\n}\n\n/**\n * Helper function to enhance a Visualization Config as needed based on behaviors specified in supports block\n * this function also collapse all editor panels\n * @param vizConfig a Visualization Config\n * @returns an enhanced Visualization Config containing updated config entries based on behaviors it supports\n * and containing `open: false` for all editor panels in editorConfig\n */\nfunction enhanceConfig(vizConfig: VizConfig): VizConfig {\n const enhancedConfig: VizConfig = { ...vizConfig };\n\n enhancedConfig.editorConfig = vizConfig.editorConfig.map((config: EditorConfig): EditorConfig => {\n return { ...config, open: config.open || false };\n });\n return enhancedConfig;\n}\n\n/**\n * Helper function to uncollapse all editor panels by adding `open: true` to the editorConfig\n * Created for editor unit tests\n * @param vizConfig a Visualization Config\n * @returns a Visualization Config containing `open: true` for all editor panels in editorConfig\n */\nfunction uncollapseEditorConfig(vizConfig: VizConfig): VizConfig {\n const editorPanelUncollapsedConfig: VizConfig = { ...vizConfig };\n editorPanelUncollapsedConfig.editorConfig = vizConfig.editorConfig.map(\n (config: EditorConfig): EditorConfig => {\n return { ...config, open: true };\n }\n );\n return editorPanelUncollapsedConfig;\n}\n\n// private helpers to improve readability of getInitialPreset\n// this shouldn't be tested since this util isn't something that we expect to use outside of getInitialPreset\n\n/**\n * this checks to make sure that all values within vizContext are compatible with the given preset's context to determine the initialPreset\n * if a preset has explicitly specified a key as being undefined, the vizContext must also has that key as undefined, or else this CANNOT be the initialPreset\n * the inverse is true; if a preset has key is NOT undefined, it must also be NOT undefined in the corresponding vizContext\n * the internal config contents are irrelevant (as the user could customize them in source), just as long as the presence of `undefined`s match up\n *\n * Since the presetConfigs have explicit undefined keys to override the existing config, we need to explicitly check the undefined values\n */\nfunction hasCompatibleContexts(\n vizContext: { [configKey: string]: any },\n presetContext: { [configKey: string]: any }\n): boolean {\n const presetContextKeys = Object.keys(presetContext);\n return presetContextKeys.every(\n (contextKey): boolean =>\n (presetContext[contextKey] === undefined && vizContext[contextKey] === undefined) ||\n (presetContext[contextKey] !== undefined && vizContext[contextKey] !== undefined)\n );\n}\n\n/**\n * Checks to make sure that dynamic (non-dynamic) options in a given preset are also dynamic (non-dynamic) in the vizOptions\n */\nfunction hasCompatibleOptions(\n vizOptions: { [configKey: string]: any },\n presetOptions: { [configKey: string]: any }\n): boolean {\n const presetOptionKeys = Object.keys(presetOptions);\n return presetOptionKeys.every(\n (optionKey): boolean =>\n isDynamicOption(presetOptions[optionKey]) === isDynamicOption(vizOptions[optionKey])\n );\n}\n\n/**\n * Evaluates whether there is an initialPreset that fits the current state of vizContext + vizOptions\n * This function ignores extraneous vizOptions or vizContext keys, as they could be outside the scope of what the preset is intended to configure\n *\n * @param {Object} vizContext - the current vizContext definition\n * @param {Object} vizOptions - the current vizOptions definition\n * @param {PresetEntry[]} presets - the list of presets, one of which can be considered an initialPreset\n */\nfunction getInitialPreset(\n vizContext: { [configKey: string]: any },\n vizOptions: { [configKey: string]: any },\n presets: PresetEntry[]\n): PresetEntry | null {\n return presets.find((preset): boolean => {\n const presetContext = get(preset, ['value', 'context'], {});\n const presetOptions = get(preset, ['value', 'options'], {});\n const presetContextKeys = Object.keys(presetContext);\n const presetOptionKeys = Object.keys(presetOptions);\n\n // all presets have to explicitly specify which options to reset (i.e. need explicitly undefined keys)\n // if not, then the preset is invalid in config.ts\n if (presetContextKeys.length === 0 || presetOptionKeys.length === 0) return false;\n\n return (\n hasCompatibleContexts(vizContext, presetContext) &&\n hasCompatibleOptions(vizOptions, presetOptions)\n );\n });\n}\n\ninterface PrecisionOption {\n label: string;\n value: number;\n}\n\n/**\n * generates number precision values for a Select editor\n *\n * @param {Number} numPrecisionValues - number of integer precision values to generate\n * @returns {{ label: string; value; string }[]} array of { label, value } tuples\n */\nfunction generatePrecisionValues(numPrecisionValues: number): PrecisionOption[] {\n return range(0, numPrecisionValues + 1).map(\n (i): PrecisionOption => ({\n label: `${i} (0${i > 0 ? '.' : ''}${'0'.repeat(i)})`, // e.g. 0.000 for numPrecisionValues = 3\n value: i,\n })\n );\n}\n\nexport { enhanceConfig, getInitialPreset, generatePrecisionValues, uncollapseEditorConfig, isDynamicOption };\n\n/**\n * insert layout in layout array, return a new layout array instead of updating the original\n *\n * @param {EditorLayoutConfig[][]} layout - editor layout\n * @param {Number} index - the index to insert layout item(s)\n * @param {EditorLayoutConfig[][]} layoutItems - the item(s) to insert\n * @returns {EditorLayoutConfig[][]} new editor layout with insertion\n */\nexport const insertLayout = (\n layout: EditorLayoutConfig[][],\n index: number,\n ...layoutItems: EditorLayoutConfig[][]\n): EditorLayoutConfig[][] => [\n // copy part of the array before the specified index\n ...layout.slice(0, index),\n // inserted layout item\n ...layoutItems,\n // copy part of the array after the specified index\n ...layout.slice(index),\n];\n", "import pick from '@splunk/themes/pick';\nimport variables from '@splunk/themes/variables';\n\nexport const defaultBackgroundColor = props =>\n pick({\n enterprise: {\n dark: variables.black(props),\n light: variables.white(props),\n },\n prisma: variables.backgroundColorSection(props),\n })(props);\n", "import { _ } from '@splunk/ui-utils/i18n';\nimport { tableOptionsSchema as optionsSchema } from '@splunk/visualization-schemas';\nimport { defaultPalettesConfig } from '@splunk/visualization-color-palettes/editors/PresetPalettes';\nimport { COLOR_EDITOR_PALETTE } from '@splunk/visualizations-shared/colorConstants';\nimport { Table as TableIcon } from '@splunk/visualization-icons';\nimport { Table as TablePlaceholderIcon } from '@splunk/visualization-icons/placeholders';\nimport variables from '@splunk/themes/variables';\nimport pick from '@splunk/themes/pick';\nimport TextAlignCenter from '@splunk/react-icons/TextAlignCenter';\nimport TextAlignLeft from '@splunk/react-icons/TextAlignLeft';\nimport TextAlignRight from '@splunk/react-icons/TextAlignRight';\n\nimport { enhanceConfig, generatePrecisionValues } from '../common/utils/configUtils';\nimport { VizConfig } from '../common/interfaces/VizConfig';\nimport { DataContract } from '../common/interfaces/DataContract';\nimport { VizSize } from '../common/interfaces/VizSize';\nimport { DefaultContext } from '../common/interfaces/DefaultContext';\nimport { EditorConfig } from '../common/interfaces/Editor';\nimport { VizBehavior } from '../common/interfaces/VizBehavior';\nimport { ThemedDefaults } from '../common/interfaces/ThemedDefaults';\nimport { VizCategory } from '../common/interfaces/VizCategory';\nimport { defaultBackgroundColor } from '../common/ThemedDefaults';\n\nconst dataContract: DataContract = {\n requiredDataSources: [\n {\n name: 'primary',\n description: 'DataSource that powers the visualization',\n },\n ],\n optionalDataSources: [],\n initialRequestParams: {\n primary: (options: { count?: number } = {}): Record<string, unknown> => ({\n offset: 0,\n count: options.count ? options.count : 10,\n requestTotalCount: true,\n add_summary_to_metadata: true,\n }),\n },\n};\n\nconst size: VizSize = {\n initialWidth: 300,\n initialHeight: 300,\n};\n\nconst defaultContext: DefaultContext = {\n // color context configs\n colorRangeConfig: [\n { to: 20, value: '#D41F1F' },\n { from: 20, to: 40, value: '#D94E17' },\n { from: 40, to: 60, value: '#CBA700' },\n { from: 60, to: 80, value: '#669922' },\n { from: 80, value: '#118832' },\n ],\n colorMatchConfig: [{ match: '', value: '#5C33FF' }],\n colorGradientConfig: { colors: ['#252214', '#B846BB'] },\n tableAlignByType: [\n { match: 'string', value: 'left' },\n { match: 'number', value: 'right' },\n { match: 'time', value: 'left' },\n { match: 'color', value: 'left' },\n { match: 'array', value: 'left' },\n { match: 'sparkline', value: 'center' },\n { match: 'unknown', value: 'left' },\n { match: 'null', value: 'left' },\n ],\n tableCellTypeByType: [\n { match: 'string', value: 'TextCell' },\n { match: 'number', value: 'TextCell' },\n { match: 'time', value: 'TextCell' },\n { match: 'color', value: 'TextCell' },\n { match: 'array', value: 'ArrayCell' },\n { match: 'sparkline', value: 'SparklineCell' },\n { match: 'unknown', value: 'TextCell' },\n { match: 'null', value: 'TextCell' },\n ],\n\n // NOTE: These contexts are used by the table background color editor.\n // Please be careful removing/renaming/altering them.\n // There are unit tests and visual test that will capture breakages.\n tableRowColorMaxContrast: {\n colors: ['> themes.textColor', '> themes.inverseTextColor'],\n default: '> themes.textColor',\n },\n tableRowBackgroundColorEvenConfig: {\n channel: 'hsv.v',\n value: '*0.96',\n },\n tableHeaderBackgroundColorConfig: {\n channel: 'hsv.v',\n value: '*0.9',\n },\n tableRowBackgroundColorsByTheme: ['> themes.rowBackgroundColorOdd'],\n tableAltRowBackgroundColorsByTheme: ['> themes.rowBackgroundColorOdd', '> themes.rowBackgroundColorEven'],\n tableRowBackgroundColorsByBackgroundColor: ['> backgroundColor'],\n tableAltRowBackgroundColorsByBackgroundColor: [\n '> backgroundColor',\n '> backgroundColor | setColorChannel(tableRowBackgroundColorEvenConfig)',\n ],\n};\n\nconst headerAlignConfigTable = {\n label: _('Header alignment'),\n editor: 'editor.radioBar',\n option: 'tableFormat.headerAlign',\n editorProps: {\n values: [\n { label: _('Left'), value: 'left', icon: TextAlignLeft },\n { label: _('Center'), value: 'center', icon: TextAlignCenter },\n { label: _('Right'), value: 'right', icon: TextAlignRight },\n ],\n },\n};\n\nconst headerAlignConfigColumn = {\n ...headerAlignConfigTable,\n option: 'headerAlign',\n editorProps: {\n values: [\n { label: _('Auto'), value: 'auto' },\n { label: _('Left'), value: 'left', icon: TextAlignLeft },\n { label: _('Center'), value: 'center', icon: TextAlignCenter },\n { label: _('Right'), value: 'right', icon: TextAlignRight },\n ],\n },\n};\n\nconst textOverflowConfigColumn = {\n label: _('Text wrapping'),\n editor: 'editor.radioBar',\n option: 'textOverflow',\n editorProps: {\n values: [\n { label: _('Standard'), value: 'break-word' },\n { label: _('Anywhere'), value: 'anywhere' },\n { label: _('Trim'), value: 'ellipsis' },\n ],\n },\n};\n\nconst textAlignConfigTable = {\n label: _('Cells alignment'),\n editor: 'editor.radioBar',\n option: 'tableFormat.align',\n editorProps: {\n values: [\n {\n label: _('Auto'),\n value: '> table | type() | matchValue(tableAlignByType)',\n },\n { label: _('Left'), value: 'left', icon: TextAlignLeft },\n { label: _('Center'), value: 'center', icon: TextAlignCenter },\n { label: _('Right'), value: 'right', icon: TextAlignRight },\n ],\n },\n};\n\nconst textAlignConfigColumn = {\n ...textAlignConfigTable,\n option: 'align',\n editorProps: {\n values: [\n { label: _('Auto'), value: 'auto' },\n { label: _('Left'), value: 'left', icon: TextAlignLeft },\n { label: _('Center'), value: 'center', icon: TextAlignCenter },\n { label: _('Right'), value: 'right', icon: TextAlignRight },\n ],\n },\n};\n\nconst unitPositionConfig = {\n label: _('Units position'),\n editor: 'editor.select',\n option: 'unitPosition',\n editorProps: {\n values: [\n { label: _('Before'), value: 'before' },\n { label: _('After'), value: 'after' },\n ],\n },\n};\n\nconst unitLabelConfig = {\n label: _('Unit label'),\n option: 'unit',\n editor: 'editor.text',\n};\n\nconst timeFormattingConfig = {\n label: _('Date & Time formatting'),\n option: 'format',\n editor: 'editor.text',\n editorProps: {\n tooltip: _('For example: DD-MM-YYYY'),\n },\n};\n\nconst themes: ThemedDefaults = {\n defaultBackgroundColor,\n defaultHeaderBackgroundColor: props =>\n pick({\n enterprise: {\n dark: variables.gray20(props),\n light: variables.gray92(props),\n },\n prisma: variables.backgroundColor(props),\n })(props),\n rowBackgroundColorEven: props =>\n pick({\n enterprise: { dark: 'rgba(35,36,41,0.4)', light: 'rgba(240,240,240,0.6)' },\n prisma: { dark: 'rgba(35,36,41,0.4)', light: 'rgba(240,240,240,0.6)' },\n })(props),\n rowBackgroundColorOdd: props =>\n pick({\n enterprise: { dark: 'rgba(0,0,0,0.4)', light: 'rgba(255,255,255,0.6)' },\n prisma: { dark: 'rgba(0,0,0,0.4)', light: 'rgba(255,255,255,0.6)' },\n })(props),\n textColor: props =>\n pick({\n enterprise: variables.textColor(props),\n prisma: variables.contentColorDefault(props),\n })(props),\n inverseTextColor: props =>\n pick({\n enterprise: {\n dark: variables.contentColorInverted(props), // equal to textColor in enterprise\n light: variables.white(props), // equal to textColor in enterpriseDark\n },\n prisma: variables.contentColorInverted(props),\n })(props),\n};\n\nconst backgroundColorPaletteSet = new Set([...COLOR_EDITOR_PALETTE]);\n\nconst EDITOR_LABEL_WIDTH = 100;\nconst editorConfig: EditorConfig[] = [\n {\n label: _('Data display'),\n layout: [\n [\n {\n label: _('Rows displayed'),\n option: 'count',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n labelWidth: EDITOR_LABEL_WIDTH,\n },\n },\n ],\n [\n {\n label: _('Row numbers'),\n option: 'showRowNumbers',\n editor: 'editor.checkbox',\n editorProps: {\n labelWidth: EDITOR_LABEL_WIDTH,\n },\n },\n ],\n [\n {\n label: _('Internal fields'),\n option: 'showInternalFields',\n editor: 'editor.checkbox',\n editorProps: {\n labelWidth: EDITOR_LABEL_WIDTH,\n },\n },\n ],\n [\n {\n label: _('Header row'),\n option: 'headerVisibility',\n editor: 'editor.select',\n editorProps: {\n values: [\n { label: _('Inline'), value: 'inline' },\n { label: _('Fixed'), value: 'fixed' },\n { label: _('Hidden'), value: 'none' },\n ],\n labelWidth: EDITOR_LABEL_WIDTH,\n },\n },\n ],\n [\n {\n label: _('Footer totals row'),\n option: 'showFooterTotals',\n editor: 'editor.checkbox',\n editorProps: {\n labelWidth: EDITOR_LABEL_WIDTH,\n },\n },\n ],\n [\n {\n label: _('Footer percentages row'),\n option: 'showFooterPercentages',\n editor: 'editor.checkbox',\n editorProps: {\n labelWidth: EDITOR_LABEL_WIDTH,\n },\n },\n ],\n ],\n },\n {\n label: _('Color and style'),\n layout: [\n [\n {\n key: 'backgroundColor',\n editor: 'editor.tableBackgroundColor',\n editorProps: {\n themes,\n labelPosition: 'top',\n labelWidth: EDITOR_LABEL_WIDTH,\n palette: [...backgroundColorPaletteSet],\n },\n },\n ],\n [\n {\n option: 'font',\n label: _('Font'),\n editor: 'editor.select',\n editorProps: {\n values: [\n {\n label: _('Proportional (Default)'),\n value: 'proportional',\n },\n { label: _('Monospace'), value: 'monospace' },\n ],\n labelPosition: 'top',\n labelWidth: EDITOR_LABEL_WIDTH,\n },\n },\n ],\n [\n {\n option: 'fontSize',\n label: _('Font size'),\n editor: 'editor.select',\n editorProps: {\n values: [\n {\n label: _('Extra Small (font 10px, row 24px)'),\n value: 'extraSmall',\n },\n {\n label: _('Small (font 12px, row 24px)'),\n value: 'small',\n },\n {\n label: _('Default (font 14px, row 32px)'),\n value: 'default',\n },\n {\n label: _('Large (font 16px, row 36px)'),\n value: 'large',\n },\n ],\n labelPosition: 'top',\n labelWidth: EDITOR_LABEL_WIDTH,\n },\n },\n ],\n [\n {\n ...headerAlignConfigTable,\n },\n ],\n [\n {\n ...textAlignConfigTable,\n },\n ],\n [\n {\n key: 'tableDynamicColor',\n editor: 'editor.tableDynamicColor',\n context: 'colorGradientConfig',\n option: 'tableFormat',\n label: _('Data colors'),\n filterKeywords: ['range', 'match', 'gradient', 'dynamic coloring'],\n editorProps: {\n labelPosition: 'top',\n formatters: [\n {\n label: _('Gradient'),\n value: 'gradient',\n isDefault: true,\n defaults: {\n table: defaultContext.colorGradientConfig,\n },\n },\n {\n label: _('Ranges'),\n value: 'rangeValue',\n defaults: {\n table: defaultContext.colorRangeConfig,\n },\n },\n {\n label: _('Matches'),\n value: 'matchValue',\n defaults: {\n table: defaultContext.colorMatchConfig,\n },\n },\n ],\n dataSelectors: [\n {\n label: _('Table'),\n value: 'table',\n },\n ],\n defaultPalettesConfig,\n },\n },\n ],\n [\n {\n label: _('Column-specific formatting'),\n editor: 'editor.tableColumnFormatter',\n editorProps: {\n // popover: {sections: [textFormatConfig, formatByTypeConfig, columnColoringConfig]}\n // Table column coloring does not adhere to same DSL structure as other dynamically colored options\n // we use the FormatterEditor directly and not the DynamicColorEditor's provided DSL builders\n columnColoringConfig: {\n coloringTypes: [\n {\n label: _('Text'),\n value: 'rowColors',\n },\n {\n label: _('Background'),\n value: 'rowBackgroundColors',\n },\n ],\n formatters: [\n {\n label: _('Ranges'),\n value: 'rangeValue',\n defaults: {\n rowBackgroundColors: defaultContext.colorRangeConfig,\n rowColors: defaultContext.colorRangeConfig,\n },\n },\n {\n label: _('Matches'),\n value: 'matchValue',\n defaults: {\n rowBackgroundColors: defaultContext.colorMatchConfig,\n rowColors: defaultContext.colorMatchConfig,\n },\n },\n ],\n themes,\n },\n defaultOptionsByType: {\n number: {\n thousandSeparated: false,\n unitPosition: 'after',\n },\n string: {\n unitPosition: 'after',\n },\n text: {\n align: 'auto',\n headerAlign: 'auto',\n textOverflow: 'break-word',\n },\n },\n textFormatConfig: [\n [\n {\n ...headerAlignConfigColumn,\n },\n ],\n [\n {\n ...textAlignConfigColumn,\n },\n ],\n [\n {\n ...textOverflowConfigColumn,\n },\n ],\n ],\n flyoutConfig: {\n number: [\n [\n {\n ...unitPositionConfig,\n },\n {\n ...unitLabelConfig,\n },\n ],\n [\n {\n label: _('Precision'),\n option: 'precision',\n editor: 'editor.select',\n editorProps: {\n values: generatePrecisionValues(20),\n },\n },\n {\n label: _('Thousand separators'),\n option: 'thousandSeparated',\n editor: 'editor.radioBar',\n editorProps: {\n values: [\n {\n label: _('Off'),\n value: false,\n },\n { label: _('On'), value: true },\n ],\n },\n },\n ],\n ],\n sparkline: [], // Configure via columnFormat.sparklineNullValueDisplay\n string: [\n [\n {\n ...unitPositionConfig,\n },\n {\n ...unitLabelConfig,\n },\n ],\n ],\n time: [\n [\n {\n ...timeFormattingConfig,\n },\n ],\n ],\n },\n value: ({ context, options }) => {\n return {\n context,\n columnFormat: options.columnFormat,\n tableFormat: options.tableFormat,\n };\n },\n },\n key: 'TableColumnFormatterEditor',\n },\n ],\n ],\n },\n];\n\n/**\n * visualization configuration\n */\nconst config: VizConfig = {\n /**\n * unique viz key\n */\n key: 'splunk.table',\n /**\n * viz name\n */\n name: _('Table'),\n category: VizCategory.TABLE,\n /**\n * viz icon\n */\n icon: TableIcon,\n placeholderIcon: TablePlaceholderIcon,\n dataContract,\n size,\n defaultContext,\n optionsSchema,\n editorConfig,\n events: {\n 'cell.click': {\n description: 'triggered when user clicks a table cell',\n },\n },\n supports: [\n VizBehavior.DYNAMIC_OPTIONS,\n VizBehavior.EVENTS,\n VizBehavior.PAGE_AND_SORT,\n VizBehavior.PLACEHOLDER,\n ],\n themes,\n};\n\nexport default enhanceConfig(config);\n", "// extractUnitFromFormattedString removed; footer formatting will use columnFormat options\n\n// Build a map of totals keyed by field name from fields metadata\nexport const buildTotalsByFieldFromFieldsMeta = (\n fieldsMeta: Array<Record<string, unknown>> | undefined | null\n): Record<string, number> => {\n const totalsByField: Record<string, number> = {};\n const fields = Array.isArray(fieldsMeta) ? fieldsMeta : [];\n fields.forEach(f => {\n if (f && typeof f === 'object' && Object.prototype.hasOwnProperty.call(f, 'summary.sum')) {\n const name = (f as { name?: string }).name ?? '';\n if (name) {\n const raw = f['summary.sum'];\n const isEmptyString = typeof raw === 'string' && raw.trim() === '';\n if (raw !== null && raw !== undefined && !isEmptyString) {\n const n = Number(raw);\n if (Number.isFinite(n)) totalsByField[name] = n;\n }\n }\n }\n });\n return totalsByField;\n};\n\n// Build footer DataFrames from field metadata for DSL usage\nexport const buildFooterDataFrames = (fieldsMeta: Array<Record<string, unknown>> | undefined | null) => {\n const totalsByField = buildTotalsByFieldFromFieldsMeta(fieldsMeta);\n // Build a percentage map from totals to support default footer percentages\n const entries = Object.entries(totalsByField).filter(([, v]) => Number.isFinite(v));\n const grandTotal = entries.reduce((acc, [, v]) => acc + Number(v), 0);\n const percentagesByField: Record<string, string> = {};\n if (grandTotal > 0) {\n entries.forEach(([k, v]) => {\n const pct = ((Number(v) / grandTotal) * 100).toFixed(2);\n percentagesByField[k] = `${pct}%`;\n });\n }\n\n // Get all field names from metadata\n const fields = Array.isArray(fieldsMeta) ? fieldsMeta : [];\n const fieldNames = fields.map(f => (f as { name?: string }).name).filter(Boolean);\n\n // Build combined footer frame with per-column series each having [total, percentage]\n const combinedFooterFields = fieldNames.map(name => ({ name }));\n const combinedFooterColumns = fieldNames.map(name => {\n const total = totalsByField[name];\n const pct = percentagesByField[name];\n return [typeof total === 'number' ? total : '', pct || ''];\n });\n\n return {\n footer: { fields: combinedFooterFields, columns: combinedFooterColumns },\n };\n};\n", "\nimport * as defaultImport from \"@splunk/themes/getSettingsFromThemedProps\";\nexport * from \"@splunk/themes/getSettingsFromThemedProps\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualization-encoding/Options\";\nexport * from \"@splunk/visualization-encoding/Options\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/SanitizeProps\";\nexport * from \"@splunk/visualizations-shared/SanitizeProps\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualization-context/TimezoneContext\";\nexport * from \"@splunk/visualization-context/TimezoneContext\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/moment\";\nexport * from \"@splunk/moment\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualization-context/FeatureFlagContext\";\nexport * from \"@splunk/visualization-context/FeatureFlagContext\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"styled-components\";\nexport * from \"styled-components\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/hocUtils\";\nexport * from \"@splunk/visualizations-shared/hocUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/JSONSchemaUtils\";\nexport * from \"@splunk/visualizations-shared/JSONSchemaUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/async-dynamic-options-evaluator\";\nexport * from \"@splunk/async-dynamic-options-evaluator\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"prop-types\";\nexport * from \"prop-types\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "/* eslint-disable class-methods-use-this */\nexport interface VizActionHandler {\n /**\n * put focus on the visualization\n */\n focus(): void;\n\n /**\n * compute snapshot of this visualization\n */\n snapshot(): Record<string, unknown>; // (This is for pdf export)\n}\n\nexport class DefaultVizActionHandler {\n focus(): void {\n // noop\n }\n\n snapshot(): Record<string, unknown> {\n return null; // noop\n }\n}\n", "/* eslint-disable react/no-unused-prop-types,react/prefer-stateless-function */\nimport * as T from 'prop-types';\nimport { noop } from 'lodash';\nimport { DashboardVizProps } from './interfaces/DashboardVizProps';\nimport { DefaultVizActionHandler } from './interfaces/VizActionHandler';\n\n// this is identical to the initial height and width we use in BaseVisualization in dashboard-visualizations\nexport const INITIAL_WIDTH = 250;\nexport const INITIAL_HEIGHT = 250;\n\n/**\n * A Splunk visualization\n */\nclass SplunkVisualization {\n static readonly propTypes: Record<keyof DashboardVizProps, T.Validator<any>> = {\n /**\n * display mode\n */\n mode: T.oneOf(['view', 'edit', 'export']).isRequired,\n /**\n * width in pixel or string, defaults to 100%\n */\n width: T.oneOfType([T.string, T.number]).isRequired,\n /**\n * height in pixel or string\n */\n height: T.oneOfType([T.string, T.number]).isRequired,\n /**\n * visualization context used for dynamic option evaluation\n */\n context: T.object,\n /**\n * visualization formatting options\n */\n options: T.object,\n /**\n * A callback to update formatting options\n */\n onOptionsChange: T.func,\n /**\n * datasource state which include data and request params, object key indicate the datasource type.\n */\n dataSources: T.objectOf(\n T.shape({\n /**\n * current request params\n */\n requestParams: T.object,\n /**\n * current dataset\n */\n data: T.shape({\n fields: T.array,\n columns: T.array,\n }),\n /**\n * error\n */\n error: T.shape({\n level: T.string,\n message: T.string,\n }),\n /**\n * meta data that came with the dataset\n */\n meta: T.object,\n })\n ),\n /**\n * A callback to trigger event\n */\n onEventTrigger: T.func,\n /**\n * Inform viz if there are handlers listening to events\n */\n hasEventHandlers: T.bool,\n /**\n * A callback to communicate computed props to a consumer\n */\n onComputedProps: T.func,\n /**\n * A callback to obtain visualization api\n */\n vizActionHandlerRef: T.func,\n\n loading: T.bool,\n theme: T.object,\n /**\n * A callback to request new data with updated request params\n */\n onRequestParamsChange: T.func,\n };\n\n /**\n *\n */\n public static readonly defaults: DashboardVizProps = {\n // BaseVisualization in dashboard-visualizations uses 100% for width but 250 for height\n width: '100%',\n height: INITIAL_HEIGHT,\n dataSources: {},\n onEventTrigger: (): Record<string, unknown> => ({}),\n mode: 'view',\n hasEventHandlers: false,\n options: {},\n context: {},\n onOptionsChange: (): Record<string, unknown> => ({}),\n vizActionHandlerRef: (): DefaultVizActionHandler => new DefaultVizActionHandler(),\n onComputedProps: (): Record<string, unknown> => ({}),\n loading: false,\n onRequestParamsChange: noop,\n };\n}\n\nexport default SplunkVisualization;\n", "import { FieldEntry } from '@splunk/visualizations-shared/dataSourceUtils';\nimport { validSegmentationModes } from '@splunk/visualization-schemas';\n\nexport interface JsonColumnData {\n fields: FieldEntry[] | string[];\n columns: (string | number | null)[][];\n}\n\nexport type HighlightedSourceMap = Record<string, Record<string, boolean>>;\nexport type TagsMap = Record<string, Record<string, string[]>>;\n\nexport interface Meta {\n totalCount: number;\n sid: string;\n app: string;\n highlighted?: HighlightedSourceMap;\n tags?: TagsMap;\n}\n\nexport const validSortDirs = ['asc', 'desc', 'none'] as const;\nexport type SortDirType = (typeof validSortDirs)[number];\nexport type SegmentationType = (typeof validSegmentationModes)[number];\nexport const validOutputModes = ['json_cols', 'json'] as const;\nexport type OutputModeType = (typeof validOutputModes)[number];\n\nexport interface RequestParams {\n count?: number;\n offset?: number;\n sort?: {\n [sortKey: string]: SortDirType;\n };\n segmentation?: SegmentationType;\n // eslint-disable-next-line camelcase\n output_mode?: OutputModeType;\n}\n\nexport interface DataSource {\n requestParams: Partial<RequestParams>;\n onRequestParamsChange?: (p: Record<string, unknown>) => void;\n data: JsonColumnData;\n error?: { level: string; message: string };\n meta: Partial<Meta>;\n}\n\nexport interface DataSourceMeta {\n requestParams: Partial<RequestParams>;\n meta: Partial<Meta>;\n onRequestParamsChange: (payload: RequestParams) => void;\n}\n", "import * as T from 'prop-types';\nimport { has } from 'lodash';\nimport { DataSourceMeta, SortDirType, validSortDirs } from '../interfaces/DataSource';\n\nexport interface SortParams {\n currentSortKey?: string;\n currentSortDir?: SortDirType;\n onSort?: (e: MouseEvent, { sortKey, sortDir }: { sortKey: string; sortDir: SortDirType }) => void;\n}\n\nexport const SortParamsPropTypes = T.shape({\n currentSortKey: T.string,\n currentSortDir: T.oneOf(validSortDirs),\n onSort: T.func,\n});\n\nexport const useSortingParams = ({ requestParams, onRequestParamsChange }: DataSourceMeta): SortParams => {\n let currentSortKey: string | undefined;\n let currentSortDir: SortDirType | undefined;\n\n const nextSortDirMap: Record<SortDirType, SortDirType> = {\n asc: 'desc',\n desc: 'asc',\n none: 'asc',\n };\n\n let onSort: SortParams['onSort'];\n if (typeof onRequestParamsChange === 'function') {\n if (requestParams && has(requestParams, 'sort')) {\n currentSortKey = Object.keys(requestParams.sort).shift();\n currentSortDir = requestParams.sort[currentSortKey];\n }\n\n // undid memoization since there is a dependency on requestParams, which is a deeply nested object\n onSort = (e, { sortKey, sortDir }): void => {\n if (typeof sortKey === 'string') {\n const nextSortDir = has(nextSortDirMap, sortDir) ? nextSortDirMap[sortDir] : 'none';\n onRequestParamsChange({\n ...requestParams,\n ...{ offset: 0, sort: { [sortKey]: nextSortDir } },\n });\n } else {\n onRequestParamsChange(requestParams);\n }\n };\n }\n\n return {\n currentSortKey,\n currentSortDir,\n onSort,\n };\n};\n", "import * as T from 'prop-types';\nimport { cloneDeep, noop } from 'lodash';\nimport * as React from 'react';\nimport { DataSourceMeta, RequestParams } from '../interfaces/DataSource';\n\nexport interface OnChangeParams {\n page?: number;\n count?: number;\n}\nexport interface PaginatorParams {\n isPaging?: boolean;\n current?: number;\n totalPages?: number;\n onChange?: (event: React.MouseEvent<HTMLButtonElement>, data: OnChangeParams) => void;\n}\n\nexport const PaginatorParamsPropTypes = T.shape({\n isPaging: T.bool,\n current: T.number,\n totalPages: T.number,\n onChange: T.func,\n});\n\nexport const usePaginationParams = ({\n requestParams,\n meta,\n onRequestParamsChange,\n}: DataSourceMeta): PaginatorParams => {\n const totalCount = meta?.totalCount || 0;\n const offset = requestParams?.offset || 0;\n const count = requestParams?.count;\n const totalPages = typeof count === 'number' && count > 0 ? Math.ceil(totalCount / count) : 0;\n const current = typeof count === 'number' && count > 0 ? Math.floor(offset / count) + 1 : 0;\n const isPaging = totalPages > 1 && typeof onRequestParamsChange === 'function';\n\n const onChangeHandler = (e, { page, count: countArg }: OnChangeParams): void => {\n const newParams: RequestParams = cloneDeep(requestParams);\n\n if (typeof countArg === 'number') {\n newParams.count = countArg;\n newParams.offset = 0;\n }\n\n const pageCount = typeof newParams.count === 'number' ? newParams.count : 10;\n if (typeof page === 'number' && page > 0) {\n newParams.count = pageCount;\n newParams.offset = (page - 1) * pageCount;\n }\n\n onRequestParamsChange(newParams);\n };\n\n return {\n isPaging,\n current,\n totalPages,\n onChange: typeof onRequestParamsChange === 'function' ? onChangeHandler : noop,\n };\n};\n", "import { useRef } from 'react';\nimport { isEqual } from 'lodash';\n\n/**\n * This hook evaluates and stores the result of a passed function and only\n * re-evaluates the function when passed dependencies change.\n *\n * It is different from the internal React useMemo in the following aspects:\n * - it only stores the last evaluated result\n * - it uses a deep equality check to determine if dependencies have changed\n *\n * Inspired by apollo-client's useDeepMemo\n *\n * @param fn the function to be executed and\n * @param dependencies an array of dependencies\n */\nexport const useDeepMemo = <FnReturnType, DepType>(\n fn: () => FnReturnType,\n dependencies: DepType\n): FnReturnType => {\n const ref = useRef<{ dependencies: DepType; value: FnReturnType }>();\n if (!ref.current || !isEqual(dependencies, ref.current.dependencies)) {\n ref.current = {\n dependencies,\n value: fn(),\n };\n }\n return ref.current.value;\n};\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/Message\";\nexport * from \"@splunk/visualizations-shared/Message\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/SizeAwareWrapper\";\nexport * from \"@splunk/visualizations-shared/SizeAwareWrapper\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import * as React from 'react';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport Message from '@splunk/visualizations-shared/Message';\nimport SizeAwareWrapper from '@splunk/visualizations-shared/SizeAwareWrapper';\nimport SplunkVisualization from '../SplunkVisualization';\n\n/**\n * @method isMissing\n * @param {any} v\n * @returns {boolean} true if the input value === null or undefined\n */\nexport const isMissing = (v): boolean => {\n return v === null || v === undefined;\n};\n\n/**\n * @method misskingKeys\n * @param {string[]} keys\n * @param {object} target\n * @returns {string[]} the keys of missing required props\n */\nexport const missingKeys = (keys: string[], target: Record<string, unknown>): string[] =>\n keys.filter(k => isMissing(target[k]));\n\nexport interface MissingPropsProps {\n width?: string | number;\n height?: string | number;\n missingProps: string[];\n backgroundColor?: string;\n}\n\n/**\n * @method MissingPropsMessage\n * @param {MissingPropsProps} props\n * @returns {React.ReactElement}\n */\nexport const MissingPropsMessage = (props: MissingPropsProps): React.ReactElement => {\n const {\n width = SplunkVisualization.defaults.width,\n height = SplunkVisualization.defaults.height,\n missingProps,\n backgroundColor,\n } = props;\n const cachedHandleResize = React.useCallback((w, h) => {\n setContainerWidth(w);\n setContainerHeight(h);\n }, []);\n const [containerWidth, setContainerWidth] = React.useState<number>(Number(width));\n const [containerHeight, setContainerHeight] = React.useState<number>(Number(height));\n return (\n <div style={{ width: containerWidth, height: containerHeight, background: backgroundColor }}>\n <SizeAwareWrapper width={width} height={height} onResize={cachedHandleResize} />\n <Message\n data-test=\"message\"\n width={width}\n height={height}\n message={_(`Missing property: ${missingProps.join(', ')}`)}\n level=\"error\"\n />\n </div>\n );\n};\n\nexport default MissingPropsMessage;\n", "import { DashboardVizProps } from '../interfaces/DashboardVizProps';\n\nexport type DashboardVizType = React.ComponentType<DashboardVizProps>;\n\n/**\n * @method extendStaticWrapperProps\n * @param {Object} props\n * @param {DashboardVizType} props.Wrapper\n * @param {DashboardVizType} props.Visualization\n */\nexport const extendStaticWrapperProps = ({\n Wrapper,\n Visualization,\n}: {\n [key: string]: DashboardVizType;\n}): void => {\n const extendProperties = ['propTypes', 'config'];\n extendProperties.forEach((prop: string): void => {\n if (Visualization[prop]) {\n // eslint-disable-next-line no-param-reassign\n Wrapper[prop] = Visualization[prop];\n }\n });\n};\n", "import * as React from 'react';\nimport styled from 'styled-components';\nimport { DashboardVizProps } from '../interfaces/DashboardVizProps';\nimport { ExtendedDashViz } from '../interfaces/ExtendedDashViz';\nimport { extendStaticWrapperProps } from '../utils/hocUtils';\n\n// Global provided via webpack\n// eslint-disable-next-line no-underscore-dangle\ndeclare const __VISION_VERSION__: string;\n\nconst Cover = styled.div`\n position: absolute;\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n`;\n\nconst Blocker = styled.div.attrs({\n 'data-splunk-visualization-version': __VISION_VERSION__,\n})`\n position: relative;\n width: 100%;\n height: 100%;\n`;\n\n/**\n * HOC that renders a cover layer in edit mode\n * @method withEditModeCover\n * @param {ExtendedDashViz} Visualization\n * @returns {ExtendedDashViz} Wrapper\n */\nconst withEditModeCover = (\n Visualization: ExtendedDashViz,\n disableEditModeCover?: boolean\n): ExtendedDashViz => {\n const Wrapper = (props: DashboardVizProps): React.ReactElement<DashboardVizProps> => {\n const { mode } = props;\n const showEditCover = mode === 'edit' && !disableEditModeCover;\n\n return (\n <Blocker>\n <Visualization {...props} />\n {showEditCover && <Cover data-test=\"edit-mode-cover\" />}\n </Blocker>\n );\n };\n extendStaticWrapperProps({ Wrapper, Visualization });\n return Wrapper as ExtendedDashViz;\n};\n\nexport default withEditModeCover;\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/style\";\nexport * from \"@splunk/visualizations-shared/style\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import * as React from 'react';\nimport styled from 'styled-components';\nimport { toPx } from '@splunk/visualizations-shared/style';\nimport { isColor } from '@splunk/visualizations-shared/colorUtils';\nimport SizeAwareWrapper from '@splunk/visualizations-shared/SizeAwareWrapper';\n\n// Global provided via webpack\n// eslint-disable-next-line no-underscore-dangle\ndeclare const __VISION_VERSION__: string;\n\ninterface ItemProps {\n backgroundColor?: string;\n width?: string | number;\n}\n\nconst Item = styled.div.attrs<ItemProps>(({ width }) => ({\n style: {\n width: toPx(width),\n },\n}))<ItemProps>`\n position: relative;\n background-color: ${(props): string =>\n (isColor(props.backgroundColor) && props.backgroundColor) || props.theme.defaultBackgroundColor}};\n`;\n\ninterface FixSizeItemProps {\n backgroundColor?: string;\n height?: string | number;\n width?: string | number;\n}\n\n// Use `.attrs()` for highly dynamic styles. Ref: https://github.com/styled-components/styled-components/issues/134#issuecomment-312415291\nconst FixSizeItem = styled.div.attrs<FixSizeItemProps>(\n ({\n width,\n height,\n }): {\n style: { width?: string; height?: string };\n } => {\n // Ensure height is never negative (browsers ignore negative height)\n const validHeight = typeof height === 'number' ? Math.max(height, 1) : height;\n return {\n style: {\n ...(width && { width: toPx(width) }),\n ...(validHeight && { height: toPx(validHeight) }),\n },\n };\n }\n)<FixSizeItemProps>`\n position: relative;\n flex-direction: column;\n flex: 1;\n display: flex;\n overflow: hidden !important;\n background-color: ${(props): string =>\n (isColor(props.backgroundColor) && props.backgroundColor) || props.theme.defaultBackgroundColor}};\n`;\n\nconst ItemContent = styled.div`\n position: relative;\n min-height: 100px;\n width: 100%;\n`;\n\nconst FixSizeItemContent = styled.div`\n min-height: 0px;\n flex: 1;\n position: relative;\n box-sizing: border-box;\n overflow: hidden !important;\n`;\n\ninterface HeightAndWidthProps {\n width?: string | number;\n height?: string | number;\n backgroundColor?: string;\n}\n\nconst withFixedSizeContainer = <P extends HeightAndWidthProps>(\n Viz: React.ComponentType<P>\n): React.ComponentType<P> => {\n const FixedSizeContainer = (props: P): React.ReactElement => {\n const { width, height, backgroundColor } = props;\n const cachedHandleResize = React.useCallback((w, h) => {\n setContainerWidth(w);\n setContainerHeight(h);\n }, []);\n const [containerWidth, setContainerWidth] = React.useState<number>(Number(props.width));\n const [containerHeight, setContainerHeight] = React.useState<number>(Number(props.height));\n if (!height) {\n return (\n <Item data-test=\"item\" width={width} backgroundColor={backgroundColor}>\n <ItemContent>\n <Viz {...props} />\n </ItemContent>\n </Item>\n );\n }\n return (\n <FixSizeItem\n data-test=\"fix-size-item\"\n data-splunk-visualization-version={__VISION_VERSION__}\n width={width}\n height={height}\n backgroundColor={backgroundColor}\n >\n <FixSizeItemContent>\n <SizeAwareWrapper width={width} height={height} onResize={cachedHandleResize} />\n <Viz {...props} width={containerWidth} height={containerHeight} />\n </FixSizeItemContent>\n </FixSizeItem>\n );\n };\n FixedSizeContainer.displayName = 'withFixedSizeContainer';\n return FixedSizeContainer;\n};\n\nexport default withFixedSizeContainer;\n", "import * as React from 'react';\nimport { get } from 'lodash';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport Message from '@splunk/visualizations-shared/Message';\nimport { DataSource } from '../interfaces/DataSource';\nimport withFixedSizeContainer from '../hocs/FixedSizeContainer';\nimport SplunkVisualization from '../SplunkVisualization';\n\n/**\n * @method shouldShowIconPlaceholder\n * @param {object} dataSources\n * @param {boolean} loading\n * @returns {boolean}\n */\nexport const shouldShowIconPlaceholder = (\n dataSources: { [name: string]: DataSource },\n loading = false\n): boolean => {\n const data = get(dataSources, 'primary.data.columns[0]', undefined);\n const noData = data === undefined;\n const fields = get(dataSources, 'primary.data.fields[0]', undefined);\n const noFields = fields === undefined;\n return loading || noData || noFields;\n};\n\nexport interface IconPlaceholderProps {\n icon?: React.ComponentType<any>;\n width?: string | number;\n height?: string | number;\n iconColor?: string;\n backgroundColor: string;\n}\n\n/**\n * @method IconPlaceholder\n * @param {IconPlaceholderProps} props\n * @returns {React.ReactElement}\n */\nconst IconPlaceholder = (props: IconPlaceholderProps): React.ReactElement => {\n const {\n width = SplunkVisualization.defaults.width,\n height = SplunkVisualization.defaults.height,\n icon,\n iconColor,\n backgroundColor,\n } = props;\n\n let content = (\n <Message width={width} height={height} level=\"warning\" message={_('No DataSource Connected')} />\n );\n if (icon) {\n content = React.createElement(icon, {\n style: {\n left: '50%',\n top: '50%',\n color: iconColor,\n opacity: 0.15,\n position: 'absolute',\n transform: 'translate(-50%, -50%)',\n },\n width: '50%',\n height: '50%',\n 'data-test': 'icon-placeholder',\n });\n }\n\n return <div style={{ width, height, background: backgroundColor }}>{content}</div>;\n};\n\nexport default withFixedSizeContainer(IconPlaceholder);\n", "import * as React from 'react';\nimport { isColor } from '@splunk/visualizations-shared/colorUtils';\nimport variables from '@splunk/themes/variables';\nimport IconPlaceholder, { shouldShowIconPlaceholder } from '../components/IconPlaceholder';\nimport { VizBehavior } from '../interfaces/VizBehavior';\nimport { DashboardVizProps } from '../interfaces/DashboardVizProps';\nimport { DataSource } from '../interfaces/DataSource';\nimport { ExtendedDashViz } from '../interfaces/ExtendedDashViz';\nimport { extendStaticWrapperProps } from '../utils/hocUtils';\nimport SplunkVisualization from '../SplunkVisualization';\n\ntype useIconPlaceholderType = (\n dataSources: { [name: string]: DataSource },\n loading: boolean,\n options: Record<string, unknown>\n) => boolean;\n\nconst withPlaceholder = (\n Visualization: ExtendedDashViz,\n useIconPlaceholder: useIconPlaceholderType = shouldShowIconPlaceholder\n): ExtendedDashViz => {\n const { config } = Visualization;\n const { themes } = config;\n\n const Wrapper = (props: DashboardVizProps): React.ReactElement<DashboardVizProps> => {\n const {\n dataSources,\n loading,\n options,\n height = SplunkVisualization.defaults.height,\n width = SplunkVisualization.defaults.width,\n } = props;\n\n const showPlaceholder = useIconPlaceholder(dataSources, loading, options);\n const icon = config.placeholderIcon ?? config.icon;\n const iconColor = variables.contentColorActive(props);\n const bgColorFromTheme = isColor(options?.backgroundColor)\n ? options?.backgroundColor\n : themes?.defaultBackgroundColor?.(props);\n\n if (config.supports.includes(VizBehavior.PLACEHOLDER) && showPlaceholder) {\n return (\n <IconPlaceholder\n data-test=\"icon-placeholder\"\n icon={icon}\n width={width}\n height={height}\n backgroundColor={bgColorFromTheme}\n iconColor={iconColor}\n />\n );\n }\n\n return <Visualization {...props} />;\n };\n extendStaticWrapperProps({ Wrapper, Visualization });\n return Wrapper as ExtendedDashViz;\n};\n\nexport default withPlaceholder;\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/numberUtils\";\nexport * from \"@splunk/visualizations-shared/numberUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import type { FieldEntry } from '@splunk/visualizations-shared/dataSourceUtils';\nimport { startsWithNumber } from '@splunk/visualizations-shared/numberUtils';\nimport type { DashboardVizProps, DataSource, VizConfig } from '../interfaces';\nimport { VizBehavior } from '../interfaces';\nimport { ChartEvent } from '../interfaces/ChartEvent';\n\nexport const convertToArrOfObjects = (columns: (string | any[])[], fields: any[]): any[] => {\n if (!columns?.[0]?.length) return [];\n\n const data = [];\n\n for (let i = 0; i < columns[0].length; i += 1) {\n const newObj = {};\n fields.forEach((field, index) => {\n const fieldName = getFieldName(field);\n if (columns[index][i] === '') {\n newObj[fieldName] = null;\n } else {\n newObj[fieldName] = columns[index][i];\n }\n });\n data.push(newObj);\n }\n\n return data;\n};\n\nconst getFieldName = (field: FieldEntry | string): string => (typeof field === 'string' ? field : field.name);\n\n// LTTB algorithm which can be used to downsample time series data while striving to maintain\n// the spikes and overall shape of the chart\n// Copied from https://github.com/sveinn-steinarsson/flot-downsample/blob/0815010016fc94b1bbc6a010afb8aad13ada6d0d/jquery.flot.downsample.js\n// Modifications include:\n// 1) Convert to modern JavaScript(use const, let, and use array.push to push to last element of array)\n// 2) Convert to camel case\n// 3) Convert to TS and also return the indices of the points that are in the downsampled result.\n// 4) Add a new parameter preferredDownsampleIndices that correspond to the indices of points\n// that should be used in case of a tie of the max area in a bucket\nconst largestTriangleThreeBuckets = (\n data: [Date | number, number][],\n threshold: number,\n preferredDownsampleIndices: Set<number>\n): {\n downsampledData: [Date | number, number][];\n downsampledIndices: number[];\n} => {\n const dataLength = data.length;\n const downsampledIndices = [];\n if (threshold >= dataLength || threshold === 0) {\n const allIndices = data.map((values, index) => index);\n return { downsampledData: data, downsampledIndices: allIndices }; // Nothing to do\n }\n\n const sampled: [Date | number, number][] = [];\n let sampledIndex = 0;\n\n // Bucket size. Leave room for start and end data points\n const every = (dataLength - 2) / (threshold - 2);\n\n let a = 0; // Initially a is the first point in the triangle\n let maxAreaPoint: [Date | number, number];\n let maxArea: number | undefined;\n let area: number | undefined;\n let nextA: number | undefined;\n\n sampled.push(data[a]); // Always add the first point\n downsampledIndices.push(0);\n\n // eslint-disable-next-line no-plusplus\n for (let i = 0; i < threshold - 2; i++) {\n // Calculate point average for next bucket (containing c)\n let avgX = 0;\n let avgY = 0;\n let avgRangeStart = Math.floor((i + 1) * every) + 1;\n let avgRangeEnd = Math.floor((i + 2) * every) + 1;\n avgRangeEnd = avgRangeEnd < dataLength ? avgRangeEnd : dataLength;\n\n const avgRangeLength = avgRangeEnd - avgRangeStart;\n\n // eslint-disable-next-line no-plusplus\n for (; avgRangeStart < avgRangeEnd; avgRangeStart++) {\n avgX += Number(data[avgRangeStart][0]); // * 1 enforces Number (value may be Date)\n avgY += data[avgRangeStart][1] * 1;\n }\n avgX /= avgRangeLength;\n avgY /= avgRangeLength;\n\n // Get the range for this bucket\n let rangeOffs = Math.floor((i + 0) * every) + 1;\n const rangeTo = Math.floor((i + 1) * every) + 1;\n\n // Point a\n const pointAX = Number(data[a][0]); // Enforce Number (value may be Date)\n const pointAY = data[a][1] * 1;\n\n // eslint-disable-next-line no-multi-assign\n maxArea = area = -1;\n let maxAreaIndex = rangeOffs;\n\n // eslint-disable-next-line no-plusplus\n for (; rangeOffs < rangeTo; rangeOffs++) {\n // Calculate triangle area over three buckets\n area =\n Math.abs(\n (pointAX - avgX) * (data[rangeOffs][1] - pointAY) -\n (pointAX - Number(data[rangeOffs][0])) * (avgY - pointAY)\n ) * 0.5;\n // Modification: try to downsample the least amount of points possible when there are multiple series\n // If all points in a bucket have the same area, prioritize the one with an x index\n // that also existed from another series so we don't add another point unnecessarily.\n // By default LTTB picks the leftmost point in the bucket\n if (area > maxArea || (area === maxArea && preferredDownsampleIndices.has(rangeOffs))) {\n maxArea = area;\n maxAreaPoint = data[rangeOffs];\n nextA = rangeOffs; // Next a is this b\n // Modification: save the index of the point with the most area\n maxAreaIndex = rangeOffs;\n }\n }\n\n // eslint-disable-next-line no-plusplus\n sampled[sampledIndex++] = maxAreaPoint; // Pick this point from the bucket\n downsampledIndices.push(maxAreaIndex);\n a = nextA; // This a is the next a (chosen b)\n }\n\n // eslint-disable-next-line no-plusplus\n sampled[sampledIndex++] = data[dataLength - 1]; // Always add last\n downsampledIndices.push(dataLength - 1);\n\n return { downsampledData: sampled, downsampledIndices };\n};\n\nexport type DownsampleOptions = { threshold: number } & Pick<DashboardVizProps, 'dataSources' | 'options'>;\n\ntype CoerceYColumnResult = {\n canDownsampleColumn: boolean;\n canLooselyCoerceSomeValues: boolean;\n coercedColumn: number[];\n};\n\n/**\n * Strictly coerces the entire column to numbers if it only consists of numeric strings or numbers. Also determines\n * if at least one of the values in the column can be loosely coerced to a number.\n * If the column cannot be strictly downsampled (if it contains nulls or non-numeric strings), returns an empty array and\n * returns that it cannot downsample the column.\n */\nconst strictlyCoerceYColumn = (\n column: (string | number)[] | number[],\n options: DownsampleOptions['options']\n): CoerceYColumnResult => {\n const isNullCoercionEnabled = options.nullValueDisplay === 'zero';\n // Splunk charting allows for numbers in formats such as negative hex that\n // Number() does not support and also allows loose coercion of hex numbers (but not other formats)\n // We want to identify columns which contain at least one value that can be loosely coerced\n const canLooselyCoerceSomeValues =\n column.findIndex(\n value => startsWithNumber(`${value}`) || (isNullCoercionEnabled && value === null)\n ) >= 0;\n\n // If not all values in column can be strictly coerced to a number, we do not downsample\n const coercedColumn: number[] = [];\n const canDownsampleColumn = !column.some(value => {\n const coercedValue = Number(value);\n const coerceValueToZero = isNullCoercionEnabled && value === null;\n\n // if it can't be parsed or isn't safe, fail\n if (\n Number.isNaN(coercedValue) ||\n coercedValue <= Number.MIN_SAFE_INTEGER ||\n coercedValue >= Number.MAX_SAFE_INTEGER ||\n (typeof value !== 'string' && typeof value !== 'number' && !coerceValueToZero)\n ) {\n return true;\n }\n // save value and continue to next\n coercedColumn.push(coercedValue);\n return false;\n });\n\n return {\n canDownsampleColumn,\n canLooselyCoerceSomeValues,\n coercedColumn: canDownsampleColumn ? coercedColumn : [],\n };\n};\n\n/**\n * Tries to coerce the x-column to numbers or dates, if it is eligible for downsampling.\n * Only strictly increasing x-columns are eligible for downsampling.\n * If the column is not eligible for downsampling, returns an empty array.\n */\nconst strictlyCoerceXColumn = (column: (string | number)[], fieldType: string): Date[] | number[] => {\n if (fieldType === 'number') {\n const coercedXColumn = column.map(xValue => Number(xValue));\n if (isColumnStrictlyIncreasing(coercedXColumn, fieldType)) {\n return coercedXColumn;\n }\n } else if (fieldType === 'time') {\n const coercedXColumn = column.map(xValue => new Date(xValue));\n if (isColumnStrictlyIncreasing(coercedXColumn, fieldType)) {\n return coercedXColumn;\n }\n }\n return [];\n};\n\nexport const isDownsamplingEnabledForViz = ({ vizConfig }: { vizConfig: VizConfig }) => {\n return vizConfig.supports?.includes(VizBehavior.DOWNSAMPLING);\n};\n\nexport const calculateThresholdOnRangeSelect = ({\n firstIndex,\n lastIndex,\n dataSources,\n width,\n}: Pick<DashboardVizProps, 'dataSources'> & {\n firstIndex: number;\n lastIndex: number;\n width: number | string;\n}): number => {\n const window = lastIndex - firstIndex + 1;\n // eslint-disable-next-line no-unsafe-optional-chaining\n const ratio = Math.round(Number(dataSources?.primary?.data?.columns[0]?.length / window) * 10) / 10;\n return Math.round(ratio * Number(width));\n};\n\n/**\n * Calculates the downsampling threshold based on the range selection. If search zoom is enabled or there is no selection,\n * then returns the width of the visualization.\n *\n * Otherwise calculates the threshold based on the ratio of the window selected compared to the size of the non-downsampled\n * data sources. Returns null if the chart event's dataset does not match the passed in primary data source or if the chart is zoomed\n * in for a categorical chart.\n */\nexport const calculateDownsamplingThreshold = ({\n enableSearchZoom,\n dataSources,\n selectChartEvent,\n width,\n xField,\n}: {\n enableSearchZoom: boolean;\n dataSources: Record<string, DataSource> | null;\n selectChartEvent: ChartEvent<'chartRangeSelect'> | null;\n width: number;\n xField: string;\n}): number | null => {\n if (enableSearchZoom || !selectChartEvent) {\n return Number(width);\n }\n\n const primaryDataSource = dataSources?.primary;\n if (!primaryDataSource) {\n return null;\n }\n\n const { startXIndex, endXIndex, currentTarget } = selectChartEvent;\n\n try {\n const xFieldIndex = primaryDataSource?.data?.fields.findIndex(field => {\n const name = typeof field === 'string' ? field : field.name;\n return name === xField;\n });\n const downsampledXFieldIndex = currentTarget.dataSet?.fields.findIndex(field => field === xField);\n\n if (xFieldIndex === -1 || downsampledXFieldIndex === -1) {\n return null;\n }\n\n const fullSeries = primaryDataSource?.data?.columns[xFieldIndex];\n const downsampledSeries = currentTarget.dataSet.seriesList[downsampledXFieldIndex];\n\n const firstIndex = fullSeries.findIndex(x => {\n return downsampledSeries[startXIndex] === x;\n });\n const lastIndex = fullSeries.findIndex(x => {\n return downsampledSeries[endXIndex] === x;\n });\n\n if (firstIndex >= 0 && lastIndex >= 0 && firstIndex <= lastIndex) {\n return calculateThresholdOnRangeSelect({\n firstIndex,\n lastIndex,\n dataSources,\n width,\n });\n }\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Error occurred while setting downsample threshold on range select event', e);\n }\n\n return null;\n};\n\nconst isColumnStrictlyIncreasing = (column: (number | Date)[], fieldType: 'number' | 'time') => {\n return column.every((value, index) => {\n if (fieldType === 'number') {\n if (Number.isNaN(value)) {\n return false;\n }\n }\n\n if (fieldType === 'time') {\n if (Number.isNaN((value as Date).getTime())) {\n return false;\n }\n }\n if (index === 0) {\n return true;\n }\n return value > column[index - 1];\n });\n};\n\n/**\n * Verifies that all of the columns that are displayed in a chart can be downsampled. Valid columns that can be\n * displayed are those that contain at least one number. We can only downsample columns that only consist of numbers.\n *\n * If all columns can be downsampled, returns the x column coerced to time/number and y columns coerced to numbers.\n * If not all columns can be downsampled, then returns empty arrays for both x and y\n */\nconst tryToCoerceAllDisplayedFields = (\n ds: DataSource,\n xField: string,\n yFields: Set<string>,\n fieldTypes: string[],\n options: DownsampleOptions['options']\n): { xColumn: Date[] | number[]; yColumns: number[][] } => {\n let xColumn: Date[] | number[] = [];\n const yColumns: number[][] = [];\n\n const canDownsample = !ds.data.fields.some((field, index) => {\n const fieldName = getFieldName(field);\n const fieldType = fieldTypes[index] ?? 'unknown';\n const column = ds.data.columns[index];\n let hasDisplayedColumnThatCantBeDownsampled = false;\n\n if (fieldName === xField) {\n xColumn = strictlyCoerceXColumn(column, fieldType);\n } else if (yFields.has(fieldName)) {\n const { coercedColumn, canLooselyCoerceSomeValues, canDownsampleColumn } = strictlyCoerceYColumn(\n ds.data.columns[index],\n options\n );\n // do not perform downsampling if a column can possibly be displayed but cannot\n // be downsampled using LTTB\n hasDisplayedColumnThatCantBeDownsampled = canLooselyCoerceSomeValues && !canDownsampleColumn;\n if (hasDisplayedColumnThatCantBeDownsampled) {\n return true;\n }\n if (canDownsampleColumn) {\n yColumns.push(coercedColumn);\n }\n }\n return false;\n });\n\n if (canDownsample) {\n return { xColumn, yColumns };\n }\n return { xColumn: [], yColumns: [] };\n};\n\nconst pickIndicesFromDataSource = (ds: DataSource, indices: Set<number>): DataSource => {\n const sortedIndices = Array.from(indices).sort((a: number, b: number) => a - b);\n const slicedColumns = [];\n ds.data.columns.forEach(column => {\n const slicedColumn = [];\n sortedIndices.forEach(index => {\n slicedColumn.push(column[index]);\n });\n slicedColumns.push(slicedColumn);\n });\n\n // update data columns with downsampled columns\n return {\n ...ds,\n data: {\n ...ds.data,\n columns: slicedColumns,\n },\n };\n};\n\nexport const downsampleDataSources = ({ dataSources, threshold, options }: DownsampleOptions) => {\n const primaryDS = dataSources?.primary;\n // only downsample time series when number of data points are over threshold\n const numPoints = primaryDS?.data?.columns[0]?.length ?? 0;\n if (Number.isNaN(threshold) || numPoints <= threshold || threshold < 2) {\n return dataSources;\n }\n\n const { xField, yFields, fieldTypes } = options;\n if (!xField || !yFields?.length || !fieldTypes?.length) {\n return dataSources;\n }\n\n const nonInternalYFields = new Set<string>(yFields.filter(yField => !yField.startsWith('_')));\n const maxPointsInDownsample = Math.min(nonInternalYFields.size * threshold, numPoints);\n\n // Do not try to downsample if there are too many downsampled pts\n // At the worst case, each series has non-overlapping downsampled pts\n // which will mean that all points will be included in the downsampled result\n // This will just lead to additional overhead due to coercing each\n // x and y field to number\n if (maxPointsInDownsample >= numPoints) {\n return dataSources;\n }\n\n const { xColumn, yColumns } = tryToCoerceAllDisplayedFields(\n primaryDS,\n xField,\n nonInternalYFields,\n fieldTypes,\n options\n );\n\n if (!yColumns.length || !xColumn.length) {\n return dataSources;\n }\n\n const downsampledDataSources = { ...dataSources };\n const downsampledIndices = new Set<number>();\n\n yColumns.forEach((yColumn, columnIndex) => {\n // perform LTTB downsampling for current series, LTTB takes an [x, y] pair\n const xyPair: [Date | number, number][] = yColumn.map((yValue, index) => {\n return [xColumn[index], yValue];\n });\n\n try {\n const { downsampledIndices: downsampledIndicesForSeries } = largestTriangleThreeBuckets(\n xyPair,\n threshold,\n downsampledIndices\n );\n downsampledIndicesForSeries.forEach(downsampleIndex => downsampledIndices.add(downsampleIndex));\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(`Error occurred while downsampling column ${columnIndex}`, e);\n }\n });\n // update data columns with downsampled columns\n downsampledDataSources.primary = pickIndicesFromDataSource(primaryDS, downsampledIndices);\n\n return downsampledDataSources;\n};\n", "import { useEffect, useRef } from 'react';\n\nexport default function usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T>();\n useEffect(() => {\n ref.current = value;\n });\n return ref.current;\n}\n", "import { useMemo } from 'react';\nimport { Options as Opts } from '@splunk/visualization-encoding/Options';\nimport type { DashboardVizProps } from '../interfaces';\n\n/**\n * Hook that evaluates the DSL for subset of a viz's options needed to determine\n * its x and y fields as well as the types of all its fields.\n */\nconst useGetXAndYFields = ({\n shouldEvaluateDSL,\n options,\n context,\n dataSources,\n}: Pick<DashboardVizProps, 'dataSources' | 'options' | 'context'> & {\n shouldEvaluateDSL: boolean;\n}) => {\n const { dataSourcesWithOnlyOnePoint, dataFrameWithOnlyOnePoint } = useMemo(() => {\n if (!shouldEvaluateDSL) {\n return {\n dataSourcesWithOnlyOnePoint: null,\n dataFrameWithOnlyOnePoint: null,\n };\n }\n\n if (!dataSources?.primary?.data?.columns?.length) {\n return {\n dataSourcesWithOnlyOnePoint: null,\n dataFrameWithOnlyOnePoint: null,\n };\n }\n const { primary: primaryDS } = dataSources;\n\n const columnsWithOnlyOnePoint = primaryDS.data.columns.map(column => {\n return [column[0]];\n });\n\n const filteredDataSources = {\n primary: {\n ...primaryDS,\n data: {\n ...primaryDS.data,\n columns: columnsWithOnlyOnePoint,\n },\n },\n };\n\n return {\n dataSourcesWithOnlyOnePoint: filteredDataSources,\n dataFrameWithOnlyOnePoint: Opts.dataFrameFromDataSource(filteredDataSources),\n };\n }, [dataSources, shouldEvaluateDSL]);\n\n const xAndYFieldsWithTypes = useMemo(() => {\n try {\n if (!dataSourcesWithOnlyOnePoint || !dataFrameWithOnlyOnePoint) {\n return options;\n }\n\n if (!options?.x || (!options?.y && !options?.y2)) {\n return options;\n }\n\n const optionsToEvaluate = {\n x: options.x,\n xField: '> x | getField()',\n y: options.y,\n yFields: options.y ? '> y | getField()' : undefined,\n y2: options.y2,\n y2Fields: options.y2 ? '> y2 | getField()' : undefined,\n fieldTypes: '> primary | getType()',\n };\n\n const {\n xField = '',\n yFields = [],\n y2Fields = [],\n fieldTypes,\n } = Opts.evaluate(\n { options: optionsToEvaluate, context },\n dataSourcesWithOnlyOnePoint,\n () => {},\n dataFrameWithOnlyOnePoint\n );\n return {\n xField,\n yFields: [...yFields, ...y2Fields],\n fieldTypes,\n };\n } catch (e) {\n return {\n xField: undefined,\n yFields: [],\n fieldTypes: [],\n };\n }\n }, [options, context, dataSourcesWithOnlyOnePoint, dataFrameWithOnlyOnePoint]);\n\n return xAndYFieldsWithTypes;\n};\n\nexport default useGetXAndYFields;\n", "import { useRef, useMemo, useEffect, useState } from 'react';\nimport { debounce, isEqual, pick } from 'lodash';\nimport type { DashboardVizProps } from '../interfaces';\nimport type { DownsampleOptions } from '../utils/dataUtils';\nimport { downsampleDataSources } from '../utils/dataUtils';\nimport usePrevious from './usePrevious';\nimport useGetXAndYFields from './useGetXAndYFields';\n\n// Options properties which impact/require re-downsample on change.\nconst downsampleVizOptionProperties = ['nullValueDisplay'];\n\nconst useDownsampleDataSources = ({\n dataSources,\n options,\n context,\n threshold,\n isDownsamplingEnabled,\n}: Pick<DashboardVizProps, 'dataSources' | 'options' | 'context'> & {\n threshold: number;\n isDownsamplingEnabled?: boolean;\n}) => {\n const isFirstUseEffectCall = useRef(true);\n\n const xAndYFieldsWithTypes = useGetXAndYFields({\n shouldEvaluateDSL: isDownsamplingEnabled,\n options,\n context,\n dataSources,\n });\n\n // Extract viz options that impact downsampling.\n const downsampleVizOptions = useMemo(() => pick(options, downsampleVizOptionProperties), [options]);\n const downsampleDSOptions = useMemo(\n () => ({\n ...downsampleVizOptions,\n ...xAndYFieldsWithTypes,\n }),\n [xAndYFieldsWithTypes, downsampleVizOptions]\n );\n\n const previousDownsampleDSOptions = usePrevious(downsampleDSOptions);\n const previousDataSources = usePrevious(dataSources);\n const previousThreshold = usePrevious(threshold);\n\n const [downsampledDataSources, setDownsampledDataSources] = useState(() => {\n return isDownsamplingEnabled\n ? downsampleDataSources({\n dataSources,\n threshold,\n options: downsampleDSOptions,\n })\n : dataSources;\n });\n\n const debouncedDownsampleDataSources = useMemo(() => {\n return debounce(\n (downsampleOptions: DownsampleOptions) => {\n const downsampledResult = downsampleDataSources(downsampleOptions);\n setDownsampledDataSources(downsampledResult);\n },\n 100,\n { trailing: true }\n );\n }, []);\n\n useEffect(() => {\n // don't downsample again on the use effect call that happened due to the initial render\n // this is since we already downsampled as part of the useState call\n if (isFirstUseEffectCall.current) {\n isFirstUseEffectCall.current = false;\n return;\n }\n\n if (!isDownsamplingEnabled) {\n setDownsampledDataSources(dataSources);\n return;\n }\n\n if (\n isEqual(previousDownsampleDSOptions, downsampleDSOptions) &&\n previousDataSources === dataSources &&\n previousThreshold === threshold\n ) {\n return;\n }\n\n // Debounce the downsampling so we don't have to downsample and execute DSL multiple times\n // while the viz is being resized\n debouncedDownsampleDataSources({\n dataSources,\n options: downsampleDSOptions, // Dont want to re-downsample everytime the options change\n threshold,\n });\n\n // need to detect if this runs as part of the initial render\n }, [\n dataSources,\n downsampleDSOptions,\n debouncedDownsampleDataSources,\n xAndYFieldsWithTypes,\n threshold,\n isDownsamplingEnabled,\n previousDataSources,\n previousThreshold,\n previousDownsampleDSOptions,\n ]);\n\n return downsampledDataSources;\n};\n\nexport default useDownsampleDataSources;\n", "\nimport * as defaultImport from \"@splunk/visualization-context/FeatureFlags\";\nexport * from \"@splunk/visualization-context/FeatureFlags\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import * as React from 'react';\nimport FeatureFlags from '@splunk/visualization-context/FeatureFlags';\n\nexport const getFeatureFlag = (\n context: React.Context<any> | null | undefined | Record<keyof typeof FeatureFlags, boolean>,\n flagName: string\n): boolean => {\n // look for feature flag in context first\n if (context && Object.keys(context).find(key => key === flagName)) {\n return context[flagName];\n }\n\n // fall back to defaults\n if (Object.keys(FeatureFlags).find(key => key === flagName)) {\n return FeatureFlags[flagName];\n }\n\n // fall back to false\n return false;\n};\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/trellisUtils\";\nexport * from \"@splunk/visualizations-shared/trellisUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import { cloneDeep, omit } from 'lodash';\nimport { FieldEntry } from '@splunk/visualizations-shared/dataSourceUtils';\nimport {\n DataSplitMode,\n CHART,\n TIMECHART,\n STATS,\n UNKNOWN,\n extractDataSourceAggregationKeysChart,\n extractDataSourceAggregationKeysStats,\n extractSplitByFieldsChartFields,\n extractSplitByFieldsForStats,\n extractSplitByFieldsForUnknown,\n} from '@splunk/visualizations-shared/trellisUtils';\nimport { DataSource } from '../interfaces/DataSource';\n\nexport type SplitDataSource = { [key: string]: { [name: string]: DataSource } };\nexport interface DataSplitResult {\n splitDataSources: SplitDataSource;\n errorCode: 'UNKNOWN_DATA_SPLIT_MODE' | 'INVALID_SPLIT_BY_FIELD' | 'UNKNOWN';\n}\nexport const AGGREGATIONS = 'aggregations';\n\n/**\n * There can be certain SPL cmds that can produce dataSource without a specific field meta info (like group_by_rank, split_by_field etc),\n * to categorize it,\n * Example1:- `index = \"_internal\" | chart count`\n * Example2:- `index=_internal | chart avg(count), max(count)`\n * Example3:- `index = \"_internal\" | stats count`\n * Example4:- `index=_internal | stats avg(count), max(count)`\n */\nexport const dataSourcesSplitByAggregationsUnknown = (dataSource: {\n [name: string]: DataSource;\n}): DataSplitResult => {\n const fields = toFieldEntries(dataSource?.primary?.data?.fields);\n const columns = dataSource?.primary?.data?.columns;\n let splitDataSources = null;\n let errorCode = null;\n\n if (fields?.length) {\n splitDataSources = {};\n for (let i = 0; i < fields.length; i += 1) {\n const fieldName = fields[i].name;\n if (!fieldName?.startsWith('_')) {\n splitDataSources[fieldName] = cloneDeep(\n omit(dataSource, ['primary.data.fields', 'primary.data.columns'])\n );\n splitDataSources[fieldName].primary.data.fields = [fields[i]];\n splitDataSources[fieldName].primary.data.columns = [columns[i]];\n }\n }\n } else {\n errorCode = 'INVALID_SPLIT_BY_FIELD';\n }\n return { splitDataSources, errorCode };\n};\n\nconst toFieldEntries = (fields: FieldEntry[] | string[] = []): FieldEntry[] => {\n return fields.map(field => {\n if (typeof field === 'string') {\n return { name: field };\n }\n return field;\n });\n};\n\nexport const dataSourcesSplitByAggregationsTimechartAndChart = (dataSource: {\n [name: string]: DataSource;\n}): DataSplitResult => {\n const fields = toFieldEntries(dataSource?.primary?.data?.fields);\n const columns = dataSource?.primary?.data?.columns;\n let splitDataSources = null;\n let splitByFields = [];\n let errorCode = null;\n\n if (fields.length > 0) {\n splitByFields = extractDataSourceAggregationKeysChart(fields);\n }\n\n if (splitByFields && splitByFields.length > 0) {\n splitDataSources = {};\n splitByFields.forEach(splitByField => {\n splitDataSources[splitByField] = cloneDeep(\n omit(dataSource, ['primary.data.fields', 'primary.data.columns'])\n );\n splitDataSources[splitByField].primary.data.fields = [fields[0]];\n splitDataSources[splitByField].primary.data.columns = [columns[0]];\n fields.forEach((field: FieldEntry, idx) => {\n const fieldName = field?.name;\n if (\n fieldName !== '_time' &&\n !fieldName?.startsWith('_') &&\n field.data_source === splitByField\n ) {\n splitDataSources[splitByField].primary.data.fields.push(field);\n splitDataSources[splitByField].primary.data.columns.push(columns[idx]);\n }\n });\n });\n } else if (!splitByFields?.length && fields.length > 1) {\n // handle where data_source doesnot exist in fields\n // example1 :- index=_internal | timechart count\n // example2 :- index=_internal | timechart max(count) avg(count)\n splitDataSources = {};\n for (let i = 1; i < fields.length; i += 1) {\n const fieldName = fields[i].name;\n if (!fieldName?.startsWith('_')) {\n splitDataSources[fieldName] = cloneDeep(\n omit(dataSource, ['primary.data.fields', 'primary.data.columns'])\n );\n splitDataSources[fieldName].primary.data.fields = [fields[0], fields[i]];\n splitDataSources[fieldName].primary.data.columns = [columns[0], columns[i]];\n }\n }\n } else {\n errorCode = 'INVALID_SPLIT_BY_FIELD';\n }\n return { splitDataSources, errorCode };\n};\n\nexport const dataSourcesSplitByAggregationsStats = (dataSource: {\n [name: string]: DataSource;\n}): DataSplitResult => {\n const fields = toFieldEntries(dataSource?.primary?.data?.fields);\n const columns = dataSource?.primary?.data?.columns;\n let splitDataSources = null;\n let splitByFields = [];\n let errorCode = null;\n if (fields.length > 0) {\n splitByFields = extractDataSourceAggregationKeysStats(fields);\n }\n\n if (splitByFields && splitByFields.length > 0) {\n splitDataSources = {};\n splitByFields.forEach(splitByField => {\n splitDataSources[splitByField] = cloneDeep(\n omit(dataSource, ['primary.data.fields', 'primary.data.columns'])\n );\n splitDataSources[splitByField].primary.data.fields = [fields[0]];\n splitDataSources[splitByField].primary.data.columns = [columns[0]];\n const idx = fields.findIndex(field => field.name === splitByField);\n if (idx > 0) {\n splitDataSources[splitByField].primary.data.fields.push(fields[idx]);\n splitDataSources[splitByField].primary.data.columns.push(columns[idx]);\n }\n });\n } else {\n errorCode = 'INVALID_SPLIT_BY_FIELD';\n }\n return { splitDataSources, errorCode };\n};\n\nexport const dataSourcesSplitByModeTimechart = (\n dataSource: { [name: string]: DataSource },\n splitBy: string\n): DataSplitResult => {\n const fields = toFieldEntries(dataSource?.primary?.data?.fields);\n const columns = dataSource?.primary?.data?.columns;\n let splitDataSources = null;\n let splitByFields = [];\n let errorCode = null;\n if (fields.length > 0) {\n splitByFields = extractSplitByFieldsChartFields(fields);\n }\n if (splitByFields?.includes(splitBy)) {\n splitDataSources = {};\n const dataSourceKeys = extractDataSourceAggregationKeysChart(fields);\n const valueKeys = [];\n for (let i = 1; i < fields.length; i += 1) {\n // not including internal fields\n if (!fields[i].name?.startsWith('_')) {\n valueKeys.push(fields[i].splitby_value ? fields[i].splitby_value : fields[i].name);\n }\n }\n valueKeys.forEach(val => {\n splitDataSources[val] = cloneDeep(\n omit(dataSource, ['primary.data.fields', 'primary.data.columns'])\n );\n splitDataSources[val].primary.data.fields = [{ name: fields[0].name }];\n splitDataSources[val].primary.data.columns = [[...columns[0]]];\n dataSourceKeys.forEach(dsKey => {\n fields.forEach((field, idx) => {\n if (field.data_source === dsKey && (field.splitby_value === val || field.name === val)) {\n // only push valid fields for the current split by valueKey, instead of all fields.\n splitDataSources[val].primary.data.fields.push({\n name: dsKey,\n });\n splitDataSources[val].primary.data.columns.push([...columns[idx]]);\n }\n });\n });\n });\n } else {\n errorCode = 'INVALID_SPLIT_BY_FIELD';\n }\n return { splitDataSources, errorCode };\n};\n\nconst splitRowWise = (\n dataSource: { [name: string]: DataSource },\n columns,\n fields,\n otherSplitBy: string[],\n dataSourceKeys: string[],\n nonDataSourceAggregations: string[]\n) => {\n const splitDataSources = {};\n const valueKeys = cloneDeep(columns[0]);\n valueKeys.forEach((val, idx) => {\n splitDataSources[val] = cloneDeep(omit(dataSource, ['primary.data.fields', 'primary.data.columns']));\n splitDataSources[val].primary.data.fields = [];\n if (otherSplitBy.length) {\n splitDataSources[val].primary.data.fields = [{ name: otherSplitBy[0] }];\n }\n if (dataSourceKeys.length) {\n const columnValues = [[]];\n splitDataSources[val].primary.data.fields = [\n ...splitDataSources[val].primary.data.fields,\n ...dataSourceKeys.map(k => ({ name: k })),\n ];\n dataSourceKeys.forEach(() => {\n columnValues.push([]);\n });\n for (let i = 1; i <= Math.ceil((fields.length - 1) / dataSourceKeys.length); i += 1) {\n columnValues[0].push(fields[i].splitby_value ? fields[i].splitby_value : fields[i].name);\n dataSourceKeys.forEach((dskey, dsIndx) => {\n const mul = (fields.length - 1) / dataSourceKeys.length;\n columnValues[dsIndx + 1].push(columns[i + dsIndx * mul][idx]);\n });\n }\n splitDataSources[val].primary.data.columns = columnValues;\n } else if (nonDataSourceAggregations.length) {\n const columnValues = [];\n fields.forEach((aggregationField, fieldIdx) => {\n if (fieldIdx > 0) {\n splitDataSources[val].primary.data.fields.push(aggregationField);\n columnValues.push([columns[fieldIdx][idx]]);\n }\n });\n splitDataSources[val].primary.data.columns = columnValues;\n }\n });\n return splitDataSources;\n};\n\nconst splitColumnWise = (\n dataSource: { [name: string]: DataSource },\n columns,\n fields,\n otherSplitBy: string[],\n dataSourceKeys: string[]\n) => {\n const splitDataSources = {};\n const valueKeys = [];\n for (let i = 1; i < fields.length; i += 1) {\n valueKeys.push(fields[i].splitby_value ? fields[i].splitby_value : fields[i].name);\n }\n valueKeys.forEach(val => {\n splitDataSources[val] = cloneDeep(omit(dataSource, ['primary.data.fields', 'primary.data.columns']));\n splitDataSources[val].primary.data.fields = [\n { name: otherSplitBy[0] },\n ...dataSourceKeys.map(k => ({ name: k })),\n ];\n splitDataSources[val].primary.data.columns = [[...columns[0]]];\n dataSourceKeys.forEach(dsKey => {\n fields.forEach((field, idx) => {\n if (field.data_source === dsKey && (field.splitby_value === val || field.name === val)) {\n splitDataSources[val].primary.data.columns.push([...columns[idx]]);\n }\n });\n });\n });\n return splitDataSources;\n};\n\nexport const dataSourcesSplitByModeChart = (\n dataSource: { [name: string]: DataSource },\n splitBy: string\n): DataSplitResult => {\n const fields = toFieldEntries(dataSource?.primary?.data?.fields);\n const columns = dataSource?.primary?.data?.columns;\n let splitDataSources = null;\n let splitByFields = [];\n let errorCode = null;\n if (fields.length > 0) {\n splitByFields = extractSplitByFieldsChartFields(fields);\n }\n if (splitByFields?.includes(splitBy)) {\n const splitByFieldIdx = splitByFields.findIndex(f => f === splitBy);\n const otherSplitBy = splitByFields.filter(f => f !== splitBy);\n const dataSourceKeys = extractDataSourceAggregationKeysChart(fields);\n const nonDataSourceAggregations = [];\n if (\n !dataSourceKeys.length &&\n fields[0].groupby_rank === '0' &&\n fields.length &&\n !fields[1].groupby_rank\n ) {\n for (let i = 1; i < fields.length; i += 1) {\n nonDataSourceAggregations.push(fields[i].name);\n }\n }\n if (splitByFieldIdx === 0) {\n splitDataSources = splitRowWise(\n dataSource,\n columns,\n fields,\n otherSplitBy,\n dataSourceKeys,\n nonDataSourceAggregations\n );\n } else {\n splitDataSources = splitColumnWise(dataSource, columns, fields, otherSplitBy, dataSourceKeys);\n }\n } else {\n errorCode = 'INVALID_SPLIT_BY_FIELD';\n }\n return { splitDataSources, errorCode };\n};\n\n/**\n * This method does datasplitting for 'stats' and generic cmds('makeresults','table' etc - categoried as 'unknown' splitMode).\n * The main difference is for 'stats' cmd possible splitBy fields have 'group_by_rank' in field meta info, whereas for 'unknown' cmd it can be any fieldnames\n */\nexport const dataSourcesSplitByModeStatsorUnknown = (\n dataSource: { [name: string]: DataSource },\n splitBy: string,\n splitMode?: DataSplitMode\n): DataSplitResult => {\n const fields = toFieldEntries(dataSource?.primary?.data?.fields);\n const columns = dataSource?.primary?.data?.columns;\n let splitDataSources = null;\n let splitByFields = [];\n let errorCode = null;\n if (fields.length > 0) {\n splitByFields =\n splitMode !== UNKNOWN\n ? extractSplitByFieldsForStats(fields)\n : extractSplitByFieldsForUnknown(fields);\n }\n const splitByIndex = fields.findIndex(field => field.name === splitBy);\n if (splitByFields?.includes(splitBy)) {\n const splitByColumn = dataSource?.primary?.data?.columns[splitByIndex];\n splitDataSources = {};\n splitByColumn.forEach((val, idx) => {\n if (!splitDataSources[val]) {\n splitDataSources[val] = [idx];\n } else {\n splitDataSources[val].push(idx);\n }\n });\n const cloneFields = cloneDeep(fields);\n cloneFields.splice(splitByIndex, 1);\n const valueKeys = Object.keys(splitDataSources);\n valueKeys.forEach(val => {\n const valIndices = cloneDeep(splitDataSources[val]);\n splitDataSources[val] = cloneDeep(\n omit(dataSource, ['primary.data.fields', 'primary.data.columns'])\n );\n splitDataSources[val].primary.data.fields = cloneFields;\n splitDataSources[val].primary.data.columns = [];\n columns.forEach((col, idx) => {\n if (idx !== splitByIndex) {\n const newCol = valIndices.map(valIdx => col[valIdx]);\n splitDataSources[val].primary.data.columns.push(newCol);\n }\n });\n });\n } else {\n errorCode = 'INVALID_SPLIT_BY_FIELD';\n }\n return { splitDataSources, errorCode };\n};\n\nexport const getTrellisDataSourcesBySplitMode = (\n splitMode: DataSplitMode,\n dataSources: { [name: string]: DataSource },\n trellisSplitBy: string\n): DataSplitResult => {\n let result: DataSplitResult = null;\n try {\n if (splitMode === TIMECHART) {\n result =\n trellisSplitBy === AGGREGATIONS\n ? dataSourcesSplitByAggregationsTimechartAndChart(dataSources)\n : dataSourcesSplitByModeTimechart(dataSources, trellisSplitBy);\n } else if (splitMode === STATS) {\n result =\n trellisSplitBy === AGGREGATIONS\n ? dataSourcesSplitByAggregationsStats(dataSources)\n : dataSourcesSplitByModeStatsorUnknown(dataSources, trellisSplitBy, STATS);\n } else if (splitMode === CHART) {\n result =\n trellisSplitBy === AGGREGATIONS\n ? dataSourcesSplitByAggregationsTimechartAndChart(dataSources)\n : dataSourcesSplitByModeChart(dataSources, trellisSplitBy);\n } else if (splitMode === UNKNOWN) {\n result =\n trellisSplitBy === AGGREGATIONS\n ? dataSourcesSplitByAggregationsUnknown(dataSources)\n : dataSourcesSplitByModeStatsorUnknown(dataSources, trellisSplitBy, UNKNOWN);\n }\n } catch (ex) {\n // eslint-disable-next-line no-console\n console.error('getTrellisDataSourcesBySplitMode ', ex);\n result = { splitDataSources: null, errorCode: 'UNKNOWN' };\n }\n return result;\n};\n\n/**\n * sets legendDisplay to off when a visualization is in trellis mode and not set by the user\n * @param {Boolean} isTrellisOn\n * @param {DashboardVizOpts} options\n * @param {DashboardVizOpts} defaultOptions\n * @returns { {'legendDisplay', 'off'} or {} }\n */\nexport const turnOffLegendDisplayWhenTrellisIsOn = (\n isTrellisOn: boolean,\n options: Record<string, any>\n): Record<string, string> => {\n if (isTrellisOn && !options.legendDisplay) {\n return {\n legendDisplay: 'off',\n };\n }\n return {};\n};\n\n/**\n * helper fn that calculates shared min and max from the split data in trellis mode\n * @param {splitData} SplitDataSource\n * @returns {Array<number>} [min, max]\n */\nconst calculateSharedMinMax = (splitData: SplitDataSource): Array<number> => {\n let max = -Infinity;\n let min = Infinity;\n\n Object.keys(splitData).forEach(splitByKey => {\n const datasources = splitData[splitByKey];\n Object.keys(datasources).forEach(datasourceName => {\n const dataColumns = datasources[datasourceName].data.columns;\n dataColumns.forEach(column => {\n column.forEach(point => {\n // Convert the string to a number. Non-numeric strings are converted to 'nan' and will be ignored.\n const pointNumber = Number(point);\n if (pointNumber > max) {\n max = pointNumber;\n }\n if (pointNumber < min) {\n min = pointNumber;\n }\n });\n });\n });\n });\n\n return [min, max];\n};\n\n/**\n * determines min and max to use in trellis mode\n * @param {splitData} SplitDataSource\n * @returns {Array<number | string>} [min, max]\n */\nexport const determineMinMax = (\n splitData: SplitDataSource,\n trellisSharedScale: boolean,\n yAxisMin: number | string,\n yAxisMax: number | string,\n stackMode?: string\n) => {\n if (!trellisSharedScale || stackMode === 'stacked100' || (yAxisMin !== 'auto' && yAxisMax !== 'auto'))\n return [yAxisMin, yAxisMax];\n\n const [sharedMin, sharedMax] = calculateSharedMinMax(splitData);\n\n const shouldUseSharedMax = sharedMax !== -Infinity && yAxisMax === 'auto';\n const shouldUseSharedMin = sharedMin !== Infinity && yAxisMin === 'auto';\n\n return [shouldUseSharedMin ? sharedMin : yAxisMin, shouldUseSharedMax ? sharedMax : yAxisMax];\n};\n", "\nimport * as defaultImport from \"@splunk/visualization-canvas\";\nexport * from \"@splunk/visualization-canvas\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import styled from 'styled-components';\n\nconst VizStyleWrapper = styled.div.attrs(({ dataTestKey }) => ({\n 'data-test': dataTestKey,\n 'data-testid': dataTestKey,\n}))`\n display: flex;\n justify-content: center;\n flex-direction: column;\n width: 100%;\n height: 100%;\n background-color: ${props => props.backgroundColor};\n`;\n\nVizStyleWrapper.displayName = 'VizStyleWrapper';\n\nexport default VizStyleWrapper;\n", "\nimport * as defaultImport from \"@splunk/react-icons/Triangle\";\nexport * from \"@splunk/react-icons/Triangle\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/propUtils\";\nexport * from \"@splunk/visualizations-shared/propUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/simpleXMLOptions\";\nexport * from \"@splunk/visualizations-shared/simpleXMLOptions\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import { has, isArray, isUndefined } from 'lodash';\nimport React from 'react';\nimport styled from 'styled-components';\nimport variables from '@splunk/themes/variables';\nimport Triangle from '@splunk/react-icons/Triangle';\nimport { adjustOptionsToSchema } from '@splunk/visualizations-shared/propUtils';\nimport { getSimpleXMLOptionsForProps } from '@splunk/visualizations-shared/simpleXMLOptions';\nimport {\n BottomLegendFactory,\n Legend,\n SideLegendFactory,\n LeftLegendFactory,\n TopLegendFactory,\n ScaleConfig,\n shortenNumber,\n SeriesConfig,\n EventAnnotation,\n EventAnnotationRendererProps,\n} from '@splunk/visualization-canvas';\nimport type { LegendTruncation } from '@splunk/visualization-canvas';\nimport type { JsonColumnData } from './interfaces/DataSource';\n\ninterface ChartOptions {\n [key: string]: any;\n}\n\ninterface TransformAxisChartOptionsParams {\n originalOptions: Record<string, any>;\n optionsSchema: Record<string, any>;\n chart: string;\n convertToSCProps: (options: Record<string, any>) => Record<string, any>;\n preservedProps: string[];\n}\n\nexport const SHARED_AXIS_CHART_CANVAS_SPECIFIC_PROPS = [\n 'yAxisMin',\n 'yAxisMax',\n 'y2AxisMin',\n 'y2AxisMax',\n 'showXMajorGridLines',\n 'showYMajorGridLines',\n 'showY2MajorGridLines',\n 'showYMinorGridLines',\n 'showY2MinorGridLines',\n 'xAxisMajorTickVisibility',\n 'xAxisMajorTickSize',\n 'yAxisMajorTickVisibility',\n 'y2AxisMajorTickVisibility',\n 'yAxisMajorTickSize',\n 'y2AxisMajorTickSize',\n 'yAxisMinorTickVisibility',\n 'y2AxisMinorTickVisibility',\n 'yAxisMinorTickSize',\n 'y2AxisMinorTickSize',\n 'legendMode',\n 'legendTruncation',\n];\n\nexport const transformAxisChartOptions = ({\n originalOptions,\n optionsSchema,\n chart,\n convertToSCProps,\n preservedProps,\n}: TransformAxisChartOptionsParams): Record<string, any> => {\n const returnOptions = adjustOptionsToSchema(originalOptions, optionsSchema);\n const convertedOptions = convertToSCProps(returnOptions);\n const transformed = {\n ...getSimpleXMLOptionsForProps(convertedOptions),\n chart,\n };\n\n const preserved = preservedProps.reduce(\n (acc, prop) => {\n if (returnOptions[prop] !== undefined) {\n acc[prop] = returnOptions[prop];\n }\n return acc;\n },\n {} as Record<string, any>\n );\n\n // Preserve legendLabels as stringified JSON (converted in convertTo*SCProperties)\n if (convertedOptions.legendLabels !== undefined) {\n preserved.legendLabels = convertedOptions.legendLabels;\n }\n\n return { ...transformed, ...preserved };\n};\n\nexport const DEFAULT_LINE_WIDTH = 2;\n/**\n * Get formatted annotations - highcharts expects annotations in a specific format\n * @method getAnnotations\n * @param {Object} options\n * @param {Array} options.annotationX\n * @param {Array} options.annotationColor\n * @param {Array} options.annotationLabel\n * @returns {Array}\n */\nexport const getAnnotations = ({ annotationX, annotationColor, annotationLabel }) =>\n annotationX?.length\n ? annotationX.map((timestamp, i) => ({\n color: annotationColor?.[i],\n label: annotationLabel?.[i],\n time: timestamp,\n }))\n : [];\n\n/**\n * Get formatted annotations for canvas - viz-canvas timeseries expects annotations in a specific format\n * @method getAnnotationsForCanvas\n * @param {Object} options\n * @param {Array} options.annotationX\n * @param {Array} options.annotationColor\n * @param {Array} options.annotationLabel\n * @returns {Array}\n */\nexport const getAnnotationsForCanvas = ({\n annotationX,\n annotationColor,\n annotationLabel,\n}): EventAnnotation[] =>\n annotationX?.length\n ? annotationX.map((timestamp, i) => ({\n key: annotationLabel?.[i],\n time: timestamp,\n color: annotationColor?.[i],\n }))\n : [];\n\n/**\n * Styled Triangle component for event annotations with default severityColorNotice\n */\nconst StyledTriangle = styled(Triangle)<{ eventColor?: string }>`\n color: ${props => props.eventColor || variables.severityColorNotice(props)};\n`;\n\n/**\n * Custom event annotation renderer using Triangle icon from @splunk/react-icons\n * @method triangleEventAnnotationRenderer\n * @param {EventAnnotationRendererProps} props\n * @returns {ReactElement}\n */\nexport const triangleEventAnnotationRenderer: React.FC<EventAnnotationRendererProps> = ({\n event,\n dimensions,\n}) => {\n const eventWithColor = event as EventAnnotation & { color?: string };\n return React.createElement(StyledTriangle, {\n width: `${dimensions.width}px`,\n height: `${dimensions.height}px`,\n viewBox: '0 0 24 24',\n variant: 'filled',\n eventColor: eventWithColor.color,\n });\n};\n\n/**\n * Truncate the result set to given limit\n * @method truncateData\n * @param {Object} dataSet - dataSources.primary.data\n * @param {Number|String} truncationLimit - options['chart.resultTruncationLimit']\n * @returns {Object}\n */\nexport const truncateData = (dataSet, truncationLimit): Record<string, any[]> => {\n if (!dataSet) {\n return null;\n }\n\n const limit = parseInt(truncationLimit, 10);\n if (!limit || limit <= 0) {\n return dataSet;\n }\n\n const truncatedData: Record<string, Array<string[] | number[]>> = {\n ...dataSet,\n };\n truncatedData.columns = truncatedData.columns.map(columnData =>\n columnData && Array.isArray(columnData) ? columnData.slice(0, limit) : columnData\n );\n return truncatedData;\n};\n\n/**\n * Helper method to update the option values into the values that SC accepts\n * @method mapToValues\n * @param {Object} options\n * @returns {Object}\n */\nexport const mapToValues = (optionValuesSCMapping: Record<string, any>) => options => {\n const convertedOptions: Record<string, any> = { ...options };\n Object.keys(optionValuesSCMapping).forEach(key => {\n if (has(options, key)) {\n const updatedValue = optionValuesSCMapping[key][options[key]];\n if (!isUndefined(updatedValue)) {\n convertedOptions[key] = updatedValue;\n }\n }\n });\n return convertedOptions;\n};\n\ninterface Y2AxisOptions extends ChartOptions {\n y2Fields?: string | string[];\n}\n\n/**\n * Helper method to process options related to y2Fields\n * @method convertY2AxisOptions\n * @param {Object} originalOptions\n * @returns {Object}\n */\nexport const convertY2AxisOptions = ({\n y2Fields,\n ...originalOptions\n}: Y2AxisOptions): Record<string, any> => {\n const convertedOptions: Record<string, any> = {\n ...originalOptions,\n };\n if (y2Fields) {\n convertedOptions['axisY2.enabled'] = true;\n convertedOptions['axisY2.fields'] = isArray(y2Fields)\n ? y2Fields.filter(name => name).join(',')\n : y2Fields;\n }\n return convertedOptions;\n};\n\n/**\n * Helper method to format value for overlayFields\n * @method convertOverlayFields\n * @param {Object} originalOptions\n * @returns {Object}\n */\nexport const convertOverlayFields = (originalOptions: ChartOptions): ChartOptions => {\n const convertedOptions: ChartOptions = {\n ...originalOptions,\n };\n const { overlayFields } = originalOptions;\n if (overlayFields) {\n convertedOptions.overlayFields = Array.isArray(overlayFields)\n ? overlayFields\n .filter(field => field)\n .map(field => field.trim())\n .join(',')\n : overlayFields;\n }\n return convertedOptions;\n};\n\n/**\n * checks whether data is multi series data\n * @param {array} data array\n * @return {Boolean}\n */\nexport const isMultiSeriesData = (data: string[] | string[][]): boolean =>\n Array.isArray(data) && Array.isArray(data[0]);\n/**\n * checks whether data is multi series data and returns value as array\n * @param {array} data array\n * @param {*} value to return as array\n * @return {array}\n */\nexport const toArrayForSeries = (data, value): any[] => {\n if (isMultiSeriesData(data)) {\n return Array.isArray(value) ? value : [value];\n }\n return [value];\n};\ninterface ConstructFieldsAndColumnsParams {\n x: string[];\n y: string[] | string[][];\n xField: string;\n yFields: string | string[];\n y2?: string[] | string[][];\n y2Fields?: string | string[];\n}\nexport const constructFieldsAndColumns = ({\n x = [],\n y = [],\n xField,\n yFields,\n y2,\n y2Fields,\n}: ConstructFieldsAndColumnsParams): JsonColumnData => {\n const columns = [x.map(String), ...toArrayForSeries(y, y).map(series => series.map(String))];\n const yFieldsArray = toArrayForSeries(y, yFields);\n const fields = [{ name: xField }, ...yFieldsArray.map(field => ({ name: field }))];\n // splunk-charting requires y2 to be part of columns\n // when y & y2 options are configured with different (mutually exclusive) series\n // y2 columns need to be added to columns\n if (y2Fields) {\n const y2FieldsArray = toArrayForSeries(y2, y2Fields);\n const y2AsArray = toArrayForSeries(y2, y2).map(series => series?.map(String));\n y2FieldsArray.forEach((y2Field, index) => {\n if (yFieldsArray.indexOf(y2Field) === -1 && y2AsArray[index]) {\n fields.push({\n name: y2Field,\n });\n columns.push(y2AsArray[index]);\n }\n });\n }\n return {\n columns,\n fields,\n };\n};\n\nexport function constructAdditionalTooltipFieldsMap({ fields, columns, additionalTooltipFields }) {\n const map = {};\n\n additionalTooltipFields?.forEach(fieldName => {\n const index = fields.findIndex(f => f.name === fieldName);\n if (index !== -1) {\n map[fieldName] = columns[index];\n }\n });\n\n return map;\n}\n\n/**\n * Extracts additional tooltip values from columns and fields into an array of objects.\n * Each object in the array represents the values at a specific data point index.\n * This follows the same pattern used by Timeline visualization.\n *\n * @param columns - Array of column data\n * @param fields - Array of field definitions with name property\n * @param additionalTooltipFields - Array of field names to extract\n * @returns Array of objects, where each object maps field names to values at that index\n */\n// Type alias for a single tooltip field value record\ntype TooltipFieldRecord = Record<string, string | number | null>;\n\nexport function extractAdditionalTooltipValues(\n columns: (string | number | null)[][],\n fields: { name: string }[],\n additionalTooltipFields: string[]\n): TooltipFieldRecord[] {\n if (!additionalTooltipFields?.length || !columns?.length || !fields?.length) {\n return [];\n }\n\n // Create a mapping of field names to their column indices\n const fieldIndexMap = fields.reduce<Record<string, number>>((acc, field, index) => {\n acc[field.name] = index;\n return acc;\n }, {});\n\n const numRows = columns[0]?.length || 0;\n const additionalTooltipValuesArray: TooltipFieldRecord[] = [];\n\n for (let i = 0; i < numRows; i += 1) {\n const tooltipObject: TooltipFieldRecord = {};\n\n additionalTooltipFields.forEach(fieldName => {\n if (fieldName in fieldIndexMap) {\n const columnIndex = fieldIndexMap[fieldName];\n tooltipObject[fieldName] = columns[columnIndex]?.[i] ?? null;\n } else {\n tooltipObject[fieldName] = null;\n }\n });\n\n additionalTooltipValuesArray.push(tooltipObject);\n }\n\n return additionalTooltipValuesArray;\n}\n\nexport type AdditionalTooltipResult = TooltipFieldRecord[];\n\ntype AdditionalTooltipValuesCache = {\n columns: unknown;\n fields: unknown;\n additionalTooltipFields: string[] | undefined;\n result: AdditionalTooltipResult | undefined;\n};\n\nexport const areStringArraysEqual = (a: string[] | undefined, b: string[] | undefined): boolean => {\n if (a === b) return true;\n if (!a || !b) return false;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i += 1) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n};\n\nexport const createAdditionalTooltipValuesMemoizer = () => {\n let cache: AdditionalTooltipValuesCache = {\n columns: null,\n fields: null,\n additionalTooltipFields: undefined,\n result: undefined,\n };\n\n return (\n columns: (string | number | null)[][],\n fields: { name: string }[],\n additionalTooltipFields: string[] | undefined\n ): AdditionalTooltipResult | undefined => {\n if (\n cache.columns === columns &&\n cache.fields === fields &&\n areStringArraysEqual(cache.additionalTooltipFields, additionalTooltipFields)\n ) {\n return cache.result;\n }\n\n let result: AdditionalTooltipResult | undefined;\n if (additionalTooltipFields?.length && columns && fields) {\n result = extractAdditionalTooltipValues(columns, fields, additionalTooltipFields);\n }\n\n cache = {\n columns,\n fields,\n additionalTooltipFields,\n result,\n };\n\n return result;\n };\n};\n\n// Note: we are making the assumption that attaching a range.select listener means the user wants to enable search zoom\n// This is because we don't know if the time range tokens being updated by the drilldown is used by the current viz.\n// In the future we are considering using a shared context to pass this information from UDF to Viz.\ninterface OptionsProps {\n events?: string[];\n selectedItemId?: string;\n [key: string]: unknown;\n}\ninterface EventHandler {\n type: string;\n options: OptionsProps;\n}\n\nexport const shouldEnableSearchZoom = (eventHandlers: EventHandler[] = [], xField = '') => {\n const rangeSelectEventHandler = eventHandlers.find(eventHandler =>\n eventHandler.options.events?.includes('range.select')\n );\n // Check if xField is _time. This is how splunk-charting distinguishes a time chart from categorical.\n // Note: search zoom will be buggy if the x axis uses timestamp values but is not _time\n const xAxisIsTime = xField === '_time';\n\n return !!rangeSelectEventHandler && xAxisIsTime;\n};\n\nconst canvasSupportedTimeSeriesCharts = ['splunk.line', 'splunk.area'];\nexport const isTimeSeriesCanvasRenderSupported = (vizConfigKey: string): boolean => {\n return canvasSupportedTimeSeriesCharts.includes(vizConfigKey);\n};\n\ntype ChartData = {\n fields: (string | { name: string })[];\n columns: (string | number)[][];\n};\n\n// Filter all internal fields and columns except for _time fild\nexport const filterChartDataFromInternalFields = (chartData: ChartData): ChartData => {\n const { fields, columns } = chartData;\n\n // Determine the indexes to keep\n const keepIndexes = fields.reduce<number[]>((acc, field, index) => {\n const fieldName = typeof field === 'object' ? field?.name : field;\n if (!fieldName?.startsWith('_') || fieldName === '_time') {\n acc.push(index);\n }\n return acc;\n }, []);\n\n // Filter fields and columns\n const filteredFields = keepIndexes.map(index => fields[index]);\n const filteredColumns = keepIndexes.map(index => columns[index]);\n\n return { fields: filteredFields, columns: filteredColumns };\n};\n\nexport const isTimeField = (field): boolean => {\n return (\n (typeof field === 'object' && field?.name === '_time') ||\n (typeof field === 'string' && field === '_time')\n );\n};\n\nexport const convert2DArrayToNumbers = arr => {\n return arr.map(subArray => subArray.map(element => parseFloat(element)));\n};\n\nexport const convertTimeStringToUnix = arr => {\n return arr.map(timeStr => parseInt((new Date(timeStr).getTime() / 1000).toFixed(0), 10));\n};\n\n/**\n * Parses an axis value that may be 'auto', null, undefined, empty string, or a numeric value.\n * Returns undefined for non-numeric values, allowing the renderer to auto-calculate the range.\n * @param {any} val - The value to parse (string, number, null, undefined)\n * @returns {number | undefined} - Parsed number or undefined\n */\nexport const parseAxisValue = (val: any): number | undefined => {\n if (val === undefined || val === null || val === 'auto' || val === '') {\n return undefined;\n }\n const num = typeof val === 'number' ? val : Number.parseFloat(val);\n return Number.isNaN(num) ? undefined : num;\n};\n\n/**\n * Parses X-axis line visibility option from string to boolean or undefined.\n * @param {string | undefined} visibility - The visibility option ('hide', 'show', or other)\n * @returns {boolean | undefined} - false for 'hide', true for 'show', undefined otherwise\n */\nexport const parseXAxisLineVisibility = (visibility?: string): boolean | undefined => {\n if (visibility === 'hide') return false;\n if (visibility === 'show') return true;\n return undefined;\n};\n\n// Legend placement logic for canvas render, used in TimeseriesChartWrapper\nexport const getLegend = (props: {\n legendDisplay: string;\n isSeriesCompare: boolean;\n legendTruncation?: LegendTruncation;\n}): Legend | false => {\n const legendPlacement = props?.legendDisplay;\n const { isSeriesCompare, legendTruncation } = props;\n const commonLegendProps = {\n center: true,\n fontSize: 12,\n largerTiles: true,\n hideSeriesValue: !isSeriesCompare, // Show values if in seriesCompare mode\n legendTruncation,\n };\n\n // \"right\" | \"left\" | \"top\" | \"bottom\" | \"off\"\n switch (legendPlacement) {\n case 'off':\n return false;\n case 'left':\n return LeftLegendFactory({\n ...commonLegendProps,\n });\n case 'bottom':\n return BottomLegendFactory({\n wrap: true,\n ...commonLegendProps,\n });\n case 'top':\n return TopLegendFactory({\n wrap: true,\n ...commonLegendProps,\n });\n // Note: By default, use right legend\n default:\n return SideLegendFactory({\n ...commonLegendProps,\n });\n }\n};\n\nexport const getComputedAxisTitles = (\n inputAxisTitle: string,\n fields: string[],\n axisTitleVisibility: 'show' | 'collapsed'\n): string => {\n if (axisTitleVisibility === 'collapsed') {\n return '';\n }\n let fieldTitle = fields.length > 1 ? '' : fields[0]; // If more than one series (multi-series) default empty title\n if (!fieldTitle) {\n fieldTitle = '';\n }\n return inputAxisTitle?.length ? inputAxisTitle.trim() : fieldTitle;\n};\n\n/**\n * Truncates Y-axis title based on available container height and font metrics\n * @param axisTitle - The title text to potentially truncate\n * @param containerSpacing - Available height/ width in pixels depending on axis orientation\n * @param fontSize - Font size in pixels (default: 12)\n * @returns Truncated title with ellipsis if needed\n */\nexport const ellipsisAxisTitle = (axisTitle: string, containerSpacing: number, fontSize = 12): string => {\n if (!axisTitle) {\n return '';\n }\n if (Number.isNaN(containerSpacing) || containerSpacing <= 0) {\n return axisTitle;\n }\n // Calculate available height for text (leave 40% margin)\n const availableHeight = containerSpacing * 0.6;\n\n // Use a generic character width ratio that works across most fonts\n // 0.55 is a reasonable average for most fonts\n const avgCharWidth = fontSize * 0.55;\n\n // Calculate maximum characters that fit in available height\n const maxChars = Math.floor(availableHeight / avgCharWidth);\n\n // If title fits, return as-is\n if (axisTitle.length <= maxChars) {\n return axisTitle;\n }\n\n // Need to truncate - use middle ellipsis for better context\n if (maxChars <= 3) {\n return '...'; // Not enough space for meaningful text\n }\n\n // Reserve 3 characters for ellipsis\n const availableChars = maxChars - 3;\n const halfChars = Math.floor(availableChars / 2);\n\n // Create truncated title with middle ellipsis\n const start = axisTitle.slice(0, halfChars);\n const end = axisTitle.slice(-halfChars);\n\n return `${start}...${end}`;\n};\n\nexport type FieldObject = {\n name: string;\n};\n\nexport const getFieldName = (field: string | FieldObject): string => {\n const fieldName = typeof field === 'object' ? (field as unknown as FieldObject)?.name : field;\n return fieldName;\n};\n\nexport const getFieldNames = (fields: (string | FieldObject)[]): string[] => {\n return fields.map(field => getFieldName(field));\n};\n\n/**\n * Type alias for axis label visibility options\n */\nexport type AxisLabelVisibility = 'hide' | 'show' | 'auto';\n\n/**\n * Returns X scale config for viz-canvas charts\n * @param label\n * @param xAxisLabelVisibility\n * @returns\n */\nexport const getXScaleConfig = (\n label: string,\n xAxisLabelVisibility?: AxisLabelVisibility,\n xAxisLabelRotation?: -90 | -45 | 0 | 45 | 90\n): ScaleConfig => {\n const xConfig: ScaleConfig = { x: {} };\n xConfig.x.label = label;\n // Set hideLabels to true when xAxisLabelVisibility is \"hide\"\n if (xAxisLabelVisibility === 'hide') {\n xConfig.x.hideLabels = true;\n }\n // Set labelRotation if provided\n if (xAxisLabelRotation !== undefined) {\n xConfig.x.labelRotation = xAxisLabelRotation;\n }\n return xConfig;\n};\n\n/**\n * Returns Y scale config for viz-canvas charts\n * @param label\n * @param yAxisAbbreviation\n * @param yAxisScale\n * @param yAxisLabelVisibility\n * @param yAxisMin\n * @param yAxisMax\n * @returns\n */\nexport const getYScaleConfig = (\n label: string,\n yAxisAbbreviation: string,\n yAxisScale?: 'linear' | 'log',\n yAxisLabelVisibility?: AxisLabelVisibility,\n yAxisMin?: number,\n yAxisMax?: number\n): ScaleConfig => {\n const scaleType = yAxisScale ?? 'linear';\n const yConfig: ScaleConfig = { y: {} };\n yConfig.y.label = label;\n yConfig.y.type = scaleType;\n if (yAxisAbbreviation !== 'none') {\n yConfig.y.tickFmt = (v): string => shortenNumber(v, 1);\n }\n // Only set fixed width when abbreviation is ON\n // When abbreviation is OFF, width remains undefined to allow dynamic sizing in uplot-utils\n // based on actual data label lengths\n if (yAxisAbbreviation !== 'none') {\n yConfig.y.width = label && label.length > 0 ? 30 : 10;\n }\n if (yAxisLabelVisibility === 'hide') {\n yConfig.y.hideLabels = true;\n }\n if (yAxisMin !== undefined || yAxisMax !== undefined) {\n yConfig.y.range = (u, dataMin, dataMax) => {\n const min = yAxisMin ?? dataMin;\n const max = yAxisMax ?? dataMax;\n return [min, max];\n };\n }\n return yConfig;\n};\n/**\n * Returns Y2 scale config for viz-canvas charts\n * @param label\n * @param axisAbbreviation\n * @param axisScale\n * @param roundAxisLabelsToInteger\n * @param y2AxisLabelVisibility\n * @param y2AxisMin\n * @param y2AxisMax\n * @returns\n */\nexport const getY2ScaleConfig = (\n label: string,\n axisAbbreviation: string,\n axisScale?: 'linear' | 'log',\n roundAxisLabelsToInteger?: boolean,\n y2AxisLabelVisibility?: AxisLabelVisibility,\n y2AxisMin?: number,\n y2AxisMax?: number\n): ScaleConfig => {\n const y2Config: ScaleConfig = { y2: {} };\n const scaleType = axisScale ?? 'linear';\n y2Config.y2.label = label;\n y2Config.y2.side = 'right';\n // Note: showGrid is intentionally not set here so that the top-level\n // showY2MajorGridLines prop can control it (defaults to false)\n y2Config.y2.type = scaleType;\n if (axisAbbreviation !== 'none') {\n y2Config.y2.tickFmt = (v): string => shortenNumber(v, 1, roundAxisLabelsToInteger);\n // Set width for abbreviated Y2 axis\n // Y2 needs more width (50px) than Y-axis (30px) because of rotated title positioning\n // Width will be used to detect abbreviation setting in padding calculations\n y2Config.y2.width = label && label.length > 0 ? 50 : 10;\n } else if (roundAxisLabelsToInteger) {\n y2Config.y2.tickFmt = (v): string =>\n roundAxisLabelsToInteger ? Math.round(v).toString() : v.toString();\n }\n if (y2AxisLabelVisibility === 'hide') {\n y2Config.y2.hideLabels = true;\n }\n if (y2AxisMin !== undefined || y2AxisMax !== undefined) {\n y2Config.y2.range = (u, dataMin, dataMax) => {\n const min = y2AxisMin ?? dataMin;\n const max = y2AxisMax ?? dataMax;\n return [min, max];\n };\n }\n return y2Config;\n};\n\n/**\n * Add series overrides for viz-canvas charts (for eg:- line width)\n */\nconst getSeriesType = (\n isOverlay: boolean,\n isAreaChart: boolean,\n isStacked: boolean\n): SeriesConfig[string]['type'] | undefined => {\n if (isOverlay) return 'line';\n if (!isAreaChart) return undefined;\n return isStacked ? 'stacked-area' : 'area';\n};\n\nconst getY2Scale = (\n field: string,\n y2fields: string[] | undefined,\n overlayFields: string[] | undefined\n): 'y' | 'y2' => {\n const assignToY2 =\n (y2fields?.length > 0 && y2fields.includes(field)) ||\n (!y2fields?.length && overlayFields?.includes(field));\n return assignToY2 ? 'y2' : 'y';\n};\n\nexport const getSeriesOverrides = (opts: {\n yfields: string[];\n y2fields?: string[];\n lineWidth?: number;\n overlayFields?: string[];\n y2Enabled?: boolean;\n nullValueMode?: 'gaps' | 'connect' | 'zero';\n markerDisplay?: 'off' | 'filled' | 'outlined';\n lineDashStyle?: string;\n lineDashStylesByField?: Record<string, string>;\n stepPosition?: 'off' | 'before' | 'after';\n stepPositionsByField?: Record<string, 'off' | 'before' | 'after'>;\n type?: 'line' | 'area';\n stackMode?: 'auto' | 'stacked' | 'stacked100';\n showLines?: boolean;\n}): SeriesConfig => {\n const {\n yfields,\n y2fields,\n lineWidth,\n overlayFields,\n y2Enabled,\n nullValueMode,\n markerDisplay,\n lineDashStyle,\n lineDashStylesByField,\n stepPosition,\n stepPositionsByField,\n type,\n stackMode,\n showLines,\n } = opts;\n const seriesConfig: SeriesConfig = {};\n\n let spanGaps: boolean | undefined;\n if (nullValueMode === 'gaps') {\n spanGaps = false;\n } else if (nullValueMode != null) {\n spanGaps = true;\n } else {\n spanGaps = undefined;\n }\n const replaceNullsWithZero = nullValueMode === 'zero' ? true : undefined;\n\n const isAreaChart = type === 'area';\n const isStacked = isAreaChart && (stackMode === 'stacked' || stackMode === 'stacked100');\n\n // Non-overlay area fields first, then overlay fields - so overlays render on top\n const areaFields = isAreaChart ? yfields.filter(f => !overlayFields?.includes(f)) : yfields;\n const overlayFieldsInOrder = overlayFields?.filter(f => yfields.includes(f)) ?? [];\n const orderedFields = isAreaChart ? [...areaFields, ...overlayFieldsInOrder] : yfields;\n\n orderedFields.forEach(field => {\n const isOverlay = overlayFields?.includes(field) ?? false;\n const isPercent = isAreaChart && stackMode === 'stacked100' && !isOverlay;\n const shouldHideAreaOutline = isAreaChart && showLines === false && !isOverlay;\n\n seriesConfig[field] = {\n overrides: {\n width: shouldHideAreaOutline ? 0 : (lineWidth ?? DEFAULT_LINE_WIDTH),\n ...(isPercent ? ({ stacking: { mode: 'percent', group: 'A' } } as object) : {}),\n } as SeriesConfig[string]['overrides'],\n };\n\n const seriesType = getSeriesType(isOverlay, isAreaChart, isStacked);\n if (seriesType !== undefined) seriesConfig[field].type = seriesType;\n\n if (spanGaps !== undefined) seriesConfig[field].overrides.spanGaps = spanGaps;\n\n if (y2Enabled) seriesConfig[field].overrides.scale = getY2Scale(field, y2fields, overlayFields);\n\n if (markerDisplay !== undefined) seriesConfig[field].markerDisplay = markerDisplay;\n\n if (!isAreaChart || isOverlay) {\n const fieldDashStyle = lineDashStylesByField?.[field] || lineDashStyle;\n if (fieldDashStyle) seriesConfig[field].lineDashStyle = fieldDashStyle as any;\n }\n\n const hasFieldStepPosition = Object.hasOwn(stepPositionsByField || {}, field);\n const fieldStepPosition = hasFieldStepPosition ? stepPositionsByField?.[field] : stepPosition;\n if (fieldStepPosition && fieldStepPosition !== 'off') {\n (seriesConfig[field] as SeriesConfig[string] & { stepPosition?: string }).stepPosition =\n fieldStepPosition;\n }\n\n if (replaceNullsWithZero !== undefined) {\n (\n seriesConfig[field] as SeriesConfig[string] & { replaceNullsWithZero?: boolean }\n ).replaceNullsWithZero = replaceNullsWithZero;\n }\n });\n\n return seriesConfig;\n};\n\n/**\n * Finds the start and end indices in time series data for a given range.\n * @param xData - Array of time values (can be ISO strings or epoch timestamps)\n * @param startValue - Start value of the range (epoch timestamp)\n * @param endValue - End value of the range (epoch timestamp)\n * @returns Object with startXIndex (first index where time >= startValue) and endXIndex (last index where time <= endValue)\n */\nexport const findRangeIndices = (\n xData: (string | number)[],\n startValue: number,\n endValue: number\n): { startXIndex: number; endXIndex: number } => {\n let startXIndex = -1;\n let endXIndex = -1;\n\n // Convert xData to epoch timestamps if they are ISO strings\n const xDataEpoch = xData.map(val => {\n if (typeof val === 'string') {\n return new Date(val).getTime() / 1000; // Convert to epoch seconds\n }\n return val;\n });\n\n // Find the closest time value >= startValue\n for (let i = 0; i < xDataEpoch.length; i += 1) {\n if (xDataEpoch[i] >= startValue) {\n startXIndex = i;\n break;\n }\n }\n\n // If no value >= startValue found, use the last index (all values are less)\n if (startXIndex === -1 && xDataEpoch.length > 0) {\n startXIndex = xDataEpoch.length - 1;\n }\n\n // Find the closest time value <= endValue\n for (let i = xDataEpoch.length - 1; i >= 0; i -= 1) {\n if (xDataEpoch[i] <= endValue) {\n endXIndex = i;\n break;\n }\n }\n\n // If no value <= endValue found, use the first index (all values are greater)\n if (endXIndex === -1 && xDataEpoch.length > 0) {\n endXIndex = 0;\n }\n\n return { startXIndex, endXIndex };\n};\n", "import { useContext } from 'react';\nimport FeatureFlagContext from '@splunk/visualization-context/FeatureFlagContext';\nimport { LAYOUT_TYPE } from '@splunk/visualization-schemas';\n\nexport const useTrellisFeatureFlagOn = (): boolean => {\n const context = useContext(FeatureFlagContext) as Record<string, unknown>;\n return Boolean(context?.visualizations_enableTrellis);\n};\n\nexport const useTrellisEnabled = (layoutType = LAYOUT_TYPE.Off): boolean => {\n const trellisFeatureEnabled = useTrellisFeatureFlagOn();\n return trellisFeatureEnabled && layoutType === LAYOUT_TYPE.Trellis;\n};\n", "import * as React from 'react';\nimport styled from 'styled-components';\n\nexport const TRELLIS_TITLE_HEIGHT = 28;\n\nconst TrellisTitleText = styled.div`\n margin-left: 10px;\n margin-right: 10px;\n padding-top: 8px;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n`;\n\nconst TrellisTitleDiv = styled.div<{\n fontColor: string;\n backgroundColor: string;\n}>`\n height: ${TRELLIS_TITLE_HEIGHT}px;\n font-size: 14px;\n font-weight: 700;\n color: ${props => props.fontColor};\n background-color: ${props => props.backgroundColor};\n box-shadow: 0 1px ${props => props.backgroundColor}; // this is added to avoid a 1px gap between title and viz divs that showed up intermittently because of pixel rounding error in chrome.\n`;\n\ninterface TrellisTitleProps {\n fontColor: string;\n backgroundColor: string;\n trellisKey: unknown;\n}\n\nconst formatTrellisKey = (value: TrellisTitleProps['trellisKey']): string => {\n if (value === null || value === undefined) {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value.toString();\n }\n if (typeof value === 'symbol') {\n return value.toString();\n }\n try {\n return JSON.stringify(value);\n } catch {\n // JSON.stringify throws for BigInt and circular references\n return typeof value === 'bigint' ? value.toString() : '';\n }\n};\n\nexport const TrellisTitle = (props: TrellisTitleProps) => {\n const titleText = formatTrellisKey(props.trellisKey);\n return (\n <TrellisTitleDiv\n fontColor={props.fontColor}\n backgroundColor={props.backgroundColor}\n data-test=\"trellis-title\"\n title={titleText}\n >\n <TrellisTitleText>{titleText}</TrellisTitleText>\n </TrellisTitleDiv>\n );\n};\n", "import * as React from 'react';\nimport { useMemo, useRef } from 'react';\nimport { pick } from 'lodash';\nimport styled from 'styled-components';\nimport SizeAwareWrapper from '@splunk/visualizations-shared/SizeAwareWrapper';\nimport { TimeSeriesChart, RangeSelectionProvider } from '@splunk/visualization-canvas';\nimport { toDimension } from '@splunk/visualizations-shared/style';\nimport type { GenericDataSet } from '@splunk/visualization-canvas/types/types';\nimport VizStyleWrapper from './components/VizStyleWrapper';\nimport { ChartingProps } from './Charting';\nimport {\n convert2DArrayToNumbers,\n filterChartDataFromInternalFields,\n getComputedAxisTitles,\n getFieldName,\n getFieldNames,\n getLegend,\n getSeriesOverrides,\n getXScaleConfig,\n getYScaleConfig,\n getY2ScaleConfig,\n ellipsisAxisTitle,\n getAnnotationsForCanvas,\n triangleEventAnnotationRenderer,\n parseAxisValue,\n parseXAxisLineVisibility,\n findRangeIndices,\n shouldEnableSearchZoom,\n} from './chartingUtils';\nimport { useTrellisEnabled } from './hooks/useTrellisEnabled';\nimport { TrellisTitle, TRELLIS_TITLE_HEIGHT } from './components/TrellisTitle';\n\nconst TimeSeriesChartContainer = styled.div<{\n width: number | string;\n height: number | string;\n}>`\n overflow: hidden;\n ${props => toDimension(pick(props, ['width', 'height']))};\n\n canvas {\n position: absolute !important; // This is needed for canvas element export pdf/png to work correctly\n }\n`;\n\n/**\n * Adds trellis information to event payload\n * @param payload - The event payload object to modify\n * @param trellisKey - The current trellis key value (e.g., \"200\", \"404\")\n * @param trellisSplitBy - The field name being split by (e.g., \"status\")\n */\nexport const appendTrellisToPayload = (\n payload: Record<string, unknown>,\n trellisKey?: string,\n trellisSplitBy?: string\n): Record<string, unknown> => {\n const result = { ...payload };\n if (trellisSplitBy) {\n result['trellis.name'] = trellisSplitBy;\n }\n if (trellisKey) {\n result['trellis.value'] = trellisKey;\n }\n return result;\n};\n\n/**\n * Checks if the mouseover payload has changed compared to the previous payload\n * @param currentPayload - The current event payload\n * @param previousPayload - The previous event payload\n * @returns true if the payload has changed, false otherwise\n */\nexport const hasMouseoverPayloadChanged = (\n currentPayload: Record<string, unknown>,\n previousPayload: Record<string, unknown> | null\n): boolean => {\n if (!previousPayload) {\n return true;\n }\n\n // Check if data point index changed - this is the primary indicator of hovering a different point\n if (currentPayload.index !== previousPayload.index) {\n return true;\n }\n\n // Check if seriesIndex changed\n if (currentPayload.seriesIndex !== previousPayload.seriesIndex) {\n return true;\n }\n\n // Check if trellis fields changed (for trellis mode)\n if (currentPayload['trellis.name'] !== previousPayload['trellis.name']) {\n return true;\n }\n if (currentPayload['trellis.value'] !== previousPayload['trellis.value']) {\n return true;\n }\n\n return false;\n};\n\nexport const handleClick = (chartEvent, onClick, trellisKey?: string, trellisSplitBy?: string) => {\n const payload = {\n ...pick(chartEvent, 'value', 'seriesKey'),\n name: chartEvent.seriesKey,\n };\n delete payload.seriesKey;\n\n // Add row context fields in the format: row.${fieldName}.value\n if (chartEvent.rowContext) {\n Object.assign(\n payload,\n Object.keys(chartEvent.rowContext).reduce((acc, fieldName) => {\n acc[`row.${fieldName}.value`] = chartEvent.rowContext[fieldName];\n return acc;\n }, {})\n );\n }\n\n const updatedPayload = appendTrellisToPayload(payload, trellisKey, trellisSplitBy);\n\n if (onClick) {\n onClick({\n type: 'point.click',\n originalEvent: chartEvent,\n payload: updatedPayload,\n });\n }\n};\n\nexport const handleLegendClick = (chartEvent, onClick, trellisKey?: string, trellisSplitBy?: string) => {\n const payload = {\n name: chartEvent,\n };\n\n const updatedPayload = appendTrellisToPayload(payload, trellisKey, trellisSplitBy);\n\n if (onClick) {\n onClick({\n type: 'legend.click',\n originalEvent: chartEvent,\n payload: updatedPayload,\n });\n }\n};\n\nexport const handleRangeSelection = (\n rangeEvent,\n onSelect,\n chartData,\n trellisKey?: string,\n trellisSplitBy?: string\n) => {\n // Handle undefined range (clearing selection)\n if (!rangeEvent) {\n return;\n }\n\n // Find the indices in the data array that correspond to the start and end timestamps\n const xData = chartData?.columns?.[0] || [];\n const { startXIndex, endXIndex } = findRangeIndices(xData, rangeEvent.start, rangeEvent.end);\n\n const payload = {\n startXIndex,\n startXValue: rangeEvent.start,\n endXIndex,\n endXValue: rangeEvent.end,\n };\n\n const updatedPayload = appendTrellisToPayload(payload, trellisKey, trellisSplitBy);\n\n if (onSelect) {\n onSelect({\n type: 'range.selectBeforeZoom',\n originalEvent: rangeEvent,\n payload: updatedPayload,\n });\n }\n};\n\nexport const handleRangeZoom = (\n rangeEvent,\n onSelect,\n chartData,\n trellisKey?: string,\n trellisSplitBy?: string\n) => {\n // Find the indices in the data array that correspond to the start and end timestamps\n const xData = chartData?.columns?.[0] || [];\n const { startXIndex, endXIndex } = findRangeIndices(xData, rangeEvent.start, rangeEvent.end);\n\n const payload = {\n startXIndex,\n startXValue: rangeEvent.start,\n endXIndex,\n endXValue: rangeEvent.end,\n };\n\n const updatedPayload = appendTrellisToPayload(payload, trellisKey, trellisSplitBy);\n\n if (onSelect) {\n onSelect({\n type: 'range.select',\n originalEvent: rangeEvent,\n payload: updatedPayload,\n });\n }\n};\n\nexport const handleCrosshairChange = (\n chartEvent,\n onPointMouseOver,\n onPointMouseOut,\n trellisKey?: string,\n trellisSplitBy?: string,\n lastPayload = null,\n lastOriginalEvent = null\n) => {\n // Handle mouseout when chartEvent is undefined\n if (!chartEvent) {\n if (onPointMouseOut && lastPayload) {\n onPointMouseOut({\n type: 'point.mouseout',\n originalEvent: lastOriginalEvent,\n payload: lastPayload,\n });\n }\n return { payload: null, originalEvent: null };\n }\n\n // Handle mouseover\n const payload = {\n ...pick(chartEvent, 'value', 'seriesKey', 'time', 'index', 'seriesIndex'),\n name: chartEvent.seriesKey,\n };\n delete payload.seriesKey;\n\n // Add row context fields in the format: row.${fieldName}.value\n if (chartEvent.rowContext) {\n Object.assign(\n payload,\n Object.keys(chartEvent.rowContext).reduce((acc, fieldName) => {\n acc[`row.${fieldName}.value`] = chartEvent.rowContext[fieldName];\n return acc;\n }, {})\n );\n }\n\n const updatedPayload = appendTrellisToPayload(payload, trellisKey, trellisSplitBy);\n\n if (onPointMouseOver) {\n onPointMouseOver({\n type: 'point.mouseover',\n originalEvent: chartEvent,\n payload: updatedPayload,\n });\n }\n\n // Return payload and originalEvent for caller to store\n return { payload: updatedPayload, originalEvent: chartEvent };\n};\n\n/**\n * Helper function to parse array options that may be stringified JSON or already arrays\n */\nexport const parseArrayOption = (\n value: string[] | string | undefined | null\n): string[] | undefined | null => {\n if (Array.isArray(value)) {\n return value;\n }\n if (value) {\n return JSON.parse(value);\n }\n return undefined;\n};\n\nconst getAreaOpacityForCanvas = (areaOpacity: number | undefined | null): number | undefined | null =>\n // Preserve legacy visualizations behavior where area opacity is squared to match charting output.\n areaOpacity !== undefined && areaOpacity !== null ? areaOpacity ** 2 : areaOpacity;\n\nconst parseTickIntervalOption = (\n simpleXMLValue?: string | number,\n canvasValue?: number\n): number | undefined => {\n if (simpleXMLValue) return Number(simpleXMLValue);\n if (canvasValue) return Number(canvasValue);\n return undefined;\n};\n\nconst getYAxisTitles = ({\n y2Enabled,\n yFields,\n y2Fields,\n overlayFields,\n yAxisTitleText,\n yAxisTitleVisibility,\n y2AxisTitleText,\n y2AxisTitleVisibility,\n containerHeight,\n}: {\n y2Enabled: boolean;\n yFields: string[];\n y2Fields: string[];\n overlayFields: string[];\n yAxisTitleText?: string;\n yAxisTitleVisibility?: 'show' | 'collapsed';\n y2AxisTitleText?: string;\n y2AxisTitleVisibility?: 'show' | 'collapsed';\n containerHeight: number;\n}) => {\n const yFieldsForTitle = y2Enabled ? yFields.filter(field => !y2Fields.includes(field)) : yFields;\n const fieldsForY2Axis = y2Fields.length > 0 ? y2Fields : overlayFields;\n\n const yAxisTitle = ellipsisAxisTitle(\n getComputedAxisTitles(yAxisTitleText, yFieldsForTitle, yAxisTitleVisibility),\n containerHeight\n );\n const y2AxisTitle = ellipsisAxisTitle(\n getComputedAxisTitles(y2AxisTitleText, fieldsForY2Axis, y2AxisTitleVisibility),\n containerHeight\n );\n\n return { yAxisTitle, y2AxisTitle };\n};\n\nconst TimeSeriesChartWrapper = (props: ChartingProps) => {\n const {\n width,\n height,\n chartData,\n options,\n userLocale,\n annotationX,\n annotationLabel,\n annotationColor,\n legendDisplay,\n markerDisplay,\n onClick,\n onPointMouseOver,\n onPointMouseOut,\n onSelect,\n splitByLayout,\n trellisKey,\n trellisSplitBy,\n backgroundColor,\n defaultFontColor,\n additionalTooltipValues,\n // Extract axis line visibility options from props\n xAxisLineVisibility,\n yAxisLineVisibility,\n y2AxisLineVisibility,\n // Extract showYAxisWithZero directly from props for accelerated render mode\n showYAxisWithZero: showYAxisWithZeroFromProps,\n showY2AxisWithZero: showY2AxisWithZeroFromProps,\n ...otherOptions\n } = props as ChartingProps & {\n showYAxisWithZero?: boolean;\n showY2AxisWithZero?: boolean;\n xAxisLineVisibility?: string;\n yAxisLineVisibility?: string;\n y2AxisLineVisibility?: string;\n };\n const { eventHandlers, xField: xFieldFromProps } = otherOptions;\n const trellisEnabled = useTrellisEnabled(splitByLayout);\n const {\n backgroundColor: bgColorFromOptions,\n seriesColors: seriesColorsStr,\n fieldColors,\n legendLabels: legendLabelsStr,\n legendMode,\n legendTruncation,\n 'axisTitleX.text': xAxisTitleText,\n 'axisTitleY.text': yAxisTitleText,\n 'axisTitleY2.text': y2AxisTitleText,\n 'axisTitleX.visibility': xAxisTitleVisibility,\n 'axisTitleY.visibility': yAxisTitleVisibility,\n 'axisTitleY2.visibility': y2AxisTitleVisibility,\n 'axisLabelsX.majorLabelVisibility': xAxisLabelVisibility,\n 'axisLabelsX.majorLabelStyle.rotation': xAxisLabelRotation,\n 'axisLabelsX.maxLabelParts': xAxisMaxLabelParts,\n 'axisLabelsY.majorLabelVisibility': yAxisLabelVisibility,\n 'axisLabelsY.majorUnit': yAxisMajorUnitFromSimpleXML,\n 'axisLabelsY2.majorLabelVisibility': y2AxisLabelVisibility,\n 'axisLabelsY2.majorUnit': y2AxisMajorUnitFromSimpleXML,\n 'axisY.abbreviation': yAxisAbbreviation,\n 'axisY.scale': yAxisScale,\n 'axisY2.abbreviation': y2AxisAbbreviation,\n 'axisY2.fields': y2FieldsStr,\n 'axisY2.scale': y2AxisScale,\n 'axisY2.enabled': y2Enabled,\n 'axisLabelsY2.integerUnits': y2IntegerUnits,\n 'chart.overlayFields': overlayFieldsStr,\n 'chart.nullValueMode': nullValueMode,\n 'chart.showDataLabels': showDataLabels,\n 'chart.showLines': showLines,\n 'chart.stackMode': stackMode,\n lineWidth,\n lineDashStyle,\n fieldDashStyles: lineDashStylesByFieldStr,\n stepPosition,\n fieldStepPositions: stepPositionsByFieldStr,\n yAxisMin: yAxisMinRaw,\n yAxisMax: yAxisMaxRaw,\n y2AxisMin: y2AxisMinRaw,\n y2AxisMax: y2AxisMaxRaw,\n showXMajorGridLines,\n showYMajorGridLines,\n showY2MajorGridLines,\n showYMinorGridLines,\n showY2MinorGridLines,\n showLineSmoothing,\n xAxisMajorTickVisibility,\n xAxisMajorTickSize,\n yAxisMajorTickVisibility,\n y2AxisMajorTickVisibility,\n yAxisMajorTickSize,\n y2AxisMajorTickSize,\n yAxisMajorTickInterval,\n y2AxisMajorTickInterval,\n yAxisMinorTickVisibility,\n y2AxisMinorTickVisibility,\n yAxisMinorTickSize,\n y2AxisMinorTickSize,\n showYAxisWithZero: showYAxisWithZeroFromOptions,\n showY2AxisWithZero: showY2AxisWithZeroFromOptions,\n // area only props\n areaFillOpacity: areaOpacity,\n chart: chartType,\n } = options;\n\n // Map showDataLabels back to dataValuesDisplay format for canvas mode\n const dataValuesDisplay = showDataLabels === 'none' ? 'off' : showDataLabels;\n\n // Get showYAxisWithZero from top-level props first (accelerated render mode),\n // then fall back to options object (non-accelerated render mode)\n const showYAxisWithZero = showYAxisWithZeroFromProps ?? showYAxisWithZeroFromOptions;\n const showY2AxisWithZero = showY2AxisWithZeroFromProps ?? showY2AxisWithZeroFromOptions;\n\n // Convert visibility to boolean for canvas renderer\n // X-axis ticks default to true (shown) when 'auto' or 'show', false when 'hide'\n const showXMajorTicks = xAxisMajorTickVisibility !== 'hide';\n const showYMajorTicks = yAxisMajorTickVisibility === 'show';\n const showY2MajorTicks = y2AxisMajorTickVisibility === 'show';\n const showYMinorTicks = yAxisMinorTickVisibility === 'show';\n const showY2MinorTicks = y2AxisMinorTickVisibility === 'show';\n // X-axis line defaults to true (shown) for backwards compatibility\n const showXAxisLine = parseXAxisLineVisibility(xAxisLineVisibility);\n const showYAxisLine = yAxisLineVisibility === 'show';\n const showY2AxisLine = y2AxisLineVisibility === 'show';\n\n // Parse axis values - convert strings to numbers\n const yAxisMin = parseAxisValue(yAxisMinRaw);\n const yAxisMax = parseAxisValue(yAxisMaxRaw);\n const y2AxisMin = parseAxisValue(y2AxisMinRaw);\n const y2AxisMax = parseAxisValue(y2AxisMaxRaw);\n\n // Parse tick interval and size values - convert strings to numbers\n // Priority: SimpleXML props (from transformed options) > canvas-specific props\n const yAxisMajorTickIntervalNum = parseTickIntervalOption(\n yAxisMajorUnitFromSimpleXML,\n yAxisMajorTickInterval\n );\n const y2AxisMajorTickIntervalNum = parseTickIntervalOption(\n y2AxisMajorUnitFromSimpleXML,\n y2AxisMajorTickInterval\n );\n const xAxisMajorTickSizeNum = xAxisMajorTickSize != null ? Number(xAxisMajorTickSize) : undefined;\n const yAxisMajorTickSizeNum = yAxisMajorTickSize != null ? Number(yAxisMajorTickSize) : undefined;\n const y2AxisMajorTickSizeNum = y2AxisMajorTickSize != null ? Number(y2AxisMajorTickSize) : undefined;\n const yAxisMinorTickSizeNum = yAxisMinorTickSize != null ? Number(yAxisMinorTickSize) : undefined;\n const y2AxisMinorTickSizeNum = y2AxisMinorTickSize != null ? Number(y2AxisMinorTickSize) : undefined;\n // Preserve legacy visualizations behavior where area opacity is squared to match charting output.\n const areaOpacityForCanvas = getAreaOpacityForCanvas(areaOpacity);\n const seriesColors = seriesColorsStr ? JSON.parse(seriesColorsStr) : undefined;\n const seriesColorsByField = fieldColors ? JSON.parse(fieldColors) : undefined;\n const lineDashStylesByField = lineDashStylesByFieldStr ? JSON.parse(lineDashStylesByFieldStr) : undefined;\n const stepPositionsByField = stepPositionsByFieldStr ? JSON.parse(stepPositionsByFieldStr) : undefined;\n const legendLabels = parseArrayOption(legendLabelsStr);\n const bgColor = backgroundColor || bgColorFromOptions;\n const [containerWidth, setContainerWidth] = React.useState(Number(props.width));\n const [containerHeight, setContainerHeight] = React.useState(Number(props.height));\n const cachedHandleResize = React.useCallback((w, h) => {\n setContainerWidth(w);\n setContainerHeight(h);\n }, []);\n const filteredChartData = filterChartDataFromInternalFields({\n fields: chartData.fields,\n columns: chartData.seriesList,\n });\n\n const xField = getFieldName(filteredChartData.fields[0]);\n const yFields = getFieldNames(\n filteredChartData.fields.length > 1 ? filteredChartData.fields.slice(1) : []\n );\n const y2Fields = useMemo(\n () => (y2FieldsStr ? y2FieldsStr.split(',').map(f => f.trim()) : []),\n [y2FieldsStr]\n );\n const overlayFields = useMemo(\n () => (overlayFieldsStr ? overlayFieldsStr.split(',').map(f => f.trim()) : []),\n [overlayFieldsStr]\n );\n\n let xAxisTitle = getComputedAxisTitles(xAxisTitleText, [xField], xAxisTitleVisibility);\n xAxisTitle = ellipsisAxisTitle(xAxisTitle, containerWidth);\n const { yAxisTitle, y2AxisTitle } = getYAxisTitles({\n y2Enabled,\n yFields,\n y2Fields,\n overlayFields,\n yAxisTitleText,\n yAxisTitleVisibility,\n y2AxisTitleText,\n y2AxisTitleVisibility,\n containerHeight,\n });\n\n const xScaleConfig = useMemo(\n () => getXScaleConfig(xAxisTitle, xAxisLabelVisibility, xAxisLabelRotation),\n [xAxisTitle, xAxisLabelVisibility, xAxisLabelRotation]\n );\n const isStacked100 = stackMode === 'stacked100';\n const yScaleConfig = useMemo(\n () => {\n const config = getYScaleConfig(\n yAxisTitle,\n yAxisAbbreviation,\n yAxisScale,\n yAxisLabelVisibility,\n yAxisMin,\n yAxisMax\n );\n // For stacked100, override tick formatter to show percentage labels (0-100%)\n // uPlot stores stacked100 values as 0-1 fractions after processPercentStacking\n if (isStacked100) {\n config.y.tickFmt = (v): string => `${Math.round(v * 100)}%`;\n config.y.range = () => [0, 1];\n }\n return config;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [yAxisTitle, yAxisAbbreviation, yAxisScale, yAxisLabelVisibility, yAxisMin, yAxisMax, isStacked100]\n );\n const y2ScaleConfig = useMemo(() => {\n if (y2Enabled) {\n return getY2ScaleConfig(\n y2AxisTitle,\n y2AxisAbbreviation,\n y2AxisScale,\n y2IntegerUnits,\n y2AxisLabelVisibility,\n y2AxisMin,\n y2AxisMax\n );\n }\n return {};\n }, [\n y2Enabled,\n y2AxisTitle,\n y2AxisAbbreviation,\n y2AxisScale,\n y2IntegerUnits,\n y2AxisLabelVisibility,\n y2AxisMin,\n y2AxisMax,\n ]);\n const uplotContainerElement = useRef(null);\n\n const seriesDataFormatted = [\n filteredChartData.columns[0],\n ...convert2DArrayToNumbers(filteredChartData.columns.slice(1)),\n ];\n chartData.fields = filteredChartData.fields;\n chartData.columns = seriesDataFormatted;\n\n // Map SimpleXML stackMode value ('default' | 'stacked' | 'stacked100') to getSeriesOverrides param\n const normalizedStackMode = stackMode === 'stacked' || stackMode === 'stacked100' ? stackMode : 'auto';\n\n // Memoize seriesOverrides to prevent unnecessary recreations\n const seriesOverrides = useMemo(\n () =>\n getSeriesOverrides({\n yfields: yFields,\n y2fields: y2Fields,\n lineWidth,\n overlayFields,\n y2Enabled,\n nullValueMode,\n markerDisplay,\n lineDashStyle,\n lineDashStylesByField,\n stepPosition,\n stepPositionsByField,\n type: chartType,\n stackMode: normalizedStackMode,\n showLines,\n }),\n [\n yFields,\n y2Fields,\n lineWidth,\n overlayFields,\n y2Enabled,\n nullValueMode,\n markerDisplay,\n lineDashStyle,\n lineDashStylesByField,\n stepPosition,\n stepPositionsByField,\n chartType,\n normalizedStackMode,\n showLines,\n ]\n );\n\n // Memoize annotations to prevent unnecessary recreations\n const chartingEventAnnotations = useMemo(\n () =>\n getAnnotationsForCanvas({\n annotationX,\n annotationColor,\n annotationLabel,\n }),\n [annotationX, annotationColor, annotationLabel]\n );\n\n // Memoize scaleConfig to prevent unnecessary recreations\n const scaleConfig = useMemo(\n () => ({ ...xScaleConfig, ...yScaleConfig, ...y2ScaleConfig }),\n [xScaleConfig, yScaleConfig, y2ScaleConfig]\n );\n\n // Memoize legend configuration\n // In seriesCompare mode, force the legend to the right side so that the legend's\n // fixed width (needed to prevent jitter when hover values appear/disappear) doesn't\n // affect layouts that would otherwise place it on the left.\n const isSeriesCompare = legendMode === 'seriesCompare';\n const legend = useMemo(\n () =>\n getLegend({\n legendDisplay: isSeriesCompare && legendDisplay !== 'off' ? 'right' : legendDisplay,\n isSeriesCompare,\n legendTruncation,\n }),\n [legendDisplay, isSeriesCompare, legendTruncation]\n );\n\n // Memoize click handlers to avoid recreating them on every render\n const handleChartClick = React.useCallback(\n event => {\n // Only invoke if onClick is defined to avoid unnecessary work\n if (onClick) {\n handleClick(event, onClick, trellisKey, trellisSplitBy);\n }\n },\n [onClick, trellisKey, trellisSplitBy]\n );\n\n const handleChartLegendClick = React.useCallback(\n event => {\n // Only invoke if onClick is defined to avoid unnecessary work\n if (onClick) {\n handleLegendClick(event, onClick, trellisKey, trellisSplitBy);\n }\n },\n [onClick, trellisKey, trellisSplitBy]\n );\n\n const handleChartRangeSelection = React.useCallback(\n range => {\n // Only invoke if onSelect is defined to avoid unnecessary work\n if (onSelect) {\n handleRangeSelection(range, onSelect, chartData, trellisKey, trellisSplitBy);\n }\n // Always allow range selection UI to appear, even if onSelect is undefined\n },\n [onSelect, chartData, trellisKey, trellisSplitBy]\n );\n\n const handleChartRangeZoom = React.useCallback(\n range => {\n // Only invoke if onSelect is defined to avoid unnecessary work\n if (onSelect) {\n handleRangeZoom(range, onSelect, chartData, trellisKey, trellisSplitBy);\n }\n },\n [onSelect, chartData, trellisKey, trellisSplitBy]\n );\n\n // Determine if search zoom should be enabled based on eventHandlers and xField\n // Use xFieldFromProps if available, otherwise fall back to computed xField from chartData\n const xFieldToUse = xFieldFromProps || xField;\n const enableSearchZoom = React.useMemo(\n () => shouldEnableSearchZoom(eventHandlers, xFieldToUse),\n [eventHandlers, xFieldToUse]\n );\n\n // Store the last payload and originalEvent to return on mouseout\n const lastPayloadRef = React.useRef<Record<string, any> | null>(null);\n const lastOriginalEventRef = React.useRef<any>(null);\n // Store the previous mouseover payload to check for changes\n const previousMouseoverPayloadRef = React.useRef<Record<string, unknown> | null>(null);\n // Store additionalTooltipValues in a ref to avoid chart remounts when it changes\n // The chart reads from this ref, so changes update the tooltip without remounting\n const additionalTooltipValuesRef = React.useRef(additionalTooltipValues);\n React.useEffect(() => {\n additionalTooltipValuesRef.current = additionalTooltipValues;\n }, [additionalTooltipValues]);\n\n const handleCrosshairMouseout = React.useCallback(() => {\n if (onPointMouseOut && lastPayloadRef.current) {\n onPointMouseOut({\n type: 'point.mouseout',\n originalEvent: lastOriginalEventRef.current,\n payload: lastPayloadRef.current,\n });\n }\n previousMouseoverPayloadRef.current = null;\n }, [onPointMouseOut]);\n\n const handleChartCrosshairChange = React.useCallback(\n event => {\n // Only invoke if onPointMouseOver or onPointMouseOut is defined to avoid unnecessary work\n if (!onPointMouseOver && !onPointMouseOut) {\n return;\n }\n\n // Handle mouseout when event is undefined\n if (!event) {\n handleCrosshairMouseout();\n return;\n }\n\n // Handle mouseover\n const payload = {\n ...pick(event, 'value', 'seriesKey', 'time', 'index', 'seriesIndex'),\n name: event.seriesKey,\n };\n delete payload.seriesKey;\n\n // Add row context fields in the format: row.${fieldName}.value\n if (event.rowContext) {\n Object.assign(\n payload,\n Object.keys(event.rowContext).reduce((acc, fieldName) => {\n acc[`row.${fieldName}.value`] = event.rowContext[fieldName];\n return acc;\n }, {})\n );\n }\n\n const updatedPayload = appendTrellisToPayload(payload, trellisKey, trellisSplitBy);\n\n // Check if the payload has actually changed to avoid emitting duplicate events\n if (!hasMouseoverPayloadChanged(updatedPayload, previousMouseoverPayloadRef.current)) {\n return;\n }\n\n // Store payload and originalEvent for mouseout\n lastPayloadRef.current = updatedPayload;\n lastOriginalEventRef.current = event;\n // Store current payload for next comparison\n previousMouseoverPayloadRef.current = { ...updatedPayload };\n\n if (onPointMouseOver) {\n onPointMouseOver({\n type: 'point.mouseover',\n originalEvent: event,\n payload: updatedPayload,\n });\n }\n },\n [onPointMouseOver, onPointMouseOut, trellisKey, trellisSplitBy, handleCrosshairMouseout]\n );\n\n // Create a key to reset RangeSelectionProvider when data changes\n const dataKey = `${chartData.columns[0]?.[0]}-${chartData.columns[0]?.[chartData.columns[0].length - 1]}-${chartData.columns[0]?.length}`;\n\n const memoizedChart = useMemo(() => {\n // Always pass zoom handler when onSelect exists, serverSideZoom controls behavior\n const computedOnRangeZoom = onSelect ? handleChartRangeZoom : undefined;\n\n return (\n <RangeSelectionProvider key={dataKey}>\n <TimeSeriesChart\n data={chartData as GenericDataSet}\n width={containerWidth}\n height={containerHeight}\n seriesColors={seriesColors}\n seriesColorsByField={seriesColorsByField}\n seriesConfig={seriesOverrides}\n legend={legend}\n legendLabels={legendLabels}\n legendTruncation={legendTruncation}\n isSeriesCompare={legendMode === 'seriesCompare'}\n maxSeriesFocus={legendMode === 'seriesCompare' ? 0 : undefined}\n scaleConfig={scaleConfig}\n timestampFormat=\"expanded\"\n onCrosshairClick={onClick ? handleChartClick : undefined}\n onCrosshairChange={\n onPointMouseOver || onPointMouseOut ? handleChartCrosshairChange : undefined\n }\n onSeriesClick={onClick ? handleChartLegendClick : undefined}\n onRangeSelection={handleChartRangeSelection}\n onRangeZoom={computedOnRangeZoom}\n serverSideZoom={enableSearchZoom}\n userLocale={userLocale}\n events={chartingEventAnnotations}\n eventsConfig={{ renderer: triangleEventAnnotationRenderer }}\n additionalTooltipValuesRef={additionalTooltipValuesRef}\n showXMajorGridLines={showXMajorGridLines}\n showYMajorGridLines={showYMajorGridLines}\n showY2MajorGridLines={showY2MajorGridLines}\n showYMinorGridLines={showYMinorGridLines}\n showY2MinorGridLines={showY2MinorGridLines}\n showLineSmoothing={showLineSmoothing}\n dataValuesDisplay={dataValuesDisplay}\n showXMajorTicks={showXMajorTicks}\n xAxisMajorTickSize={xAxisMajorTickSizeNum}\n showYMajorTicks={showYMajorTicks}\n showY2MajorTicks={showY2MajorTicks}\n yAxisMajorTickSize={yAxisMajorTickSizeNum}\n y2AxisMajorTickSize={y2AxisMajorTickSizeNum}\n yAxisMajorTickInterval={yAxisMajorTickIntervalNum}\n y2AxisMajorTickInterval={y2AxisMajorTickIntervalNum}\n showYMinorTicks={showYMinorTicks}\n showY2MinorTicks={showY2MinorTicks}\n yAxisMinorTickSize={yAxisMinorTickSizeNum}\n y2AxisMinorTickSize={y2AxisMinorTickSizeNum}\n showYAxisWithZero={showYAxisWithZero}\n showY2AxisWithZero={showY2AxisWithZero}\n showXAxisLine={showXAxisLine}\n showYAxisLine={showYAxisLine}\n showY2AxisLine={showY2AxisLine}\n xAxisMaxLabelParts={xAxisMaxLabelParts}\n areaOpacity={areaOpacityForCanvas}\n />\n </RangeSelectionProvider>\n );\n // Note: additionalTooltipValues passed via ref to avoid chart remount when switching stories.\n // The ref is updated via useEffect, so tooltip gets latest values without remounting chart.\n }, [\n onSelect,\n handleChartRangeZoom,\n dataKey,\n chartData,\n containerWidth,\n containerHeight,\n seriesColors,\n seriesColorsByField,\n seriesOverrides,\n legend,\n legendLabels,\n legendTruncation,\n scaleConfig,\n onClick,\n handleChartClick,\n onPointMouseOver,\n onPointMouseOut,\n handleChartCrosshairChange,\n handleChartLegendClick,\n handleChartRangeSelection,\n enableSearchZoom,\n userLocale,\n chartingEventAnnotations,\n showXMajorGridLines,\n showYMajorGridLines,\n showY2MajorGridLines,\n showYMinorGridLines,\n showY2MinorGridLines,\n showLineSmoothing,\n dataValuesDisplay,\n showXMajorTicks,\n xAxisMajorTickSizeNum,\n showYMajorTicks,\n showY2MajorTicks,\n yAxisMajorTickSizeNum,\n y2AxisMajorTickSizeNum,\n yAxisMajorTickIntervalNum,\n y2AxisMajorTickIntervalNum,\n showYMinorTicks,\n showY2MinorTicks,\n yAxisMinorTickSizeNum,\n y2AxisMinorTickSizeNum,\n showYAxisWithZero,\n showY2AxisWithZero,\n showXAxisLine,\n showYAxisLine,\n showY2AxisLine,\n legendMode,\n xAxisMaxLabelParts,\n areaOpacityForCanvas,\n ]);\n\n const memoizedVisualization = useMemo(() => {\n return <VizStyleWrapper backgroundColor={bgColor}>{memoizedChart}</VizStyleWrapper>;\n }, [bgColor, memoizedChart]);\n\n return (\n <>\n {trellisEnabled && (\n <TrellisTitle\n trellisKey={trellisKey}\n backgroundColor={bgColor}\n fontColor={defaultFontColor}\n />\n )}\n <TimeSeriesChartContainer\n height={trellisEnabled ? Number(height) - TRELLIS_TITLE_HEIGHT : height}\n width={width}\n ref={uplotContainerElement}\n data-test=\"timeseries-chart-wrapper\"\n >\n <SizeAwareWrapper width={width} height={height} onResize={cachedHandleResize} />\n {memoizedVisualization}\n </TimeSeriesChartContainer>\n </>\n );\n};\n\nexport default TimeSeriesChartWrapper;\n", "import * as React from 'react';\nimport { camelCase, has, get, defaultsDeep, noop } from 'lodash';\nimport getSettingsFromThemedProps from '@splunk/themes/getSettingsFromThemedProps';\nimport { Options as Opts } from '@splunk/visualization-encoding/Options';\nimport { withSanitizedProps } from '@splunk/visualizations-shared/SanitizeProps';\nimport type { TimezoneContextInterface } from '@splunk/visualization-context/TimezoneContext';\nimport TimezoneContext from '@splunk/visualization-context/TimezoneContext';\nimport moment from '@splunk/moment';\nimport FeatureFlagContext from '@splunk/visualization-context/FeatureFlagContext';\nimport { withTheme } from 'styled-components';\nimport { deepMergeWithArrayPrimitiveOverrides } from '@splunk/visualizations-shared/hocUtils';\nimport { pickFieldFromJSONSchema } from '@splunk/visualizations-shared/JSONSchemaUtils';\nimport AsyncDynamicOptionsEvaluator, {\n AsyncDynamicOptionsEvaluatorParams,\n} from '@splunk/async-dynamic-options-evaluator';\nimport { createGUID } from '@splunk/ui-utils/id';\nimport type { Frames } from '@splunk/visualization-encoding/EncodingExecutor';\nimport SplunkVisualization from './SplunkVisualization';\nimport type { DashboardVizProps, DataSource, VizConfig, VizProps } from './interfaces';\nimport { VizBehavior } from './interfaces/VizBehavior';\nimport { useSortingParams } from './hooks/useSorting';\nimport { usePaginationParams } from './hooks/usePagination';\nimport { useDeepMemo } from './hooks/useDeepMemo';\nimport MissingPropsMessage, { missingKeys } from './components/MissingPropsMessage';\nimport withEditModeCover from './hocs/withEditModeCover';\nimport withPlaceholder from './hocs/withPlaceholder';\nimport { ChartingProps } from './Charting';\nimport useDownsampleDataSources from './hooks/useDownsampleDataSources';\nimport { isDownsamplingEnabledForViz } from './utils/dataUtils';\nimport { getFeatureFlag } from '../common/utils/featureFlagUtils';\nimport { turnOffLegendDisplayWhenTrellisIsOn } from '../common/utils/trellisUtils';\nimport TimeSeriesChartWrapper from './TimeSeriesChartWrapper';\nimport { isTimeSeriesCanvasRenderSupported } from './chartingUtils';\n\n// Create the sanitized version once, outside the component to prevent remounting\nconst SanitizedTimeSeriesChartWrapper = withSanitizedProps(TimeSeriesChartWrapper);\n\ntype FeatureFlagContextValue = Record<string, boolean | undefined> | null;\n\ntype HOC = React.ComponentType<DashboardVizProps>;\nexport interface DashboardVizOpts {\n ReactViz: React.ComponentType<ChartingProps | VizProps>; // we will wrap this in DashboardViz (see const DashboardViz = ...)\n vizConfig: VizConfig;\n computeVizProps?: (props) => any;\n computeVizPropsBeforeEval?: (props) => any;\n computeDataFrames?: (args: {\n dataSources: { [key: string]: DataSource };\n options: Record<string, unknown>;\n }) => Partial<Frames>;\n disableEditModeCover?: boolean;\n useIconPlaceholder?: (\n dataSources: { [name: string]: DataSource },\n loading: boolean,\n options: Record<string, unknown>\n ) => boolean;\n}\n\nconst buildEventCallbackProps = (\n supportedEvents,\n evaluatedOptionsToUse,\n onEventTrigger\n): Record<string, unknown> => {\n const result = {};\n Object.keys(supportedEvents).forEach((eventName): void => {\n const { parentKeys, payloadKeys } = supportedEvents[eventName];\n const eventCallbackPropName = camelCase(`on.${eventName}`);\n\n let payload = {};\n if (Array.isArray(payloadKeys) && payloadKeys.length) {\n payloadKeys.forEach(p => {\n payload[p] = evaluatedOptionsToUse[p];\n });\n }\n\n result[eventCallbackPropName] = (ev): Record<string, unknown> => {\n if (ev?.payload) {\n payload = { ...ev.payload };\n }\n return onEventTrigger({\n originalEvent: ev,\n payload,\n type: eventName,\n });\n };\n\n if (parentKeys) {\n for (let i = parentKeys.length - 1; i >= 0; i -= 1) {\n const newObject = {};\n newObject[parentKeys[i]] = result[eventCallbackPropName];\n result[eventCallbackPropName] = newObject;\n }\n }\n });\n return result;\n};\n\n/**\n * hoc that wraps a pure react visualization in a Dashboard visualization\n * @param {DashboardVizOpts} opts\n * @returns {HOC}\n */\nconst withDashboardViz = (opts: DashboardVizOpts): HOC => {\n const {\n ReactViz,\n vizConfig,\n computeVizProps = () => {},\n computeVizPropsBeforeEval = () => {},\n computeDataFrames,\n disableEditModeCover,\n useIconPlaceholder,\n } = opts;\n\n // sanitizing props before sending them to reactviz.\n const SanitizedReactViz = withSanitizedProps(ReactViz); // Default assigned to ReactViz\n const defaultOptions = pickFieldFromJSONSchema(vizConfig.optionsSchema, 'default');\n\n const DashboardViz = (props: DashboardVizProps): React.ReactElement<DashboardVizProps> => {\n const {\n mode = 'view',\n hasEventHandlers,\n dataSources, // type of { [key: string]: DataSource }\n options = {},\n context = {},\n width,\n height,\n onComputedProps = noop,\n onEventTrigger = SplunkVisualization.defaults.onEventTrigger,\n theme,\n onRequestParamsChange = noop,\n } = props;\n const localeContext = React.useContext<TimezoneContextInterface>(TimezoneContext);\n if (localeContext.serializedTimezone) {\n /*\n @splunk/moment currently does not allow us to customize the timezone on a per visualization basis.\n This ensures that if a timezone was provided via TimezoneContext @splunk/moment time formatting\n will use it.\n */\n if (!moment.getDefaultSplunkTimezone()) {\n moment.setDefaultSplunkTimezone(localeContext.serializedTimezone);\n }\n }\n\n const themeFunc = themeVar => vizConfig.themes[themeVar]?.(props);\n const {\n family: currentThemeFamily,\n colorScheme: currentThemeColorScheme,\n density: currentThemeDensity,\n } = getSettingsFromThemedProps({ theme });\n let evaluatedOptions: Record<string, unknown> = {}; // evaluatedOptions need to be initialized as an empty object\n const [evaluatedOptionsAsync, setEvaluatedOptionsAsync] = React.useState({}); // evaluatedOptions need to be initialized as an empty object\n const featureFlagContext = React.useContext<FeatureFlagContextValue>(FeatureFlagContext);\n\n const [visualizationID] = React.useState(`${vizConfig.name} - ${createGUID()}`);\n\n const [dataSourcesInState, setDataSourcesInState] = React.useState({});\n const [dataFramesInState, setDataFramesInState] = React.useState<Frames | undefined>();\n\n const [useAsyncEvaluatedOptions, setUseAsyncEvaluatedOptions] = React.useState(\n Boolean(getFeatureFlag(featureFlagContext, 'visualizations_useWebWorkersForDSL'))\n );\n const isDownsamplingEnabledByFeatureFlag = Boolean(\n featureFlagContext?.visualizations_enableDownsampling\n );\n const isTrellisFeatureFlagOn = Boolean(featureFlagContext?.visualizations_enableTrellis);\n const isTrellisOn =\n isTrellisFeatureFlagOn &&\n vizConfig?.supports?.includes(VizBehavior.TRELLIS) &&\n options?.splitByLayout === VizBehavior.TRELLIS;\n\n const isAcceleratedRenderFeatureFlagOn = Boolean(\n featureFlagContext?.visualizations_enableAcceleratedRender\n );\n const isAcceleratedRenderOn =\n isAcceleratedRenderFeatureFlagOn &&\n isTimeSeriesCanvasRenderSupported(vizConfig.key) &&\n options?.acceleratedRender === true;\n const isMounted = React.useRef(true);\n const optionsToEvaluate = React.useMemo(() => {\n const legendDisplay = turnOffLegendDisplayWhenTrellisIsOn(isTrellisOn, options);\n // computeVizPropsBeforeEval will run before DSL gets evaluated\n const computedOptions = computeVizPropsBeforeEval(options) ?? {};\n return {\n context: defaultsDeep({}, context, vizConfig.defaultContext),\n options: deepMergeWithArrayPrimitiveOverrides(\n {},\n legendDisplay,\n computedOptions,\n options,\n defaultOptions\n ),\n };\n }, [isTrellisOn, options, context]);\n\n const [threshold, setThreshold] = React.useState(Number(width));\n const onDownsamplingThresholdChange = React.useCallback((newThreshold: number) => {\n setThreshold(newThreshold);\n }, []);\n const isDownsamplingEnabled = React.useMemo(() => {\n return isDownsamplingEnabledByFeatureFlag && isDownsamplingEnabledForViz({ vizConfig });\n }, [isDownsamplingEnabledByFeatureFlag]);\n\n const downsamplingProps = React.useMemo(() => {\n if (!isDownsamplingEnabled) {\n return {};\n }\n return {\n onDownsamplingThresholdChange,\n originalDataSources: dataSources,\n };\n }, [dataSources, isDownsamplingEnabled, onDownsamplingThresholdChange]);\n const downsampledDataSources = useDownsampleDataSources({\n options: optionsToEvaluate.options,\n context: optionsToEvaluate.context,\n dataSources,\n threshold,\n isDownsamplingEnabled,\n });\n\n evaluatedOptions = useDeepMemo(() => {\n try {\n if (useAsyncEvaluatedOptions) {\n const asyncDynamicOptionsEvaluatorParams: AsyncDynamicOptionsEvaluatorParams = {\n visualizationID,\n props,\n options: optionsToEvaluate,\n dataSources: downsampledDataSources,\n theme: vizConfig.themes,\n bypassCloneDeepOptionScope: Boolean(\n getFeatureFlag(featureFlagContext, 'visualizations_bypassCloneDeepOptionScope')\n ),\n lazyLoadingDataFrame: Boolean(\n getFeatureFlag(featureFlagContext, 'visualizations_lazyLoadingDataFrame')\n ),\n };\n AsyncDynamicOptionsEvaluator.evaluate(asyncDynamicOptionsEvaluatorParams)\n .then(results => {\n setEvaluatedOptionsAsync(results.results);\n })\n .catch(() => {\n if (isMounted.current) {\n setUseAsyncEvaluatedOptions(false);\n }\n });\n } else {\n let dataFrames: Frames | undefined = dataFramesInState;\n if (downsampledDataSources !== dataSourcesInState) {\n setDataSourcesInState(downsampledDataSources);\n dataFrames = Opts.dataFrameFromDataSource(\n downsampledDataSources,\n getFeatureFlag(featureFlagContext, 'visualizations_lazyLoadingDataFrame')\n );\n setDataFramesInState(dataFrames);\n }\n // Merge derived frames when provided\n let mergedFrames = dataFrames;\n if (computeDataFrames && dataFrames) {\n const derivedFrames = computeDataFrames({\n dataSources: downsampledDataSources,\n options: optionsToEvaluate.options,\n });\n mergedFrames = { ...dataFrames, ...derivedFrames };\n }\n const result = Opts.evaluate(\n optionsToEvaluate,\n downsampledDataSources,\n themeFunc,\n mergedFrames,\n getFeatureFlag(featureFlagContext, 'visualizations_bypassCloneDeepOptionScope')\n );\n return result;\n }\n } catch (e) {\n if (e instanceof Error) {\n // eslint-disable-next-line no-console\n console.error(`unexpected error evaluating options: ${e.message}`);\n }\n return {};\n }\n return {};\n }, [\n currentThemeFamily,\n currentThemeColorScheme,\n currentThemeDensity,\n optionsToEvaluate,\n downsampledDataSources,\n localeContext.serializedTimezone,\n useAsyncEvaluatedOptions,\n ]);\n\n const evaluatedOptionsToUse = !useAsyncEvaluatedOptions ? evaluatedOptions : evaluatedOptionsAsync;\n\n /**\n * PAGE_AND_SORT behavior\n *\n * Some visualizations, like table, requires metadata about the datasource,\n * like total number of results, current count, offset, and sort, for rendering\n * paginator and sorting direction. In this approach, the visualization\n * allow users to set 'paginateDataSourceKey' to select which datasource\n * should the visualization extract the metadata from. It defaults to 'primary' datasource.\n * The visualization config should set the PAGE_AND_SORT behavior to receive\n * 'requestParams', 'meta' and onRequestParams callback as props.\n *\n * In future, we could automatically detect which all datasources are being used\n * and bind those magically to pagination/sorting behavior.\n */\n let dataSourceMetadata = {};\n const OptionKey = 'paginateDataSourceKey';\n const optsKey = has(evaluatedOptionsToUse, OptionKey) && evaluatedOptionsToUse[OptionKey];\n const paginateDataSourceKey = typeof optsKey === 'string' ? optsKey : 'primary';\n\n const requestParams = get(dataSources, [paginateDataSourceKey, 'requestParams'], {});\n const meta = get(dataSources, [paginateDataSourceKey, 'meta'], {});\n const handleRequestParamsChange = (payload: Record<string, unknown>): void =>\n onRequestParamsChange(paginateDataSourceKey, payload);\n\n const sortParams = useSortingParams({\n requestParams,\n meta,\n onRequestParamsChange: handleRequestParamsChange,\n });\n\n const paginatorParams = usePaginationParams({\n requestParams,\n meta,\n onRequestParamsChange: handleRequestParamsChange,\n });\n\n dataSourceMetadata = {\n sortParams,\n paginatorParams,\n };\n\n if (\n vizConfig.supports.indexOf(VizBehavior.PAGE_AND_SORT) === -1 &&\n !has(dataSources, paginateDataSourceKey)\n ) {\n dataSourceMetadata = {};\n }\n\n // trellis specific backgroundColor update for onComputedProps\n // if trellis is enabled following these three criteria - 1) trellis feature flag is enabled 2) vizConfig supports array has 'trellis' 3) option 'splitByLayout' is set to 'trellis\n // onComputedProps api should return back trellisBackgroundColor value for backgroundColor option to support coloring of sibling panels (for eg:- title/ description on UDF side)\n const clonedEvaluatedOptions: Record<string, unknown> = { ...evaluatedOptionsToUse };\n if (isTrellisOn) {\n clonedEvaluatedOptions.backgroundColor = clonedEvaluatedOptions?.trellisBackgroundColor;\n }\n // useEffect hook needs to be initialized before any early returns\n // this is in accordance with the order of hook calls being the same on each render https://reactjs.org/docs/hooks-rules.html#explanation\n React.useEffect((): void => {\n onComputedProps(clonedEvaluatedOptions);\n });\n\n React.useEffect((): (() => void) => {\n return () => {\n if (useAsyncEvaluatedOptions) {\n isMounted.current = false;\n AsyncDynamicOptionsEvaluator.reset(visualizationID);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // present warning message if any required props are missing\n const { requiredProps = [], supports } = vizConfig;\n const missing = missingKeys(requiredProps, evaluatedOptionsToUse);\n if (\n missing.length > 0 &&\n supports.includes(VizBehavior.PLACEHOLDER) &&\n vizConfig.key !== 'splunk.singlevalue' // For SV missing props msg is not displayed if required props majorValue is missing, instead this will be handled from the component, instead handled within component\n ) {\n return (\n <MissingPropsMessage\n data-test=\"missing-props-message\"\n width={width}\n height={height}\n missingProps={missing}\n backgroundColor={themeFunc('defaultBackgroundColor')}\n />\n );\n }\n\n // events\n const eventCallbackProps =\n hasEventHandlers && mode === 'view' && vizConfig.supports.includes(VizBehavior.EVENTS)\n ? buildEventCallbackProps(vizConfig.events, evaluatedOptionsToUse, onEventTrigger)\n : {};\n\n // compute pure viz props which are not from options\n const computedVizProps = computeVizProps({\n ...props,\n ...evaluatedOptionsToUse,\n // Align option transformation with the actual renderer selected below.\n // This prevents canvas-only option preservation from leaking into Highcharts mode.\n isAcceleratedRenderOn,\n ...eventCallbackProps,\n themeFunc,\n });\n\n // if were using webworkers and this is the first render we dont want to show a viz with missing data so we return null\n if (useAsyncEvaluatedOptions && Object.keys(evaluatedOptionsToUse).length === 0) {\n return null;\n }\n\n // if acceleratedRender mode is on, then use canvas viz\n const SanitizedViz = isAcceleratedRenderOn ? SanitizedTimeSeriesChartWrapper : SanitizedReactViz;\n\n return (\n <SanitizedViz\n {...SplunkVisualization.defaults}\n mode={mode}\n width={width || SplunkVisualization.defaults.width}\n height={height || SplunkVisualization.defaults.height}\n userLocale={localeContext}\n {...downsamplingProps}\n {...evaluatedOptionsToUse}\n {...computedVizProps}\n {...eventCallbackProps}\n {...dataSourceMetadata}\n />\n );\n };\n\n DashboardViz.propTypes = {\n ...SplunkVisualization.propTypes,\n ...ReactViz.propTypes,\n };\n\n DashboardViz.defaultProps = {\n ...ReactViz.defaultProps, // we still need ReactViz.defaultProps for the visualizations that still have them\n onEventTrigger: SplunkVisualization.defaults.onEventTrigger,\n };\n\n // attach viz config\n DashboardViz.config = vizConfig;\n\n return withTheme(\n withPlaceholder(withEditModeCover(DashboardViz, disableEditModeCover), useIconPlaceholder)\n );\n};\n\nexport default withDashboardViz;\n", "\nimport * as defaultImport from \"lodash/debounce\";\nexport * from \"lodash/debounce\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-ui/Table\";\nexport * from \"@splunk/react-ui/Table\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-ui/Paginator\";\nexport * from \"@splunk/react-ui/Paginator\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-ui/Message\";\nexport * from \"@splunk/react-ui/Message\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-ui/JSONTree\";\nexport * from \"@splunk/react-ui/JSONTree\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import React from 'react';\nimport { has, includes, get } from 'lodash';\nimport { isColor } from '@splunk/visualizations-shared/colorUtils';\nimport {\n validCellRenderers,\n validSparklineTypes,\n validHeaderVisibilities,\n validAlignments,\n TextOverflow,\n TableHeaderVisibility,\n TableAlignment,\n CellRenderers,\n SparklineType,\n ColumnAlignment,\n} from '@splunk/visualization-schemas';\nimport { FieldEntry } from '@splunk/visualizations-shared/dataSourceUtils';\n\nconst isArray = (v: unknown): boolean => Array.isArray(v);\n\ninterface TextOverFlowStyles {\n maxWidth?: string;\n overflow?: React.CSSProperties['overflow'];\n overflowWrap?: React.CSSProperties['overflowWrap'];\n textOverflow?: React.CSSProperties['textOverflow'];\n whiteSpace?: React.CSSProperties['whiteSpace'];\n wordBreak?: React.CSSProperties['wordBreak'];\n wordWrap?: React.CSSProperties['wordWrap'];\n}\ninterface TableHeaderCell {\n /* unique key for the table header cell */\n key: string;\n /* value to be displayed in the table header cell */\n value: string;\n /* header align control */\n align: TableAlignment;\n /* original column field name, used for formatting */\n columnId: string;\n /* key that will be used for sorting */\n sortKey: string;\n truncate?: boolean;\n width?: number;\n style?: TextOverFlowStyles;\n textOverflowType?: string;\n showCell: boolean;\n}\n\nexport interface TableHeaderStyle extends TextOverFlowStyles {\n backgroundColor?: string;\n color?: string;\n}\nexport interface TableFooterStyle extends TableHeaderStyle {\n dividerColor?: string;\n}\nexport interface TableHeader {\n /* header visiibility control */\n visibility: TableHeaderVisibility;\n /* array containing table header cells */\n cells: TableHeaderCell[];\n /* styles to be applied to table */\n style: TableHeaderStyle;\n}\n\nexport interface TableFooter {\n /* collection of table rows */\n rows: TableRow[];\n}\n\nexport type TableCellValueType = string | number | (string | number)[];\n\ninterface TableRowStyles extends TextOverFlowStyles {\n backgroundColor?: string;\n color?: string;\n width?: number | 'auto';\n}\nexport type SparklineNullValueDisplay = 'gaps' | 'zero' | 'connect';\n\nexport interface TableRowCell {\n /* unique key for the row cell */\n key: string;\n /* value to be displayed in the row cell. This is a layered value columnFormat.[FieldName].data > tableFormat.data > table options */\n value: TableCellValueType;\n /* always the value from table options */\n rawValue: TableCellValueType;\n align: TableAlignment;\n cellType: CellRenderers;\n columnIndex: number;\n rowIndex: number;\n sparklineAreaColor?: string;\n sparklineColor?: string;\n sparklineType: SparklineType;\n sparklineNullValueDisplay: SparklineNullValueDisplay;\n header: string;\n style: TableRowStyles;\n showCell: boolean;\n}\n\ninterface TableRow {\n /* unique key for each row */\n key: string;\n /* row index */\n index: number;\n /* array of table cells to be displayed in the row */\n cells: TableRowCell[];\n}\n\nexport interface TableBody {\n /* collection of table rows */\n rows: TableRow[];\n}\n\nexport interface TableStructure {\n tableHeader: TableHeader;\n tableBody: TableBody;\n tableFooter?: TableFooter;\n}\n\nexport interface TableFormat {\n align: TableAlignment[][] | TableAlignment;\n cellTypes: CellRenderers[][];\n data: TableCellValueType[][];\n headerAlign: TableAlignment;\n /* header background color. NOTE: react table does not support background color for individual column headers */\n headerBackgroundColor: string;\n /* header text color. NOTE: react table does not support text color for individual column headers */\n headerColor: string;\n /* array of colors for the background color of each table row */\n rowBackgroundColors: string[] | string[][];\n /* array of colors for the text color of each table row */\n rowColors: string[] | string[][];\n sparklineAreaColors: string[][];\n sparklineColors: string[][];\n sparklineTypes: SparklineType[][];\n sparklineNullValueDisplay?: SparklineNullValueDisplay;\n textOverflow?: TextOverflow;\n}\n\ninterface ColumnFormatter {\n align: ColumnAlignment[] | ColumnAlignment;\n cellTypes: CellRenderers[];\n data: TableCellValueType[];\n headerAlign: ColumnAlignment;\n rowBackgroundColors: string[];\n rowColors: string[];\n sparklineAreaColors: string[];\n sparklineColors: string[];\n sparklineTypes: SparklineType[];\n sparklineNullValueDisplay?: SparklineNullValueDisplay;\n width: number | 'auto';\n textOverflow: TextOverflow;\n footer: string[];\n}\nexport interface ColumnFormat {\n [k: string]: Partial<ColumnFormatter>;\n}\n\nexport type ThemeFunc = (themeVar: string) => string | undefined;\n\nexport interface UseTableArgs {\n /* array of headers to be displayed */\n headers?: string[];\n /* metadata for each field */\n headersMetadata?: FieldEntry[];\n /* array of original data columns */\n columnIds?: string[];\n /* 2 dimensional array of table data to be displayed */\n table?: TableCellValueType[][];\n /* header visibility control */\n headerVisibility?: TableHeaderVisibility;\n /* adds row number column */\n showRowNumbers?: boolean;\n /* shows or hides internal fields */\n showInternalFields?: boolean;\n /* shows footer totals row */\n showFooterTotals?: boolean;\n /* shows footer percentages row */\n showFooterPercentages?: boolean;\n /* table wide formatting options */\n tableFormat?: Partial<TableFormat>;\n /* column format for individual columns */\n columnFormat?: Partial<ColumnFormat>;\n /* pagination offset */\n paginationOffset?: number;\n /* count */\n count?: number;\n /* theme function for getting theme colors as fallback */\n themeFunc?: ThemeFunc;\n}\n\ninterface GetOverflowStylesArgs {\n textOverflow: TextOverflow;\n}\n\nconst textOverflowStyles = {\n anywhere: {\n wordBreak: 'break-all',\n whiteSpace: 'pre-wrap',\n },\n 'break-word': {\n wordBreak: 'break-word',\n wordWrap: 'break-word',\n overflowWrap: 'break-word',\n whiteSpace: 'pre-wrap',\n },\n ellipsis: {\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n },\n};\n\nexport const getOverflowStyles = ({ textOverflow }: GetOverflowStylesArgs): TextOverFlowStyles => {\n return (textOverflowStyles[textOverflow] || textOverflowStyles['break-word']) as TextOverFlowStyles;\n};\n\nconst generateKey = (i: string | number = '', value = ''): string => `${value}-${i}`;\n\nexport const getTextOverflowType = (\n columnFormat: Partial<ColumnFormat>,\n columnId: string,\n tableFormat?: Partial<TableFormat>,\n currentColumn?: string,\n defaultValue: TextOverflow = 'break-word'\n): string => {\n // Priority: columnFormat.textOverflow > tableFormat.textOverflow > defaultValue\n const columnTextOverflow = getAttributeFromColumnFormat(\n 'textOverflow',\n columnFormat,\n columnId,\n currentColumn\n );\n if (columnTextOverflow) {\n return columnTextOverflow;\n }\n return tableFormat?.textOverflow || defaultValue;\n};\n\n// Helper to check if textOverflow is explicitly set (returns undefined if not set)\nconst getTextOverflow = (\n columnFormat: Partial<ColumnFormat>,\n columnId: string,\n tableFormat?: Partial<TableFormat>,\n currentColumn?: string\n): string | undefined => {\n const columnTextOverflow = getAttributeFromColumnFormat(\n 'textOverflow',\n columnFormat,\n columnId,\n currentColumn\n );\n if (columnTextOverflow) {\n return columnTextOverflow;\n }\n return tableFormat?.textOverflow;\n};\n\nconst generateHeader = (\n value: string,\n columnId: string,\n i: number,\n columnFormat: Partial<ColumnFormat>,\n tableFormat: Partial<TableFormat>,\n showInternalFields: boolean\n): TableHeaderCell => {\n const ret: TableHeaderCell = {\n key: generateKey(value, String(i)),\n value,\n align: 'left',\n columnId,\n sortKey: value,\n showCell: true,\n };\n if (!showInternalFields && value.charAt(0) === '_' && value !== '_time') {\n ret.showCell = false;\n }\n\n const headerAlign =\n getColumnFormatHeaderAlign(columnFormat, columnId, value) ||\n getTableFormatHeaderAlign(tableFormat) ||\n 'left';\n ret.align = headerAlign;\n ret.truncate = true;\n\n // Only apply textOverflow to headers if explicitly set in columnFormat or tableFormat\n const textOverflow = getTextOverflow(columnFormat, columnId, tableFormat, value);\n if (textOverflow) {\n ret.textOverflowType = textOverflow;\n }\n\n return ret;\n};\n\nconst getColumnFormatAlign = (\n columnFormat: Partial<ColumnFormat> | undefined,\n currentColumn: TableHeaderCell,\n currentRow: number\n): TableAlignment | undefined => {\n let align;\n const alignOption = getAttributeFromColumnFormat(\n 'align',\n columnFormat,\n currentColumn.columnId,\n currentColumn.value\n );\n\n if (isArray(alignOption) && includes(validAlignments, alignOption[currentRow])) {\n align = alignOption[currentRow];\n } else if (typeof alignOption === 'string' && alignOption === 'auto') {\n align = undefined;\n } else if (typeof alignOption === 'string' && includes(validAlignments, alignOption)) {\n align = alignOption;\n } else if (typeof alignOption !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\n `columnFormat.${\n currentColumn.columnId\n }.align should be a string or an array containing (${validAlignments.join(\n ' | '\n )}). ${JSON.stringify(alignOption)} provided`\n );\n }\n return align;\n};\n\nconst getColumnFormatCellType = (\n columnFormat: Partial<ColumnFormat> | undefined,\n currentColumn: TableHeaderCell,\n currentRow: number\n): CellRenderers | undefined => {\n let cellType;\n const cellTypes = getAttributeFromColumnFormat(\n 'cellTypes',\n columnFormat,\n currentColumn.columnId,\n currentColumn.value\n );\n\n if (isArray(cellTypes) && includes(validCellRenderers, cellTypes[currentRow])) {\n cellType = cellTypes[currentRow];\n } else if (typeof cellTypes !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\n `columnFormat.${\n currentColumn.value\n }.cellType should be an array containing (${validCellRenderers.join(' | ')}). ${JSON.stringify(\n cellTypes\n )} provided`\n );\n }\n return cellType;\n};\n\nconst getColumnFormatSparklineType = (\n columnFormat: Partial<ColumnFormat> | undefined,\n currentColumn: TableHeaderCell,\n currentRow: number\n): SparklineType | undefined => {\n let sparklineType;\n const types = getAttributeFromColumnFormat(\n 'sparklineTypes',\n columnFormat,\n currentColumn.columnId,\n currentColumn.value\n );\n\n if (isArray(types) && includes(validSparklineTypes, types[currentRow])) {\n sparklineType = types[currentRow];\n } else if (typeof types !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\n `columnFormat.${currentColumn.value}.sparklineTypes should be one of (${validSparklineTypes.join(\n ' | '\n )}). ${JSON.stringify(types)} provided`\n );\n }\n return sparklineType;\n};\n\nconst getColumnFormatData = (\n columnFormat: Partial<ColumnFormat> | undefined,\n currentColumn: TableHeaderCell,\n currentRow: number\n): string | undefined => {\n let datum;\n const data = getAttributeFromColumnFormat(\n 'data',\n columnFormat,\n currentColumn.columnId,\n currentColumn.value\n );\n\n if (isArray(data)) {\n datum = data[currentRow];\n } else if (typeof data !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\n `columnFormat.${\n currentColumn.value\n }.data should be an array containing formatted data. ${typeof data} provided`\n );\n }\n return datum;\n};\n\nconst getColumnFormatColor = (\n columnFormat: Partial<ColumnFormat> | undefined,\n currentColumn: TableHeaderCell,\n currentRow: number,\n field: string\n): string | undefined => {\n let color;\n const colors = getAttributeFromColumnFormat(\n field,\n columnFormat,\n currentColumn.columnId,\n currentColumn.value\n );\n\n // Only use the color if it's a valid color value\n // When matchValue returns the original data value (no match, no default),\n // it won't be a valid color, so we silently fall back to table-level colors\n if (isArray(colors) && isColor(colors[currentRow])) {\n color = colors[currentRow];\n }\n return color;\n};\n\nconst getColumnFormatRowColor = (\n columnFormat: Partial<ColumnFormat> | undefined,\n currentColumn: TableHeaderCell,\n currentRow: number\n): string | undefined => {\n return getColumnFormatColor(columnFormat, currentColumn, currentRow, 'rowColors');\n};\n\nconst getColumnFormatRowBgColor = (\n columnFormat: Partial<ColumnFormat> | undefined,\n currentColumn: TableHeaderCell,\n currentRow: number\n): string | undefined => {\n return getColumnFormatColor(columnFormat, currentColumn, currentRow, 'rowBackgroundColors');\n};\n\nconst getColumnFormatSparklineColor = (\n columnFormat: Partial<ColumnFormat> | undefined,\n currentColumn: TableHeaderCell,\n currentRow: number\n): string | undefined => {\n return getColumnFormatColor(columnFormat, currentColumn, currentRow, 'sparklineColors');\n};\n\nconst getColumnFormatSparklineAreaColor = (\n columnFormat: Partial<ColumnFormat> | undefined,\n currentColumn: TableHeaderCell,\n currentRow: number\n): string | undefined => {\n return getColumnFormatColor(columnFormat, currentColumn, currentRow, 'sparklineAreaColors');\n};\n\nconst validSparklineNullValueDisplayOptions = ['gaps', 'zero', 'connect'] as const;\n\nconst getColumnFormatSparklineNullValueDisplay = (\n columnFormat: Partial<ColumnFormat> | undefined,\n currentColumn: TableHeaderCell\n): SparklineNullValueDisplay | undefined => {\n const nullValueDisplay = getAttributeFromColumnFormat(\n 'sparklineNullValueDisplay',\n columnFormat,\n currentColumn.columnId,\n currentColumn.value\n );\n\n if (\n typeof nullValueDisplay === 'string' &&\n validSparklineNullValueDisplayOptions.includes(nullValueDisplay as SparklineNullValueDisplay)\n ) {\n return nullValueDisplay as SparklineNullValueDisplay;\n }\n return undefined;\n};\n\nconst getColumnFormatHeaderAlign = (\n columnFormat: Partial<ColumnFormat> | undefined,\n columnId: string,\n columnValue: string\n): TableAlignment | undefined => {\n let headerAlign;\n const alignOption = getAttributeFromColumnFormat('headerAlign', columnFormat, columnId, columnValue);\n\n if (typeof alignOption === 'string' && alignOption === 'auto') {\n return undefined;\n }\n if (typeof alignOption === 'string' && includes(validAlignments, alignOption)) {\n headerAlign = alignOption;\n } else if (typeof alignOption !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\n `columnFormat.${columnId}.headerAlign should be a string containing (${validAlignments.join(\n ' | '\n )}). ${JSON.stringify(alignOption)} provided`\n );\n }\n return headerAlign;\n};\n\nconst getTableFormatAlign = (\n tableFormat: Partial<TableFormat>,\n currentColumn: number,\n currentRow: number\n): TableAlignment | undefined => {\n const alignOption = get(tableFormat, 'align');\n let align;\n if (\n isArray(alignOption) &&\n isArray(alignOption[currentColumn]) &&\n includes(validAlignments, alignOption[currentColumn][currentRow])\n ) {\n align = alignOption[currentColumn][currentRow];\n } else if (typeof alignOption === 'string' && includes(validAlignments, alignOption)) {\n align = alignOption;\n } else if (typeof alignOption !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\n `tableFormat.align should be a string or a 2 dimensional array containing (${validAlignments.join(\n ' | '\n )}). ${JSON.stringify(alignOption)} provided`\n );\n }\n return align;\n};\n\nconst getTableFormatCellType = (\n tableFormat: Partial<TableFormat>,\n currentColumn: number,\n currentRow: number\n): CellRenderers | undefined => {\n const cellTypes = get(tableFormat, 'cellTypes');\n let cellType;\n if (\n isArray(cellTypes) &&\n isArray(cellTypes[currentColumn]) &&\n includes(validCellRenderers, cellTypes[currentColumn][currentRow])\n ) {\n cellType = cellTypes[currentColumn][currentRow];\n } else if (typeof cellTypes !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\n `tableFormat.cellType should be a 2 dimensional array containing (${validCellRenderers.join(\n ' | '\n )}). ${JSON.stringify(cellTypes)} provided`\n );\n }\n return cellType;\n};\n\nconst getTableFormatSparklineType = (\n tableFormat: Partial<TableFormat>,\n currentColumn: number,\n currentRow: number\n): SparklineType | undefined => {\n const types = get(tableFormat, 'sparklineTypes');\n let sparklineType;\n if (\n isArray(types) &&\n isArray(types[currentColumn]) &&\n includes(validSparklineTypes, types[currentColumn][currentRow])\n ) {\n sparklineType = types[currentColumn][currentRow];\n } else if (typeof types !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\n `tableFormat.sparklineTypes should be a 2 dimensional array containing one of (${validSparklineTypes.join(\n ' | '\n )}). ${JSON.stringify(types)} provided`\n );\n }\n return sparklineType;\n};\n\nconst getTableFormatColor = (\n tableFormat: Partial<TableFormat>,\n currentColumn: number,\n currentRow: number,\n field: string\n): string | undefined => {\n const colors = get(tableFormat, field);\n let color;\n if (isArray(colors) && isArray(colors[currentColumn]) && isColor(colors[currentColumn][currentRow])) {\n color = colors[currentColumn][currentRow];\n } else if (isArray(colors) && isColor(colors[currentRow])) {\n color = colors[currentRow];\n } else if (\n typeof colors !== 'undefined' &&\n isArray(colors) &&\n isArray(colors[currentColumn]) &&\n colors[currentColumn][currentRow] !== undefined\n ) {\n // eslint-disable-next-line no-console\n console.warn(\n `tableFormat.${field} needs to be an array of colors, provided ${JSON.stringify(\n colors\n )}. Current value at [${currentColumn}][${currentRow}] is ${JSON.stringify(colors[currentRow])}`\n );\n }\n return color;\n};\n\nconst getTableFormatRowColor = (\n tableFormat: Partial<TableFormat>,\n currentCol: number,\n currentRow: number\n): string | undefined => {\n return getTableFormatColor(tableFormat, currentCol, currentRow, 'rowColors');\n};\n\nconst getTableFormatRowBgColor = (\n tableFormat: Partial<TableFormat>,\n currentCol: number,\n currentRow: number\n): string | undefined => {\n return getTableFormatColor(tableFormat, currentCol, currentRow, 'rowBackgroundColors');\n};\n\n/**\n * Get theme row background color as the final fallback.\n * Uses odd/even striping based on row index (row 1 = odd, row 2 = even, etc.)\n */\nconst getThemeRowBgColor = (themeFunc: ThemeFunc | undefined, currentRow: number): string | undefined => {\n if (!themeFunc) return undefined;\n // (currentRow + 1) % 2 because 'odd' refers to row number, so index 0 -> row 1 -> odd colored\n const themeVar = (currentRow + 1) % 2 === 0 ? 'rowBackgroundColorEven' : 'rowBackgroundColorOdd';\n return themeFunc(themeVar);\n};\n\n/**\n * Get theme text color as the final fallback.\n */\nconst getThemeRowColor = (themeFunc: ThemeFunc | undefined): string | undefined => {\n if (!themeFunc) return undefined;\n return themeFunc('textColor');\n};\n\nconst getTableFormatSparklineColor = (\n tableFormat: Partial<TableFormat>,\n currentCol: number,\n currentRow: number\n): string | undefined => {\n return getTableFormatColor(tableFormat, currentCol, currentRow, 'sparklineColors');\n};\n\nconst getTableFormatSparklineAreaColor = (\n tableFormat: Partial<TableFormat>,\n currentCol: number,\n currentRow: number\n): string | undefined => {\n return getTableFormatColor(tableFormat, currentCol, currentRow, 'sparklineAreaColors');\n};\n\nconst getTableFormatSparklineNullValueDisplay = (\n tableFormat: Partial<TableFormat>\n): SparklineNullValueDisplay | undefined => {\n const nullValueDisplay = get(tableFormat, 'sparklineNullValueDisplay');\n if (\n typeof nullValueDisplay === 'string' &&\n validSparklineNullValueDisplayOptions.includes(nullValueDisplay as SparklineNullValueDisplay)\n ) {\n return nullValueDisplay as SparklineNullValueDisplay;\n }\n return undefined;\n};\n\nconst getTableFormatData = (\n tableFormat: Partial<TableFormat>,\n currentCol: number,\n currentRow: number\n): string | undefined => {\n const data = get(tableFormat, 'data');\n let datum;\n if (isArray(data) && isArray(data[currentCol])) {\n datum = data[currentCol][currentRow];\n } else if (typeof data !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\n `tableFormat.data should be a 2 dimensional array containing formatted data to be displayed. ${typeof data} provided`\n );\n }\n return datum;\n};\n\nconst getTableFormatHeaderAlign = (tableFormat: Partial<TableFormat>): TableAlignment | undefined => {\n const alignOption = get(tableFormat, 'headerAlign');\n let headerAlign;\n if (typeof alignOption === 'string' && validAlignments.includes(alignOption)) {\n headerAlign = alignOption;\n } else if (typeof alignOption !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\n `tableFormat.headerAlign should be a string containing (${validAlignments.join(\n ' | '\n )}). ${JSON.stringify(alignOption)} provided`\n );\n }\n return headerAlign;\n};\n\nconst getAttributeFromColumnFormat = (attribute, columnFormat, columnId, columnValue) =>\n get(columnFormat, [columnId, attribute]) || get(columnFormat, [columnValue, attribute]);\n\nconst validValueSelector = (\n v1: TableCellValueType,\n v2: TableCellValueType,\n v3: TableCellValueType,\n defaultValue: TableCellValueType\n): TableCellValueType => {\n const validTypes = ['string', 'number'];\n if (validTypes.includes(typeof v1) || isArray(v1)) {\n return v1;\n }\n if (validTypes.includes(typeof v2) || isArray(v2)) {\n return v2;\n }\n if (validTypes.includes(typeof v3) || isArray(v3)) {\n return v3;\n }\n return defaultValue;\n};\n\nconst computeBodyRows = (args: {\n table: TableCellValueType[][];\n tableHeader: TableHeader;\n columnFormat: Partial<ColumnFormat>;\n tableFormat: Partial<TableFormat>;\n columnIds: string[];\n showInternalFields: boolean;\n longestColumnLength: number;\n themeFunc?: ThemeFunc;\n}): TableRow[] => {\n const rows: TableRow[] = [];\n const {\n table: t,\n tableHeader: hdr,\n columnFormat: cfmt,\n tableFormat: tfmt,\n columnIds: cids,\n showInternalFields: showInternal,\n longestColumnLength: len,\n themeFunc: themeFn,\n } = args;\n for (let r = 0; r < len; r += 1) {\n const row: TableRow = { key: `row-${r}`, index: r, cells: [] };\n t.forEach((column, i): void => {\n const currentHeader = hdr.cells[i];\n const value = validValueSelector(\n getColumnFormatData(cfmt, currentHeader, r),\n getTableFormatData(tfmt, i, r),\n column[r],\n ''\n );\n const rawValue = column[r];\n // Color cascade: columnFormat -> tableFormat -> theme\n const rowBackgroundColor =\n getColumnFormatRowBgColor(cfmt, currentHeader, r) ||\n getTableFormatRowBgColor(tfmt, i, r) ||\n getThemeRowBgColor(themeFn, r);\n const rowColor =\n getColumnFormatRowColor(cfmt, currentHeader, r) ||\n getTableFormatRowColor(tfmt, i, r) ||\n getThemeRowColor(themeFn);\n const align =\n getColumnFormatAlign(cfmt, currentHeader, r) || getTableFormatAlign(tfmt, i, r) || 'left';\n const cellType =\n getColumnFormatCellType(cfmt, currentHeader, r) ||\n getTableFormatCellType(tfmt, i, r) ||\n 'TextCell';\n const sparklineColor =\n getColumnFormatSparklineColor(cfmt, currentHeader, r) ||\n getTableFormatSparklineColor(tfmt, i, r) ||\n undefined;\n const sparklineAreaColor =\n getColumnFormatSparklineAreaColor(cfmt, currentHeader, r) ||\n getTableFormatSparklineAreaColor(tfmt, i, r) ||\n undefined;\n const sparklineType =\n getColumnFormatSparklineType(cfmt, currentHeader, r) ||\n getTableFormatSparklineType(tfmt, i, r) ||\n 'area';\n const sparklineNullValueDisplay =\n getColumnFormatSparklineNullValueDisplay(cfmt, currentHeader) ||\n getTableFormatSparklineNullValueDisplay(tfmt) ||\n 'gaps';\n const key = generateKey(value as string, `${r}-${i}`);\n const textOverflowType = getTextOverflowType(cfmt, cids[i], tfmt, currentHeader.value);\n const textOverflowStyle = getOverflowStyles({\n textOverflow: textOverflowType as TextOverflow,\n });\n const showCell = !(\n !showInternal &&\n currentHeader.value.startsWith('_') &&\n currentHeader.value !== '_time'\n );\n row.cells.push({\n key,\n value,\n rawValue,\n align,\n cellType,\n rowIndex: r,\n columnIndex: i,\n sparklineColor,\n sparklineAreaColor,\n sparklineType,\n sparklineNullValueDisplay,\n header: currentHeader.value,\n style: {\n backgroundColor: rowBackgroundColor,\n color: rowColor,\n ...textOverflowStyle,\n },\n showCell,\n } as TableRowCell);\n });\n rows.push(row);\n }\n return rows;\n};\n\nconst prependRowNumberColumn = (\n table: TableCellValueType[][],\n headers: string[],\n columnIds: string[],\n tableFormat: Partial<TableFormat>,\n longestColumnLength: number,\n paginationOffset: number,\n count: number\n): {\n table: TableCellValueType[][];\n headers: string[];\n columnIds: string[];\n tableFormat: Partial<TableFormat>;\n} => {\n const correctedPaginationOffset = Math.max(0, (paginationOffset - 1) * count);\n const newHeaders = ['#', ...headers];\n const newColumnIds = ['#', ...columnIds];\n const newTable = [\n Array.from({ length: longestColumnLength }, (v, i): number => correctedPaginationOffset + i + 1),\n ...table,\n ];\n const newTableFormat: Partial<TableFormat> = { ...tableFormat };\n if (isArray(newTableFormat.align)) {\n newTableFormat.align = [\n new Array(longestColumnLength).fill('left'),\n ...(newTableFormat.align as TableAlignment[][]),\n ];\n }\n if (isArray(newTableFormat.cellTypes)) {\n newTableFormat.cellTypes = [\n new Array(longestColumnLength).fill('TextCell'),\n ...newTableFormat.cellTypes,\n ];\n }\n if (isArray(newTableFormat.data)) {\n newTableFormat.data = [\n Array.from({ length: longestColumnLength }, (v, i): string => `${i + 1}`),\n ...newTableFormat.data,\n ];\n }\n if (isArray(newTableFormat.rowBackgroundColors)) {\n if (newTableFormat.rowBackgroundColors.length > 0 && isArray(newTableFormat.rowBackgroundColors[0])) {\n newTableFormat.rowBackgroundColors = [\n new Array(longestColumnLength),\n ...newTableFormat.rowBackgroundColors,\n ] as string[][];\n }\n }\n if (isArray(newTableFormat.rowColors)) {\n if (newTableFormat.rowColors.length > 0 && isArray(newTableFormat.rowColors[0])) {\n newTableFormat.rowColors = [\n new Array(longestColumnLength),\n ...newTableFormat.rowColors,\n ] as string[][];\n }\n }\n if (isArray(newTableFormat.sparklineColors)) {\n newTableFormat.sparklineColors = [new Array(longestColumnLength), ...newTableFormat.sparklineColors];\n }\n if (isArray(newTableFormat.sparklineAreaColors)) {\n newTableFormat.sparklineAreaColors = [\n new Array(longestColumnLength),\n ...newTableFormat.sparklineAreaColors,\n ];\n }\n if (isArray(newTableFormat.sparklineTypes)) {\n newTableFormat.sparklineTypes = [\n new Array(longestColumnLength).fill('area'),\n ...newTableFormat.sparklineTypes,\n ];\n }\n return { table: newTable, headers: newHeaders, columnIds: newColumnIds, tableFormat: newTableFormat };\n};\n\nexport const useTable = (tableArgs: UseTableArgs = {}): TableStructure => {\n let { table = [], headers = [], columnIds = [] } = tableArgs;\n const {\n headerVisibility = 'inline',\n showRowNumbers = false,\n showInternalFields = true,\n tableFormat: tableFormatIn = {},\n columnFormat = {},\n paginationOffset = 0,\n count = 0,\n showFooterTotals = false,\n showFooterPercentages = false,\n themeFunc,\n } = tableArgs;\n let tableFormat = tableFormatIn;\n const longestColumnLength: number = Math.max(...table.map((column): number => column.length));\n\n if (showRowNumbers) {\n ({ table, headers, columnIds, tableFormat } = prependRowNumberColumn(\n table,\n headers,\n columnIds,\n tableFormat,\n longestColumnLength,\n paginationOffset,\n count\n ));\n }\n\n const tableHeader: TableHeader = {\n visibility:\n validHeaderVisibilities.indexOf(headerVisibility as TableHeaderVisibility) >= 0\n ? (headerVisibility as TableHeaderVisibility)\n : 'inline',\n cells: table.map((f, i): TableHeaderCell => {\n if (i < headers.length) {\n return generateHeader(\n headers[i],\n columnIds[i],\n i,\n columnFormat,\n tableFormat,\n showInternalFields\n );\n }\n return generateHeader('', '', i, columnFormat, tableFormat, showInternalFields);\n }),\n style: {\n backgroundColor:\n (has(tableFormat, 'headerBackgroundColor') &&\n isColor(tableFormat.headerBackgroundColor) &&\n tableFormat.headerBackgroundColor) ||\n undefined,\n color:\n (has(tableFormat, 'headerColor') &&\n isColor(tableFormat.headerColor) &&\n tableFormat.headerColor) ||\n undefined,\n },\n };\n\n const tableBody: TableBody = { rows: [] };\n\n const tableFooter: TableFooter = {\n rows: [],\n };\n\n tableBody.rows = computeBodyRows({\n table,\n tableHeader,\n columnFormat,\n tableFormat,\n columnIds,\n showInternalFields,\n longestColumnLength,\n themeFunc,\n });\n\n // Build tableFooter from named maps if provided (minimal: value only)\n // FOOTER TOTALS & PERCENTAGES\n const resolveByField = <T extends number | string | TableAlignment>(\n fieldId: string,\n displayName: string,\n map?: Record<string, T>\n ): T | undefined => {\n if (!map) return undefined;\n if (Object.hasOwn(map, fieldId)) return map[fieldId];\n if (Object.hasOwn(map, displayName)) return map[displayName];\n return undefined;\n };\n\n const computeDerivedAlign = (\n colMeta: TableHeaderCell,\n colIdx: number,\n alignOverrides?: Record<string, TableAlignment>\n ): TableAlignment => {\n const fieldId = colMeta.columnId;\n const label = colMeta.value;\n const alignOverride = resolveByField(fieldId, label, alignOverrides);\n return (\n alignOverride ||\n getColumnFormatAlign(columnFormat, colMeta, Math.max(0, longestColumnLength - 1)) ||\n getTableFormatAlign(tableFormat, colIdx, Math.max(0, longestColumnLength - 1)) ||\n 'right'\n );\n };\n\n const buildFooterRow = (\n key: 'footer-totals' | 'footer-percentages',\n styleExtras: { bold?: boolean; opacity?: number },\n rowIndexBase: number\n ): TableRow => {\n const idx = rowIndexBase + tableFooter.rows.length;\n const row: TableRow = { key, index: idx, cells: [] };\n tableHeader.cells.forEach((colMeta, colIdx) => {\n const fieldId = colMeta.columnId;\n const label = colMeta.value;\n // Prefer column-level footer DSL value if present; try both id and label keys\n const columnFooterRaw = columnFormat?.[fieldId]?.footer ?? columnFormat?.[label]?.footer;\n let displayValue: string | number = '';\n if (Array.isArray(columnFooterRaw)) {\n // Expected shape: 1D series [total, percentage]\n displayValue =\n key === 'footer-percentages' ? (columnFooterRaw[1] ?? '') : (columnFooterRaw[0] ?? '');\n } else if (typeof columnFooterRaw !== 'undefined') {\n // Scalar footer: use for totals, blank for percentages\n displayValue = key === 'footer-percentages' ? '' : (columnFooterRaw as string | number);\n } else {\n // No column footer configured; leave blank\n displayValue = '';\n }\n const derivedAlign = computeDerivedAlign(colMeta, colIdx, undefined);\n row.cells.push({\n key: `${key}-${colIdx}`,\n value: displayValue,\n align: derivedAlign,\n showCell: colMeta.showCell,\n style: {\n backgroundColor: tableHeader.style?.backgroundColor || tableHeader.style?.color,\n color: tableHeader.style?.color,\n ...(styleExtras.bold ? { fontWeight: 600 as React.CSSProperties['fontWeight'] } : {}),\n ...(typeof styleExtras.opacity === 'number'\n ? { opacity: styleExtras.opacity as React.CSSProperties['opacity'] }\n : {}),\n },\n } as TableRowCell);\n });\n return row;\n };\n\n if (showFooterTotals) {\n const totalsRow = buildFooterRow('footer-totals', { bold: true }, tableBody.rows.length);\n tableFooter.rows.push(totalsRow);\n }\n if (showFooterPercentages) {\n const percentagesRow = buildFooterRow('footer-percentages', {}, tableBody.rows.length);\n tableFooter.rows.push(percentagesRow);\n }\n\n return {\n tableHeader,\n tableBody,\n tableFooter,\n };\n};\n", "\nimport * as defaultImport from \"@splunk/react-ui/Link\";\nexport * from \"@splunk/react-ui/Link\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/themes\";\nexport * from \"@splunk/themes\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import styled from 'styled-components';\nimport Link from '@splunk/react-ui/Link';\nimport { mixins, variables } from '@splunk/themes';\n\nexport const StyledSkipLink = styled(Link)`\n ${mixins.skipLink()};\n &:not([disabled], [aria-disabled='true']) {\n background-color: ${variables.backgroundColorSection};\n }\n &&& {\n text-decoration: none;\n }\n &:focus {\n z-index: ${variables.zindexLayer};\n }\n`;\n", "export const SwitchTableCell = ({ type, children }): React.ReactElement =>\n children.filter((child): boolean => child.type.displayName === type);\n", "import * as React from 'react';\nimport SUITable from '@splunk/react-ui/Table';\nimport { TableRowCell } from '../hooks';\n\ninterface TextCellProps {\n cell: TableRowCell;\n useMouseOverEffect: boolean;\n}\nconst noop = () => undefined;\n\nexport const TextCell = ({ cell, useMouseOverEffect }: TextCellProps): React.ReactElement => {\n const { cellStyle, textStyle } = React.useMemo(() => {\n const style = cell.style || {};\n const { whiteSpace, overflow, textOverflow, wordBreak, wordWrap, overflowWrap, ...rest } = style;\n return {\n cellStyle: rest,\n textStyle: { whiteSpace, overflow, textOverflow, wordBreak, wordWrap, overflowWrap },\n };\n }, [cell.style]);\n\n return (\n <SUITable.Cell\n style={cellStyle}\n align={cell.align}\n data-test-cell-type=\"TextCell\"\n data-test-align-value={cell.align}\n data-row-index={cell.rowIndex}\n data-col-index={cell.columnIndex}\n onClick={useMouseOverEffect ? noop : undefined}\n >\n <span style={textStyle}>{cell.value.toString()}</span>\n </SUITable.Cell>\n );\n};\n\nTextCell.displayName = 'TextCell';\n", "import * as React from 'react';\nimport styled from 'styled-components';\nimport SUITable from '@splunk/react-ui/Table';\nimport { createDOMID } from '@splunk/ui-utils/id';\nimport { noop } from 'lodash';\nimport { TableRowCell } from '../hooks';\n\nconst StyledTableCell = styled(SUITable.Cell)`\n & > div {\n flex-direction: column;\n }\n`;\n\nconst ArrayItemDiv = styled.div`\n min-width: 0;\n max-width: 100%;\n`;\ninterface ArrayCellProps {\n cell: TableRowCell;\n useMouseOverEffect: boolean;\n}\n\nexport const ArrayCell = ({ cell, useMouseOverEffect }: ArrayCellProps): React.ReactElement => {\n const value = React.useMemo(() => (Array.isArray(cell.value) ? cell.value : [cell.value]), [cell.value]);\n\n const { cellStyle, itemStyle } = React.useMemo(() => {\n const style = cell.style || {};\n const { whiteSpace, overflow, textOverflow, wordBreak, wordWrap, overflowWrap, ...rest } = style;\n return {\n cellStyle: rest,\n // flex-direction:column (set on StyledTableCell) makes justify-content control the\n // vertical axis, so the Cell's `align` prop no longer drives horizontal alignment.\n // Explicitly mirror cell.align as textAlign on each item to restore the behaviour.\n itemStyle: {\n whiteSpace,\n overflow,\n textOverflow,\n wordBreak,\n wordWrap,\n overflowWrap,\n textAlign: cell.align,\n },\n };\n }, [cell.style, cell.align]);\n\n return (\n <StyledTableCell\n style={cellStyle}\n align={cell.align}\n data-test-align-value={cell.align}\n data-test-cell-type=\"ArrayCell\"\n onClick={useMouseOverEffect ? noop : undefined}\n >\n {value\n .filter(v => v !== null)\n .map(\n (v, i): React.ReactElement => (\n <ArrayItemDiv\n key={createDOMID()}\n data-row-index={cell.rowIndex}\n data-col-index={cell.columnIndex}\n data-array-index={i}\n style={itemStyle}\n >\n {v.toString()}\n </ArrayItemDiv>\n )\n )}\n </StyledTableCell>\n );\n};\nArrayCell.displayName = 'ArrayCell';\n", "\nimport * as defaultImport from \"@splunk/react-ui/Popover\";\nexport * from \"@splunk/react-ui/Popover\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import PropTypes from 'prop-types';\nimport React, { Component } from 'react';\nimport { isArray, isFinite, isNull, keys, max, min, omit } from 'lodash';\nimport styled from 'styled-components';\nimport Popover from '@splunk/react-ui/Popover';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport { createDOMID } from '@splunk/ui-utils/id';\n\nconst StyledSvg = styled.svg`\n /* For fixing IE11 shows overflow part line issue */\n overflow: hidden;\n`;\n\nconst StyledTooltip = styled.div`\n padding: 3px 8px;\n font-size: 12px;\n text-align: center;\n min-width: 20px;\n`;\n\nconst preventDefault = e => e.preventDefault();\n\nclass SparkLine extends Component {\n static propTypes = {\n /**\n * If true, data can contain `null` as a value and is treated as `0`. If false, this throws error when data contains `null`.\n */\n acceptNull: PropTypes.bool,\n /** Array of numbers. These data numbers are converted to points and show on sparkline. */\n data: props => {\n if (!isArray(props.data)) {\n return new Error('Data provided to Sparkline must be an array.');\n }\n\n if (props.acceptNull && !props.data.every(value => isNull(value) || isFinite(value))) {\n return new Error('Data provided to Sparkline must be finite numbers or null.');\n }\n\n if (!props.acceptNull && !props.data.every(value => isFinite(value))) {\n return new Error('Data provided to Sparkline must be finite numbers.');\n }\n return null;\n },\n /** A React ref which is set to the DOM element when the component mounts and `null` when it unmounts. */\n elementRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),\n /** Sets the number of end dots to display. When showEndDot is set to `true`, endDotCount is at least 1. If set to a positive value, this overrides showEndDot. */\n endDotCount: PropTypes.number,\n /** Fills color to the end dot. */\n endDotFillColor: PropTypes.string,\n /**\n * Sets end dot radius. End dot radius must be less than or equal to the margin. By default, its value equals the margin.\n */\n endDotRadius: PropTypes.number,\n /** Sets end dot circle stroke color. */\n endDotStroke: PropTypes.string,\n /** Sets end dot circle stroke width in pixels. */\n endDotStrokeWidth: PropTypes.number,\n /** Fills color to area. */\n fillColor: PropTypes.string,\n /** Fills opacity to area. Value must be in 0 ~ 1. */\n fillOpacity: PropTypes.string,\n /** Sets cursor stroke color. */\n cursorStroke: PropTypes.string,\n /** Sets cursor stroke width in pixels. */\n cursorStrokeWidth: PropTypes.number,\n /** Sets cursor line cap style. */\n cursorStrokeLinecap: PropTypes.oneOf(['butt', 'round', 'square']),\n /** Sets cursor dash array style. */\n cursorStrokeDasharray: PropTypes.string,\n /**\n * Container height. If this value is specified, sparkline calculates the size using this height. If height isn't specified,\n * sparkline figures out the container height by itself.\n */\n height: PropTypes.number.isRequired,\n /** When set to `true`, sparkline shows as area. */\n isArea: PropTypes.bool,\n /** The sparkline line color. */\n lineColor: PropTypes.string,\n /** Allows user to draw only the last data points for the line. */\n lineLength: PropTypes.number,\n /** The sparkline line stroke width in pixels. */\n lineStrokeWidth: PropTypes.number,\n /** Enable to show end dot. */\n showEndDot: PropTypes.bool,\n /** Enable to show tooltip. */\n showTooltip: PropTypes.bool,\n /** Sets the data value range and maximum value shown on sparkline. */\n yMax: PropTypes.number,\n /** Sets the data value range and minimum value shown on sparkline. */\n yMin: PropTypes.number,\n /**\n * The width of the container.\n */\n width: PropTypes.number.isRequired,\n /** Sets the a11y title text on sparkline. */\n title: PropTypes.string,\n };\n\n static defaultProps = {\n acceptNull: false,\n data: [],\n showTooltip: true,\n endDotCount: 0,\n showEndDot: false,\n endDotRadius: 0,\n endDotFillColor: 'white',\n endDotStroke: 'black',\n endDotStrokeWidth: 0,\n fillColor: '#65a637',\n fillOpacity: '.1',\n cursorStroke: '#5184AF',\n cursorStrokeWidth: 3,\n cursorStrokeLinecap: 'square',\n cursorStrokeDasharray: '1, 5',\n isArea: false,\n lineColor: '#65a637',\n lineStrokeWidth: 1,\n };\n\n constructor(props, ...rest) {\n super(props, ...rest);\n this.state = {\n anchor: null,\n activeIndex: 0,\n hoveredIndex: null,\n componentIsFocused: false,\n };\n this.titleId = createDOMID('sparkline-title');\n this.pointRefs = [];\n this.containerRef = React.createRef();\n\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleMouseOver = this.handleMouseOver.bind(this);\n this.handleMouseLeave = this.handleMouseLeave.bind(this);\n this.handleFocus = this.handleFocus.bind(this);\n this.handleBlur = this.handleBlur.bind(this);\n }\n\n handleFocus(event) {\n const { target } = event;\n const { pointIndex: pointIndexStr } = target.dataset || {};\n const { activeIndex, componentIsFocused, hoveredIndex } = this.state;\n\n if (pointIndexStr !== undefined) {\n // focus event propagated from a datapoint\n const pointIndex = Number.parseInt(pointIndexStr, 10);\n if (activeIndex !== pointIndex || !componentIsFocused || hoveredIndex !== null) {\n this.setState({\n activeIndex: pointIndex,\n hoveredIndex: null,\n componentIsFocused: true,\n });\n }\n } else if (this.pointRefs.length > 0) {\n // focus set programmatically or by user agent\n const indexToFocus = activeIndex ? Math.min(this.pointRefs.length - 1, activeIndex) : 0;\n this.pointRefs[indexToFocus].focus();\n }\n }\n\n handleBlur(event) {\n if (this.containerRef.current && !this.containerRef.current.contains(event.relatedTarget)) {\n this.setState({ componentIsFocused: false });\n }\n }\n\n handleKeyDown(event) {\n const { data } = this.props;\n const { activeIndex } = this.state;\n const numPoints = data.length;\n\n if (numPoints === 0) {\n return;\n }\n\n const allowedKeys = ['ArrowLeft', 'ArrowRight', 'Home', 'End'];\n if (!allowedKeys.includes(event.key)) {\n return;\n }\n\n let newIndex;\n\n switch (event.key) {\n case 'Home':\n newIndex = 0;\n break;\n case 'End':\n newIndex = numPoints - 1;\n break;\n case 'ArrowLeft':\n newIndex = Math.max(0, activeIndex - 1);\n break;\n case 'ArrowRight':\n newIndex = Math.min(numPoints - 1, activeIndex + 1);\n break;\n default:\n return;\n }\n\n if (newIndex !== activeIndex) {\n event.preventDefault();\n if (this.pointRefs[newIndex]) {\n this.pointRefs[newIndex].focus();\n }\n }\n }\n\n handleMouseOver(event) {\n const pointIndexStr = event.target.dataset && event.target.dataset.pointIndex;\n if (pointIndexStr !== undefined) {\n const pointIndex = Number.parseInt(pointIndexStr, 10);\n if (this.state.hoveredIndex !== pointIndex) {\n this.setState({ hoveredIndex: pointIndex });\n }\n }\n }\n\n handleMouseLeave() {\n if (this.state.hoveredIndex !== null) {\n this.setState({ hoveredIndex: null });\n }\n }\n\n getMax() {\n const { data, acceptNull, yMax } = this.props;\n const dataMax = () => (acceptNull ? max(this.fillNull()) : max(data));\n return yMax === undefined ? dataMax() : yMax;\n }\n\n getMin() {\n const { data, acceptNull, yMin } = this.props;\n const dataMin = () => (acceptNull ? min(this.fillNull()) : min(data));\n return yMin === undefined ? dataMin() : yMin;\n }\n\n /**\n * Gets unit value of x axis.\n * @param {Number} xMargin - margin of x axis.\n * @return {Number} unit value of x axis.\n * @private\n */\n getXUnit(xMargin) {\n const { data, width } = this.props;\n // Calculate xUnit. Width substract the left margin and right margin, then divide by data length.\n const xUnit = (width - xMargin * 2) / (data.length > 1 ? data.length - 1 : 1);\n return Math.max(0, xUnit);\n }\n\n /**\n * Gets unit value of y axis.\n * @param {String} yMargin - margin of y axis.\n * @return {Number} unit value of y axis.\n * @private\n */\n getYUnit(yMargin) {\n const { height } = this.props;\n const maxValue = this.getMax();\n const minValue = this.getMin();\n\n // Calculate yUnit. Height substract the upper margin and bottom margin, then divide by value range of values in data.\n // if the maxValue equals minValue, means all values in data are the same, then, we need to set the YUnit at the mid value of Height.\n // So, draws sparkline right in the mid of the container.\n const yUnit = (height - yMargin * 2) / (maxValue - minValue || 2);\n return Math.max(0, yUnit);\n }\n\n /**\n * Get a list of arrays of points for drawing lines, based on acceptNull property\n * @method getSegmentSets\n * @param {Array} data\n * @param {Array} points\n * @returns {Object} Object containing lines (arrays of points for polylines) and isolatedPoints (single points surrounded by nulls)\n */\n getSegmentSets(data, points) {\n const { acceptNull } = this.props;\n const lines = [];\n const isolatedPoints = [];\n let currentLine = [];\n // eslint-disable-next-line\n for (const [idx, p] of data.entries()) {\n // Found null data\n if (!acceptNull && isNull(p)) {\n // need at least 2 points to draw a segment\n if (currentLine.length > 1) {\n lines.push(currentLine);\n } else if (currentLine.length === 1) {\n // Single point surrounded by nulls - this is an isolated point\n isolatedPoints.push(currentLine[0]);\n }\n // reset for the next segment\n currentLine = [];\n } else {\n // data is good, add point data\n currentLine.push(points[idx]);\n }\n }\n\n // Add the last line or isolated point\n if (currentLine.length > 1) {\n lines.push(currentLine);\n } else if (currentLine.length === 1) {\n isolatedPoints.push(currentLine[0]);\n }\n\n return { lines, isolatedPoints };\n }\n\n handleCursorMount = el => {\n this.setState({\n anchor: el,\n });\n };\n\n /**\n * Utility for fill null value with number 0.\n * @private\n */\n fillNull() {\n const { data } = this.props;\n return data.map(value => (value === null ? 0 : value));\n }\n\n /**\n * Converts data to points in svg\n * @param {Number} xMargin - margin of x axis.\n * @param {Number} yMargin - margin of x axis.\n * @return {Array} points coordination.\n * @private\n */\n dataToPoints(xMargin, yMargin) {\n const { data } = this.props;\n const xUnit = this.getXUnit(xMargin);\n const yUnit = this.getYUnit(yMargin);\n const maxValue = this.getMax();\n const minValue = this.getMin();\n return data\n .map((val, idx) => ({\n x: idx * xUnit + xMargin,\n y: maxValue === minValue ? yUnit + yMargin : (maxValue - val) * yUnit + yMargin,\n }))\n .map(p => [p.x, p.y]);\n }\n\n /**\n * Renders rect area for each datapoint for interactions and screen reader support\n * @param {Array} points - array of points coordination.\n * @param {Number} xMargin - margin of x axis.\n * @return {Array} array of svg rect objects\n * @private\n */\n renderRect(points, xMargin) {\n const { data, height, showTooltip } = this.props;\n const xUnit = this.getXUnit(xMargin);\n\n return points.map((p, i) => (\n /* eslint-disable react/no-array-index-key */\n <rect\n key={`${i}_${p[0]}`}\n role=\"graphics-symbol\"\n aria-label={`Value: ${data[i] === null ? 'N/A' : data[i]}, point ${i + 1} of ${data.length}`}\n data-test={`rect-${i}`}\n data-point-index={i}\n tabIndex={showTooltip && this.state.activeIndex === i ? 0 : -1}\n ref={el => {\n this.pointRefs[i] = el;\n }}\n x={Math.max(0, p[0] - xUnit / 2)}\n y={0}\n width={i === 0 && data.length !== 1 ? xUnit / 2 : xUnit}\n height={height}\n style={{ fillOpacity: 0 }}\n onMouseDown={preventDefault} // do not take focus on click\n />\n /* eslint-enable react/no-array-index-key */\n ));\n }\n\n // Renders area chart\n renderArea(points) {\n const { data, fillColor, fillOpacity, height, isArea } = this.props;\n\n if (!isArea || points.length === 0) {\n return null;\n }\n\n const { lines } = this.getSegmentSets(data, points);\n const segments = lines.map(s =>\n s.concat([\n [s.at(-1)[0], height], // down to bottom of graph\n [s[0][0], height], // over to below first data point\n s[0], // up to first data point to close the box\n ])\n );\n\n return (\n <g data-test=\"area\">\n {segments.map(s => (\n <polyline\n key={`area${s.join('')}`}\n points={s.join(' ')}\n data-test=\"area-line\"\n style={{\n fill: fillColor,\n fillOpacity,\n strokeWidth: '0',\n }}\n />\n ))}\n </g>\n );\n }\n\n renderCursor(currentPointX, shouldRender) {\n const { cursorStroke, cursorStrokeWidth, cursorStrokeLinecap, cursorStrokeDasharray, height } =\n this.props;\n\n return (\n shouldRender && (\n <line\n data-test=\"cursor\"\n ref={this.handleCursorMount}\n x1={currentPointX}\n y1={0}\n x2={currentPointX}\n y2={height}\n style={{\n stroke: cursorStroke,\n strokeWidth: cursorStrokeWidth,\n strokeLinecap: cursorStrokeLinecap,\n strokeDasharray: cursorStrokeDasharray,\n }}\n />\n )\n );\n }\n\n renderTooltip(tooltipValue, isOpen) {\n const { anchor } = this.state;\n // Display '-' for null values, consistent with canvas chart tooltips\n const displayValue = tooltipValue === null ? '-' : tooltipValue;\n\n return (\n <Popover\n data-test=\"tooltip\"\n open={isOpen}\n anchor={anchor}\n data-test-value={tooltipValue}\n appearance=\"inverted\"\n defaultPlacement=\"above\"\n animation={false}\n >\n <StyledTooltip>{displayValue}</StyledTooltip>\n </Popover>\n );\n }\n\n /**\n * Renders one or more svg circles to highlight values on the sparkline\n * @method renderEndDots\n * @param {Array[Array[Number]]} points // x,y coordinates of values\n * @param {Number} dotsToShow // number of end dots to display\n * @param {Number} xMargin // used when calculating the dot radius\n * @returns {Object} React representation of SVG group\n * @private\n */\n renderEndDots(points, dotsToShow, xMargin) {\n const { endDotFillColor, endDotRadius, endDotStroke, endDotStrokeWidth } = this.props;\n\n return (\n <g>\n {points.slice(-dotsToShow).map(point => (\n <circle\n key={`end-dot${point[0]}${point[1]}`}\n data-test=\"end-dot\"\n cx={point[0]}\n cy={point[1]}\n r={endDotRadius === 0 ? xMargin : endDotRadius}\n style={{\n fill: endDotFillColor,\n stroke: endDotStroke,\n strokeWidth: endDotStrokeWidth,\n }}\n />\n ))}\n </g>\n );\n }\n\n /**\n * Renders circles for isolated points (single data points surrounded by nulls)\n * These would otherwise be invisible since a line requires at least 2 points\n * @method renderIsolatedPoints\n * @param {Array} isolatedPoints - Array of [x, y] coordinates for isolated points\n * @returns {Object} SVG Group of circles\n */\n renderIsolatedPoints(isolatedPoints) {\n const { lineColor, lineStrokeWidth } = this.props;\n\n if (!isolatedPoints || isolatedPoints.length === 0) {\n return null;\n }\n\n // Use a radius slightly larger than line width for visibility\n const radius = lineStrokeWidth + 0.5;\n\n return (\n <g data-test=\"isolated-points\">\n {isolatedPoints.map(point => (\n <circle\n key={`isolated-${point[0]}-${point[1]}`}\n data-test=\"isolated-point\"\n cx={point[0]}\n cy={point[1]}\n r={radius}\n style={{\n fill: lineColor,\n }}\n />\n ))}\n </g>\n );\n }\n\n /**\n * Renders the line(s) above the area graph\n * @method renderPolyline\n * @param {Array} points\n * @returns {Object} SVG Group of polylines and isolated points\n */\n renderPolyline(points) {\n const { data, lineColor, lineLength, lineStrokeWidth } = this.props;\n\n const linePoints = isFinite(lineLength) && lineLength > 0 ? lineLength : points.length;\n const { lines, isolatedPoints } = this.getSegmentSets(\n data.slice(-linePoints),\n points.slice(-linePoints)\n );\n\n return (\n <g data-test=\"sparkline\">\n {lines.map(lineData => (\n <polyline\n key={`line${lineData.join('')}`}\n data-test=\"polyline\"\n style={{\n fill: 'none',\n stroke: lineColor,\n strokeWidth: lineStrokeWidth,\n strokeLinejoin: 'round',\n strokeLinecap: 'round',\n }}\n points={lineData.join(' ')}\n />\n ))}\n {this.renderIsolatedPoints(isolatedPoints)}\n </g>\n );\n }\n\n getInteractionState({ data, points, showTooltip, activeIndex, hoveredIndex, componentIsFocused }) {\n if (!showTooltip) {\n return {\n currentPointX: null,\n tooltipValue: null,\n showCursorAndTooltip: false,\n interactiveProps: {},\n };\n }\n\n const interactiveProps = {\n onKeyDown: this.handleKeyDown,\n onMouseOver: this.handleMouseOver,\n onMouseLeave: this.handleMouseLeave,\n onFocus: this.handleFocus,\n onBlur: this.handleBlur,\n };\n\n const isHovered = hoveredIndex !== null;\n const shouldDisplayInteractiveElements = (isHovered || componentIsFocused) && data.length > 0;\n\n if (!shouldDisplayInteractiveElements) {\n return {\n currentPointX: null,\n tooltipValue: null,\n showCursorAndTooltip: false,\n interactiveProps,\n };\n }\n\n const displayIndex = isHovered ? hoveredIndex : activeIndex;\n const isValidIndex = displayIndex !== null && displayIndex >= 0;\n const withinBounds = isValidIndex && displayIndex < data.length && displayIndex < points.length;\n\n if (!withinBounds) {\n return {\n currentPointX: null,\n tooltipValue: null,\n showCursorAndTooltip: false,\n interactiveProps,\n };\n }\n\n const displayPointCoords = points[displayIndex];\n const currentPointX = displayPointCoords ? displayPointCoords[0] : null;\n const tooltipValue = data[displayIndex];\n\n return {\n currentPointX,\n tooltipValue,\n showCursorAndTooltip: currentPointX !== null,\n interactiveProps,\n };\n }\n\n render() {\n const {\n data,\n elementRef,\n showTooltip,\n showEndDot,\n endDotRadius,\n endDotStrokeWidth,\n endDotCount,\n height,\n isArea,\n lineStrokeWidth,\n width,\n title,\n } = this.props;\n const { activeIndex, hoveredIndex, componentIsFocused } = this.state;\n\n if (data.length === 0) {\n return null;\n }\n\n if (this.pointRefs.length !== data.length) {\n // remove stale point refs when data changes\n this.pointRefs.length = data.length;\n }\n\n // Calculate horizontal and vertical margin so that fit line or end dot.\n const xMargin = endDotRadius + endDotStrokeWidth / 2;\n const yMargin = Math.max(lineStrokeWidth / 2, endDotRadius + endDotStrokeWidth / 2);\n\n const points = this.dataToPoints(xMargin, yMargin);\n\n const dotsToShow = Math.max(showEndDot && 1, isFinite(endDotCount) && endDotCount > 0 && endDotCount);\n\n const { currentPointX, tooltipValue, showCursorAndTooltip, interactiveProps } =\n this.getInteractionState({\n data,\n points,\n showTooltip,\n activeIndex,\n hoveredIndex,\n componentIsFocused,\n });\n\n const ariaLabel = title || _('Source count over time sparkline trend');\n\n return (\n <div\n data-test=\"line\"\n data-test-type={isArea ? 'area' : 'line'}\n ref={el => {\n this.containerRef.current = el;\n if (typeof elementRef === 'function') {\n elementRef(el);\n } else if (elementRef && typeof elementRef === 'object') {\n elementRef.current = el;\n }\n }}\n {...interactiveProps}\n {...omit(this.props, keys(SparkLine.propTypes))}\n >\n <StyledSvg\n height={height}\n width={width}\n aria-labelledby={this.titleId}\n data-test=\"sparkline-svg\"\n >\n <title id={this.titleId} data-test=\"sparkline-title\">\n {ariaLabel}\n </title>\n <g>\n {showTooltip ? this.renderCursor(currentPointX, showCursorAndTooltip) : null}\n {this.renderPolyline(points)}\n {this.renderArea(points)}\n {dotsToShow ? this.renderEndDots(points, dotsToShow, xMargin) : null}\n {this.renderRect(points, xMargin)}\n {showTooltip ? this.renderTooltip(tooltipValue, showCursorAndTooltip) : null}\n </g>\n </StyledSvg>\n </div>\n );\n }\n}\n\nexport default SparkLine;\n", "import * as React from 'react';\nimport SUITable from '@splunk/react-ui/Table';\nimport SparkLine from '../../SparkLine/SparkLine';\nimport { TableRowCell, TableCellValueType, SparklineNullValueDisplay } from '../hooks';\n\ninterface SparklineCellProps {\n cell: TableRowCell;\n useMouseOverEffect: boolean;\n width: number | 'auto';\n}\n\nconst paddingLeftRight = 5;\nconst paddingTopBottom = 3;\n\nconst parseSparklineData = (data: TableCellValueType): (number | null)[] =>\n (Array.isArray(data) ? data : [data]).map((d): number | null => {\n const str = d?.toString() ?? '';\n if (str.trim() === '') {\n return null;\n }\n const num = Number(str);\n return Number.isNaN(num) ? null : num;\n });\n\nconst processDataForNullDisplay = (\n data: (number | null)[],\n nullValueDisplay: SparklineNullValueDisplay\n): (number | null)[] => {\n if (nullValueDisplay === 'connect') {\n return data.filter((d): d is number => d !== null);\n }\n return data;\n};\n\nconst getAcceptNull = (nullValueDisplay: SparklineNullValueDisplay): boolean => {\n return nullValueDisplay === 'zero';\n};\n\nconst noop = () => undefined;\nconst svgStyle = { height: 0 };\nconst dummySVG = <svg style={svgStyle} />;\n\nexport const SparklineCell = ({\n cell,\n useMouseOverEffect,\n width,\n}: SparklineCellProps): React.ReactElement => {\n const [cellEl, setEl] = React.useState<HTMLTableCellElement>();\n const [height, setHeight] = React.useState<number>();\n const nullValueDisplay = cell.sparklineNullValueDisplay || 'gaps';\n let data = React.useMemo<(number | null)[]>(() => {\n const parsed = parseSparklineData(cell.value);\n return processDataForNullDisplay(parsed, nullValueDisplay);\n }, [cell.value, nullValueDisplay]);\n if (cell.value[0] === '##__SPARKLINE__##') {\n data = data.slice(1);\n }\n const acceptNull = getAcceptNull(nullValueDisplay);\n\n React.useLayoutEffect(() => {\n setHeight(cellEl?.offsetHeight || 20);\n }, [cellEl]);\n\n const cellStyle = React.useMemo(\n () => ({\n ...cell.style,\n padding: 0,\n margin: 0,\n width,\n height: `${height}px`,\n }),\n [cell.style, width, height]\n );\n\n const lineStyle = React.useMemo(\n () => ({\n paddingLeft: `${paddingLeftRight}px`,\n paddingTop: `${paddingTopBottom}px`,\n // eslint-disable-next-line no-unsafe-optional-chaining\n width: width === 'auto' ? `${cellEl?.offsetWidth - paddingLeftRight * 2}px` : `${width}px`,\n height: `${height - paddingTopBottom * 2}px`,\n }),\n [height, width, cellEl]\n );\n\n return (\n <SUITable.Cell\n style={cellStyle}\n align=\"left\"\n elementRef={setEl}\n data-test-align-value=\"left\"\n data-test-cell-type=\"SparklineCell\"\n data-row-index={cell.rowIndex}\n data-col-index={cell.columnIndex}\n onClick={useMouseOverEffect ? noop : undefined}\n >\n {height ? (\n <SparkLine\n style={lineStyle}\n data={data}\n // eslint-disable-next-line no-unsafe-optional-chaining\n width={cellEl?.offsetWidth - paddingLeftRight * 2}\n height={height - paddingTopBottom * 2}\n isArea={cell.sparklineType === 'area'}\n acceptNull={acceptNull}\n lineColor={cell.sparklineColor}\n fillColor={cell.sparklineAreaColor}\n />\n ) : (\n dummySVG\n )}\n </SUITable.Cell>\n );\n};\n\nSparklineCell.displayName = 'SparklineCell';\n", "export const VIZ_FONT_FAMILY =\n \"'Splunk Platform Sans', 'Splunk Data Sans', Roboto, Droid, 'Helvetica Neue', Helvetica, Arial, sans-serif\";\n\n/**\n * Return text width\n * @method computeTextWidth\n * @param {String} text\n * @param {String} font\n * @returns {Number} width of text with font\n */\nexport const computeTextWidth = (text: string, font: string): number => {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n context.font = font;\n const measure = context.measureText(text);\n return measure.width;\n};\n\n/**\n * Return truncated text\n * @method truncateText\n * @param {String} text\n * @param {Number} maxWidth\n * @param {String} truncationType\n * @param {String} font\n * @returns {String} truncated text\n */\nexport const truncateText = (\n text: string,\n maxWidth: number,\n truncationType: 'ellipsisEnd' | 'ellipsisMiddle' | 'ellipsisStart',\n font = `10px ${VIZ_FONT_FAMILY}`\n): string => {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) return text;\n\n context.font = font;\n\n const ellipsis = '...';\n const ellipsisWidth = context.measureText(ellipsis).width;\n const fullTextWidth = context.measureText(text).width;\n\n if (fullTextWidth <= maxWidth) {\n return text;\n }\n\n if (truncationType === 'ellipsisEnd') {\n for (let i = text.length - 1; i > 0; i -= 1) {\n const truncatedText = text.slice(0, i) + ellipsis;\n if (context.measureText(truncatedText).width <= maxWidth) {\n return truncatedText;\n }\n }\n } else if (truncationType === 'ellipsisStart') {\n for (let i = 0; i < text.length; i += 1) {\n const truncatedText = ellipsis + text.slice(i);\n if (context.measureText(truncatedText).width <= maxWidth) {\n return truncatedText;\n }\n }\n } else if (truncationType === 'ellipsisMiddle') {\n for (let i = 0; i < text.length / 2; i += 1) {\n const left = text.slice(0, Math.floor(text.length / 2) - i);\n const right = text.slice(Math.ceil(text.length / 2) + i);\n const truncatedText = left + ellipsis + right;\n if (\n context.measureText(left).width + ellipsisWidth + context.measureText(right).width <=\n maxWidth\n ) {\n return truncatedText;\n }\n }\n }\n\n return ellipsis;\n};\n", "import * as React from 'react';\n\nconst DEFAULT_FOCUSABLE_SELECTORS = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([disabled]):not([hidden])',\n 'area[href]',\n 'iframe',\n 'object',\n 'embed',\n '[contenteditable]:not([contenteditable=\"false\"])',\n 'summary',\n 'audio[controls]',\n 'video[controls]',\n].join(',');\n\nconst getFocusableElements = (): HTMLElement[] => {\n return Array.from(document.querySelectorAll(DEFAULT_FOCUSABLE_SELECTORS));\n};\n\nconst isElementHidden = (element: HTMLElement): boolean => {\n const computedStyle = window.getComputedStyle(element);\n\n return (\n element.hasAttribute('hidden') ||\n element.getAttribute('aria-hidden') === 'true' ||\n computedStyle.display === 'none' ||\n computedStyle.visibility === 'hidden'\n );\n};\n\nconst isVisibleFocusableElement = (element: HTMLElement): boolean => {\n let currentElement: HTMLElement | null = element;\n\n while (currentElement) {\n if (isElementHidden(currentElement)) {\n return false;\n }\n\n currentElement = currentElement.parentElement;\n }\n\n return true;\n};\n\nconst resolveTargetElement = (container: ParentNode, selector: string): Element | null => {\n if (container instanceof Element && container.matches(selector)) {\n return container;\n }\n\n return container.querySelector(selector);\n};\n\nconst findFirstFocusableElementAfter = (container: ParentNode, selector: string): HTMLElement | null => {\n const targetElement = resolveTargetElement(container, selector);\n\n if (!targetElement) {\n return null;\n }\n\n return (\n getFocusableElements().find(element => {\n if (targetElement.contains(element)) {\n return false;\n }\n\n const relativePosition = targetElement.compareDocumentPosition(element);\n\n return (\n relativePosition === Node.DOCUMENT_POSITION_FOLLOWING && isVisibleFocusableElement(element)\n );\n }) || null\n );\n};\n\nconst findFirstFocusableElementInside = (container: ParentNode, selector: string): HTMLElement | null => {\n const targetElement = resolveTargetElement(container, selector);\n\n if (!targetElement) {\n return null;\n }\n\n return (\n getFocusableElements().find(element => {\n return (\n element !== targetElement &&\n targetElement.contains(element) &&\n isVisibleFocusableElement(element)\n );\n }) || null\n );\n};\n\nexport const moveFocusOutside = (container: ParentNode, selector: string, event: React.MouseEvent): void => {\n event.preventDefault();\n findFirstFocusableElementAfter(container, selector)?.focus();\n};\n\nexport const moveFocusInto = (container: ParentNode, selector: string, event: React.MouseEvent): void => {\n event.preventDefault();\n findFirstFocusableElementInside(container, selector)?.focus();\n};\n", "import { type JSONElement } from '@splunk/react-ui/JSONTree';\n\nimport { type TableBody } from './hooks';\n\nexport interface ExpandedRowColors {\n backgroundColor?: string;\n color?: string;\n}\n\nexport interface ExpandedRowContent {\n isExpandable: boolean;\n json: JSONElement | null;\n}\n\n// JSONTree only renders structured data reliably; scalar JSON values like \"10\" should open blank rows instead.\nconst isJSONObject = (value: unknown): value is Record<string, JSONElement> =>\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n Object.values(value).every(isJSONElement);\n\nconst isJSONTreeContent = (value: unknown): value is JSONElement =>\n (Array.isArray(value) && value.every(isJSONElement)) || isJSONObject(value);\n\n// Accept JSON primitives for validation recursion, but structured objects/arrays are gated separately above.\nexport const isJSONElement = (value: unknown): value is JSONElement => {\n if (\n value === undefined ||\n value === null ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n ) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.every(isJSONElement);\n }\n\n if (typeof value === 'object') {\n return Object.values(value).every(isJSONElement);\n }\n\n return false;\n};\n\n// Every provided expanded-row value should keep the row expandable; invalid or scalar content renders as blank.\nexport const parseExpandedJson = (value: unknown): ExpandedRowContent => {\n if (value === undefined || value === null || value === '') {\n return { isExpandable: true, json: null };\n }\n\n if (typeof value !== 'string') {\n return { isExpandable: true, json: null };\n }\n\n try {\n const parsedValue: unknown = JSON.parse(value);\n return {\n isExpandable: true,\n json: isJSONTreeContent(parsedValue) ? parsedValue : null,\n };\n } catch {\n return { isExpandable: true, json: null };\n }\n};\n\n// Match the expand control and expanded content row to the first visible cell's resolved row colors.\nexport const getExpandedRowColors = (row: TableBody['rows'][number]): ExpandedRowColors => {\n const visibleCells = row.cells.filter(cell => cell.showCell);\n const backgroundColor = visibleCells.find(cell => cell.style?.backgroundColor)?.style?.backgroundColor;\n const color = visibleCells.find(cell => cell.style?.color)?.style?.color;\n\n return {\n backgroundColor,\n color,\n };\n};\n", "import * as React from 'react';\nimport * as T from 'prop-types';\nimport { cloneDeep, noop } from 'lodash';\nimport debounce from 'lodash/debounce';\nimport styled, { css } from 'styled-components';\n\nimport { _ } from '@splunk/ui-utils/i18n';\nimport SUITable from '@splunk/react-ui/Table';\nimport Paginator from '@splunk/react-ui/Paginator';\nimport Message from '@splunk/react-ui/Message';\nimport JSONTree from '@splunk/react-ui/JSONTree';\nimport { isColor } from '@splunk/visualizations-shared/colorUtils';\nimport { toDimension } from '@splunk/visualizations-shared/style';\nimport variables from '@splunk/themes/variables';\nimport {\n validCellRenderers,\n validSparklineTypes,\n validAlignments,\n validHeaderVisibilities,\n TableHeaderVisibility,\n validColumnAlignments,\n} from '@splunk/visualization-schemas';\n\nimport { FieldEntry } from '@splunk/visualizations-shared/dataSourceUtils';\nimport {\n TableCellValueType,\n TableRowCell,\n useTable,\n TableHeaderStyle,\n TableBody,\n TableHeader,\n TableFooter,\n TableFormat,\n ColumnFormat,\n} from './hooks';\n\nimport { StyledSkipLink } from '../common/StyledSkipLink';\nimport { SwitchTableCell, TextCell, ArrayCell, SparklineCell } from './cells';\nimport { PaginatorParamsPropTypes, PaginatorParams } from '../common/hooks/usePagination';\nimport { SortParamsPropTypes, SortParams } from '../common/hooks/useSorting';\nimport withFixedSizeContainer from '../common/hocs/FixedSizeContainer';\nimport { VIZ_FONT_FAMILY } from '../common/utils/textUtils';\nimport { moveFocusOutside, moveFocusInto } from '../common/utils/focusUtils';\nimport { getExpandedRowColors, parseExpandedJson, type ExpandedRowColors } from './tableUtils';\n\nexport const MINIMUM_COLUMN_SIZE = 60;\nexport const INITIAL_UNSET_COLUMN_WIDTH = 90;\nexport const COMPACT_PAGINATOR_WIDTH_THRESHOLD = 350;\ninterface TableCellClickPayload {\n /* user should be able to use value to drilldown */\n value: string | number;\n // other details user can use to for building complex drilldown/tokens\n\n /* nth - column. starts at 0. row number column is ignored */\n cellIndex: number;\n\n /* nth - row */\n rowIndex: number;\n\n /* field name from the table header */\n fieldValue: string;\n name: string;\n\n /* displayed table cell value. This could be formatted data */\n cellValue: TableCellValueType;\n\n /* Raw unformatted data */\n cellRawValue: TableCellValueType;\n\n /* cell values of all cells of clicked row with the field and value - in shape row.<field>.value */\n [key: string]: TableCellValueType | TableCellValueType[];\n}\n\nexport interface PureTableProps {\n backgroundColor?: string;\n count?: number;\n mode?: string;\n width?: number;\n height?: number;\n headers?: string[];\n columnIds?: string[];\n headersMetadata?: FieldEntry[];\n table?: TableCellValueType[][];\n headerVisibility?: TableHeaderVisibility;\n showRowNumbers?: boolean;\n showInternalFields?: boolean;\n showFooterTotals?: boolean;\n showFooterPercentages?: boolean;\n tableBody?: TableBody;\n tableHeader?: TableHeader;\n tableFooter?: TableFooter;\n tableFormat?: Partial<TableFormat>;\n columnFormat?: Partial<ColumnFormat>;\n sortParams?: SortParams;\n paginatorParams?: PaginatorParams;\n onCellClick?: ({ e, payload }: { e: Event; payload: TableCellClickPayload }) => void;\n onColumnFormatChange?: (columnFormat: Partial<ColumnFormat>) => void;\n font?: string;\n fontSize?: string;\n eventHandlers?: Array<{\n type: string;\n options: {\n url?: string;\n fields: string[];\n };\n }>;\n hasEventHandlers?: boolean;\n showColumnAsExpandedJson?: string[];\n}\n\nconst NonVisibleTableHead = styled(SUITable.Head)`\n pointer-events: none;\n & [data-test='head-cell'] > div {\n display: none;\n }\n`;\n\nconst FixedTableHead = styled(SUITable.Head)`\n position: sticky;\n top: 0;\n`;\n\nconst headerTextOverflowStyles = {\n ellipsis: `\n word-break: inherit;\n word-wrap: inherit;\n white-space: nowrap;\n display: inline;\n overflow: hidden;\n text-overflow: ellipsis;\n `,\n anywhere: `\n word-break: break-all;\n white-space: inherit;\n display: inline;\n `,\n default: `\n word-break: inherit;\n word-wrap: inherit;\n white-space: inherit;\n display: inline;\n `,\n};\n\nconst TableHeadCell = styled(SUITable.HeadCell)<{\n textOverflowType?: string;\n}>`\n button > span {\n ${(props): string =>\n headerTextOverflowStyles[props.textOverflowType as keyof typeof headerTextOverflowStyles] ||\n headerTextOverflowStyles.default}\n }\n`;\n\nconst VizTableContainer = styled.div<{\n backgroundColor: string;\n}>`\n box-sizing: border-box;\n padding: ${variables.spacingSmall};\n background-color: ${(props): string =>\n (isColor(props.backgroundColor) && props.backgroundColor) || props.theme.defaultBackgroundColor};\n display: flex;\n flex-flow: column nowrap;\n overflow: hidden !important;\n height: 100%;\n\n /* footer totals row styling */\n tr[data-test='footer-row-totals'] td[data-test='cell'] {\n color: ${variables.contentColorActive} !important;\n cursor: default;\n font-weight: bold;\n }\n\n /* footer percentage row styling */\n tr[data-test='footer-row-percentages'] td[data-test='cell'] {\n color: ${variables.contentColorDefault} !important;\n cursor: default;\n }\n`;\nVizTableContainer.displayName = 'VizTableContainer';\n\nconst PAGINATOR_CONTAINER_HEIGHT = 38;\nconst PAGINATOR_SPACING = 5;\nconst SUITableContainer = styled.div<{\n headerStyle?: TableHeaderStyle;\n width: string | number;\n height: string | number;\n isPaging: boolean;\n font: string;\n fontSize: string;\n lineHeight: string;\n isFullyFixed: boolean;\n}>`\n & * {\n font-family: ${(props): string => props.font};\n font-size: ${(props): string => props.fontSize};\n line-height: ${(props): string => props.lineHeight};\n }\n box-sizing: border-box;\n flex-grow: 1;\n overflow: auto;\n\n ${({ width, height, isPaging, theme }: any): string => {\n const padding = variables.spacingSmall({ theme });\n const paddingOffset = parseInt(padding, 10) * 2;\n const calculatedHeight = isPaging\n ? height - PAGINATOR_CONTAINER_HEIGHT - PAGINATOR_SPACING - paddingOffset\n : height - paddingOffset;\n // Ensure height is never negative (minimum 1px to maintain valid CSS)\n const finalHeight = Math.max(calculatedHeight, 1);\n return toDimension({\n width: width - paddingOffset,\n height: finalHeight,\n });\n }};\n\n ${({ isPaging }): string =>\n isPaging &&\n `\n margin-bottom: ${PAGINATOR_SPACING}px;\n `};\n\n ${({ headerStyle }) =>\n headerStyle?.backgroundColor &&\n css`\n & th {\n background-color: ${headerStyle.backgroundColor};\n }\n `}\n\n ${({ headerStyle }) =>\n headerStyle?.color &&\n css`\n & [data-test='head-cell'] > div > button > span {\n color: ${headerStyle.color};\n }\n `}\n\n /* Footer cells should match header background for both totals and percentages */\n ${({ headerStyle }) =>\n (headerStyle?.backgroundColor || headerStyle?.color) &&\n css`\n tr[data-test='footer-row-totals'] td[data-test='cell'],\n tr[data-test='footer-row-percentages'] td[data-test='cell'] {\n background-color: ${headerStyle.backgroundColor || headerStyle.color} !important;\n }\n `}\n\n tbody tr td[data-test='expand'] button {\n background-color: transparent !important;\n }\n\n /* To accomodate custom logic that diverges from default resizableFillLayout behavior - allows the columns to shrink beneath Table width when columns are fixed */\n [data-test='main-table'] {\n ${({ isFullyFixed }) =>\n isFullyFixed &&\n css`\n width: fit-content;\n min-width: unset;\n `}\n td {\n white-space: pre-wrap; // css override to render text with newline/ line-breaks and tabs/ spaces properly\n }\n }\n` as any;\nSUITableContainer.displayName = 'SUITableContainer';\n\nconst PaginatorContainer = styled.div`\n position: relative;\n text-align: right;\n height: ${PAGINATOR_CONTAINER_HEIGHT}px;\n`;\nPaginatorContainer.displayName = 'PaginatorContainer';\n\nconst ExpandedJsonTreeContainer = styled.div`\n & * {\n font-family: ${variables.monoFontFamily};\n }\n`;\nExpandedJsonTreeContainer.displayName = 'ExpandedJsonTreeContainer';\n\n// need to calculate background color ourselves to account for alternating row colors\n// SUI Table supports a stripeRows option but we are not using that\nconst ExpandableTableRow = styled(SUITable.Row)<ExpandedRowColors>`\n ${({ backgroundColor }) =>\n backgroundColor &&\n css`\n td[data-test='expand'] {\n background-color: ${backgroundColor} !important;\n }\n `}\n\n td[data-test='expand'] button {\n background-color: transparent !important;\n }\n`;\nExpandableTableRow.displayName = 'ExpandableTableRow';\n\nconst ExpandedContentRow = styled(SUITable.Row)<ExpandedRowColors>`\n ${({ backgroundColor, color }) =>\n (backgroundColor || color) &&\n css`\n td {\n ${backgroundColor ? `background-color: ${backgroundColor};` : ''}\n ${color ? `color: ${color};` : ''}\n }\n `}\n`;\nExpandedContentRow.displayName = 'ExpandedContentRow';\n\n// allow for early return in case of empty tableBody while still following hook rules\nconst withEmptyTableMessage = (Viz): React.FunctionComponent<PureTableProps> => {\n const Wrapper = (props: PureTableProps): React.ReactElement => {\n const {\n headers,\n columnIds,\n table,\n headerVisibility,\n showRowNumbers,\n showInternalFields,\n tableFormat,\n columnFormat,\n paginatorParams,\n count,\n headersMetadata,\n } = props;\n const { tableHeader, tableBody, tableFooter } = useTable({\n headers,\n columnIds,\n table,\n headerVisibility,\n showRowNumbers,\n showInternalFields,\n headersMetadata,\n showFooterTotals: (props as any).showFooterTotals,\n showFooterPercentages: (props as any).showFooterPercentages,\n tableFormat: {\n ...tableFormat,\n ...(tableFormat?.headerAlign && {\n headerAlign: cloneDeep(tableFormat.headerAlign),\n }),\n ...(tableFormat?.align && {\n align: cloneDeep(tableFormat.align),\n }),\n ...(tableFormat?.cellTypes && {\n cellTypes: cloneDeep(tableFormat.cellTypes),\n }),\n ...(tableFormat?.data && { data: cloneDeep(tableFormat.data) }),\n ...(tableFormat?.rowBackgroundColors && {\n rowBackgroundColors: cloneDeep(tableFormat.rowBackgroundColors),\n }),\n ...(tableFormat?.rowColors && {\n rowColors: cloneDeep(tableFormat.rowColors),\n }),\n },\n columnFormat,\n paginationOffset: paginatorParams?.current,\n count,\n });\n\n if (tableBody.rows.length === 0) {\n return <Message type=\"warning\">{_('No data!')}</Message>;\n }\n\n return <Viz {...props} tableHeader={tableHeader} tableBody={tableBody} tableFooter={tableFooter} />;\n };\n\n Wrapper.displayName = 'PureTableWrapper';\n return Wrapper;\n};\n\nconst useTableHead = (visibility: TableHeaderVisibility) => {\n if (visibility === 'none') {\n return NonVisibleTableHead;\n }\n\n if (visibility === 'fixed') {\n return FixedTableHead;\n }\n\n return SUITable.Head;\n};\n\nconst HeadCell = ({ value, textOverflowType, ...props }: any) => {\n const cellRef = React.useRef(null);\n return (\n <TableHeadCell elementRef={cellRef} textOverflowType={textOverflowType} {...props}>\n {value}\n </TableHeadCell>\n );\n};\n\nconst fontMap: Record<string, string> = {\n proportional: VIZ_FONT_FAMILY,\n monospace: 'Splunk Platform Mono',\n};\n\nconst fontSizeMap: Record<string, string> = {\n extraSmall: '10px',\n small: '12px',\n default: '14px',\n large: '16px',\n};\n\nconst rowHeightMap: Record<string, string> = {\n extraSmall: '12px',\n small: '12px',\n default: '20px',\n large: '24px',\n};\n\nexport const getUseMouseOverEffect = (props, header: string): boolean => {\n if (!props.hasEventHandlers || props.mode === 'edit') {\n return false;\n }\n const eventHandlers = props.eventHandlers || [];\n\n // No handlers configured - apply to all columns\n if (eventHandlers.length === 0) {\n return true;\n }\n\n // Return true if any handler applies to this column\n return eventHandlers.some(handler => {\n const handlerFields = handler.options?.fields;\n if (!handlerFields?.length) {\n return true;\n }\n return handlerFields.includes(header);\n });\n};\n\nconst PureTable = (props: PureTableProps): React.ReactElement => {\n const {\n count,\n width,\n height,\n backgroundColor,\n tableHeader,\n tableBody,\n tableFooter,\n showRowNumbers,\n showFooterTotals,\n showFooterPercentages,\n sortParams: { currentSortKey, currentSortDir, onSort },\n paginatorParams: { isPaging, onChange: paginatorOnChange, ...paginatorProps },\n onCellClick,\n onColumnFormatChange,\n columnFormat,\n mode,\n headerVisibility,\n font,\n fontSize,\n showColumnAsExpandedJson,\n } = props;\n const [columns, setColumns] = React.useState(columnFormat);\n const containerRef = React.useRef(null);\n const containerRefInner = React.useRef(null);\n // this state avoids unncessary column sorting when column resize ends\n const [isResizing, setResizing] = React.useState(false);\n\n const firstRenderCount = React.useRef(count);\n React.useEffect((): void => {\n if (firstRenderCount.current !== count) {\n firstRenderCount.current = count;\n paginatorOnChange(null, { count });\n }\n }, [count, paginatorOnChange, paginatorProps]);\n\n const stringifiedColumnFormat = JSON.stringify(columnFormat);\n const columnFormatRef = React.useRef(stringifiedColumnFormat);\n const modeRef = React.useRef(mode);\n React.useEffect((): void => {\n if (modeRef.current !== mode || columnFormatRef.current !== stringifiedColumnFormat) {\n columnFormatRef.current = stringifiedColumnFormat;\n modeRef.current = mode;\n setColumns(columnFormat);\n }\n }, [columnFormat, mode, stringifiedColumnFormat]);\n\n const expandedRowJson = React.useMemo(() => {\n const rowJsonValues = Array.isArray(showColumnAsExpandedJson)\n ? showColumnAsExpandedJson\n : [showColumnAsExpandedJson];\n return rowJsonValues.map(parseExpandedJson);\n }, [showColumnAsExpandedJson]);\n\n const hasExpandableRows = React.useMemo(\n () => expandedRowJson.some(rowJson => rowJson.isExpandable),\n [expandedRowJson]\n );\n\n const TableHead = useTableHead(headerVisibility);\n\n const debouncedDrilldown = React.useMemo(\n () =>\n debounce((e: MouseEvent | KeyboardEvent, payload: TableCellClickPayload): void => {\n if (window.getSelection().toString() === '' || e?.ctrlKey || e?.metaKey) {\n if (typeof onCellClick === 'function') {\n onCellClick({ e, payload });\n }\n }\n }, 200),\n [onCellClick]\n );\n\n const drilldownHandler = React.useCallback(\n (e: React.SyntheticEvent): void => {\n // SUI added an additional div for styling, so we need this to ensure drilldowns still work.\n // Otherwise it only works when you click the border around a cell.\n const element = (e.target as Element)?.closest('[data-row-index]');\n if (!element) {\n return;\n }\n const row = element.getAttribute('data-row-index');\n const col = element.getAttribute('data-col-index');\n const arrayIndex = element.getAttribute('data-array-index') || -1;\n if (row && col) {\n const cellRefIndex = +col;\n let cellIndex = cellRefIndex;\n const rowIndex = +row;\n const fieldValue = tableHeader.cells[cellRefIndex].value;\n const cellValue = tableBody.rows[rowIndex].cells[cellRefIndex].value;\n const cellRawValue = tableBody.rows[rowIndex].cells[cellRefIndex].value;\n\n const value = arrayIndex === -1 ? cellValue : cellRawValue[+arrayIndex];\n\n // Wish we did not have these if statements for\n // showRowNumbers\n if (showRowNumbers === true) {\n if (cellIndex === 0) {\n // no click event for row numbers\n return;\n }\n cellIndex -= 1;\n }\n\n const payload = {\n cellIndex,\n rowIndex,\n fieldValue,\n cellValue,\n cellRawValue,\n value,\n name: fieldValue,\n };\n\n tableBody.rows[rowIndex].cells.forEach((c: TableRowCell, index: number) => {\n const rowToken = `row.${tableHeader.cells[index].value}.value`;\n payload[rowToken] = c.value;\n });\n debouncedDrilldown(e.nativeEvent as MouseEvent | KeyboardEvent, payload);\n }\n },\n [tableHeader.cells, tableBody.rows, showRowNumbers, debouncedDrilldown]\n );\n\n const tableCellClickHandler = React.useCallback(\n e => {\n setResizing(false); // The resizing state will be set back to false on any cell click\n return onCellClick ? drilldownHandler(e) : noop;\n },\n [onCellClick, drilldownHandler]\n );\n\n const debouncedOnColumnFormatChange = React.useMemo(\n () =>\n debounce((newFormat: Partial<ColumnFormat>): void => {\n onColumnFormatChange(newFormat);\n }, 300),\n [onColumnFormatChange]\n );\n\n const handleEventHeadCellMouseDown = React.useCallback(e => {\n // Hack to target the resize handlers, since the only button within a HeadCell is the resize handlers\n if (e.target.tagName.toLowerCase() === 'hr') {\n e.stopPropagation();\n }\n }, []);\n\n const handleKeyDown = e => {\n if (e.keyCode !== 13) {\n return;\n }\n drilldownHandler(e);\n };\n const handleKeyUp = React.useCallback(\n e => {\n if (['ArrowLeft', 'ArrowRight'].includes(e.key)) {\n setResizing(false);\n }\n },\n [setResizing]\n );\n\n const handleResizeColumn = (_event, payload) => {\n setResizing(true);\n const updatedCF = { ...columns };\n const field = payload.columnId;\n updatedCF[field] = {\n ...updatedCF[field],\n width: Math.max(payload.width, MINIMUM_COLUMN_SIZE),\n };\n setColumns({ ...updatedCF });\n\n // Updates column json in edit mode\n if (mode === 'edit') {\n debouncedOnColumnFormatChange(updatedCF);\n }\n };\n\n const fontMapped = fontMap[font] || fontMap.proportional;\n const fontSizeMapped = fontSizeMap[fontSize] || fontSizeMap.default;\n const rowHeightMapped = rowHeightMap[fontSize] || rowHeightMap.default;\n const tableInnerStyle = { height: '100%' };\n const tableOuterStyle = { height: '100%' };\n const visibleHeaderCells = tableHeader.cells.filter(c => c.showCell);\n const numberOfFixedHeaders = visibleHeaderCells.filter(({ value }) => {\n return columns[value]?.width && columns[value]?.width !== 'auto';\n }).length;\n\n const isFullyFixed = visibleHeaderCells.length === numberOfFixedHeaders;\n const isHeaderHidden = headerVisibility === 'none';\n const onSortToUse = isResizing ? noop : onSort;\n\n const handlePaginationSkipLink = (event: React.MouseEvent): void => {\n event.preventDefault();\n moveFocusInto(containerRef.current, '[data-test=\"table-pagination\"]', event);\n };\n\n const handleTableSkipLink = (event: React.MouseEvent): void => {\n event.preventDefault();\n moveFocusOutside(containerRef.current, '[data-test=\"table-container\"]', event);\n };\n\n // Match footer cells to header cells so explicit widths can be applied during resize.\n const footerVisibleHeaderCells = tableHeader.cells.filter(c => c.showCell !== false);\n\n const renderFooterRow = (\n key: 'footer-totals' | 'footer-percentages',\n dataAttr: string\n ): React.ReactNode => {\n const rows = (tableFooter?.rows || []).filter(r => r && r.key === key);\n if (rows.length === 0) return null;\n return rows.map(row => (\n <SUITable.Row\n key={row.key}\n data-test={dataAttr}\n data-row-index={key === 'footer-totals' ? '0' : '1'}\n >\n {(row.cells || [])\n .filter((c: any) => c.showCell !== false)\n .map((c: any, idx: number) => {\n const headerCell = footerVisibleHeaderCells[idx];\n const explicitWidth = headerCell && columns[headerCell.value]?.width;\n const colWidth =\n explicitWidth && explicitWidth !== 'auto' ? explicitWidth : undefined;\n return (\n <SUITable.Cell\n key={`${key}-cell-${c.key || idx}`}\n data-test=\"cell\"\n style={{\n ...c.style,\n backgroundColor:\n tableHeader.style?.backgroundColor || tableHeader.style?.color,\n ...(colWidth !== undefined && { width: colWidth }),\n }}\n align={c.align || 'right'}\n >\n {c.value ?? ''}\n </SUITable.Cell>\n );\n })}\n </SUITable.Row>\n ));\n };\n return (\n <VizTableContainer backgroundColor={backgroundColor} ref={containerRef} data-test=\"table-container\">\n <div data-test=\"skip-links-container\">\n {isPaging ? (\n <StyledSkipLink\n data-test=\"skip-link-pagination\"\n to=\"#pagination\"\n onClick={handlePaginationSkipLink}\n >\n {_('Skip to table pagination')}\n </StyledSkipLink>\n ) : null}\n <StyledSkipLink data-test=\"skip-link-table\" to=\"#next\" onClick={handleTableSkipLink}>\n {_('Skip entire table')}\n </StyledSkipLink>\n </div>\n <SUITableContainer\n ref={containerRefInner}\n width={width}\n height={height}\n isPaging={isPaging}\n headerStyle={tableHeader.style}\n font={fontMapped}\n fontSize={fontSizeMapped}\n lineHeight={rowHeightMapped}\n isFullyFixed={isFullyFixed}\n >\n <SUITable\n resizableFillLayout\n headType={isHeaderHidden ? undefined : 'inline'}\n rowExpansion={hasExpandableRows ? 'multi' : 'none'}\n innerStyle={tableInnerStyle}\n outerStyle={tableOuterStyle}\n onClick={tableCellClickHandler}\n onKeyDown={onCellClick ? handleKeyDown : noop}\n onKeyUp={handleKeyUp}\n onRequestResizeColumn={handleResizeColumn}\n >\n <TableHead>\n {visibleHeaderCells.map(\n ({\n key,\n value,\n sortKey,\n style,\n align,\n textOverflowType,\n ...rest\n }): React.ReactElement => {\n return (\n <HeadCell\n {...{ sortKey, ...rest }}\n align={align}\n data-test-align-value={align}\n data-test-text-overflow-value={textOverflowType}\n key={key}\n columnId={value}\n sortDir={sortKey === currentSortKey ? currentSortDir : 'none'}\n width={columns[value]?.width ?? INITIAL_UNSET_COLUMN_WIDTH}\n onMouseDown={handleEventHeadCellMouseDown}\n value={value}\n onSort={\n (showRowNumbers && value === '#') || isHeaderHidden\n ? null\n : onSortToUse\n }\n resizable={!isHeaderHidden}\n style={\n showRowNumbers && value === '#'\n ? { ...style, cursor: 'auto' }\n : style\n }\n textOverflowType={textOverflowType}\n headerVisibility={headerVisibility}\n />\n );\n }\n )}\n </TableHead>\n <SUITable.Body>\n {tableBody.rows.map((row): React.ReactElement => {\n const expandedRowData = expandedRowJson[row.index];\n const expandedJson = expandedRowData?.json ?? null;\n const expandedRowColors = getExpandedRowColors(row);\n const expansionRow = expandedRowData?.isExpandable ? (\n <ExpandedContentRow\n key={`${row.key}-expanded`}\n data-test=\"expanded-json-row\"\n {...expandedRowColors}\n >\n <SUITable.Cell colSpan={visibleHeaderCells.length}>\n <ExpandedJsonTreeContainer>\n {expandedJson === null ? null : (\n <JSONTree\n json={expandedJson}\n defaultExpanded\n overflow=\"wrap\"\n />\n )}\n </ExpandedJsonTreeContainer>\n </SUITable.Cell>\n </ExpandedContentRow>\n ) : undefined;\n\n return (\n <ExpandableTableRow\n key={row.key}\n expansionRow={expansionRow}\n {...expandedRowColors}\n >\n {row.cells\n .filter(c => c.showCell)\n .map((cell): React.ReactElement => {\n return (\n <SwitchTableCell key={cell.key} type={cell.cellType}>\n <TextCell\n cell={cell}\n useMouseOverEffect={getUseMouseOverEffect(\n props,\n cell.header\n )}\n />\n <SparklineCell\n cell={cell}\n useMouseOverEffect={getUseMouseOverEffect(\n props,\n cell.header\n )}\n width={columns[cell.header]?.width ?? 'auto'}\n />\n <ArrayCell\n cell={cell}\n useMouseOverEffect={getUseMouseOverEffect(\n props,\n cell.header\n )}\n />\n </SwitchTableCell>\n );\n })}\n </ExpandableTableRow>\n );\n })}\n {tableFooter &&\n showFooterTotals &&\n renderFooterRow('footer-totals', 'footer-row-totals')}\n {tableFooter &&\n showFooterPercentages &&\n renderFooterRow('footer-percentages', 'footer-row-percentages')}\n </SUITable.Body>\n </SUITable>\n </SUITableContainer>\n {isPaging ? (\n <PaginatorContainer data-test=\"table-pagination\">\n {width < COMPACT_PAGINATOR_WIDTH_THRESHOLD ? (\n <Paginator.Compact\n current={paginatorProps.current}\n totalPages={paginatorProps.totalPages}\n renderLabel={false}\n onChange={(e, { direction }) => {\n const newPage =\n direction === 'next'\n ? paginatorProps.current + 1\n : paginatorProps.current - 1;\n paginatorOnChange(e as React.MouseEvent<HTMLButtonElement>, {\n page: newPage,\n });\n }}\n />\n ) : (\n <Paginator\n totalPages={paginatorProps.totalPages}\n onChange={paginatorOnChange}\n {...paginatorProps}\n />\n )}\n </PaginatorContainer>\n ) : null}\n </VizTableContainer>\n );\n};\n\nconst cellDataType = T.oneOfType([T.string, T.number, T.arrayOf(T.oneOfType([T.string, T.number]))]);\n\nPureTable.propTypes = {\n backgroundColor: T.string,\n count: T.number,\n columnFormat: T.objectOf(\n T.shape({\n align: T.oneOfType([T.arrayOf(T.oneOf(validColumnAlignments)), T.oneOf(validColumnAlignments)]),\n cellTypes: T.arrayOf(T.oneOf(validCellRenderers)),\n data: T.arrayOf(cellDataType),\n headerAlign: T.oneOf(validColumnAlignments),\n rowBackgroundColors: T.arrayOf(T.string),\n rowColors: T.arrayOf(T.string),\n sparklineAreaColors: T.arrayOf(T.string),\n sparklineColors: T.arrayOf(T.string),\n sparklineTypes: T.arrayOf(T.oneOf(validSparklineTypes)),\n })\n ),\n headers: T.arrayOf(T.string),\n headerVisibility: T.oneOf(validHeaderVisibilities),\n height: T.oneOfType([T.number]),\n mode: T.string,\n onCellClick: T.func,\n paginatorParams: PaginatorParamsPropTypes,\n showColumnAsExpandedJson: T.arrayOf(T.string),\n showRowNumbers: T.bool,\n showFooterTotals: T.bool,\n sortParams: SortParamsPropTypes,\n table: T.arrayOf(T.arrayOf(cellDataType)),\n tableFormat: T.shape({\n align: T.oneOfType([T.arrayOf(T.arrayOf(T.oneOf(validAlignments))), T.oneOf(validAlignments)]),\n cellTypes: T.arrayOf(T.arrayOf(T.oneOf(validCellRenderers))),\n data: T.arrayOf(T.arrayOf(cellDataType)),\n headerAlign: T.oneOf(validAlignments),\n headerBackgroundColor: T.string,\n headerColor: T.string,\n rowBackgroundColors: T.oneOfType([T.arrayOf(T.string), T.arrayOf(T.arrayOf(T.string))]),\n rowColors: T.oneOfType([T.arrayOf(T.string), T.arrayOf(T.arrayOf(T.string))]),\n sparklineAreaColors: T.arrayOf(T.arrayOf(T.string)),\n sparklineColors: T.arrayOf(T.arrayOf(T.string)),\n sparklineTypes: T.arrayOf(T.arrayOf(T.oneOf(validSparklineTypes))),\n }),\n theme: T.any,\n width: T.oneOfType([T.number]),\n onColumnFormatChange: T.func,\n font: T.string,\n fontSize: T.string,\n};\n\nPureTable.defaultProps = {\n columnFormat: {},\n headers: [],\n headerVisibility: 'inline' as const,\n height: 300,\n mode: 'view',\n onCellClick: null,\n paginatorParams: {\n isPaging: false,\n onChange: noop,\n },\n showColumnAsExpandedJson: [],\n showRowNumbers: false,\n showFooterTotals: false,\n showFooterPercentages: false,\n sortParams: {\n onSort: noop,\n },\n table: [],\n tableFormat: {},\n theme: {},\n width: 300,\n onColumnFormatChange: noop,\n font: fontMap.proportional,\n fontSize: fontSizeMap.default,\n};\nPureTable.displayName = 'VizTable';\n\nexport default withEmptyTableMessage(withFixedSizeContainer(PureTable)) as any;\n", "import { get } from 'lodash';\n\nimport { sanitizeArrayOfColors } from '@splunk/visualizations-shared/colorUtils';\nimport * as React from 'react';\nimport { createDOMID } from '@splunk/ui-utils/id';\nimport config from './config';\nimport { buildFooterDataFrames } from '../common/utils/tableUtils';\nimport withDashboardViz, { DashboardVizOpts } from '../common/withDashboardViz';\nimport PureTable from './PureTable';\nimport type { ColumnFormat } from './hooks';\n\nexport const computeVizProps = ({ ...props }): Record<string, unknown> => {\n const vizProps = { ...props };\n vizProps.columnIds = vizProps.dataSources?.primary?.data?.fields.map(field => field.name ?? field) ?? [];\n if (vizProps.columnIds.length === 0) {\n vizProps.columnIds = vizProps.headers;\n }\n vizProps.headersMetadata = vizProps.dataSources?.primary?.data?.fields;\n\n if (vizProps.columnFormat) {\n const columns: Partial<ColumnFormat> = vizProps.columnFormat;\n\n // `columns` looks like { `column title`: { rowBackgroundColors, rowColors... }}\n Object.entries(columns).forEach(([columnKey, columnProperties]) => {\n let rowBackgroundColors;\n let rowColors;\n\n // If columns have `rowBackgroundColors` or `rowColors` arrays defined, sanitize them.\n // Keep undefined values as-is so they can fall back to tableFormat colors in hooks.tsx\n // This allows matchValue without a fallback to properly inherit table-level row colors\n if (columnProperties.rowBackgroundColors) {\n rowBackgroundColors = sanitizeArrayOfColors(columnProperties.rowBackgroundColors);\n }\n if (columnProperties.rowColors) {\n rowColors = sanitizeArrayOfColors(columnProperties.rowColors);\n }\n\n vizProps.columnFormat[columnKey] = {\n ...vizProps.columnFormat[columnKey],\n ...(columnProperties.rowBackgroundColors && {\n rowBackgroundColors,\n }),\n ...(columnProperties.rowColors && { rowColors }),\n };\n });\n }\n\n if (vizProps.onOptionsChange) {\n const handleColumnFormatChange = updatedColumnFormat => {\n const cloneOfExistingColumnFormat = {\n ...(vizProps?.options?.columnFormat || {}),\n };\n const keys = Object.keys(updatedColumnFormat);\n const values = Object.values(updatedColumnFormat);\n keys.forEach((key: string, index: number) => {\n if (!cloneOfExistingColumnFormat[key]) {\n cloneOfExistingColumnFormat[key] = {};\n }\n const newWidth = get(values[index], 'width');\n cloneOfExistingColumnFormat[key] = {\n ...cloneOfExistingColumnFormat[key],\n width: newWidth,\n };\n });\n vizProps.onOptionsChange({\n columnFormat: cloneOfExistingColumnFormat,\n });\n };\n vizProps.onColumnFormatChange = handleColumnFormatChange;\n }\n\n return vizProps;\n};\n\n// HOC for injecting a 'footer' datasource alongside 'primary'\nconst withTableFooter = Viz => {\n const VizWithTableFooter = ({\n dataSources,\n options = {},\n ...otherProps\n }: {\n dataSources?: any;\n options?: Record<string, any>;\n }) => {\n // Stable key for the footer datasource \u2014 generated once on mount so it never\n // changes during column resize, preventing unnecessary footer re-renders.\n // DSL doesnt accept dashes in keys, so strip them from the generated ID.\n const footerKeyRef = React.useRef<string | null>(null);\n if (footerKeyRef.current === null) {\n let key = `footer${createDOMID().replaceAll('-', '')}`;\n while (dataSources?.[key]) {\n key = `footer${createDOMID().replaceAll('-', '')}`;\n }\n footerKeyRef.current = key;\n }\n const footerKey = footerKeyRef.current;\n\n const fieldsMeta = React.useMemo(\n () => (dataSources?.primary?.data?.fields || []) as unknown as Array<Record<string, unknown>>,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [JSON.stringify(dataSources?.primary?.data?.fields)]\n );\n\n // Memoize footer data so buildFooterDataFrames only reruns when fields change.\n const footerData = React.useMemo(() => buildFooterDataFrames(fieldsMeta), [fieldsMeta]);\n\n // Stable dataSources reference \u2014 only rebuilds when the actual data changes.\n const newDataSources = React.useMemo(() => {\n if (!dataSources?.primary?.data) return dataSources;\n return {\n ...dataSources,\n [footerKey]: { data: footerData.footer },\n };\n }, [dataSources, footerKey, footerData]);\n\n // Inject footer DSL per column only when footer rows are enabled.\n // Memoized so it doesn't rerun on every resize tick \u2014 only when options or fields change.\n const showFooterTotals = Boolean(options?.showFooterTotals);\n const showFooterPercentages = Boolean(options?.showFooterPercentages);\n const newOptions = React.useMemo(() => {\n if (!showFooterTotals && !showFooterPercentages) {\n return options;\n }\n const columnFormat = { ...(options?.columnFormat || {}) } as Record<string, any>;\n const fieldNames = (fieldsMeta || [])\n .map((f: any) => (f && (f.name || f)) as string)\n .filter(Boolean);\n fieldNames.forEach(fieldName => {\n if (!fieldName || fieldName === '#') return;\n const existingFooter = columnFormat?.[fieldName]?.footer;\n if (typeof existingFooter === 'undefined') {\n // Try to reuse column data's formatByType config if present\n const dataDsl = columnFormat?.[fieldName]?.data;\n let configToken: string | null = null;\n if (typeof dataDsl === 'string') {\n const m = /formatByType\\(([^)]+)\\)/.exec(dataDsl);\n configToken = m ? m[1] : null;\n }\n let footerDsl = `> ${footerKey} | seriesByName(\"${fieldName}\")`;\n if (configToken) footerDsl += ` | formatByType(${configToken})`;\n columnFormat[fieldName] = {\n ...(columnFormat[fieldName] || {}),\n footer: footerDsl,\n };\n } else if (typeof existingFooter === 'string') {\n // Replace any stale \"> footer<oldId>\" references with the current key\n const updatedFooterDsl = existingFooter.replaceAll(/>\\s*footer\\w*/g, `> ${footerKey}`);\n if (updatedFooterDsl !== existingFooter) {\n columnFormat[fieldName] = {\n ...(columnFormat[fieldName] || {}),\n footer: updatedFooterDsl,\n };\n }\n }\n });\n return { ...options, columnFormat };\n }, [options, fieldsMeta, showFooterTotals, showFooterPercentages, footerKey]);\n\n if (!dataSources?.primary?.data) {\n return <Viz dataSources={dataSources} options={options} {...otherProps} />;\n }\n\n return <Viz dataSources={newDataSources} options={newOptions} {...otherProps} />;\n };\n // Inherit config and defaultProps from wrapped component\n VizWithTableFooter.defaultProps = Viz.defaultProps;\n VizWithTableFooter.config = Viz.config;\n return VizWithTableFooter;\n};\n\nconst Table = withTableFooter(\n withDashboardViz({\n ReactViz: PureTable,\n vizConfig: config,\n disableEditModeCover: true,\n computeVizProps,\n } as DashboardVizOpts)\n);\nconst { themes } = config;\n\nexport { themes, PureTable, config };\nexport default Table;\n"],
5
+ "mappings": "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",
6
+ "names": ["Table_exports", "Table_default", "themes", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "config", "TableIcon", "TablePlaceholderIcon", "optionsSchema", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "keys", "defaultImport", "config", "themes", "defaultImport", "Opts", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "getFieldName", "min", "max", "_a", "getFieldName", "config", "range", "computeVizProps", "_a", "Opts", "defaultImport", "defaultImport", "defaultImport", "Message_exports", "Message_default", "defaultImport", "Message_exports", "Message_default", "defaultImport", "isArray", "defaultImport", "defaultImport", "noop", "defaultImport", "noop", "_a", "Message_default", "_a", "_b", "_c", "_a", "keys", "_b", "themes", "Table_default"]
7
7
  }