@splunk/visualizations 28.5.0 → 28.5.2

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["<define:global>", "esm-externals:@splunk/react-icons/ArrowsDoubleLeftRight.js", "esm-externals:@splunk/react-icons/ArrowsFourRightLeftUpDown.js", "esm-externals:@splunk/react-icons/ArrowsFourTowardUp.js", "esm-externals:@splunk/react-icons/Bell.js", "esm-externals:@splunk/react-icons/Bookshelf.js", "esm-externals:@splunk/react-icons/Buildings.js", "esm-externals:@splunk/react-icons/CellularGateway.js", "esm-externals:@splunk/react-icons/ChartColumnMagnifier.js", "esm-externals:@splunk/react-icons/ChartColumnSquare.js", "esm-externals:@splunk/react-icons/CheckCircle.js", "esm-externals:@splunk/react-icons/ChevronsSlash.js", "esm-externals:@splunk/react-icons/Cloud.js", "esm-externals:@splunk/react-icons/CogChevronsSlash.js", "esm-externals:@splunk/react-icons/Containership.js", "esm-externals:@splunk/react-icons/Cube.js", "esm-externals:@splunk/react-icons/Cylinder.js", "esm-externals:@splunk/react-icons/CylinderIndexTable.js", "esm-externals:@splunk/react-icons/CylinderMetrics.js", "esm-externals:@splunk/react-icons/CylinderMulti.js", "esm-externals:@splunk/react-icons/CylinderTrace.js", "esm-externals:@splunk/react-icons/CylinderWaves.js", "esm-externals:@splunk/react-icons/DeviceEdgeHub.js", "esm-externals:@splunk/react-icons/DeviceSignalWaves.js", "esm-externals:@splunk/react-icons/DotsThreeBalloon.js", "esm-externals:@splunk/react-icons/Drive.js", "esm-externals:@splunk/react-icons/DriveIndexTable.js", "esm-externals:@splunk/react-icons/DriveMagnifier.js", "esm-externals:@splunk/react-icons/DriveSliders.js", "esm-externals:@splunk/react-icons/Envelope.js", "esm-externals:@splunk/react-icons/EthernetPort.js", "esm-externals:@splunk/react-icons/ExclamationTriangle.js", "esm-externals:@splunk/react-icons/Factory.js", "esm-externals:@splunk/react-icons/File.js", "esm-externals:@splunk/react-icons/FileLogs.js", "esm-externals:@splunk/react-icons/Filter.js", "esm-externals:@splunk/react-icons/Folder.js", "esm-externals:@splunk/react-icons/ForwarderHeavy.js", "esm-externals:@splunk/react-icons/ForwarderUniversal.js", "esm-externals:@splunk/react-icons/Gate.js", "esm-externals:@splunk/react-icons/Globe.js", "esm-externals:@splunk/react-icons/IdentityCard.js", "esm-externals:@splunk/react-icons/InformationCircle.js", "esm-externals:@splunk/react-icons/InformationDiamond.js", "esm-externals:@splunk/react-icons/LaptopOpen.js", "esm-externals:@splunk/react-icons/Layout.js", "esm-externals:@splunk/react-icons/License.js", "esm-externals:@splunk/react-icons/MobilePhone.js", "esm-externals:@splunk/react-icons/Monitor.js", "esm-externals:@splunk/react-icons/MonitorPhone.js", "esm-externals:@splunk/react-icons/NetworkDevice.js", "esm-externals:@splunk/react-icons/NodeBranch.js", "esm-externals:@splunk/react-icons/NodeModel.js", "esm-externals:@splunk/react-icons/NodeTopology.js", "esm-externals:@splunk/react-icons/Picture.js", "esm-externals:@splunk/react-icons/Portrait.js", "esm-externals:@splunk/react-icons/PortraitsTwo.js", "esm-externals:@splunk/react-icons/Printer.js", "esm-externals:@splunk/react-icons/Processor.js", "esm-externals:@splunk/react-icons/ReportDouble.js", "esm-externals:@splunk/react-icons/SecurityCamera.js", "esm-externals:@splunk/react-icons/Servers.js", "esm-externals:@splunk/react-icons/ServersCloud.js", "esm-externals:@splunk/react-icons/ShoppingCart.js", "esm-externals:@splunk/react-icons/SignalWavesAngled.js", "esm-externals:@splunk/react-icons/SingleIndex.js", "esm-externals:@splunk/react-icons/SlidersTripleHorizontal.js", "esm-externals:@splunk/react-icons/SquaresAndCircles.js", "esm-externals:@splunk/react-icons/Star.js", "esm-externals:@splunk/react-icons/Store.js", "esm-externals:@splunk/react-icons/Telescope.js", "esm-externals:@splunk/react-icons/Token.js", "esm-externals:@splunk/react-icons/Truck.js", "esm-externals:@splunk/react-icons/WallBricks.js", "esm-externals:@splunk/react-icons/WiFiSignal.js", "src/NetworkGraph/index.ts", "src/NetworkGraph/NetworkGraph.tsx", "esm-externals:react", "esm-externals:@splunk/visualizations-shared/dataSourceUtils", "src/common/withDashboardViz.tsx", "esm-externals:lodash", "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:@splunk/ui-utils/id", "src/common/SplunkVisualization.tsx", "esm-externals:prop-types", "src/common/interfaces/VizActionHandler.ts", "src/common/interfaces/VizBehavior.ts", "src/common/hooks/useSorting.ts", "src/common/interfaces/DataSource.ts", "src/common/hooks/usePagination.ts", "src/common/hooks/useDeepMemo.ts", "src/common/components/MissingPropsMessage.tsx", "esm-externals:@splunk/ui-utils/i18n", "esm-externals:@splunk/visualizations-shared/Message", "esm-externals:@splunk/visualizations-shared/SizeAwareWrapper", "src/common/hocs/withEditModeCover.tsx", "src/common/utils/hocUtils.ts", "src/common/hocs/withPlaceholder.tsx", "esm-externals:@splunk/visualizations-shared/colorUtils", "esm-externals:@splunk/themes/variables", "src/common/components/IconPlaceholder.tsx", "src/common/hocs/FixedSizeContainer.tsx", "esm-externals:@splunk/visualizations-shared/style", "src/common/hooks/useDownsampleDataSources.tsx", "src/common/utils/dataUtils.ts", "esm-externals:@splunk/visualizations-shared/numberUtils", "src/common/interfaces/index.ts", "src/common/interfaces/DashboardVizProps.ts", "src/common/interfaces/DataContract.ts", "src/common/interfaces/DefaultContext.ts", "src/common/interfaces/Editor.ts", "src/common/interfaces/ExtendedDashViz.ts", "src/common/interfaces/Object.ts", "src/common/interfaces/Overview.ts", "src/common/interfaces/ThemedDefaults.ts", "src/common/interfaces/VizCategory.ts", "src/common/interfaces/VizConfig.ts", "src/common/interfaces/VizEvent.ts", "src/common/interfaces/VizProps.ts", "src/common/interfaces/VizRegistry.ts", "src/common/interfaces/VizSize.ts", "src/common/interfaces/VizStatus.ts", "src/common/hooks/usePrevious.ts", "src/common/hooks/useGetXAndYFields.tsx", "src/common/utils/featureFlagUtils.ts", "esm-externals:@splunk/visualization-context/FeatureFlags", "src/common/utils/trellisUtils.ts", "esm-externals:@splunk/visualizations-shared/trellisUtils", "src/common/TimeSeriesChartWrapper.tsx", "esm-externals:@splunk/visualization-canvas", "src/common/components/VizStyleWrapper.jsx", "src/common/chartingUtils.ts", "esm-externals:@splunk/react-icons/Triangle", "src/common/hooks/useTrellisEnabled.ts", "esm-externals:@splunk/visualization-schemas", "src/common/components/TrellisTitle.tsx", "src/NetworkGraph/PureNetworkGraph/PureNetworkGraph.tsx", "esm-externals:d3-transition", "esm-externals:d3-selection", "esm-externals:d3-zoom", "src/NetworkGraph/PureNetworkGraph/utils/networkGraphUtils.ts", "esm-externals:dagre", "esm-externals:@splunk/visualizations-shared/iconUtils", "esm-externals:@splunk/visualization-encoding/utils/colorUtils", "src/common/utils/textUtils.ts", "src/NetworkGraph/PureNetworkGraph/utils/forceLayout.ts", "esm-externals:d3-force", "esm-externals:d3-quadtree", "src/NetworkGraph/PureNetworkGraph/utils/networkGraphShared.ts", "src/NetworkGraph/PureNetworkGraph/utils/dragUtils.ts", "src/NetworkGraph/PureNetworkGraph/components/NetworkGraphSvg.tsx", "src/NetworkGraph/PureNetworkGraph/components/Node.tsx", "esm-externals:@splunk/themes", "esm-externals:@splunk/visualizations-shared/RemoteIcon", "src/NetworkGraph/PureNetworkGraph/utils/iconLoader.ts", "src/NetworkGraph/PureNetworkGraph/components/Link.tsx", "src/NetworkGraph/PureNetworkGraph/components/Tooltip.tsx", "esm-externals:@splunk/react-ui/Popover", "src/NetworkGraph/PureNetworkGraph/components/ZoomControls.tsx", "esm-externals:@splunk/react-icons/Plus", "esm-externals:@splunk/react-icons/Minus", "esm-externals:@splunk/react-icons/SquareAndCorners", "esm-externals:@splunk/react-ui/Button", "esm-externals:@splunk/react-ui/Tooltip", "src/NetworkGraph/config.ts", "esm-externals:@splunk/visualization-color-palettes/editors/PresetPalettes", "esm-externals:@splunk/visualization-icons", "esm-externals:@splunk/visualization-icons/placeholders", "src/common/utils/configUtils.ts", "esm-externals:@splunk/visualizations-shared/configUtils", "src/common/ThemedDefaults.tsx", "esm-externals:@splunk/themes/pick", "src/common/editorConfig/BackgroundColor.ts"],
4
- "sourcesContent": ["", "\nimport * as defaultImport from \"@splunk/react-icons/ArrowsDoubleLeftRight.js\";\nexport * from \"@splunk/react-icons/ArrowsDoubleLeftRight.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ArrowsFourRightLeftUpDown.js\";\nexport * from \"@splunk/react-icons/ArrowsFourRightLeftUpDown.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ArrowsFourTowardUp.js\";\nexport * from \"@splunk/react-icons/ArrowsFourTowardUp.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Bell.js\";\nexport * from \"@splunk/react-icons/Bell.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Bookshelf.js\";\nexport * from \"@splunk/react-icons/Bookshelf.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Buildings.js\";\nexport * from \"@splunk/react-icons/Buildings.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/CellularGateway.js\";\nexport * from \"@splunk/react-icons/CellularGateway.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ChartColumnMagnifier.js\";\nexport * from \"@splunk/react-icons/ChartColumnMagnifier.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ChartColumnSquare.js\";\nexport * from \"@splunk/react-icons/ChartColumnSquare.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/CheckCircle.js\";\nexport * from \"@splunk/react-icons/CheckCircle.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ChevronsSlash.js\";\nexport * from \"@splunk/react-icons/ChevronsSlash.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Cloud.js\";\nexport * from \"@splunk/react-icons/Cloud.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/CogChevronsSlash.js\";\nexport * from \"@splunk/react-icons/CogChevronsSlash.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Containership.js\";\nexport * from \"@splunk/react-icons/Containership.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Cube.js\";\nexport * from \"@splunk/react-icons/Cube.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Cylinder.js\";\nexport * from \"@splunk/react-icons/Cylinder.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/CylinderIndexTable.js\";\nexport * from \"@splunk/react-icons/CylinderIndexTable.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/CylinderMetrics.js\";\nexport * from \"@splunk/react-icons/CylinderMetrics.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/CylinderMulti.js\";\nexport * from \"@splunk/react-icons/CylinderMulti.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/CylinderTrace.js\";\nexport * from \"@splunk/react-icons/CylinderTrace.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/CylinderWaves.js\";\nexport * from \"@splunk/react-icons/CylinderWaves.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/DeviceEdgeHub.js\";\nexport * from \"@splunk/react-icons/DeviceEdgeHub.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/DeviceSignalWaves.js\";\nexport * from \"@splunk/react-icons/DeviceSignalWaves.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/DotsThreeBalloon.js\";\nexport * from \"@splunk/react-icons/DotsThreeBalloon.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Drive.js\";\nexport * from \"@splunk/react-icons/Drive.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/DriveIndexTable.js\";\nexport * from \"@splunk/react-icons/DriveIndexTable.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/DriveMagnifier.js\";\nexport * from \"@splunk/react-icons/DriveMagnifier.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/DriveSliders.js\";\nexport * from \"@splunk/react-icons/DriveSliders.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Envelope.js\";\nexport * from \"@splunk/react-icons/Envelope.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/EthernetPort.js\";\nexport * from \"@splunk/react-icons/EthernetPort.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ExclamationTriangle.js\";\nexport * from \"@splunk/react-icons/ExclamationTriangle.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Factory.js\";\nexport * from \"@splunk/react-icons/Factory.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/File.js\";\nexport * from \"@splunk/react-icons/File.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/FileLogs.js\";\nexport * from \"@splunk/react-icons/FileLogs.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Filter.js\";\nexport * from \"@splunk/react-icons/Filter.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Folder.js\";\nexport * from \"@splunk/react-icons/Folder.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ForwarderHeavy.js\";\nexport * from \"@splunk/react-icons/ForwarderHeavy.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ForwarderUniversal.js\";\nexport * from \"@splunk/react-icons/ForwarderUniversal.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Gate.js\";\nexport * from \"@splunk/react-icons/Gate.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Globe.js\";\nexport * from \"@splunk/react-icons/Globe.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/IdentityCard.js\";\nexport * from \"@splunk/react-icons/IdentityCard.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/InformationCircle.js\";\nexport * from \"@splunk/react-icons/InformationCircle.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/InformationDiamond.js\";\nexport * from \"@splunk/react-icons/InformationDiamond.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/LaptopOpen.js\";\nexport * from \"@splunk/react-icons/LaptopOpen.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Layout.js\";\nexport * from \"@splunk/react-icons/Layout.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/License.js\";\nexport * from \"@splunk/react-icons/License.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/MobilePhone.js\";\nexport * from \"@splunk/react-icons/MobilePhone.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Monitor.js\";\nexport * from \"@splunk/react-icons/Monitor.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/MonitorPhone.js\";\nexport * from \"@splunk/react-icons/MonitorPhone.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/NetworkDevice.js\";\nexport * from \"@splunk/react-icons/NetworkDevice.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/NodeBranch.js\";\nexport * from \"@splunk/react-icons/NodeBranch.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/NodeModel.js\";\nexport * from \"@splunk/react-icons/NodeModel.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/NodeTopology.js\";\nexport * from \"@splunk/react-icons/NodeTopology.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Picture.js\";\nexport * from \"@splunk/react-icons/Picture.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Portrait.js\";\nexport * from \"@splunk/react-icons/Portrait.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/PortraitsTwo.js\";\nexport * from \"@splunk/react-icons/PortraitsTwo.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Printer.js\";\nexport * from \"@splunk/react-icons/Printer.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Processor.js\";\nexport * from \"@splunk/react-icons/Processor.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ReportDouble.js\";\nexport * from \"@splunk/react-icons/ReportDouble.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/SecurityCamera.js\";\nexport * from \"@splunk/react-icons/SecurityCamera.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Servers.js\";\nexport * from \"@splunk/react-icons/Servers.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ServersCloud.js\";\nexport * from \"@splunk/react-icons/ServersCloud.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ShoppingCart.js\";\nexport * from \"@splunk/react-icons/ShoppingCart.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/SignalWavesAngled.js\";\nexport * from \"@splunk/react-icons/SignalWavesAngled.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/SingleIndex.js\";\nexport * from \"@splunk/react-icons/SingleIndex.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/SlidersTripleHorizontal.js\";\nexport * from \"@splunk/react-icons/SlidersTripleHorizontal.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/SquaresAndCircles.js\";\nexport * from \"@splunk/react-icons/SquaresAndCircles.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Star.js\";\nexport * from \"@splunk/react-icons/Star.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Store.js\";\nexport * from \"@splunk/react-icons/Store.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Telescope.js\";\nexport * from \"@splunk/react-icons/Telescope.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Token.js\";\nexport * from \"@splunk/react-icons/Token.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Truck.js\";\nexport * from \"@splunk/react-icons/Truck.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/WallBricks.js\";\nexport * from \"@splunk/react-icons/WallBricks.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/WiFiSignal.js\";\nexport * from \"@splunk/react-icons/WiFiSignal.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "export * from './NetworkGraph';\nexport { default } from './NetworkGraph';\n", "import * as React from 'react';\nimport { getDataSourceStateInfo } from '@splunk/visualizations-shared/dataSourceUtils';\nimport withDashboardViz, { DashboardVizOpts } from '../common/withDashboardViz';\nimport PureNetworkGraph from './PureNetworkGraph/PureNetworkGraph';\nimport config from './config';\nimport { DataSource } from '../common/interfaces/DataSource';\nimport { convertToArrOfObjects } from '../common/utils/dataUtils';\n\nexport const showPlaceHolderIcon = dataSources => {\n const columns = dataSources?.primary?.data?.columns;\n const noColumns = !(Array.isArray(columns) && columns.length);\n const dataSourceState = getDataSourceStateInfo(dataSources?.primary);\n return dataSourceState.hasError || dataSourceState.isLoading || dataSourceState.isMissing || noColumns;\n};\n\nexport const computeVizProps = ({ dataSources, onOptionsChange, themeFunc }): Record<string, unknown> => {\n const columns = dataSources?.primary?.data?.columns || [];\n const fields = dataSources?.primary?.data?.fields || [];\n const dataSourceData = dataSources?.primary?.data ?? {};\n const transformedData = convertToArrOfObjects(dataSourceData.columns, dataSourceData.fields);\n\n const themeColorVariables = [\n 'defaultBackgroundColor',\n 'defaultLinkColor',\n 'defaultNodeColor',\n 'defaultNodeIconColor',\n ];\n const themeColors: Record<string, unknown> = {};\n themeColorVariables.forEach(variable => {\n themeColors[variable] = themeFunc(variable);\n });\n\n return {\n fields: fields.map(field => (field?.name ? field.name : field)),\n columns,\n onOptionsChange,\n metadata: transformedData,\n ...themeColors,\n };\n};\n\nconst withTooltipFields = Viz => {\n const VizWithTooltipFields = ({ dataSources, options, ...otherProps }): JSX.Element => {\n if (!dataSources?.primary?.data) {\n return <Viz {...otherProps} options={options} />;\n }\n const updatedOptions = { ...options, tooltipHeaderFieldName: '> tooltipHeaderField | getField()' };\n return <Viz dataSources={dataSources} options={updatedOptions} {...otherProps} />;\n };\n\n VizWithTooltipFields.propTypes = Viz.propTypes;\n VizWithTooltipFields.defaultProps = Viz.defaultProps;\n VizWithTooltipFields.config = Viz.config;\n return VizWithTooltipFields;\n};\n\nconst NetworkGraph = withTooltipFields(\n withDashboardViz({\n ReactViz: PureNetworkGraph,\n vizConfig: config,\n computeVizProps,\n disableEditModeCover: true,\n useIconPlaceholder: (dataSources: { [name: string]: DataSource }) => showPlaceHolderIcon(dataSources),\n } as DashboardVizOpts)\n);\nconst { themes } = config;\nexport default NetworkGraph;\nexport { themes, config, PureNetworkGraph };\n", "\nimport * as defaultImport from \"react\";\nexport * from \"react\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/dataSourceUtils\";\nexport * from \"@splunk/visualizations-shared/dataSourceUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\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\";\nexport * from \"lodash\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\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 \"@splunk/ui-utils/id\";\nexport * from \"@splunk/ui-utils/id\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\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", "\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", "export enum VizBehavior {\n /**\n * Dynamic Options Behavior.\n * This allows visualization options to be powered by data\n *\n * **Example**\n *\n * sparklineValues: \">primary|seriesByIndex(0)\"\n * would configure sparklineValues with an array of data points\n * coming from the first series in the primary datasource\n *\n */\n DYNAMIC_OPTIONS = 'dynamic-options',\n EVENTS = 'events',\n DOWNSAMPLING = 'downsampling',\n /**\n * Placeholder behavior: visualization will display a placeholder rather than fail if any of the `requiredProps` is\n * missing.\n * @type {string}\n */\n PLACEHOLDER = 'placeholder',\n PAGE_AND_SORT = 'page-and-sort',\n TRELLIS = 'trellis',\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 { 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 { 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", "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", "\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/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 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", "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 { 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/colorUtils\";\nexport * from \"@splunk/visualizations-shared/colorUtils\";\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", "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 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", "\nimport * as defaultImport from \"@splunk/visualizations-shared/style\";\nexport * from \"@splunk/visualizations-shared/style\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\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", "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", "\nimport * as defaultImport from \"@splunk/visualizations-shared/numberUtils\";\nexport * from \"@splunk/visualizations-shared/numberUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "export * from './DashboardVizProps';\nexport * from './DataContract';\nexport * from './DataSource';\nexport * from './DefaultContext';\nexport * from './Editor';\nexport * from './ExtendedDashViz';\nexport * from './Object';\nexport * from './Overview';\nexport * from './ThemedDefaults';\nexport * from './VizActionHandler';\nexport * from './VizBehavior';\nexport * from './VizCategory';\nexport * from './VizConfig';\nexport * from './VizEvent';\nexport * from './VizProps';\nexport * from './VizRegistry';\nexport * from './VizSize';\nexport * from './VizStatus';\n", "import { DataSource } from './DataSource';\nimport { VizActionHandler } from './VizActionHandler';\nimport { KV } from './Object';\n\nexport interface DashboardVizProps {\n mode?: string;\n width: number | string;\n height: number | string;\n options?: KV;\n context?: KV;\n onOptionsChange?: (options: Record<string, unknown>) => void;\n dataSources: Record<string, DataSource>;\n onEventTrigger?: ({ type, payload, originalEvent }) => Record<string, unknown>;\n hasEventHandlers?: boolean;\n vizActionHandlerRef?: (actionHandler: VizActionHandler) => void;\n onComputedProps?: (...args: any) => void;\n loading?: boolean;\n theme?: Record<string, any>;\n onRequestParamsChange?: (dataSourceKey: string, payload) => void;\n}\n", "/**\n * A data structure used at runtime to wire up a visualization.\n */\n\ninterface InitialRequestParams {\n [key: string]: Record<string, unknown> | ((options?: Record<string, unknown>) => Record<string, unknown>);\n}\nexport interface DataContract {\n requiredDataSources: {\n name: string;\n description: string;\n }[];\n optionalDataSources?: {\n name: string;\n description: string;\n }[];\n initialRequestParams: InitialRequestParams;\n}\n", "interface Threshold {\n from?: number;\n to?: number;\n value: string | number;\n}\n\ninterface Gradient {\n stops?: number[];\n colors: string[];\n}\n\ninterface MatchValue {\n match: string;\n value: string;\n}\n\ntype Pick = string | number;\n\ninterface SetColorChannel {\n channel: string;\n value: string | number;\n}\n\ninterface MaxContrast {\n colors: string[];\n default?: string;\n}\n/**\n * represents the default context if any. Currently, the default context is range formatting\n */\nexport interface DefaultContext {\n [key: string]: Threshold[] | MatchValue[] | Gradient | Pick[] | SetColorChannel | MaxContrast | string;\n}\n", "/**\n * Provides the two dimensional layout in terms of rows of editable dimensions\n */\nexport interface EditorConfig {\n label: string;\n layout: EditorLayoutConfig[][];\n open?: boolean;\n}\n\n/**\n * Provides the info needed at runtime for an editor to make an option\n * configurable via an editor\n */\ninterface EditorLayoutObj {\n label?: string;\n key?: string; // for preset selector updates\n option?: string; // optional since preset selector does not have a 1-1 mapping when persisting options\n context?: string;\n editor: string;\n editorProps?: Record<string, unknown>;\n}\n\nexport type EditorLayoutConfig = EditorLayoutObj | Record<string, unknown>;\n", "import { DashboardVizProps } from './DashboardVizProps';\nimport { VizConfig } from './VizConfig';\n\nexport interface ExtendedDashViz extends React.FunctionComponent<DashboardVizProps> {\n config?: VizConfig;\n propTypes: any;\n}\n", "export interface KV {\n [key: string]: any;\n}\n", "export interface Variation {\n title: string;\n description: string;\n key: string;\n hideSandbox?: boolean;\n}\n\nexport interface Overview {\n type?: string;\n typeOfViz: string;\n overview: string;\n note?: string;\n tips: string[];\n variations: Variation[];\n}\n", "import { KV } from './Object';\n\nexport interface ThemedDefaults {\n [theme: string]: KV;\n}\n", "export enum VizCategory {\n SINGLE_VALUE = 'Single Value',\n TRENDS = 'Trends',\n COMPARISONS = 'Comparisons',\n TABLE = 'Table',\n TIMELINE = 'Timeline',\n GAUGE = 'Gauge',\n DISTRIBUTIONS = 'Distributions',\n CHOROPLETH = 'Choropleth Maps',\n SHAPES = 'Shapes',\n MISC = 'misc',\n FLOW = 'Flow',\n CORRELATION = 'Correlation',\n SPATIAL = 'Spatial',\n}\n", "import type { OptionsSchema } from '@splunk/visualization-schemas';\nimport type React from 'react';\nimport { DataContract } from './DataContract';\nimport { VizSize } from './VizSize';\nimport { DefaultContext } from './DefaultContext';\nimport { EditorConfig } from './Editor';\nimport { VizEvent } from './VizEvent';\nimport { VizBehavior } from './VizBehavior';\nimport { VizStatus } from './VizStatus';\nimport { VizCategory } from './VizCategory';\n/**\n * A static descriptor for a visualization\n */\nexport interface VizConfig {\n key: string;\n name: string;\n category: VizCategory;\n /**\n * Reflects whether the visualization is new (with the 'preview' value). This property allows us to\n * surface a message about the visualization in the visualization docs.\n */\n status?: VizStatus;\n icon?: React.ComponentType;\n placeholderIcon?: React.ComponentType;\n dataContract: DataContract;\n size: VizSize;\n defaultContext?: DefaultContext;\n optionsSchema: OptionsSchema;\n editorConfig: EditorConfig[];\n events?: VizEvent;\n supports: VizBehavior[];\n themes: any;\n // a list if properties that must be defined in order for the viz placeholder to be replaced with the actual viz.\n // The presence of the required properties is checked *after* DSL evaluation\n requiredProps?: string[];\n}\n", "export interface VizEvent {\n [key: string]: {\n description: string;\n payloadKeys?: string[];\n /**\n * Array of keys used to create nested parent object for event\n *\n * Example: [ 'a', 'b' ] -> { a: { b: event } }\n */\n parentKeys?: string[];\n };\n}\n", "import { VizActionHandler } from './VizActionHandler';\n\nexport interface VizProps {\n mode: string;\n width: number | string;\n height: number | string;\n vizActionHandlerRef?: (actionHandler: VizActionHandler) => void;\n}\n", "import { VizConfig } from './VizConfig';\n\nexport interface VizRegistry {\n visualizations: { [key: string]: VizConfig };\n}\n", "/**\n * represents the initial size, max and min size for visualizations,\n */\nexport interface VizSize {\n initialWidth: number;\n initialHeight: number;\n}\n", "export type VizStatus = 'preview';\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 * 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/visualization-context/FeatureFlags\";\nexport * from \"@splunk/visualization-context/FeatureFlags\";\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/visualizations-shared/trellisUtils\";\nexport * from \"@splunk/visualizations-shared/trellisUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\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", "\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", "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", "\nimport * as defaultImport from \"@splunk/react-icons/Triangle\";\nexport * from \"@splunk/react-icons/Triangle\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\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", "\nimport * as defaultImport from \"@splunk/visualization-schemas\";\nexport * from \"@splunk/visualization-schemas\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\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 React, { useState, useEffect, useMemo, useRef, ReactElement, useCallback } from 'react';\nimport styled from 'styled-components';\nimport 'd3-transition';\nimport { select } from 'd3-selection';\nimport { zoom, zoomIdentity, zoomTransform, ZoomBehavior } from 'd3-zoom';\nimport { toDimension } from '@splunk/visualizations-shared/style';\nimport { noop, pick } from 'lodash';\n\nimport {\n getUniqueNodesVisual,\n getUniqueLinks,\n getNodeMapWithPositions,\n getAutoZoomAndPan,\n updatePositions,\n LinkStyleType,\n ShowDirectionType,\n LayoutType,\n PreferPortsType,\n LayoutDirectionType,\n nearlyEqual,\n LayoutOptionsType,\n unsanitizeSvgId,\n createDynamicPayload,\n calculateMinZoomBounds,\n getZoomDisableState,\n MAX_ZOOM,\n getDefaultPreferPorts,\n} from './utils/networkGraphUtils';\nimport {\n getPointerInGraphSpaceFromMouseEvent,\n getInitialDragOffset,\n getDraggedNodePositionWithOffset,\n updateDraggedNodePosition,\n patchNodeMapWithDragPositionChanges,\n patchDragPositionsMap,\n DragStateType,\n PositionType,\n ZoomAndPanStateType,\n} from './utils/dragUtils';\nimport {\n DEFAULT_CHARGE_STRENGTH,\n DEFAULT_COLLIDE_PADDING,\n DEFAULT_LINK_DISTANCE,\n DEFAULT_COLLIDE_STRENGTH,\n DEFAULT_DISTANCE_MAX,\n DEFAULT_CHARGE_THETA,\n DEFAULT_DISTANCE_MIN,\n DEFAULT_CLUSTER_STRENGTH,\n} from './utils/forceLayout';\nimport {\n DEFAULT_CHART_HEIGHT,\n DEFAULT_CHART_WIDTH,\n DEFAULT_NODE_RADIUS,\n DEFAULT_LINK_WIDTH,\n IconType,\n NodeMetadataType,\n NodeClickEvent,\n NodeMouseOverEvent,\n NodeMouseOutEvent,\n NodeDragEvent,\n NodeMapStructuralType,\n} from './utils/networkGraphShared';\nimport NetworkGraphSvg from './components/NetworkGraphSvg';\nimport ZoomControls from './components/ZoomControls';\nimport { useDeepMemo } from '../../common/hooks/useDeepMemo';\n\nexport interface PureNetworkGraphProps {\n width?: number | string;\n height?: number | string;\n source?: string[];\n target?: (string | null)[];\n nodeIds?: string[];\n nodeTypes?: string[];\n nodeValues?: number[];\n nodeTexts?: string[];\n nodeSize?: number[] | number;\n nodeColors?: string[] | string;\n nodeIconColors?: string[] | string;\n nodeIcons?: IconType[];\n layout?: LayoutType;\n nodeHorizontalPadding?: number;\n nodeVerticalPadding?: number;\n hierarchyDirection?: LayoutDirectionType;\n xPositions?: number[];\n yPositions?: number[];\n gridColumns?: number;\n chargeStrength?: number;\n chargeTheta?: number;\n chargeDistanceMin?: number;\n chargeDistanceMax?: number;\n linkDistance?: number;\n linkStrength?: number;\n collidePadding?: number;\n collideStrength?: number;\n clusterStrength?: number;\n backgroundColor?: string;\n linkStyle?: LinkStyleType;\n linkColors?: string[] | string;\n linkWidth?: number[] | number;\n showDirection?: ShowDirectionType;\n preferPorts?: PreferPortsType;\n showZoomControls?: boolean;\n nodeDragPositions?: { [key: string]: { x: number; y: number } };\n metadata?: NodeMetadataType[];\n resultLimit?: number;\n tooltipNodeFields?: string[];\n tooltipHeaderFieldName?: string;\n onOptionsChange?: (options: Record<string, unknown>) => void;\n onNodeClick?: (event: NodeClickEvent) => void;\n onNodeMouseOver?: (event: NodeMouseOverEvent) => void;\n onNodeMouseOut?: (event: NodeMouseOutEvent) => void;\n onNodeDrag?: (event: NodeDragEvent) => void;\n}\n\nconst StyledWrapper = styled.div<{\n backgroundColor?: string;\n width?: number | string;\n height?: number | string;\n}>`\n ${props => toDimension(pick(props, ['width', 'height']))};\n background-color: ${props => props.backgroundColor};\n position: relative;\n overflow: hidden;\n`;\n\n// memoize default values to prevent unnecessary recalculations\nconst EMPTY_ARRAY = [];\nconst EMPTY_OBJECT = {};\n\n// helper to forward mouse events from d3-zoom to udf for viz selection.\n// This is needed because d3-zoom stops propagation of mouse events.\nexport const forwardMouseDownEvent = (\n event: MouseEvent | null | undefined,\n container: HTMLElement | null | undefined\n) => {\n if (event?.type !== 'mousedown') return;\n\n const forwarded = new MouseEvent('mousedown', event);\n container?.dispatchEvent(forwarded);\n};\n\nconst PureNetworkGraph = ({\n width = DEFAULT_CHART_WIDTH,\n height = DEFAULT_CHART_HEIGHT,\n source = EMPTY_ARRAY,\n target = EMPTY_ARRAY,\n nodeIds = EMPTY_ARRAY,\n nodeTypes = EMPTY_ARRAY,\n nodeValues = EMPTY_ARRAY,\n nodeTexts = EMPTY_ARRAY,\n nodeSize = DEFAULT_NODE_RADIUS * 2,\n nodeColors = EMPTY_ARRAY,\n nodeIconColors = EMPTY_ARRAY,\n nodeIcons = EMPTY_ARRAY,\n layout = 'grid',\n nodeHorizontalPadding = 0,\n nodeVerticalPadding = 0,\n hierarchyDirection = 'leftRight',\n xPositions = EMPTY_ARRAY,\n yPositions = EMPTY_ARRAY,\n chargeStrength = DEFAULT_CHARGE_STRENGTH,\n chargeTheta = DEFAULT_CHARGE_THETA,\n chargeDistanceMin = DEFAULT_DISTANCE_MIN,\n chargeDistanceMax = DEFAULT_DISTANCE_MAX,\n linkDistance = DEFAULT_LINK_DISTANCE,\n linkStrength = undefined,\n collidePadding = DEFAULT_COLLIDE_PADDING,\n collideStrength = DEFAULT_COLLIDE_STRENGTH,\n clusterStrength = DEFAULT_CLUSTER_STRENGTH,\n gridColumns = undefined,\n backgroundColor = null,\n linkStyle = 'straight',\n linkColors = EMPTY_ARRAY,\n linkWidth = DEFAULT_LINK_WIDTH,\n showDirection = 'bidirection',\n preferPorts,\n showZoomControls = true,\n nodeDragPositions = EMPTY_OBJECT,\n metadata = EMPTY_ARRAY,\n resultLimit = 1000,\n tooltipNodeFields = EMPTY_ARRAY,\n tooltipHeaderFieldName = '',\n onOptionsChange = noop,\n onNodeClick = noop,\n onNodeMouseOver = noop,\n onNodeMouseOut = noop,\n onNodeDrag = noop,\n}: PureNetworkGraphProps): ReactElement => {\n // used by d3-zoom\n const svgRef = useRef<SVGSVGElement>();\n const zoomContainerRef = useRef<SVGGElement>();\n // toDimension does not handle negative numbers correctly\n const cssWidth = typeof width === 'number' && width < 0 ? '0px' : width;\n const cssHeight = typeof height === 'number' && height < 0 ? '0px' : height;\n // used to get actual container dimensions for responsive sizing (vh used by full screen mode in dashboard)\n const containerRef = useRef<HTMLDivElement>(null);\n const prevLayoutRef = useRef(layout);\n const [containerSize, setContainerSize] = useState({\n width: typeof width === 'number' ? width : DEFAULT_CHART_WIDTH,\n height: typeof height === 'number' ? height : DEFAULT_CHART_HEIGHT,\n });\n const [isDragging, setIsDragging] = useState<DragStateType>({ dragStarted: false, id: null });\n const [parentZoomAndPanState, setParentZoomAndPanState] = useState<ZoomAndPanStateType>({\n zoom: null,\n x: null,\n y: null,\n });\n // Snapshot of node positions at drag start, used to keep auto-zoom inputs stable while dragging.\n const frozenNodeMapForZoomRef = useRef<NodeMapStructuralType | null>(null);\n // Stores pointer-to-node delta captured on drag start so dragging does not snap node center to cursor.\n const dragOffsetRef = useRef<PositionType | null>(null);\n // Caches the latest base layout output to detect when layout changed vs only drag overrides changed.\n const baseNodeMapRef = useRef<NodeMapStructuralType | null>(null);\n // Tracks previous drag override prop so we can diff and patch only changed nodes.\n const previousNodeDragPositionsRef = useRef(nodeDragPositions);\n // Accumulates committed drag overrides across interactions before emitting via onOptionsChange.\n const persistedDragPositionsRef = useRef<Record<string, { x: number; y: number }>>({\n ...nodeDragPositions,\n });\n\n const effectivePreferPorts = preferPorts ?? getDefaultPreferPorts(layout, hierarchyDirection);\n\n useEffect(() => {\n const updateSize = () => {\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n setContainerSize({\n width: rect.width,\n height: rect.height,\n });\n }\n };\n\n // Initial size calculation\n updateSize();\n\n // Update on window resize (for vh units)\n window.addEventListener('resize', updateSize);\n return () => window.removeEventListener('resize', updateSize);\n }, []);\n\n const linkMap = useMemo(() => {\n return getUniqueLinks(source, target, linkColors, linkWidth, resultLimit);\n }, [source, target, linkColors, linkWidth, resultLimit]);\n\n // split nodeMap into visual and structural parts to avoid rerunning layout algorithm on style changes\n const nodeMapVisual = useMemo(() => {\n return getUniqueNodesVisual({\n nodeIds,\n nodeColors,\n iconColors: nodeIconColors,\n icons: nodeIcons,\n nodeValues,\n resultLimit,\n tooltipHeaderField: tooltipHeaderFieldName,\n tooltipNodeFields,\n metadata,\n });\n }, [\n nodeIds,\n nodeColors,\n nodeIconColors,\n nodeIcons,\n nodeValues,\n resultLimit,\n metadata,\n tooltipNodeFields,\n tooltipHeaderFieldName,\n ]);\n\n // deep memo is needed to avoid rerunning layout algorithms when related options have not changed\n // note this works in storybooks without deep memo but fails in ESM tester\n const nodeMapStructWithPositions = useDeepMemo(() => {\n const layoutOptions: LayoutOptionsType = {\n nodeHorizontalPadding,\n nodeVerticalPadding,\n hierarchyDirection,\n xPositions,\n yPositions,\n gridColumns,\n chargeStrength,\n chargeTheta,\n chargeDistanceMin,\n chargeDistanceMax,\n linkDistance,\n linkStrength,\n collidePadding,\n collideStrength,\n clusterStrength,\n };\n\n return getNodeMapWithPositions({\n source,\n target,\n nodeIds,\n nodeTexts,\n nodeTypes,\n nodeSize,\n layout,\n layoutOptions,\n resultLimit,\n });\n }, [\n layout,\n source,\n nodeHorizontalPadding,\n nodeVerticalPadding,\n hierarchyDirection,\n xPositions,\n yPositions,\n gridColumns,\n chargeStrength,\n chargeTheta,\n chargeDistanceMin,\n chargeDistanceMax,\n linkDistance,\n linkStrength,\n collidePadding,\n collideStrength,\n clusterStrength,\n target,\n nodeIds,\n nodeSize,\n nodeTexts,\n nodeTypes,\n resultLimit,\n ]);\n\n // provide a nodeMap state so we can use it to update positions when dragging nodes\n const [nodeMapStruct, setNodeMapStruct] = useState(() =>\n updatePositions(nodeMapStructWithPositions, nodeDragPositions)\n );\n const [hideReset, setHideReset] = useState(true);\n // need this flag to avoid rendering nodes and links before initial auto zoom and pan is applied\n const [isReadyToRender, setIsReadyToRender] = useState(false);\n // state for highlighting nodes and neightbors\n const [highlightedNode, setHighlightedNode] = useState(null);\n\n // Use calculated container size when size is a string like 100vh\n const numberWidth = typeof width === 'string' ? containerSize.width : width;\n const numberHeight = typeof height === 'string' ? containerSize.height : height;\n const effectiveWidth = Math.max(numberWidth, 0);\n const effectiveHeight = Math.max(numberHeight, 0);\n\n // Freeze auto-zoom inputs while dragging so bounds/zoom math does not churn on every pointer move.\n const nodeMapForAutoZoom =\n isDragging.dragStarted && frozenNodeMapForZoomRef.current\n ? frozenNodeMapForZoomRef.current\n : nodeMapStruct;\n\n const { autoZoomLevel, autoCenter } = useMemo(() => {\n return getAutoZoomAndPan(nodeMapForAutoZoom, effectiveWidth, effectiveHeight);\n }, [nodeMapForAutoZoom, effectiveWidth, effectiveHeight]);\n\n const { minZoomLevel, minZoomWidth, minZoomHeight } = useMemo(() => {\n return calculateMinZoomBounds(autoZoomLevel, effectiveHeight, effectiveWidth);\n }, [autoZoomLevel, effectiveHeight, effectiveWidth]);\n\n const initialTransform = useMemo(\n () =>\n zoomIdentity\n // move viewport center to origin\n .translate(effectiveWidth / 2, effectiveHeight / 2)\n // scale around that point\n .scale(autoZoomLevel)\n // move data center into that origin\n .translate(-autoCenter[0], -autoCenter[1]),\n [autoCenter, autoZoomLevel, effectiveWidth, effectiveHeight]\n );\n\n const { disableZoomIn, disableZoomOut } = useMemo(\n () => getZoomDisableState(parentZoomAndPanState.zoom, autoZoomLevel, minZoomLevel),\n [parentZoomAndPanState.zoom, autoZoomLevel, minZoomLevel]\n );\n\n useEffect(() => {\n const baseNodeMap = baseNodeMapRef.current;\n if (!baseNodeMap) {\n // Initial state already applies layout + drag overrides, so skip a redundant mount update.\n baseNodeMapRef.current = nodeMapStructWithPositions;\n previousNodeDragPositionsRef.current = nodeDragPositions;\n return;\n }\n\n const baseLayoutChanged = baseNodeMap !== nodeMapStructWithPositions;\n baseNodeMapRef.current = nodeMapStructWithPositions;\n\n if (baseLayoutChanged) {\n setNodeMapStruct(updatePositions(nodeMapStructWithPositions, nodeDragPositions));\n } else {\n // Only patch nodes whose drag position changed instead of rebuilding the full node map.\n setNodeMapStruct(previousNodeMap =>\n patchNodeMapWithDragPositionChanges(\n previousNodeMap,\n baseNodeMap,\n previousNodeDragPositionsRef.current,\n nodeDragPositions\n )\n );\n }\n\n const nextPersistedDragPositions = patchDragPositionsMap(\n persistedDragPositionsRef.current,\n previousNodeDragPositionsRef.current,\n nodeDragPositions\n );\n persistedDragPositionsRef.current = nextPersistedDragPositions;\n previousNodeDragPositionsRef.current = nodeDragPositions;\n }, [nodeDragPositions, nodeMapStructWithPositions]);\n\n // zoom function used by d3-zoom, datum type is unknown because we are not using d3 data binding\n const zoomFunc: ZoomBehavior<SVGSVGElement, unknown> = useMemo(\n () =>\n zoom<SVGSVGElement, unknown>()\n .on('zoom', event => {\n if (zoomContainerRef.current) {\n select(zoomContainerRef.current).attr('transform', event.transform);\n }\n setParentZoomAndPanState({\n zoom: event.transform.k,\n x: event.transform.x,\n y: event.transform.y,\n });\n })\n // d3-zoom will stop propagation of mousedown events, so we need to forward it to udf for viz selection.\n .on('start', event => {\n const src = event.sourceEvent;\n forwardMouseDownEvent(src, containerRef.current);\n }),\n []\n );\n\n useEffect(() => {\n // if value is null we are using the initial transform so hide reset button\n const shouldHideReset =\n (!parentZoomAndPanState.zoom ||\n nearlyEqual(parentZoomAndPanState.zoom, initialTransform.k, 0.01, true)) &&\n (!parentZoomAndPanState.x || nearlyEqual(parentZoomAndPanState.x, initialTransform.x)) &&\n (!parentZoomAndPanState.y || nearlyEqual(parentZoomAndPanState.y, initialTransform.y));\n setHideReset(shouldHideReset);\n }, [parentZoomAndPanState, initialTransform]);\n\n // attach zoom function\n useEffect(() => {\n // reset any existing zoom handlers before applying new ones\n if (select(svgRef.current).on) select(svgRef.current).on('.zoom', null);\n\n // apply zoom bounds\n const minTopLeft = [autoCenter[0] - minZoomWidth / 2, autoCenter[1] - minZoomHeight / 2];\n const minBottomRight = [minTopLeft[0] + minZoomWidth, minTopLeft[1] + minZoomHeight];\n zoomFunc\n .scaleExtent([minZoomLevel, MAX_ZOOM])\n .translateExtent([minTopLeft as [number, number], minBottomRight as [number, number]]);\n\n select(svgRef.current).call(zoomFunc);\n\n // set initial zoom and pan state\n if (\n parentZoomAndPanState.zoom === null ||\n parentZoomAndPanState.x === null ||\n parentZoomAndPanState.y === null\n ) {\n select(svgRef.current).call(zoomFunc.transform, initialTransform);\n }\n\n // tell networkGraphSVG that it can now render nodes and links\n setIsReadyToRender(true);\n }, [\n zoomFunc,\n autoZoomLevel,\n parentZoomAndPanState.zoom,\n parentZoomAndPanState.x,\n parentZoomAndPanState.y,\n minZoomLevel,\n minZoomWidth,\n minZoomHeight,\n initialTransform,\n autoCenter,\n ]);\n\n // clear the custom dragged positions when layout changes\n useEffect(() => {\n if (prevLayoutRef.current !== layout) {\n persistedDragPositionsRef.current = {};\n onOptionsChange({\n nodeDragPositions: {},\n });\n }\n prevLayoutRef.current = layout;\n }, [layout, onOptionsChange]);\n\n const handleZoomIn = useCallback(() => {\n select(svgRef.current)\n .transition()\n .call(zoomFunc.scaleTo, zoomTransform(svgRef.current).k * 1.5);\n }, [zoomFunc]);\n\n const handleZoomOut = useCallback(() => {\n select(svgRef.current)\n .transition()\n .call(zoomFunc.scaleTo, zoomTransform(svgRef.current).k / 1.5);\n }, [zoomFunc]);\n\n const handleReset = useCallback(() => {\n select(svgRef.current).transition().call(zoomFunc.transform, initialTransform);\n }, [initialTransform, zoomFunc.transform]);\n\n const handlePan = useCallback(\n (dx: number, dy: number) => {\n select(svgRef.current)\n .transition()\n .call(\n zoomFunc.translateBy,\n // divide by scale to get consistent panning distance regardless of zoom level\n dx / zoomTransform(svgRef.current).k,\n dy / zoomTransform(svgRef.current).k\n );\n },\n [zoomFunc]\n );\n\n // add keyboard shortcuts for zoom and pan\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n switch (e.key) {\n case '+':\n case '=': // '=' is the same key as '+' without shift\n handleZoomIn();\n break;\n case '-':\n handleZoomOut();\n break;\n case 'ArrowLeft':\n handlePan(100, 0);\n break;\n case 'ArrowRight':\n handlePan(-100, 0);\n break;\n case 'ArrowUp':\n handlePan(0, 100);\n break;\n case 'ArrowDown':\n handlePan(0, -100);\n break;\n default:\n return;\n }\n\n e.preventDefault();\n },\n [handlePan, handleZoomIn, handleZoomOut]\n );\n\n const handleMouseDown = useCallback(\n // mousedown uses event from d3 which is typed to any\n (e: any) => {\n const unSanitizedId = unsanitizeSvgId(e.currentTarget.id);\n // Freeze current positions so auto-zoom math stays stable during drag.\n frozenNodeMapForZoomRef.current = nodeMapStruct;\n // Reset offset at drag start; it will be derived from this pointer down event.\n dragOffsetRef.current = null;\n const draggedNode = nodeMapStruct[unSanitizedId];\n if (draggedNode) {\n const pointerInGraphSpace = getPointerInGraphSpaceFromMouseEvent(\n e,\n svgRef.current,\n parentZoomAndPanState\n );\n dragOffsetRef.current = getInitialDragOffset(pointerInGraphSpace, {\n x: draggedNode.x,\n y: draggedNode.y,\n });\n }\n // this gets rid of the focus ring lag\n if (e?.preventDefault) {\n e.preventDefault();\n }\n setIsDragging({ dragStarted: true, id: unSanitizedId });\n\n // we currently stop the propagation of mousedown events to prevent panning during a node drag\n // but we need to forward it to udf for viz selection.\n forwardMouseDownEvent(e, containerRef.current);\n },\n [nodeMapStruct, parentZoomAndPanState, setIsDragging]\n );\n\n const handleMouseUp = useCallback(() => {\n // reset offset since drag is over\n dragOffsetRef.current = null;\n // reset frozen node map so auto-zoom can consider updated positions after drag\n frozenNodeMapForZoomRef.current = null;\n\n if (isDragging.id && nodeMapStruct[isDragging.id]) {\n // update persisted drag positions with the final position of the dragged node\n const nextPersistedDragPositions = {\n ...persistedDragPositionsRef.current,\n [isDragging.id]: {\n x: nodeMapStruct[isDragging.id].x,\n y: nodeMapStruct[isDragging.id].y,\n },\n };\n persistedDragPositionsRef.current = nextPersistedDragPositions;\n onOptionsChange({\n nodeDragPositions: nextPersistedDragPositions,\n });\n const metadataForNode = metadata[nodeMapVisual[isDragging.id].index] || {};\n\n onNodeDrag({\n type: 'node.drag',\n payload: {\n value: nodeMapVisual[isDragging.id].value,\n name: nodeMapVisual[isDragging.id].id,\n position: {\n x: nodeMapStruct[isDragging.id].x,\n y: nodeMapStruct[isDragging.id].y,\n },\n ...createDynamicPayload(metadataForNode),\n },\n });\n }\n setIsDragging({ dragStarted: false, id: null });\n }, [nodeMapStruct, isDragging.id, onOptionsChange, metadata, nodeMapVisual, onNodeDrag]);\n\n const handleDrag = useCallback(\n (x: number, y: number) => {\n if (!isDragging.dragStarted) {\n return;\n }\n const currentNode = nodeMapStruct[isDragging.id];\n\n // We want to use mouse offset to calculate the new position instead of letting the node snap to the cursor position.\n // This is done by calculating the offset between the pointer position and node position at the start of the drag,\n // and applying that offset to the pointer position during dragging.\n const dragPositionResult = getDraggedNodePositionWithOffset({\n pendingDragPosition: { x, y },\n zoomAndPanState: parentZoomAndPanState,\n currentNodePosition: currentNode ? { x: currentNode.x, y: currentNode.y } : null,\n existingDragOffset: dragOffsetRef.current,\n });\n if (!dragPositionResult) {\n return;\n }\n dragOffsetRef.current = dragPositionResult.resolvedDragOffset;\n\n setNodeMapStruct(prevNodeMapStruct =>\n updateDraggedNodePosition(\n prevNodeMapStruct,\n isDragging.id,\n dragPositionResult.adjustedPositionWithOffset\n )\n );\n },\n [isDragging, nodeMapStruct, parentZoomAndPanState]\n );\n\n const handleNodeClick = useCallback(\n (node): void => {\n if (node) {\n const metadataForNode = metadata[node.index] || {};\n\n onNodeClick({\n type: 'node.click',\n payload: {\n value: node.value,\n name: node.id,\n ...createDynamicPayload(metadataForNode),\n },\n });\n }\n },\n [metadata, onNodeClick]\n );\n\n const getTooltipContext = useCallback(\n (node: {\n x: number;\n y: number;\n }): {\n tooltipContext: { tooltipX: number; tooltipY: number };\n } => {\n const transform = svgRef.current ? zoomTransform(svgRef.current) : zoomIdentity;\n const [appliedX, appliedY] = transform.apply([node.x, node.y]);\n const tooltipYOffset = DEFAULT_NODE_RADIUS * transform.k;\n return {\n tooltipContext: {\n tooltipX: appliedX,\n tooltipY: appliedY - tooltipYOffset,\n },\n };\n },\n []\n );\n\n const handleNodeMouseOver = useCallback(\n (node): void => {\n if (node) {\n const metadataForNode = metadata[node.index] || {};\n const tooltipPosition = getTooltipContext(node);\n\n onNodeMouseOver({\n type: 'node.mouseOver',\n payload: {\n value: node.value,\n name: node.id,\n ...tooltipPosition,\n ...createDynamicPayload(metadataForNode),\n },\n });\n }\n },\n [getTooltipContext, metadata, onNodeMouseOver]\n );\n\n const handleNodeMouseOut = useCallback(\n (node): void => {\n if (node) {\n const metadataForNode = metadata[node.index] || {};\n const tooltipPosition = getTooltipContext(node);\n\n onNodeMouseOut({\n type: 'node.mouseOut',\n payload: {\n value: node.value,\n name: node.id,\n ...tooltipPosition,\n ...createDynamicPayload(metadataForNode),\n },\n });\n }\n },\n [getTooltipContext, metadata, onNodeMouseOut]\n );\n\n const currentZoomLevel = parentZoomAndPanState.zoom ?? autoZoomLevel ?? 1;\n\n return (\n <StyledWrapper\n ref={containerRef}\n data-test=\"network-graph-container\"\n backgroundColor={backgroundColor}\n width={cssWidth}\n height={cssHeight}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n >\n {nodeMapVisual && nodeMapStruct && (\n <>\n {isReadyToRender && (\n <ZoomControls\n handleReset={handleReset}\n handleZoomIn={handleZoomIn}\n handleZoomOut={handleZoomOut}\n hideReset={hideReset}\n disableZoomIn={disableZoomIn}\n disableZoomOut={disableZoomOut}\n hideZoomControls={!showZoomControls}\n />\n )}\n <NetworkGraphSvg\n nodeMapStruct={nodeMapStruct}\n nodeMapVisual={nodeMapVisual}\n linkMap={linkMap}\n linkStyle={linkStyle}\n showDirection={showDirection}\n preferPorts={effectivePreferPorts}\n svgRef={svgRef}\n zoomContainerRef={zoomContainerRef}\n isReadyToRender={isReadyToRender}\n zoomLevel={currentZoomLevel}\n hideTooltip={!tooltipHeaderFieldName && tooltipNodeFields.length === 0}\n handleMouseDown={handleMouseDown}\n handleMouseUp={handleMouseUp}\n handleDrag={handleDrag}\n handleNodeClick={handleNodeClick}\n handleNodeMouseOver={handleNodeMouseOver}\n handleNodeMouseOut={handleNodeMouseOut}\n highlightedNode={highlightedNode}\n setHighlightedNode={setHighlightedNode}\n isDragging={isDragging.dragStarted}\n />\n </>\n )}\n </StyledWrapper>\n );\n};\n\nexport default PureNetworkGraph;\n", "\nimport * as defaultImport from \"d3-transition\";\nexport * from \"d3-transition\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"d3-selection\";\nexport * from \"d3-selection\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"d3-zoom\";\nexport * from \"d3-zoom\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import dagre from 'dagre';\nimport { isRemoteIcon, isDataURI, isRelativeUrlPath } from '@splunk/visualizations-shared/iconUtils';\nimport { isColor } from '@splunk/visualization-encoding/utils/colorUtils';\nimport { truncateText, VIZ_FONT_FAMILY, computeTextWidth } from '../../../common/utils/textUtils';\nimport { getForceLayout, ForceLayoutOptionsType, ForceNodeType, ForceLinkType } from './forceLayout';\nimport type {\n IconType,\n NodeMapVisualType,\n NodeMapStructuralType,\n NodeTypeStructural,\n PositionMapType,\n NodePositionType,\n LinkMapType,\n ClusterLinkType,\n NodeMetadataType,\n NodeMetadataPayloadType,\n} from './networkGraphShared';\n\nimport {\n DEFAULT_NODE_RADIUS,\n MAX_NODE_DIAMETER,\n MIN_NODE_DIAMETER,\n DEFAULT_LINK_WIDTH,\n MIN_LINK_WIDTH,\n MAX_LINK_WIDTH,\n} from './networkGraphShared';\n\nexport const MAX_ZOOM = 4;\nexport const MAX_TEXT_WIDTH = 144;\n\nexport const RECT_HORIZONTAL_PADDING = 12;\nexport const RECT_VERTICAL_PADDING = 4;\nexport const LINE_HEIGHT = 16;\nexport const RECT_TOP_MARGIN = 4;\nexport const LABEL_FONT_SIZE = 12;\nexport const FONT = `${LABEL_FONT_SIZE}px ${VIZ_FONT_FAMILY}`;\nexport const DIM_OPACITY = 0.25;\nconst MIN_NODE_SPACING = 4;\nconst MIN_EDGE_LENGTH = 48;\nconst MIN_NODE_CONTAINER_SIZE = DEFAULT_NODE_RADIUS * 2 + MIN_EDGE_LENGTH;\nconst DEFAULT_NODE_HORIZONTAL_SPACING = 0;\nconst DEFAULT_NODE_VERTICAL_SPACING = 0;\nconst FORCE_NODE_PADDING = 24;\nexport type LinkStyleType = 's' | 'z' | 'c' | 'straight';\n\nexport type ShowDirectionType = 'bidirection' | 'oneWay' | 'none';\n\nexport type PreferPortsType = 'none' | 'horizontal' | 'vertical';\n\nexport type LayoutType = 'grid' | 'preset' | 'hierarchical' | 'force';\n\nexport type LayoutDirectionType =\n | 'horizontal'\n | 'vertical'\n | 'topBottom'\n | 'bottomTop'\n | 'leftRight'\n | 'rightLeft';\n\nexport type LayoutOptionsType = {\n // shared options\n nodeHorizontalPadding?: number;\n nodeVerticalPadding?: number;\n\n // hierarchical options\n hierarchyDirection?: LayoutDirectionType;\n\n // preset options\n xPositions?: number[];\n yPositions?: number[];\n\n // grid options\n gridColumns?: number;\n} & ForceLayoutOptionsType;\n\nexport type BoundingBoxType = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\nexport type IconRenderInfo = {\n iconUrl?: string;\n shouldRenderRemoteIcon: boolean;\n};\n\nexport const getIconRenderInfo = (icon?: IconType): IconRenderInfo => {\n const isIconString = typeof icon === 'string';\n const isRelativeIcon = isIconString ? isRelativeUrlPath(icon) : false;\n let iconUrl = isIconString ? icon : undefined;\n if (iconUrl && isRelativeIcon && typeof window !== 'undefined' && window.location?.origin) {\n iconUrl = `${window.location.origin}${iconUrl}`;\n }\n const shouldRenderRemoteIcon =\n !!iconUrl && isIconString && (isRemoteIcon(iconUrl) || isDataURI(iconUrl) || isRelativeIcon);\n\n return { iconUrl, shouldRenderRemoteIcon };\n};\n\n// sanitize id for use in SVG\nexport const sanitizeSvgId = (id: string): string => {\n const encoder = new TextEncoder();\n const bytes = encoder.encode(id.normalize('NFC')); // normalize for consistency\n const hex = Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n return `id_${hex}`;\n};\n\n// decode id back to original string\nexport const unsanitizeSvgId = (safeId: string): string => {\n // Remove the \"id_\" prefix if present\n const hex = safeId.startsWith('id_') ? safeId.slice(3) : safeId;\n\n // Convert every 2 hex chars into a byte\n const pairs = hex.match(/.{1,2}/g) || [];\n const bytes = new Uint8Array(pairs.map(byte => parseInt(byte, 16)));\n\n // Decode bytes back to string\n const decoder = new TextDecoder();\n return decoder.decode(bytes);\n};\n\n// create dynamic payload from metadata for event payloads\nexport const createDynamicPayload = (metadata: NodeMetadataType = {}): NodeMetadataPayloadType => {\n const dynamicPayload: NodeMetadataPayloadType = {};\n Object.entries(metadata).forEach(([key, value]) => {\n dynamicPayload[`row.${key}.value`] = value;\n });\n return dynamicPayload;\n};\n\nexport const shouldDimNode = (highlightedNode: NodeTypeStructural | null, currentNodeId: string): boolean => {\n if (!highlightedNode) return false;\n if (highlightedNode.id === currentNodeId) return false;\n if (highlightedNode.children?.includes(currentNodeId)) return false;\n if (highlightedNode.parents?.includes(currentNodeId)) return false;\n\n return true;\n};\n\nexport const shouldHighlightLink = (source: string, target: string, highlightedNode: string | null) => {\n if (!highlightedNode) return false;\n return source === highlightedNode || target === highlightedNode;\n};\n\n// generate node map visual\n// when visual changes occur only change visual node map\ntype UniqueNodesVisualParams = {\n nodeIds: string[];\n nodeColors: string[] | string;\n iconColors: string[] | string;\n icons: IconType[];\n nodeValues: number[];\n resultLimit?: number;\n tooltipHeaderField?: string;\n tooltipNodeFields?: string[];\n metadata?: NodeMetadataType[];\n};\n\nconst getValidColor = (nodeColors: string[] | string, index: number): string | null => {\n const color = typeof nodeColors === 'string' ? nodeColors : nodeColors[index];\n return isColor(color) ? color : null;\n};\n\nexport const getUniqueNodesVisual = ({\n nodeIds,\n nodeColors,\n iconColors,\n icons,\n nodeValues,\n resultLimit,\n tooltipHeaderField,\n tooltipNodeFields = [],\n metadata = [],\n}: UniqueNodesVisualParams): NodeMapVisualType => {\n const nodeMapVisual: NodeMapVisualType = {};\n // add nodes from datasource\n // note: we assume nodeIds match up with nodeTexts, nodeValues, nodeColors, icons, and iconColors\n // nodeIds can be the same as from if the user is not using a secondary data source\n nodeIds.slice(0, resultLimit).forEach((id, i) => {\n if (!nodeMapVisual[id]?.index) {\n const nodeMeta = metadata[i] || {};\n nodeMapVisual[id] = {\n id,\n index: i,\n color: getValidColor(nodeColors, i),\n icon: icons[i],\n iconColor: getValidColor(iconColors, i),\n value: nodeValues[i],\n tooltipFields:\n tooltipNodeFields.length > 0\n ? [...tooltipNodeFields].reduce((acc, fieldName) => {\n if (fieldName in nodeMeta) {\n acc[fieldName] = nodeMeta[fieldName];\n }\n return acc;\n }, {})\n : undefined,\n tooltipHeader: tooltipHeaderField ? nodeMeta[tooltipHeaderField] : undefined,\n };\n }\n });\n\n return nodeMapVisual;\n};\n\n// generate node map only used for structural changes to trigger layout recalculations\nexport const getUniqueNodesStruct = (\n source: string[],\n target: string[],\n nodeIds: string[],\n nodeTexts: string[],\n nodeTypes: string[],\n nodeSizes: number[] | number,\n resultLimit?: number\n): NodeMapStructuralType => {\n // for updates that do require a layout recalculation\n const nodeMapStruct: NodeMapStructuralType = {};\n\n // add nodes from datasource\n // note: we assume nodeIds match up with nodeTexts, nodeValues, nodeColors, icons, and iconColors\n // nodeIds can be the same as source if the user is not using a secondary data source\n nodeIds.slice(0, resultLimit).forEach((id, i) => {\n const truncatedText = truncateTextToMaxLines(nodeTexts[i], FONT, MAX_TEXT_WIDTH, 4);\n const textWidth = Math.max(...truncatedText.map(line => computeTextWidth(line, FONT)));\n const labelHeight =\n truncatedText.length > 0 ? RECT_VERTICAL_PADDING * 2 + LINE_HEIGHT * truncatedText.length : 0;\n const diameter = Math.max(\n MIN_NODE_DIAMETER,\n Math.min(\n MAX_NODE_DIAMETER,\n Array.isArray(nodeSizes) ? nodeSizes[i] : (nodeSizes ?? DEFAULT_NODE_RADIUS * 2)\n )\n );\n const nodeHeight = diameter + RECT_TOP_MARGIN + MIN_NODE_SPACING + labelHeight;\n const nodeWidth = Math.max(textWidth + RECT_HORIZONTAL_PADDING * 2, diameter + MIN_NODE_SPACING * 2);\n if (!nodeMapStruct[id]?.index) {\n nodeMapStruct[id] = {\n id,\n index: i,\n // need label to calculate node size, which will be used in the layout algorithm\n label: nodeTexts[i],\n height: nodeHeight,\n width: nodeWidth,\n type: nodeTypes?.[i],\n size: diameter,\n children: [],\n parents: [],\n x: undefined,\n y: undefined,\n };\n }\n });\n\n // add neighbors to nodes\n // this will make it easier to highlight neighbors on hover\n target.forEach((targetId, index) => {\n const sourceId = source[index];\n // add parent neighbors to nodeMap\n if (targetId && nodeMapStruct[targetId] && !nodeMapStruct[targetId].parents.includes(sourceId)) {\n nodeMapStruct[targetId].parents.push(sourceId);\n }\n // add child neighbors to nodeMap\n if (sourceId && nodeMapStruct[sourceId] && !nodeMapStruct[sourceId].children.includes(targetId)) {\n nodeMapStruct[sourceId].children.push(targetId);\n }\n });\n return nodeMapStruct;\n};\n\nexport const updatePositions = (\n nodeMap: NodeMapStructuralType,\n positions: PositionMapType\n): NodeMapStructuralType => {\n const updatedNodeMap: NodeMapStructuralType = {};\n Object.keys(nodeMap).forEach(id => {\n updatedNodeMap[id] = {\n ...nodeMap[id],\n x: positions?.[id] ? positions[id].x : nodeMap[id].x,\n y: positions?.[id] ? positions[id].y : nodeMap[id].y,\n };\n });\n return updatedNodeMap;\n};\n\nexport const getUniqueLinks = (\n source: string[],\n target: (string | null)[],\n linkColors: string[] | string,\n linkWidth: number[] | number,\n resultLimit?: number\n): LinkMapType => {\n const linkMap: LinkMapType = {};\n source.slice(0, resultLimit).forEach((sourceId, index) => {\n const targetId = target[index];\n const linkColor = getValidColor(linkColors, index);\n const width = typeof linkWidth === 'number' ? linkWidth : (linkWidth?.[index] ?? DEFAULT_LINK_WIDTH);\n const clampedWidth = Number.isNaN(width)\n ? DEFAULT_LINK_WIDTH\n : Math.min(MAX_LINK_WIDTH, Math.max(MIN_LINK_WIDTH, width));\n // check for toId, since we can have links with no target\n if (targetId) {\n const linkId = `${sourceId}-${targetId}`;\n // this will overwrite the link if it already exists, we use the last one in the list\n // this is what the splunkbase network graph does\n linkMap[linkId] = {\n id: linkId,\n source: sourceId,\n target: targetId,\n color: linkColor,\n width: clampedWidth,\n };\n }\n });\n return linkMap;\n};\n\n// generate grid x,y positions for nodes\nexport const getGridLayout = (\n nodeMap: NodeMapStructuralType,\n gridColumns: number | undefined,\n nodeHorizontalPadding = DEFAULT_NODE_HORIZONTAL_SPACING,\n nodeVerticalPadding = DEFAULT_NODE_VERTICAL_SPACING\n): PositionMapType => {\n const positions = {};\n const numOfCols = gridColumns ?? Math.ceil(Math.sqrt(Object.keys(nodeMap).length));\n const nodeMaxWidth = Math.max(...Object.values(nodeMap).map(node => node.width), 0);\n const nodeMaxHeight = Math.max(...Object.values(nodeMap).map(node => node.height), 0);\n const columnWidth = Math.max(nodeMaxWidth, MIN_NODE_CONTAINER_SIZE) + nodeHorizontalPadding;\n const rowHeight = Math.max(nodeMaxHeight, MIN_NODE_CONTAINER_SIZE) + nodeVerticalPadding;\n\n Object.keys(nodeMap).forEach((id, index) => {\n positions[id] = {\n x: (index % numOfCols) * columnWidth + MAX_TEXT_WIDTH,\n y: Math.floor(index / numOfCols) * rowHeight + DEFAULT_NODE_RADIUS,\n };\n });\n return positions;\n};\n\n// use user-defined x and y positions to preset the layout\nexport const getPresetLayout = (\n nodeMap: NodeMapStructuralType,\n xPositions: number[],\n yPositions: number[]\n): PositionMapType => {\n const positionsMap: PositionMapType = {};\n const xPosFormatted = xPositions?.map(x => x + 340);\n const yPosFormatted = yPositions?.map(y => y + 280);\n Object.keys(nodeMap).forEach(id => {\n const { index } = nodeMap[id];\n positionsMap[id] = {\n x: xPosFormatted[index],\n y: yPosFormatted[index],\n };\n });\n return positionsMap;\n};\n\n// this can take a long time for > 200 nodes\n// for 200 it takes 26ms, 1000 takes 2 seconds\n// eventually move to a webworker\nexport const getHierarchicalLayout = (\n nodeMap: NodeMapStructuralType,\n nodeHorizontalPadding = DEFAULT_NODE_HORIZONTAL_SPACING,\n nodeVerticalPadding = DEFAULT_NODE_VERTICAL_SPACING,\n hierarchyDirection: LayoutDirectionType = 'leftRight'\n): PositionMapType => {\n let rankdir: string;\n if (hierarchyDirection === 'topBottom' || hierarchyDirection === 'vertical') {\n rankdir = 'TB';\n } else if (hierarchyDirection === 'bottomTop') {\n rankdir = 'BT';\n } else if (hierarchyDirection === 'rightLeft') {\n rankdir = 'RL';\n } else {\n rankdir = 'LR';\n }\n const isVertical =\n hierarchyDirection === 'topBottom' ||\n hierarchyDirection === 'bottomTop' ||\n hierarchyDirection === 'vertical';\n const edgeSeparation = 24;\n const g = new dagre.graphlib.Graph();\n g.setGraph({\n rankdir,\n nodesep: isVertical ? nodeHorizontalPadding : nodeVerticalPadding,\n ranksep: isVertical ? nodeVerticalPadding : nodeHorizontalPadding,\n edgesep: edgeSeparation,\n });\n // set empty object by default to avoid errors\n g.setDefaultEdgeLabel(() => ({}));\n\n // Add nodes and edges\n Object.values(nodeMap).forEach(node => {\n g.setNode(node.id, {\n width: Math.max(node.width, MIN_NODE_CONTAINER_SIZE),\n // note: the label is beneath the node, so height is not symmetrical around the position, so we need to use the node size\n // add padding to make sure the link looks good in s and z shape\n height: Math.max(node.height, MIN_NODE_CONTAINER_SIZE),\n // useful for incremental layouting\n x: node.x || null,\n y: node.y || null,\n });\n });\n Object.values(nodeMap).forEach(node => {\n if (Array.isArray(node.children)) {\n node.children.forEach(childId => {\n if (nodeMap[childId]) {\n g.setEdge(node.id, childId);\n }\n });\n }\n });\n\n dagre.layout(g);\n\n // Convert result to position map\n const positionMap: PositionMapType = {};\n g.nodes().forEach(id => {\n const node = g.node(id);\n if (node && typeof node.x === 'number' && typeof node.y === 'number') {\n positionMap[id] = {\n // offset to keep top left corner within view\n // this should not be needed after autozoom\n x: node.x + 50,\n y: node.y + 16,\n };\n }\n });\n\n return positionMap;\n};\n\nexport const getLayout = (\n layout: LayoutType,\n nodeMapStruct: NodeMapStructuralType,\n layoutOptions: LayoutOptionsType\n): PositionMapType => {\n const {\n hierarchyDirection,\n xPositions,\n yPositions,\n nodeHorizontalPadding,\n nodeVerticalPadding,\n gridColumns,\n d3NodeList,\n d3LinkList,\n chargeStrength,\n chargeTheta,\n chargeDistanceMax,\n chargeDistanceMin,\n linkDistance,\n linkStrength,\n collidePadding,\n collideStrength,\n clusterStrength,\n } = layoutOptions;\n\n if (layout === 'preset' && xPositions && yPositions) {\n return getPresetLayout(nodeMapStruct, xPositions, yPositions);\n }\n if (layout === 'hierarchical') {\n return getHierarchicalLayout(\n nodeMapStruct,\n nodeHorizontalPadding,\n nodeVerticalPadding,\n hierarchyDirection\n );\n }\n if (layout === 'force' && d3NodeList && d3LinkList) {\n return getForceLayout({\n d3NodeList,\n d3LinkList,\n chargeStrength,\n chargeTheta,\n collidePadding,\n collideStrength,\n clusterStrength,\n chargeDistanceMax,\n chargeDistanceMin,\n linkDistance,\n linkStrength,\n });\n }\n return getGridLayout(nodeMapStruct, gridColumns, nodeHorizontalPadding, nodeVerticalPadding);\n};\n\ntype NodeMapWithPositionsParams = {\n source: string[];\n target: (string | null)[];\n nodeIds: string[];\n nodeTexts: string[];\n nodeTypes: string[];\n nodeSize?: number[] | number;\n layout: LayoutType;\n layoutOptions: LayoutOptionsType;\n resultLimit?: number;\n};\n\nexport const getNodeMapWithPositions = ({\n source,\n target,\n nodeIds,\n nodeTexts,\n nodeTypes,\n nodeSize,\n layout,\n layoutOptions,\n resultLimit,\n}: NodeMapWithPositionsParams) => {\n const nodeMapStruct = getUniqueNodesStruct(\n source,\n target,\n nodeIds,\n nodeTexts,\n nodeTypes,\n nodeSize,\n resultLimit\n );\n let updatedLayoutOptions = { ...layoutOptions };\n\n // generate node list and link list for d3-force algorithm, need a copy because d3-force modifies the objects\n if (layout === 'force') {\n const d3NodeList: ForceNodeType[] =\n layout === 'force' &&\n [...new Set(source.slice(0, resultLimit))].map(sourceId => ({\n id: sourceId,\n // add a type if clustering is on\n type: nodeMapStruct[sourceId]?.type,\n r: Number.isFinite(nodeMapStruct[sourceId]?.size)\n ? nodeMapStruct[sourceId].size / 2 + FORCE_NODE_PADDING\n : DEFAULT_NODE_RADIUS + FORCE_NODE_PADDING,\n }));\n\n const d3LinkList: ForceLinkType[] =\n layout === 'force' &&\n source\n .slice(0, resultLimit)\n .map((sourceId, index) => ({\n source: sourceId,\n target: target[index],\n // add a clusterType if clustering is on\n clusterType:\n nodeMapStruct[sourceId]?.type &&\n (nodeMapStruct[sourceId]?.type === nodeMapStruct[target[index]]?.type\n ? ('same' as ClusterLinkType)\n : ('mixed' as ClusterLinkType)),\n }))\n .filter(x => !!x.target && nodeMapStruct[x.source] && nodeMapStruct[x.target]);\n updatedLayoutOptions = { ...updatedLayoutOptions, d3NodeList, d3LinkList };\n }\n\n const positionMap = getLayout(layout, nodeMapStruct, updatedLayoutOptions);\n return updatePositions(nodeMapStruct, positionMap);\n};\n\n// get the substring that fits in the line\n// use binary search approach for performance\nconst fitCharacters = (context: CanvasRenderingContext2D, maxWidth: number, prefix: string, word: string) => {\n const space = prefix ? ' ' : '';\n let start = 0;\n let end = word.length;\n let bestFit = 0;\n while (start <= end) {\n const mid = Math.floor((start + end) / 2);\n const candidate = prefix ? `${prefix}${space}${word.slice(0, mid)}` : word.slice(0, mid);\n if (context.measureText(candidate).width <= maxWidth) {\n bestFit = mid;\n start = mid + 1;\n } else {\n end = mid - 1;\n }\n }\n return bestFit;\n};\n\nconst handleWordSplit = (\n context: CanvasRenderingContext2D,\n maxWidth: number,\n currentLineText: string,\n nextWord: string\n) => {\n const charsThatFit = fitCharacters(context, maxWidth, currentLineText, nextWord);\n const splitPart = nextWord.slice(0, Math.max(1, charsThatFit));\n const remainder = nextWord.slice(splitPart.length);\n const space = currentLineText ? ' ' : '';\n const currentLineWithSplitPart = `${currentLineText}${space}${splitPart}`;\n\n return { currentLineWithSplit: currentLineWithSplitPart, remainder };\n};\n\nexport const truncateTextToMaxLines = (\n text = '',\n font = `12px ${VIZ_FONT_FAMILY}`,\n maxWidth = 144,\n maxLines = 2\n): string[] => {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) return [text];\n context.font = font;\n\n const wordQueue = text.split(/\\s+/).filter(Boolean);\n const outputLines: string[] = [];\n let currentLineText = '';\n\n while (wordQueue.length && outputLines.length < maxLines) {\n const space = currentLineText ? ' ' : '';\n\n // Handle last line with truncation\n if (outputLines.length === maxLines - 1) {\n const remainingText = `${currentLineText}${space}${wordQueue.join(' ')}`;\n const truncatedText = truncateText(remainingText, maxWidth, 'ellipsisEnd', font);\n outputLines.push(truncatedText);\n break;\n }\n\n const nextWord = wordQueue[0];\n const lineWithNextWord = `${currentLineText}${space}${nextWord}`;\n const fitsOnCurrentLine = context.measureText(lineWithNextWord).width <= maxWidth;\n const isNextWordLongerThanMaxWidth = context.measureText(nextWord).width > maxWidth;\n\n // Word fits fully on the current line\n if (fitsOnCurrentLine) {\n currentLineText = lineWithNextWord;\n wordQueue.shift();\n } else if (!isNextWordLongerThanMaxWidth) {\n // Word fits on an empty line but not current line\n outputLines.push(currentLineText);\n currentLineText = '';\n } else {\n // Word is longer than a line and needs to be split\n const { currentLineWithSplit, remainder } = handleWordSplit(\n context,\n maxWidth,\n currentLineText,\n nextWord\n );\n outputLines.push(currentLineWithSplit);\n currentLineText = '';\n wordQueue[0] = remainder;\n }\n }\n\n if (currentLineText && outputLines.length < maxLines) {\n outputLines.push(currentLineText);\n }\n\n return outputLines;\n};\n\nconst getNodeBounds = (node: NodeTypeStructural) => {\n if (!node) return undefined;\n\n const truncatedText = truncateTextToMaxLines(node.label ?? '', FONT, MAX_TEXT_WIDTH, 2);\n const textWidth = truncatedText.length\n ? Math.max(...truncatedText.map(line => computeTextWidth(line, FONT)))\n : 0;\n const labelHeight =\n truncatedText.length > 0 ? RECT_VERTICAL_PADDING * 2 + LINE_HEIGHT * truncatedText.length : 0;\n const nodeLabelHeightWithMargin = RECT_TOP_MARGIN + labelHeight;\n const nodeLabelWidth = textWidth + RECT_HORIZONTAL_PADDING * 2;\n const nodeDiameter = node.size ?? DEFAULT_NODE_RADIUS * 2;\n const nodeRadius = nodeDiameter / 2;\n\n return {\n x: node.x - Math.max(nodeRadius, nodeLabelWidth / 2),\n y: node.y - nodeRadius,\n x2: node.x - Math.max(nodeRadius, nodeLabelWidth / 2) + Math.max(nodeRadius * 2, nodeLabelWidth),\n y2: node.y + nodeRadius + nodeLabelHeightWithMargin,\n };\n};\n\nconst getFullVizBoundsWithPadding = (nodeMap: NodeMapStructuralType, padding: number): BoundingBoxType => {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n if (Object.keys(nodeMap).length === 0) {\n // Handle empty node map case\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n };\n }\n\n // iterate through nodes to get the outmost nodes for bounds\n // make sure to include label size in the bounds\n Object.values(nodeMap).forEach(node => {\n // getNodeBounds does text truncation + width measurement, so compute once per node.\n const bounds = getNodeBounds(node);\n if (!bounds) return;\n if (!Number.isFinite(bounds.x) || !Number.isFinite(bounds.y)) return;\n if (!Number.isFinite(bounds.x2) || !Number.isFinite(bounds.y2)) return;\n\n minX = Math.min(minX, bounds.x);\n minY = Math.min(minY, bounds.y);\n maxX = Math.max(maxX, bounds.x2);\n maxY = Math.max(maxY, bounds.y2);\n });\n\n return {\n x: Number.isFinite(minX) ? minX - padding : 0,\n y: Number.isFinite(minY) ? minY - padding : 0,\n width: Number.isFinite(maxX) && Number.isFinite(minX) ? maxX - minX + padding * 2 : 0,\n height: Number.isFinite(maxY) && Number.isFinite(minY) ? maxY - minY + padding * 2 : 0,\n };\n};\n\nexport const getAutoZoomAndPan = (\n nodeMap: NodeMapStructuralType,\n containerWidth: number,\n containerHeight: number\n) => {\n if (Object.keys(nodeMap).length === 0) {\n // Handle empty node map case\n return {\n autoZoomLevel: 1,\n autoCenter: [0, 0],\n };\n }\n const { width, height, x, y } = getFullVizBoundsWithPadding(nodeMap, DEFAULT_NODE_RADIUS);\n\n // calculate the zoom level based on the bounding box size\n const zoomLevel = Math.min(containerWidth / width, containerHeight / height);\n\n const centerX = x + width / 2;\n const centerY = y + height / 2;\n\n return { autoZoomLevel: Math.min(zoomLevel, MAX_ZOOM), autoCenter: [centerX, centerY] };\n};\n\nexport const nearlyEqual = (a: number, b: number, tolerance = 1e-4, usePercentage = false) => {\n if (!usePercentage) {\n return Math.abs(a - b) < tolerance;\n }\n\n const maxAbs = Math.max(Math.abs(a), Math.abs(b));\n\n if (maxAbs === 0) {\n return Math.abs(a - b) < tolerance;\n }\n\n return Math.abs(a - b) / maxAbs <= tolerance;\n};\n\nexport const calculateMinZoomBounds = (autoZoomLevel: number, height, width) => {\n // min zoom value is 25% of auto zoom value\n // which is the same as clicking on the zoom out control twice\n const minZoomLevel = autoZoomLevel / (1.5 * 1.5);\n const minZoomWidth = width / minZoomLevel;\n const minZoomHeight = height / minZoomLevel;\n\n return { minZoomLevel, minZoomHeight, minZoomWidth };\n};\n\nexport const getZoomDisableState = (\n currentZoom: number | null | undefined,\n autoZoomLevel: number,\n minZoomLevel: number\n) => {\n const currentZoomLevel = currentZoom ?? autoZoomLevel;\n const zoomPercentTolerance = 0.001; // 0.1%\n const disableZoomIn =\n currentZoomLevel >= MAX_ZOOM || nearlyEqual(currentZoomLevel, MAX_ZOOM, zoomPercentTolerance, true);\n const disableZoomOut =\n currentZoomLevel <= minZoomLevel ||\n nearlyEqual(currentZoomLevel, minZoomLevel, zoomPercentTolerance, true);\n\n return { disableZoomIn, disableZoomOut };\n};\n\nexport const getDefaultPreferPorts = (\n layout: LayoutType,\n hierarchyDirection: LayoutDirectionType\n): PreferPortsType => {\n if (layout === 'hierarchical') {\n if (hierarchyDirection === 'topBottom' || hierarchyDirection === 'bottomTop') {\n return 'vertical';\n }\n return 'horizontal';\n }\n return 'none';\n};\n\n/// ////////////////////////////\n// LINK STYLING FUNCTIONS\n/// ////////////////////////////\n\ntype StartEndAngleParams = {\n sourcePosition: NodePositionType;\n targetPosition: NodePositionType;\n linkStyle: LinkStyleType;\n showDirection: ShowDirectionType;\n isBidirectional: boolean;\n preferPorts: PreferPortsType;\n startMargin: number;\n endMargin: number;\n linkWidth: number;\n arrowWidth: number;\n};\n\nconst getStartAndEndAngle = ({\n sourcePosition,\n targetPosition,\n linkStyle,\n showDirection,\n isBidirectional,\n preferPorts,\n startMargin,\n endMargin,\n linkWidth,\n arrowWidth,\n}: StartEndAngleParams) => {\n // this is the angle from the line that connects the start and end\n const angle = Math.atan2(targetPosition.y - sourcePosition.y, targetPosition.x - sourcePosition.x);\n\n // angle adjustment used to snap edge to nearest of 4 ports for z and s edges\n // also used to offset straight and c edges for one way edges\n let diffAngleStart;\n let diffAngleEnd;\n\n if (linkStyle === 'straight' || linkStyle === 'c') {\n diffAngleStart = Math.atan((linkWidth + arrowWidth) / startMargin) / 2;\n diffAngleEnd = Math.atan((linkWidth + arrowWidth) / endMargin) / 2;\n } else {\n // restrict to horizontal or vertical ports\n const portAngle = getIsHorizontalDominant(preferPorts, sourcePosition, targetPosition)\n ? Math.PI * Math.round(angle / Math.PI)\n : Math.PI * Math.round((angle + Math.PI / 2) / Math.PI) - Math.PI / 2;\n diffAngleStart = portAngle - angle;\n diffAngleEnd = diffAngleStart;\n }\n\n let startDiffToggle = 1;\n let endDiffToggle = 1;\n if (linkStyle === 'straight' || linkStyle === 'c') {\n // if direction is one-way and there are 2 directions, we want the lines to start slightly off center so they don't overlap\n startDiffToggle = showDirection === 'oneWay' && isBidirectional ? -1 : 0;\n endDiffToggle = showDirection === 'oneWay' && isBidirectional ? 1 : 0;\n }\n\n const startAngleOffset = startDiffToggle * diffAngleStart;\n const endAngleOffset = endDiffToggle * diffAngleEnd;\n\n return { startAngle: angle + startAngleOffset, endAngle: angle + endAngleOffset };\n};\n\nexport const getIsHorizontalDominant = (\n preferPorts: PreferPortsType,\n sourcePosition: NodePositionType,\n targetPosition: NodePositionType\n) => {\n const minDistanceHorizontal = 72;\n const minDistanceVertical = 72;\n\n const isHorizontalDistanceDominant =\n Math.abs(sourcePosition.x - targetPosition.x) > Math.abs(sourcePosition.y - targetPosition.y);\n\n // use none by default if value is invalid\n if (preferPorts === 'none' || (preferPorts !== 'horizontal' && preferPorts !== 'vertical')) {\n return isHorizontalDistanceDominant;\n }\n if (\n preferPorts === 'horizontal' &&\n (isHorizontalDistanceDominant ||\n Math.abs(sourcePosition.x - targetPosition.x) > minDistanceHorizontal)\n ) {\n return true;\n }\n if (preferPorts === 'vertical' && Math.abs(sourcePosition.y - targetPosition.y) < minDistanceVertical) {\n return true;\n }\n return false;\n};\n\ntype EdgePathParams = {\n sourcePosition: NodePositionType;\n targetPosition: NodePositionType;\n startWithArrowOffset: NodePositionType;\n endWithArrowOffset: NodePositionType;\n start: NodePositionType;\n end: NodePositionType;\n middle: NodePositionType;\n preferPorts: PreferPortsType;\n};\n\nconst getSPath = ({\n sourcePosition,\n targetPosition,\n startWithArrowOffset,\n endWithArrowOffset,\n start,\n end,\n middle,\n preferPorts,\n}: EdgePathParams) => {\n // Horizontal-dominant S\n const isHorizontalDominant = getIsHorizontalDominant(preferPorts, sourcePosition, targetPosition);\n\n if (isHorizontalDominant) {\n const segment = (end.x - start.x) / 7;\n return `\n M ${startWithArrowOffset.x} ${startWithArrowOffset.y} \n L ${start.x + segment} ${start.y} \n C ${middle.x + segment} ${start.y}, ${middle.x - segment} ${end.y}, ${end.x - segment} ${end.y} \n L ${endWithArrowOffset.x} ${endWithArrowOffset.y}\n `;\n }\n const segment = (end.y - start.y) / 7;\n // Vertical-dominant S\n return `\n M ${startWithArrowOffset.x} ${startWithArrowOffset.y} \n L ${start.x} ${start.y + segment} \n C ${start.x} ${middle.y + segment}, ${end.x} ${middle.y - segment}, ${end.x} ${end.y - segment}\n L ${endWithArrowOffset.x} ${endWithArrowOffset.y}\n `;\n};\n\nconst getZPath = ({\n sourcePosition,\n targetPosition,\n startWithArrowOffset,\n endWithArrowOffset,\n start,\n end,\n middle,\n preferPorts,\n}: EdgePathParams) => {\n // radius for corner rounding\n const radius = 8;\n // straight line, no need for Z\n if (\n Math.abs(sourcePosition.x - targetPosition.x) < radius * 2 ||\n Math.abs(sourcePosition.y - targetPosition.y) < radius * 2\n ) {\n return `\n M ${startWithArrowOffset.x} ${startWithArrowOffset.y} \n L ${endWithArrowOffset.x} ${endWithArrowOffset.y}\n `;\n }\n // Horizontal-dominant Z\n const isHorizontalDominant = getIsHorizontalDominant(preferPorts, sourcePosition, targetPosition);\n\n if (isHorizontalDominant) {\n const directionX = end.x > start.x ? 1 : -1;\n const directionY = end.y > start.y ? 1 : -1;\n\n return `\n M ${startWithArrowOffset.x} ${startWithArrowOffset.y}\n L ${middle.x - directionX * radius} ${start.y}\n Q ${middle.x} ${start.y} ${middle.x} ${start.y + directionY * radius}\n L ${middle.x} ${end.y - directionY * radius}\n Q ${middle.x} ${end.y} ${middle.x + directionX * radius} ${end.y}\n L ${endWithArrowOffset.x} ${endWithArrowOffset.y}\n `;\n }\n // Vertical-dominant Z\n const directionX = end.x > start.x ? 1 : -1;\n const directionY = end.y > start.y ? 1 : -1;\n\n return `\n M ${startWithArrowOffset.x} ${startWithArrowOffset.y}\n L ${start.x} ${middle.y - directionY * radius}\n Q ${start.x} ${middle.y} ${start.x + directionX * radius} ${middle.y}\n L ${end.x - directionX * radius} ${middle.y}\n Q ${end.x} ${middle.y} ${end.x} ${middle.y + directionY * radius}\n L ${endWithArrowOffset.x} ${endWithArrowOffset.y}\n `;\n};\n\nconst getCPath = (\n startWithArrowOffset: NodePositionType,\n endWithArrowOffset: NodePositionType,\n start: NodePositionType,\n end: NodePositionType\n) => {\n const angle = Math.atan2(end.y - start.y, end.x - start.x);\n const edgeCurve = 24;\n const dx = (end.x - start.x) ** 2;\n const dy = (end.y - start.y) ** 2;\n const ds = Math.sqrt(dx + dy);\n // control points used for curved edge\n const curvedqx =\n (end.x - start.x) / 2 + start.x - ((edgeCurve * ds) / 400) * Math.cos(angle + Math.PI / 2);\n const curvedqy =\n (end.y - start.y) / 2 + start.y - ((edgeCurve * ds) / 400) * Math.sin(angle + Math.PI / 2);\n\n const linkPath = `\n M ${startWithArrowOffset.x} ${startWithArrowOffset.y} \n Q ${curvedqx} ${curvedqy} ${endWithArrowOffset.x} ${endWithArrowOffset.y}\n `;\n return linkPath;\n};\n\nexport const getArrowHeight = (linkSize: number, linkWidth: number): number => {\n if (linkSize === 1) return 5;\n // min linkSize is 1 so this will not divide by 0\n return linkWidth * (0.5 + 1 / linkSize);\n};\n\nexport const getArrowWidth = (linkSize: number): number => {\n return Math.round(linkSize < 4 ? 8 : linkSize * (2.1 - linkSize / 40));\n};\n\nexport const getMinDistanceForArrow = (arrowHeight: number): number => {\n return arrowHeight + 12;\n};\n\nexport const getMinDistanceForCurve = (arrowHeight: number, linkStyle: LinkStyleType | undefined): number => {\n return linkStyle === 'c' ? arrowHeight * 2 + 12 : arrowHeight * 5 + 12;\n};\n\ntype LinkRenderInfoParams = {\n linkStyle: LinkStyleType;\n showDirection: ShowDirectionType;\n preferPorts: PreferPortsType;\n sourcePosition: NodePositionType;\n targetPosition: NodePositionType;\n sourceSize: number;\n targetSize: number;\n arrowHeight: number;\n};\n\nexport const getLinkRenderInfo = ({\n linkStyle,\n showDirection,\n preferPorts,\n sourcePosition,\n targetPosition,\n sourceSize,\n targetSize,\n arrowHeight,\n}: LinkRenderInfoParams) => {\n const isHorizontalDominant = getIsHorizontalDominant(preferPorts, sourcePosition, targetPosition);\n const verticalDistance = Math.abs(targetPosition.y - sourcePosition.y);\n const horizontalDistance = Math.abs(targetPosition.x - sourcePosition.x);\n const minDistanceForArrow = getMinDistanceForArrow(\n showDirection === 'bidirection' ? arrowHeight * 2 : arrowHeight\n );\n const minDistanceForCurve = getMinDistanceForCurve(arrowHeight, linkStyle);\n const distance = Math.hypot(horizontalDistance, verticalDistance) - (sourceSize / 2 + targetSize / 2);\n const shouldHideArrow = distance < minDistanceForArrow;\n const shouldShowBasicLinkStyle = isHorizontalDominant\n ? horizontalDistance - (sourceSize / 2 + targetSize / 2) < minDistanceForCurve\n : verticalDistance - (sourceSize / 2 + targetSize / 2) < minDistanceForCurve;\n const effectiveLinkStyle = shouldShowBasicLinkStyle ? 'straight' : linkStyle;\n const effectiveShowDirection = shouldHideArrow ? 'none' : showDirection;\n\n return { effectiveLinkStyle, effectiveShowDirection };\n};\n\n// generate edge path for svg, inspired from Tatsuya's code sandbox\n// https://codesandbox.io/p/devbox/network-graph-demo-forked-lv8pnr?file=%2Fsrc%2Findex.mjs%3A517%2C4&workspaceId=ws_TYfFvbbyHMCRyRr9xg5ppW\ntype GetEdgePathParams = {\n linkStyle: LinkStyleType;\n sourcePosition: NodePositionType;\n targetPosition: NodePositionType;\n isBidirectional: boolean;\n showDirection: ShowDirectionType;\n arrowHeight?: number;\n arrowWidth?: number;\n preferPorts?: PreferPortsType;\n sourceNodeSize?: number;\n targetNodeSize?: number;\n linkWidth?: number;\n};\n\nexport const getEdgePath = ({\n linkStyle,\n sourcePosition,\n targetPosition,\n isBidirectional,\n showDirection,\n arrowHeight = 6,\n arrowWidth = 8,\n preferPorts = 'none' as PreferPortsType,\n sourceNodeSize = DEFAULT_NODE_RADIUS * 2,\n targetNodeSize = DEFAULT_NODE_RADIUS * 2,\n linkWidth = 2,\n}: GetEdgePathParams) => {\n const getNodeMargin = (nodeSize?: number) => {\n const radius = (nodeSize ?? DEFAULT_NODE_RADIUS * 2) / 2;\n return radius + arrowHeight + MIN_NODE_SPACING;\n };\n const startMargin = getNodeMargin(sourceNodeSize);\n const endMargin = getNodeMargin(targetNodeSize);\n const validatedlinkStyleType =\n linkStyle !== 'c' && linkStyle !== 'z' && linkStyle !== 's' ? 'straight' : linkStyle;\n // offset to extend the line if there is no arrow tip, this may change depending on the width of the arrow\n const startArrowTipOffset = isBidirectional && showDirection === 'bidirection' ? 0 : -arrowHeight;\n const endArrowTipOffset = showDirection === 'none' ? -arrowHeight : 0;\n // get angle to draw edge\n const { startAngle, endAngle } = getStartAndEndAngle({\n sourcePosition,\n targetPosition,\n linkStyle: validatedlinkStyleType,\n showDirection,\n isBidirectional,\n preferPorts,\n startMargin,\n endMargin,\n linkWidth,\n arrowWidth,\n });\n\n // start and end position used for calculations\n const start = {\n x: sourcePosition.x + Math.cos(startAngle) * startMargin,\n y: sourcePosition.y + Math.sin(startAngle) * startMargin,\n };\n const end = {\n x: targetPosition.x - Math.cos(endAngle) * endMargin,\n y: targetPosition.y - Math.sin(endAngle) * endMargin,\n };\n // start and end position with offset for missing arrow tip\n const startWithArrowOffset = {\n x: start.x + Math.cos(startAngle) * startArrowTipOffset,\n y: start.y + Math.sin(startAngle) * startArrowTipOffset,\n };\n const endWithArrowOffset = {\n x: end.x - Math.cos(endAngle) * endArrowTipOffset,\n y: end.y - Math.sin(endAngle) * endArrowTipOffset,\n };\n // half-way position used as control points for z and s edges\n const middle = {\n x: (end.x - start.x) / 2 + start.x,\n y: (end.y - start.y) / 2 + start.y,\n };\n\n // Z edge\n if (linkStyle === 'z') {\n return getZPath({\n sourcePosition,\n targetPosition,\n startWithArrowOffset,\n endWithArrowOffset,\n start,\n end,\n middle,\n preferPorts,\n });\n }\n // S edge\n if (linkStyle === 's') {\n return getSPath({\n sourcePosition,\n targetPosition,\n startWithArrowOffset,\n endWithArrowOffset,\n start,\n end,\n middle,\n preferPorts,\n });\n }\n // Curved edge\n if (linkStyle === 'c') {\n return getCPath(startWithArrowOffset, endWithArrowOffset, start, end);\n }\n // Straight edge by default\n return `\n M ${startWithArrowOffset.x} ${startWithArrowOffset.y} \n L ${endWithArrowOffset.x} ${endWithArrowOffset.y}\n `;\n};\n", "\nimport * as defaultImport from \"dagre\";\nexport * from \"dagre\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/iconUtils\";\nexport * from \"@splunk/visualizations-shared/iconUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualization-encoding/utils/colorUtils\";\nexport * from \"@splunk/visualization-encoding/utils/colorUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\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 {\n forceSimulation,\n forceLink,\n forceCollide,\n forceCenter,\n forceManyBody,\n SimulationNodeDatum,\n SimulationLinkDatum,\n} from 'd3-force';\nimport { quadtree, Quadtree } from 'd3-quadtree';\nimport {\n NodePositionType,\n PositionMapType,\n ClusterLinkType,\n DEFAULT_CHART_HEIGHT,\n DEFAULT_CHART_WIDTH,\n DEFAULT_NODE_RADIUS,\n} from './networkGraphShared';\n\n// ---- d3 force simulation constants ---- //\n\n// The many-body (or n-body) force applies mutually amongst all nodes.\n// It can be used to simulate gravity (attraction) if the strength is positive,\n// or electrostatic charge (repulsion) if the strength is negative.\nexport const DEFAULT_CHARGE_STRENGTH = -30;\n// The Barnes-Hut approximation parameter for many-body forces. A higher value results in faster performance\n// but less accurate positioning.\nexport const DEFAULT_CHARGE_THETA = 0.9;\n// Used for performance, we will not apply many-body forces on nodes outside of this distance.\nexport const DEFAULT_DISTANCE_MIN = 1;\nexport const DEFAULT_DISTANCE_MAX = Infinity;\n\n// The link force pushes linked nodes together or apart according to the desired link distance.\nexport const DEFAULT_LINK_DISTANCE = 30;\n\n// The collide force treats nodes as circles with a given radius, rather than points, and prevents nodes from overlapping.\n// For clustering, this value is used to increase collision distance for nodes in different categories.\nexport const DEFAULT_COLLIDE_PADDING = 10;\n// The strength of the collider used for node repulsion. A higher value results in stronger repulsion,\n// causing nodes to spread out more.\nexport const DEFAULT_COLLIDE_STRENGTH = 1;\n\n// The strength of the force used to cluster nodes of the same type together. Must be between 0 and 1.\nexport const DEFAULT_CLUSTER_STRENGTH = 0.05;\n\nexport type ForceLayoutOptionsType = {\n d3NodeList?: ForceNodeType[];\n d3LinkList?: ForceLinkType[];\n chargeStrength?: number;\n chargeTheta?: number;\n chargeDistanceMin?: number;\n chargeDistanceMax?: number;\n\n linkDistance?: number;\n linkStrength?: number;\n collidePadding?: number;\n collideStrength?: number;\n clusterStrength?: number;\n};\n\nexport type ForceNodeType = SimulationNodeDatum & {\n id: string;\n r?: number;\n type?: string;\n};\n\nexport type ForceLinkType = SimulationLinkDatum<ForceNodeType> & {\n // d3-force automatically converts source and target to node references\n source: string | ForceNodeType;\n target: string | ForceNodeType;\n clusterType?: ClusterLinkType;\n};\n\n// find centroid of a set of nodes\nexport const calculateCentroid = (nodes: ForceNodeType[]): NodePositionType => {\n let x = 0;\n let y = 0;\n let z = 0;\n nodes.forEach(node => {\n const k = (node.r || 0) ** 2;\n x += (node.x || 0) * k;\n y += (node.y || 0) * k;\n z += k;\n });\n return z > 0 ? { x: x / z, y: y / z } : { x: 0, y: 0 };\n};\n\n// Helper to process collision between two nodes\nexport const processNodeCollision = (\n nodeA: ForceNodeType,\n nodeB: ForceNodeType,\n sameGroupPadding = 1,\n diffGroupPadding = DEFAULT_COLLIDE_PADDING,\n collideStrength = 1\n) => {\n if (!nodeA || !nodeB || nodeA === nodeB) return;\n const collisionRadius =\n (nodeA.r || 0) + (nodeB.r || 0) + (nodeA.type === nodeB.type ? sameGroupPadding : diffGroupPadding);\n\n const deltaX = (nodeA.x || 0) - (nodeB.x || 0);\n const deltaY = (nodeA.y || 0) - (nodeB.y || 0);\n const distance = Math.hypot(deltaX, deltaY);\n\n if (distance < collisionRadius && distance > 0) {\n const adjustmentFactor = ((distance - collisionRadius) / distance) * collideStrength;\n const adjustmentX = deltaX * adjustmentFactor;\n const adjustmentY = deltaY * adjustmentFactor;\n\n // need to ignore param-reassign because this is how d3-force works\n /* eslint-disable no-param-reassign */\n if (nodeA.x !== undefined) nodeA.x -= adjustmentX;\n if (nodeA.y !== undefined) nodeA.y -= adjustmentY;\n if (nodeB.x !== undefined) nodeB.x += adjustmentX;\n if (nodeB.y !== undefined) nodeB.y += adjustmentY;\n /* eslint-enable no-param-reassign */\n }\n};\n\n// Helper to process all collisions in a quadtree node\nexport const processQuadCollisions = (\n quadNode: Quadtree<ForceNodeType>,\n currentNode: ForceNodeType,\n sameGroupPadding = 1,\n diffGroupPadding = 50,\n collideStrength = 1\n) => {\n let currentQuadNode = quadNode;\n while (currentQuadNode) {\n if (currentQuadNode.data) {\n processNodeCollision(\n currentNode,\n currentQuadNode.data,\n sameGroupPadding,\n diffGroupPadding,\n collideStrength\n );\n }\n currentQuadNode = currentQuadNode.next;\n }\n};\n\n// Custom collision force for node clustering\nexport const createCustomForceCollide = (collidePadding: number, collideStrength: number) => {\n const sameGroupPadding = 1; // separation between same-type nodes\n const diffGroupPadding = collidePadding; // separation between diff-type nodes\n let nodes: ForceNodeType[] = [];\n let maxRadius = 0;\n\n const force = () => {\n // use a quadtree for efficient collision detection\n const tree: Quadtree<ForceNodeType> = quadtree(\n nodes,\n (d: ForceNodeType) => d.x || 0,\n (d: ForceNodeType) => d.y || 0\n );\n\n nodes.forEach(currentNode => {\n const radius = (currentNode.r || 0) + maxRadius;\n const leftBound = (currentNode.x || 0) - radius;\n const topBound = (currentNode.y || 0) - radius;\n const rightBound = (currentNode.x || 0) + radius;\n const bottomBound = (currentNode.y || 0) + radius;\n\n tree.visit((quad: Quadtree<ForceNodeType>, x1: number, y1: number, x2: number, y2: number) => {\n if (!quad.length) {\n processQuadCollisions(\n quad,\n currentNode,\n sameGroupPadding,\n diffGroupPadding,\n collideStrength\n );\n }\n // this will skip the quadrant and ignore nodes that don't collide with the current node\n return x1 > rightBound || x2 < leftBound || y1 > bottomBound || y2 < topBound;\n });\n });\n };\n\n force.initialize = (nodeList: SimulationNodeDatum[]) => {\n nodes = nodeList;\n const nodeRadii = nodes.map(d => d.r || 0);\n maxRadius =\n nodeRadii.length > 0\n ? Math.max(...nodeRadii) + Math.max(sameGroupPadding, diffGroupPadding)\n : Math.max(sameGroupPadding, diffGroupPadding);\n };\n\n return force;\n};\n\n// Custom clustering force - moved outside for reduced complexity\nexport const createForceCluster = (clusterStrength: number) => {\n let nodes: ForceNodeType[] = [];\n const validClusterStrength = Math.max(0, Math.min(clusterStrength, 1));\n\n const force = () => {\n const clusterGroups = new Map<string, ForceNodeType[]>();\n const centroids = new Map<string, NodePositionType>();\n\n // Group nodes by their type\n nodes.forEach(node => {\n const group = node.type || 'default';\n if (!clusterGroups.has(group)) {\n clusterGroups.set(group, []);\n }\n const groupNodes = clusterGroups.get(group);\n if (groupNodes) {\n groupNodes.push(node);\n }\n });\n\n // Compute the actual centroid for each group\n clusterGroups.forEach((groupNodes, groupKey) => {\n const centroid = calculateCentroid(groupNodes);\n centroids.set(groupKey, centroid);\n });\n\n const adjustmentStrength = validClusterStrength;\n nodes.forEach(node => {\n const group = node.type || 'default';\n const centroidPos = centroids.get(group);\n if (centroidPos && node.x !== undefined && node.y !== undefined) {\n const deltaX = (node.x - centroidPos.x) * adjustmentStrength;\n const deltaY = (node.y - centroidPos.y) * adjustmentStrength;\n\n // Apply velocity adjustments safely\n // eslint-disable-next-line no-param-reassign\n if (node.vx !== undefined) node.vx -= deltaX;\n // eslint-disable-next-line no-param-reassign\n if (node.vy !== undefined) node.vy -= deltaY;\n }\n });\n };\n\n force.initialize = (nodeList: ForceNodeType[]) => {\n nodes = nodeList;\n };\n\n return force;\n};\n\n// TODO: Move force layout to web worker\nexport const getForceLayout = (forceLayoutOptions: ForceLayoutOptionsType): PositionMapType => {\n const {\n d3NodeList = [],\n d3LinkList = [],\n chargeStrength = DEFAULT_CHARGE_STRENGTH,\n chargeTheta = DEFAULT_CHARGE_THETA,\n chargeDistanceMax = DEFAULT_DISTANCE_MAX,\n chargeDistanceMin = DEFAULT_DISTANCE_MIN,\n linkDistance = DEFAULT_LINK_DISTANCE,\n linkStrength = undefined,\n collidePadding = DEFAULT_COLLIDE_PADDING,\n collideStrength = DEFAULT_COLLIDE_STRENGTH,\n clusterStrength = DEFAULT_CLUSTER_STRENGTH,\n } = forceLayoutOptions;\n\n const updatedPositionMap: PositionMapType = {};\n\n if (d3NodeList.length === 0) {\n return updatedPositionMap;\n }\n\n const enableClustering = d3NodeList.some(node => Boolean(node.type));\n\n // Create link force\n let linkForce = forceLink(d3LinkList)\n .id((d: any) => d.id)\n .distance((link: any) => {\n if (!link.clusterType) return linkDistance;\n // Enhance clustering by adjusting link distances\n return link.clusterType === 'same' ? linkDistance * 0.1 : linkDistance * 3;\n });\n\n // Apply link strength if specified\n if (linkStrength !== undefined) {\n linkForce = linkForce.strength(linkStrength);\n }\n\n const getCollideRadius = (node: ForceNodeType): number => {\n const currentNode = node?.r || DEFAULT_NODE_RADIUS;\n return currentNode + collidePadding;\n };\n // Create collision force - use custom or default\n const collisionForce = enableClustering\n ? createCustomForceCollide(collidePadding, collideStrength)\n : forceCollide().radius(getCollideRadius).strength(collideStrength);\n\n // Build simulation\n const simulation = forceSimulation(d3NodeList)\n .force('link', linkForce)\n .force('collide', collisionForce)\n .force(\n 'charge',\n forceManyBody()\n .strength(chargeStrength)\n .theta(chargeTheta)\n .distanceMax(chargeDistanceMax)\n .distanceMin(chargeDistanceMin)\n )\n .force('center', forceCenter(DEFAULT_CHART_WIDTH / 2, DEFAULT_CHART_HEIGHT / 2));\n\n // Add clustering force if enabled\n if (enableClustering) {\n simulation.force('cluster', createForceCluster(clusterStrength));\n }\n\n // Run simulation\n simulation.tick(300);\n simulation.stop();\n\n // Extract final positions\n d3NodeList.forEach(node => {\n updatedPositionMap[node.id] = {\n x: node.x || 0,\n y: node.y || 0,\n };\n });\n\n return updatedPositionMap;\n};\n", "\nimport * as defaultImport from \"d3-force\";\nexport * from \"d3-force\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"d3-quadtree\";\nexport * from \"d3-quadtree\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "export const DEFAULT_CHART_WIDTH = 800;\nexport const DEFAULT_CHART_HEIGHT = 500;\nexport const DEFAULT_NODE_RADIUS = 24;\nexport const MIN_NODE_DIAMETER = 12;\nexport const MAX_NODE_DIAMETER = 200;\nexport const DEFAULT_LINK_WIDTH = 2;\nexport const MIN_LINK_WIDTH = 1;\nexport const MAX_LINK_WIDTH = 20;\n\nexport type NodeTypeStructural = {\n id: string;\n index: number;\n height: number;\n width: number;\n size?: number;\n label?: string;\n type?: string;\n children?: string[];\n parents?: string[];\n x?: number;\n y?: number;\n};\n\nexport type BuiltInIconType =\n | 'arrowsDoubleLeftRight'\n | 'arrowsFourRightLeftUpDown'\n | 'arrowsFourTowardUp'\n | 'bell'\n | 'bookshelf'\n | 'buildings'\n | 'chartColumnMagnifier'\n | 'chartColumnSquare'\n | 'checkCircle'\n | 'chevronsSlash'\n | 'cloud'\n | 'cogChevronsSlash'\n | 'containership'\n | 'cube'\n | 'cylinder'\n | 'cylinderIndexTable'\n | 'cylinderMetrics'\n | 'cylinderMulti'\n | 'cylinderTrace'\n | 'cylinderWaves'\n | 'deviceEdgeHub'\n | 'deviceSignalWaves'\n | 'dotsThreeBalloon'\n | 'drive'\n | 'driveIndexTable'\n | 'driveMagnifier'\n | 'driveSliders'\n | 'envelope'\n | 'ethernetPort'\n | 'exclamationTriangle'\n | 'factory'\n | 'file'\n | 'fileLogs'\n | 'filter'\n | 'folder'\n | 'forwarderHeavy'\n | 'forwarderUniversal'\n | 'gate'\n | 'globe'\n | 'identityCard'\n | 'informationCircle'\n | 'informationDiamond'\n | 'laptopOpen'\n | 'layout'\n | 'license'\n | 'mobilePhone'\n | 'monitor'\n | 'monitorPhone'\n | 'networkDevice'\n | 'nodeBranch'\n | 'nodeModel'\n | 'nodeTopology'\n | 'picture'\n | 'portrait'\n | 'portraitsTwo'\n | 'printer'\n | 'processor'\n | 'reportDouble'\n | 'securityCamera'\n | 'servers'\n | 'serversCloud'\n | 'shoppingCart'\n | 'signalWavesAngled'\n | 'singleIndex'\n | 'slidersTripleHorizontal'\n | 'squaresAndCircles'\n | 'star'\n | 'store'\n | 'telescope'\n | 'token'\n | 'truck'\n | 'wallBricks'\n | 'wifiSignal'\n | 'cellularGateway';\n\n// Brand external icons so plain `string` doesn't swallow the BuiltInIconType union.\ntype ExternalIconType = string & {\n __externalIconType?: never;\n};\n\nexport type IconType = BuiltInIconType | ExternalIconType;\n\nexport type NodeTypeVisual = {\n id: string;\n index: number;\n color?: string;\n icon?: IconType;\n iconColor?: string;\n value?: number;\n tooltipFields?: Record<string, MetaDataType | MetaDataType[]>;\n tooltipHeader?: MetaDataType | MetaDataType[];\n};\n\nexport type LinkType = {\n id: string;\n source: string;\n target: string;\n color?: string;\n width?: number;\n tooltipFields?: Record<string, MetaDataType | MetaDataType[]>;\n};\n\nexport type NodePositionType = {\n x: number;\n y: number;\n};\n\nexport type PositionMapType = {\n [id: string]: NodePositionType;\n};\n\nexport type NodeMapStructuralType = {\n [id: string]: NodeTypeStructural;\n};\n\nexport type NodeMapVisualType = {\n [id: string]: NodeTypeVisual;\n};\n\nexport type LinkMapType = {\n [id: string]: LinkType;\n};\n\nexport type ClusterLinkType = 'same' | 'mixed';\n\nexport type MetaDataType = string | number | boolean | null | undefined;\n\nexport type NodeMetadataType = {\n [key: string]: MetaDataType | MetaDataType[];\n};\n\nexport type NodeMetadataPayloadType = {\n [key: `row.${string}.value`]: MetaDataType | MetaDataType[];\n};\n\n// Event payload interfaces\nexport type NodeEventCallbackType = {\n id: string;\n value?: number;\n index: number;\n};\n\nexport type NodeEventCallbackWithPositionType = NodeEventCallbackType & {\n x: number;\n y: number;\n};\n\nexport type NodeEventPayloadType = {\n name: string;\n value?: number;\n} & NodeMetadataPayloadType;\n\nexport type NodeEventPayloadWithPosition = NodeEventPayloadType & {\n position: {\n x: number;\n y: number;\n };\n};\n\nexport type NodeEventPayloadWithTooltip = NodeEventPayloadType & {\n tooltipContext: {\n tooltipX: number;\n tooltipY: number;\n };\n};\n\n// Event objects\nexport interface NodeClickEvent {\n type: 'node.click';\n payload: NodeEventPayloadType;\n}\n\nexport interface NodeMouseOverEvent {\n type: 'node.mouseOver';\n payload: NodeEventPayloadWithTooltip;\n}\n\nexport interface NodeMouseOutEvent {\n type: 'node.mouseOut';\n payload: NodeEventPayloadWithTooltip;\n}\n\nexport interface NodeDragEvent {\n type: 'node.drag';\n payload: NodeEventPayloadWithPosition;\n}\n", "import type { NodeMapStructuralType } from './networkGraphShared';\n\nexport type DragStateType = {\n dragStarted: boolean;\n id: string | null;\n};\n\nexport type ZoomAndPanStateType = {\n zoom: number | null;\n x: number | null;\n y: number | null;\n};\n\nexport type PositionType = {\n x: number;\n y: number;\n};\n\nexport const isValidZoomAndPanState = (\n zoomAndPanState: ZoomAndPanStateType\n): zoomAndPanState is PositionType & {\n zoom: number;\n} =>\n Number.isFinite(zoomAndPanState.zoom) &&\n zoomAndPanState.zoom > 0 &&\n Number.isFinite(zoomAndPanState.x) &&\n Number.isFinite(zoomAndPanState.y);\n\n// Convert screen-space pointer coordinates into graph-space coordinates.\n// When zoom/pan is invalid, return the raw pointer position as a safe fallback.\nexport const getAdjustedDragPosition = (\n pendingDragPosition: PositionType | null,\n zoomAndPanState: ZoomAndPanStateType\n): PositionType | null => {\n if (!pendingDragPosition) {\n return null;\n }\n if (!isValidZoomAndPanState(zoomAndPanState)) {\n return pendingDragPosition;\n }\n\n return {\n x: (pendingDragPosition.x - zoomAndPanState.x) / zoomAndPanState.zoom,\n y: (pendingDragPosition.y - zoomAndPanState.y) / zoomAndPanState.zoom,\n };\n};\n\ntype MousePositionEvent = {\n clientX?: number;\n clientY?: number;\n};\n\ntype SvgPointerTarget = {\n getBoundingClientRect: () => { left: number; top: number; width: number; height: number };\n width?: { baseVal?: { value: number } };\n height?: { baseVal?: { value: number } };\n};\n\n// Convert a mouse event on the SVG into graph-space coordinates, accounting for SVG scaling and zoom/pan.\nexport const getPointerInGraphSpaceFromMouseEvent = (\n event: MousePositionEvent | null | undefined,\n svgElement: SvgPointerTarget | null | undefined,\n zoomAndPanState: ZoomAndPanStateType\n): PositionType | null => {\n if (!svgElement || !Number.isFinite(event?.clientX) || !Number.isFinite(event?.clientY)) {\n return null;\n }\n\n const rect = svgElement.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) {\n return null;\n }\n\n const svgWidth = svgElement.width?.baseVal?.value ?? rect.width;\n const svgHeight = svgElement.height?.baseVal?.value ?? rect.height;\n const scaleX = svgWidth / rect.width;\n const scaleY = svgHeight / rect.height;\n const pointerInSvgSpace = {\n x: (event.clientX - rect.left) * scaleX,\n y: (event.clientY - rect.top) * scaleY,\n };\n\n return getAdjustedDragPosition(pointerInSvgSpace, zoomAndPanState);\n};\n\n// Capture the fixed pointer-to-node delta at drag start so future moves preserve the grab point.\nexport const getInitialDragOffset = (\n pointerInGraphSpace: PositionType | null,\n nodePosition: PositionType | null\n): PositionType | null => {\n if (\n !pointerInGraphSpace ||\n !nodePosition ||\n !Number.isFinite(pointerInGraphSpace.x) ||\n !Number.isFinite(pointerInGraphSpace.y) ||\n !Number.isFinite(nodePosition.x) ||\n !Number.isFinite(nodePosition.y)\n ) {\n return null;\n }\n\n return {\n x: pointerInGraphSpace.x - nodePosition.x,\n y: pointerInGraphSpace.y - nodePosition.y,\n };\n};\n\ntype DraggedNodePositionParams = {\n pendingDragPosition: PositionType | null;\n zoomAndPanState: ZoomAndPanStateType;\n currentNodePosition: PositionType | null;\n existingDragOffset: PositionType | null;\n};\n\ntype DraggedNodePositionResult = {\n adjustedPositionWithOffset: PositionType;\n resolvedDragOffset: PositionType | null;\n};\n\n// Resolve dragged node position in graph-space while preserving the original cursor grab offset.\nexport const getDraggedNodePositionWithOffset = ({\n pendingDragPosition,\n zoomAndPanState,\n currentNodePosition,\n existingDragOffset,\n}: DraggedNodePositionParams): DraggedNodePositionResult | null => {\n const adjustedPendingPosition = getAdjustedDragPosition(pendingDragPosition, zoomAndPanState);\n if (!adjustedPendingPosition) {\n return null;\n }\n\n const resolvedDragOffset =\n existingDragOffset ?? getInitialDragOffset(adjustedPendingPosition, currentNodePosition);\n\n return {\n adjustedPositionWithOffset: {\n x: adjustedPendingPosition.x - (resolvedDragOffset?.x ?? 0),\n y: adjustedPendingPosition.y - (resolvedDragOffset?.y ?? 0),\n },\n resolvedDragOffset,\n };\n};\n\n// Return previous map reference when no effective movement occurred.\n// This avoids unnecessary React state updates while dragging.\nexport const updateDraggedNodePosition = (\n previousNodeMap: NodeMapStructuralType,\n nodeId: string | null,\n nextPosition: PositionType | null\n): NodeMapStructuralType => {\n if (!nodeId || !nextPosition) {\n return previousNodeMap;\n }\n\n const currentNode = previousNodeMap[nodeId];\n if (!currentNode) {\n return previousNodeMap;\n }\n\n if (currentNode.x === nextPosition.x && currentNode.y === nextPosition.y) {\n return previousNodeMap;\n }\n\n return {\n ...previousNodeMap,\n [nodeId]: {\n ...currentNode,\n x: nextPosition.x,\n y: nextPosition.y,\n },\n };\n};\n\n// Patch only nodes whose drag positions changed (added/updated/removed) and keep other node references stable.\nexport const patchNodeMapWithDragPositionChanges = (\n previousNodeMap: NodeMapStructuralType,\n baseNodeMap: NodeMapStructuralType,\n previousDragPositions: Record<string, { x: number; y: number }>,\n nextDragPositions: Record<string, { x: number; y: number }>\n) => {\n const changedNodeIds = new Set([\n ...Object.keys(previousDragPositions || {}),\n ...Object.keys(nextDragPositions || {}),\n ]);\n let updatedNodeMap = previousNodeMap;\n\n changedNodeIds.forEach(nodeId => {\n const currentNode = previousNodeMap[nodeId];\n const baseNode = baseNodeMap[nodeId];\n if (!currentNode || !baseNode) {\n return;\n }\n\n const nextPosition = nextDragPositions?.[nodeId];\n const resolvedPosition = nextPosition ?? { x: baseNode.x, y: baseNode.y };\n if (currentNode.x === resolvedPosition.x && currentNode.y === resolvedPosition.y) {\n return;\n }\n\n if (updatedNodeMap === previousNodeMap) {\n updatedNodeMap = { ...previousNodeMap };\n }\n updatedNodeMap[nodeId] = {\n ...currentNode,\n x: resolvedPosition.x,\n y: resolvedPosition.y,\n };\n });\n\n return updatedNodeMap;\n};\n\n// Patch persisted drag positions by applying only changed node ids from previous -> next drag maps.\nexport const patchDragPositionsMap = (\n baseMap: Record<string, { x: number; y: number }>,\n previousDragPositions: Record<string, { x: number; y: number }>,\n nextDragPositions: Record<string, { x: number; y: number }>\n) => {\n const patchedMap = { ...baseMap };\n const changedNodeIds = new Set([\n ...Object.keys(previousDragPositions || {}),\n ...Object.keys(nextDragPositions || {}),\n ]);\n\n changedNodeIds.forEach(nodeId => {\n const nextPosition = nextDragPositions?.[nodeId];\n if (nextPosition) {\n patchedMap[nodeId] = nextPosition;\n } else {\n delete patchedMap[nodeId];\n }\n });\n\n return patchedMap;\n};\n", "import * as React from 'react';\nimport { ReactElement, memo, RefObject, useEffect, useState, useCallback, useId } from 'react';\nimport { select } from 'd3-selection';\n\nimport Node from './Node';\nimport Link from './Link';\nimport Tooltip from './Tooltip';\nimport {\n LinkStyleType,\n ShowDirectionType,\n PreferPortsType,\n shouldDimNode,\n shouldHighlightLink,\n unsanitizeSvgId,\n DIM_OPACITY,\n} from '../utils/networkGraphUtils';\nimport type {\n NodeMapStructuralType,\n NodeMapVisualType,\n LinkMapType,\n NodeEventCallbackType,\n NodeEventCallbackWithPositionType,\n} from '../utils/networkGraphShared';\n\ninterface NetworkGraphSvgProps {\n nodeMapStruct?: NodeMapStructuralType;\n nodeMapVisual?: NodeMapVisualType;\n linkMap?: LinkMapType;\n linkStyle?: LinkStyleType;\n showDirection?: ShowDirectionType;\n preferPorts?: PreferPortsType;\n svgRef?: RefObject<SVGSVGElement>;\n zoomContainerRef?: RefObject<SVGGElement>;\n isReadyToRender?: boolean;\n hideTooltip?: boolean;\n zoomLevel?: number;\n handleMouseUp?: () => void;\n handleMouseDown?: (e: any) => void; // mousedown uses event from d3 which is typed to any\n handleDrag?: (x: number, y: number) => void;\n handleNodeClick?: (node: NodeEventCallbackType) => void;\n handleNodeMouseOver?: (node: NodeEventCallbackWithPositionType) => void;\n handleNodeMouseOut?: (node: NodeEventCallbackWithPositionType) => void;\n highlightedNode?: string | null;\n setHighlightedNode?: (id: string | null) => void;\n isDragging?: boolean;\n}\n\nconst NetworkGraphSvg = memo(function NetworkGraphSvg({\n nodeMapStruct = {},\n nodeMapVisual = {},\n linkMap = {},\n linkStyle = 'straight',\n showDirection = 'bidirection',\n preferPorts = 'none',\n hideTooltip = false,\n svgRef,\n zoomContainerRef,\n isReadyToRender,\n zoomLevel = 1,\n handleMouseUp,\n handleMouseDown,\n handleDrag,\n handleNodeClick,\n handleNodeMouseOver,\n handleNodeMouseOut,\n highlightedNode,\n setHighlightedNode = () => undefined,\n isDragging = false,\n}: NetworkGraphSvgProps): ReactElement {\n const graphId = useId();\n // state for popover\n const [open, setOpen] = useState(false);\n const [anchor, setAnchor] = useState(null);\n\n const handleAnchor = useCallback(el => setAnchor(el), []);\n const handleOpen = useCallback(() => {\n if (!hideTooltip) {\n setOpen(true);\n }\n }, [hideTooltip]);\n const handleRequestClose = useCallback(() => setOpen(false), []);\n\n const handleMouseMove = useCallback(\n e => {\n if (!handleDrag) return;\n const svg = e.currentTarget;\n const rect = svg.getBoundingClientRect();\n const viewBox = svg.viewBox?.baseVal;\n const width = viewBox?.width || svg.clientWidth || rect.width;\n const height = viewBox?.height || svg.clientHeight || rect.height;\n const scaleX = width / rect.width || 1;\n const scaleY = height / rect.height || 1;\n const x = (e.clientX - rect.left) * scaleX;\n const y = (e.clientY - rect.top) * scaleY;\n handleDrag(x, y);\n },\n [handleDrag]\n );\n\n const anchorId = anchor ? unsanitizeSvgId(anchor.id) : null;\n const anchorNodeVisual = anchorId ? nodeMapVisual[anchorId] : undefined;\n const headerValue = anchorNodeVisual?.tooltipHeader ?? '';\n const nodeFields = anchorNodeVisual?.tooltipFields ?? {};\n\n useEffect(() => {\n if (isReadyToRender) {\n select(svgRef?.current)\n .selectAll('circle')\n .on('mousedown', event => {\n // need to stop propogation when circle is clicked\n // because clicking a node means drilldown or drag, not pan\n // adding stopPropagation to the <circle> mouseDown itself does not work for some reason\n event.stopPropagation();\n handleMouseDown(event);\n });\n }\n }, [handleMouseDown, isReadyToRender, svgRef]);\n\n const { regularLinks, highlightedLinks } = Object.keys(linkMap).reduce(\n (acc, linkId) => {\n if (!isReadyToRender) return acc;\n const { source, target, color, width } = linkMap[linkId];\n if (!target) return acc; // Skip if no target for the source\n const sourcePosition = {\n x: nodeMapStruct[source]?.x,\n y: nodeMapStruct[source]?.y,\n };\n const targetPosition = {\n x: nodeMapStruct[target]?.x,\n y: nodeMapStruct[target]?.y,\n };\n\n // check if opposite direction link exists\n const oppositeLinkId = `${target}-${source}`;\n const isBidirectional = Object.keys(linkMap).includes(oppositeLinkId);\n const sourceAndTargetExist = nodeMapStruct[source] && nodeMapStruct[target];\n\n // if bidirectional, render link if source comes before target alphabetically\n // this will fail for self pointing nodes, need a separate case for that\n // also skip link if source or target node does not exist\n const shouldSkipLink =\n (showDirection !== 'oneWay' && isBidirectional && source > target) || !sourceAndTargetExist;\n\n if (shouldSkipLink) return acc;\n\n const sourceSize = nodeMapStruct[source]?.size;\n const targetSize = nodeMapStruct[target]?.size;\n const isHighlighted = shouldHighlightLink(source, target, highlightedNode);\n const linkDomId = `${graphId}-${source}-${target}`;\n\n const linkElement = (\n <Link\n key={`${source}-${target}`}\n id={linkDomId}\n sourcePosition={sourcePosition}\n targetPosition={targetPosition}\n linkStyle={linkStyle}\n preferPorts={preferPorts}\n isBidirectional={isBidirectional}\n showDirection={showDirection}\n sourceSize={sourceSize}\n targetSize={targetSize}\n color={color}\n width={width}\n />\n );\n\n if (isHighlighted) {\n acc.highlightedLinks.push(linkElement);\n } else {\n acc.regularLinks.push(linkElement);\n }\n\n return acc;\n },\n { regularLinks: [] as ReactElement[], highlightedLinks: [] as ReactElement[] }\n );\n\n return (\n <>\n {anchor && !hideTooltip && (\n <Tooltip\n open={open}\n anchor={anchor}\n onRequestClose={handleRequestClose}\n headerValue={headerValue}\n nodeFields={nodeFields}\n />\n )}\n\n <svg\n height=\"100%\"\n width=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n ref={svgRef}\n data-test=\"network-graph-svg\"\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n >\n <g ref={zoomContainerRef}>\n {/* Render links between nodes. Apply opacity in group level so there are no overlapping colors */}\n <g opacity={highlightedNode ? DIM_OPACITY : 1}>{regularLinks}</g>\n {highlightedLinks}\n {Object.keys(nodeMapStruct).map(id => {\n const nodeStruct = nodeMapStruct[id];\n const nodeVisual = nodeMapVisual[id];\n const isDimmed = shouldDimNode(nodeMapStruct[highlightedNode], id);\n return (\n isReadyToRender && (\n <Node\n key={id}\n id={id}\n index={nodeStruct?.index}\n label={nodeStruct?.label}\n value={nodeVisual?.value}\n x={nodeStruct?.x}\n y={nodeStruct?.y}\n size={nodeStruct?.size}\n color={nodeVisual?.color}\n icon={nodeVisual?.icon}\n iconColor={nodeVisual?.iconColor}\n zoomLevel={zoomLevel}\n isDimmed={isDimmed}\n handleNodeClick={handleNodeClick}\n handleNodeMouseOver={handleNodeMouseOver}\n handleNodeMouseOut={handleNodeMouseOut}\n setHighlightedNode={setHighlightedNode}\n handleOpen={handleOpen}\n handleAnchor={handleAnchor}\n handleRequestClose={handleRequestClose}\n isDragging={isDragging}\n />\n )\n );\n })}\n </g>\n </svg>\n </>\n );\n});\n\nexport default NetworkGraphSvg;\n", "import * as React from 'react';\nimport { useRef, useCallback, memo, useMemo } from 'react';\nimport styled from 'styled-components';\nimport { useSplunkTheme, variables } from '@splunk/themes';\nimport { createGUID } from '@splunk/ui-utils/id';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport RemoteIcon from '@splunk/visualizations-shared/RemoteIcon';\n\nimport iconLoader from '../utils/iconLoader';\n\nimport {\n DIM_OPACITY,\n RECT_HORIZONTAL_PADDING,\n RECT_VERTICAL_PADDING,\n LINE_HEIGHT,\n RECT_TOP_MARGIN,\n LABEL_FONT_SIZE,\n MAX_TEXT_WIDTH,\n FONT,\n sanitizeSvgId,\n truncateTextToMaxLines,\n getIconRenderInfo,\n} from '../utils/networkGraphUtils';\nimport { VIZ_FONT_FAMILY, computeTextWidth } from '../../../common/utils/textUtils';\nimport {\n DEFAULT_NODE_RADIUS,\n IconType,\n BuiltInIconType,\n NodeEventCallbackType,\n NodeEventCallbackWithPositionType,\n} from '../utils/networkGraphShared';\n\ninterface NodeProps {\n id: string;\n label?: string;\n x: number;\n y: number;\n zoomLevel?: number;\n icon?: IconType;\n color?: string;\n iconColor?: string;\n isDimmed?: boolean;\n index?: number;\n size?: number;\n value?: number;\n handleNodeClick?: (node: NodeEventCallbackType) => void;\n handleNodeMouseOver?: (node: NodeEventCallbackWithPositionType) => void;\n handleNodeMouseOut?: (node: NodeEventCallbackWithPositionType) => void;\n setHighlightedNode: (id: string | null) => void;\n handleOpen: () => void;\n handleAnchor: (anchor: any) => void;\n handleRequestClose: () => void;\n isDragging?: boolean;\n}\n\nconst NodeText = styled.text`\n font-family: ${VIZ_FONT_FAMILY};\n font-size: ${LABEL_FONT_SIZE}px;\n line-height: 16px;\n fill: ${variables.contentColorActive};\n pointer-events: none;\n user-select: none;\n -webkit-user-select: none;\n`;\n\nconst NodeRect = styled.rect`\n fill: ${variables.backgroundColorScrim};\n opacity: 0.8;\n rx: 4;\n ry: 4;\n`;\n\nconst NodeCircle = styled.circle<{\n color: string;\n}>`\n fill: ${props => props.color ?? variables.neutral100};\n cursor: pointer;\n`;\n\ntype SvgIconProps = {\n width: number;\n height: number;\n x: number;\n y: number;\n};\n\ntype IconComponentType = React.ComponentType<SvgIconProps>;\n\nconst IconElement = ({ icon, ...iconProps }: SvgIconProps & { icon: IconComponentType }) => {\n const IconComponent = icon;\n if (!IconComponent) {\n return null;\n }\n return <IconComponent {...iconProps} />;\n};\n\nconst isBuiltInIcon = (icon?: IconType): icon is BuiltInIconType =>\n typeof icon === 'string' && Object.hasOwn(iconLoader, icon);\n\nconst NodeIcon = styled(IconElement)<{\n color: string;\n opacity: number;\n}>`\n fill: ${props => props.color || variables.contentColorActive};\n pointer-events: none;\n opacity: ${props => props.opacity};\n user-select: none;\n -webkit-user-select: none;\n`;\n\nconst Node = memo(function Node(props: NodeProps) {\n const theme = useSplunkTheme();\n const {\n id,\n label,\n x,\n y,\n icon,\n color,\n iconColor,\n index,\n value,\n isDimmed,\n handleNodeClick,\n handleNodeMouseOver,\n handleNodeMouseOut,\n setHighlightedNode,\n handleOpen,\n handleAnchor,\n handleRequestClose,\n isDragging = false,\n } = props;\n const circleRef = useRef(null);\n const truncatedText = truncateTextToMaxLines(label, FONT, MAX_TEXT_WIDTH, 2);\n const textWidth = Math.max(...truncatedText.map(line => computeTextWidth(line, FONT)));\n const sanitizedId = sanitizeSvgId(id);\n const opacity = isDimmed ? DIM_OPACITY : 1;\n const zoomLevel = props.zoomLevel ?? 1;\n const diameter = props?.size ?? DEFAULT_NODE_RADIUS * 2;\n const currentSize = diameter * zoomLevel;\n const shouldHideIcon = currentSize < 16;\n const radius = diameter / 2;\n const iconSize = radius;\n const iconX = x - iconSize / 2;\n const iconY = y - iconSize / 2;\n const { iconUrl, shouldRenderRemoteIcon } = useMemo(() => getIconRenderInfo(icon), [icon]);\n const builtInIcon = useMemo(() => (isBuiltInIcon(icon) ? icon : null), [icon]);\n const [IconComponent, setIconComponent] = React.useState<IconComponentType | null>(null);\n\n React.useEffect(() => {\n if (!builtInIcon) {\n setIconComponent(null);\n return;\n }\n\n let isMounted = true;\n\n const loadIcon = async () => {\n const loadIconFn = iconLoader[builtInIcon];\n if (!loadIconFn) {\n if (isMounted) {\n setIconComponent(null);\n }\n return;\n }\n\n try {\n const importedIcon = await loadIconFn();\n if (isMounted) {\n setIconComponent(() => importedIcon.default);\n }\n } catch {\n if (isMounted) {\n setIconComponent(null);\n }\n }\n };\n\n loadIcon();\n\n // cleanup function to prevent setting state on an unmounted component\n // eslint-disable-next-line consistent-return\n return () => {\n isMounted = false;\n };\n }, [builtInIcon]);\n\n const nodeClickHandler = useCallback(() => {\n if (handleNodeClick) {\n handleNodeClick({ id, value, index });\n }\n }, [handleNodeClick, id, value, index]);\n const onKeyDown = useCallback(\n (event: React.KeyboardEvent<SVGCircleElement>) => {\n if (event.repeat) {\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n nodeClickHandler();\n }\n },\n [nodeClickHandler]\n );\n\n // highlight neighbor nodes and links on mouse enter\n const nodeWithPosition = useMemo(\n () => ({ id, value, index, x, y, size: diameter }),\n [id, index, value, x, y, diameter]\n );\n\n const onMouseEnter = useCallback(() => {\n if (isDragging) {\n handleRequestClose();\n return;\n }\n setHighlightedNode(id);\n if (handleNodeMouseOver) {\n handleNodeMouseOver(nodeWithPosition);\n }\n // update tooltip\n handleOpen();\n handleAnchor(circleRef.current);\n }, [\n handleNodeMouseOver,\n id,\n nodeWithPosition,\n setHighlightedNode,\n handleOpen,\n handleAnchor,\n isDragging,\n handleRequestClose,\n ]);\n\n // undo highlight on neighbor nodes and links on mouse leave\n const onMouseLeave = useCallback(() => {\n if (isDragging) {\n return;\n }\n setHighlightedNode(null);\n if (handleNodeMouseOut) {\n handleNodeMouseOut(nodeWithPosition);\n }\n handleRequestClose();\n }, [handleNodeMouseOut, nodeWithPosition, setHighlightedNode, handleRequestClose, isDragging]);\n\n React.useEffect(() => {\n if (isDragging) {\n handleRequestClose();\n }\n }, [isDragging, handleRequestClose]);\n\n return (\n <>\n <NodeCircle\n data-test=\"node\"\n r={radius}\n cx={x}\n cy={y}\n width={diameter}\n height={diameter}\n id={sanitizedId}\n ref={circleRef}\n tabIndex={0}\n role=\"button\"\n aria-label={label || _('Node')}\n color={color}\n opacity={opacity}\n onClick={nodeClickHandler}\n onKeyDown={onKeyDown}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onFocus={onMouseEnter}\n onBlur={onMouseLeave}\n />\n {!!IconComponent && !shouldHideIcon && (\n <NodeIcon\n data-test=\"node-icon\"\n icon={IconComponent}\n color={iconColor}\n width={iconSize}\n height={iconSize}\n x={iconX}\n y={iconY}\n opacity={opacity}\n />\n )}\n {shouldRenderRemoteIcon && iconUrl && !shouldHideIcon && (\n <g opacity={opacity}>\n <foreignObject\n data-test=\"node-icon\"\n x={iconX}\n y={iconY}\n width={iconSize}\n height={iconSize}\n style={{ pointerEvents: 'none', userSelect: 'none', WebkitUserSelect: 'none' }}\n >\n <RemoteIcon\n iconURL={iconUrl}\n color={iconColor ?? theme.contentColorActive}\n width={iconSize}\n height={iconSize}\n />\n </foreignObject>\n </g>\n )}\n <NodeRect\n x={x - textWidth / 2 - RECT_HORIZONTAL_PADDING}\n y={y + radius + RECT_TOP_MARGIN}\n width={textWidth + RECT_HORIZONTAL_PADDING * 2}\n height={LINE_HEIGHT * truncatedText.length + RECT_VERTICAL_PADDING * 2}\n />\n <NodeText x={x} y={y + radius + RECT_TOP_MARGIN} textAnchor=\"middle\">\n {truncatedText.map(line => (\n <tspan key={createGUID()} x={x} dy={LINE_HEIGHT} opacity={opacity}>\n {line}\n </tspan>\n ))}\n </NodeText>\n </>\n );\n});\n\nexport default Node;\n", "\nimport * as defaultImport from \"@splunk/themes\";\nexport * from \"@splunk/themes\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/RemoteIcon\";\nexport * from \"@splunk/visualizations-shared/RemoteIcon\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "const iconLoader = {\n arrowsDoubleLeftRight: () => import('@splunk/react-icons/ArrowsDoubleLeftRight.js'),\n arrowsFourRightLeftUpDown: () => import('@splunk/react-icons/ArrowsFourRightLeftUpDown.js'),\n arrowsFourTowardUp: () => import('@splunk/react-icons/ArrowsFourTowardUp.js'),\n bell: () => import('@splunk/react-icons/Bell.js'),\n bookshelf: () => import('@splunk/react-icons/Bookshelf.js'),\n buildings: () => import('@splunk/react-icons/Buildings.js'),\n cellularGateway: () => import('@splunk/react-icons/CellularGateway.js'),\n chartColumnMagnifier: () => import('@splunk/react-icons/ChartColumnMagnifier.js'),\n chartColumnSquare: () => import('@splunk/react-icons/ChartColumnSquare.js'),\n checkCircle: () => import('@splunk/react-icons/CheckCircle.js'),\n chevronsSlash: () => import('@splunk/react-icons/ChevronsSlash.js'),\n cloud: () => import('@splunk/react-icons/Cloud.js'),\n cogChevronsSlash: () => import('@splunk/react-icons/CogChevronsSlash.js'),\n containership: () => import('@splunk/react-icons/Containership.js'),\n cube: () => import('@splunk/react-icons/Cube.js'),\n cylinder: () => import('@splunk/react-icons/Cylinder.js'),\n cylinderIndexTable: () => import('@splunk/react-icons/CylinderIndexTable.js'),\n cylinderMetrics: () => import('@splunk/react-icons/CylinderMetrics.js'),\n cylinderMulti: () => import('@splunk/react-icons/CylinderMulti.js'),\n cylinderTrace: () => import('@splunk/react-icons/CylinderTrace.js'),\n cylinderWaves: () => import('@splunk/react-icons/CylinderWaves.js'),\n deviceEdgeHub: () => import('@splunk/react-icons/DeviceEdgeHub.js'),\n deviceSignalWaves: () => import('@splunk/react-icons/DeviceSignalWaves.js'),\n dotsThreeBalloon: () => import('@splunk/react-icons/DotsThreeBalloon.js'),\n drive: () => import('@splunk/react-icons/Drive.js'),\n driveIndexTable: () => import('@splunk/react-icons/DriveIndexTable.js'),\n driveMagnifier: () => import('@splunk/react-icons/DriveMagnifier.js'),\n driveSliders: () => import('@splunk/react-icons/DriveSliders.js'),\n envelope: () => import('@splunk/react-icons/Envelope.js'),\n ethernetPort: () => import('@splunk/react-icons/EthernetPort.js'),\n exclamationTriangle: () => import('@splunk/react-icons/ExclamationTriangle.js'),\n factory: () => import('@splunk/react-icons/Factory.js'),\n file: () => import('@splunk/react-icons/File.js'),\n fileLogs: () => import('@splunk/react-icons/FileLogs.js'),\n filter: () => import('@splunk/react-icons/Filter.js'),\n folder: () => import('@splunk/react-icons/Folder.js'),\n forwarderHeavy: () => import('@splunk/react-icons/ForwarderHeavy.js'),\n forwarderUniversal: () => import('@splunk/react-icons/ForwarderUniversal.js'),\n gate: () => import('@splunk/react-icons/Gate.js'),\n globe: () => import('@splunk/react-icons/Globe.js'),\n identityCard: () => import('@splunk/react-icons/IdentityCard.js'),\n informationCircle: () => import('@splunk/react-icons/InformationCircle.js'),\n informationDiamond: () => import('@splunk/react-icons/InformationDiamond.js'),\n laptopOpen: () => import('@splunk/react-icons/LaptopOpen.js'),\n layout: () => import('@splunk/react-icons/Layout.js'),\n license: () => import('@splunk/react-icons/License.js'),\n mobilePhone: () => import('@splunk/react-icons/MobilePhone.js'),\n monitor: () => import('@splunk/react-icons/Monitor.js'),\n monitorPhone: () => import('@splunk/react-icons/MonitorPhone.js'),\n networkDevice: () => import('@splunk/react-icons/NetworkDevice.js'),\n nodeBranch: () => import('@splunk/react-icons/NodeBranch.js'),\n nodeModel: () => import('@splunk/react-icons/NodeModel.js'),\n nodeTopology: () => import('@splunk/react-icons/NodeTopology.js'),\n picture: () => import('@splunk/react-icons/Picture.js'),\n portrait: () => import('@splunk/react-icons/Portrait.js'),\n portraitsTwo: () => import('@splunk/react-icons/PortraitsTwo.js'),\n printer: () => import('@splunk/react-icons/Printer.js'),\n processor: () => import('@splunk/react-icons/Processor.js'),\n reportDouble: () => import('@splunk/react-icons/ReportDouble.js'),\n securityCamera: () => import('@splunk/react-icons/SecurityCamera.js'),\n servers: () => import('@splunk/react-icons/Servers.js'),\n serversCloud: () => import('@splunk/react-icons/ServersCloud.js'),\n shoppingCart: () => import('@splunk/react-icons/ShoppingCart.js'),\n signalWavesAngled: () => import('@splunk/react-icons/SignalWavesAngled.js'),\n singleIndex: () => import('@splunk/react-icons/SingleIndex.js'),\n slidersTripleHorizontal: () => import('@splunk/react-icons/SlidersTripleHorizontal.js'),\n squaresAndCircles: () => import('@splunk/react-icons/SquaresAndCircles.js'),\n star: () => import('@splunk/react-icons/Star.js'),\n store: () => import('@splunk/react-icons/Store.js'),\n telescope: () => import('@splunk/react-icons/Telescope.js'),\n token: () => import('@splunk/react-icons/Token.js'),\n truck: () => import('@splunk/react-icons/Truck.js'),\n wallBricks: () => import('@splunk/react-icons/WallBricks.js'),\n wifiSignal: () => import('@splunk/react-icons/WiFiSignal.js'),\n};\n\nexport default iconLoader;\n", "import * as React from 'react';\nimport { useRef, memo } from 'react';\nimport styled from 'styled-components';\nimport { variables } from '@splunk/themes';\nimport {\n LinkStyleType,\n PreferPortsType,\n getEdgePath,\n sanitizeSvgId,\n getArrowHeight,\n getArrowWidth,\n getLinkRenderInfo,\n} from '../utils/networkGraphUtils';\nimport { DEFAULT_LINK_WIDTH, NodePositionType } from '../utils/networkGraphShared';\n\ninterface LinkProps {\n id: string;\n sourcePosition: NodePositionType;\n targetPosition: NodePositionType;\n linkStyle?: LinkStyleType;\n isBidirectional: boolean;\n color?: string;\n showDirection?: 'bidirection' | 'oneWay' | 'none';\n preferPorts?: PreferPortsType;\n sourceSize?: number;\n targetSize?: number;\n width?: number;\n}\n\nconst LinkPath = styled.path<{\n edgeWidth: number;\n color: string;\n}>`\n fill: none;\n stroke: ${props => props.color ?? variables.borderColorStrong};\n stroke-width: ${props => props.edgeWidth}px;\n pointer-events: none;\n stroke-linecap: butt;\n`;\n\nconst StyledPolygon = styled.polygon<{\n color: string;\n}>`\n fill: ${props => props.color ?? variables.borderColorStrong};\n`;\n\ninterface ArrowMarkerProps {\n id: string;\n orient: string;\n arrowWidth: number;\n arrowHeight: number;\n color?: string;\n}\n\nconst ArrowMarker = memo(function ArrowMarker({\n id,\n orient,\n arrowWidth,\n arrowHeight,\n color,\n}: ArrowMarkerProps) {\n // note: from the designs, arrowHeight is the horizontal size and arrowWidth is vertical, when the arrow looks like -->\n // this is slightly confusing because markerWidth and markerHeight is the opposite.\n return (\n <marker\n id={id}\n markerWidth={arrowHeight}\n markerHeight={arrowWidth}\n // add small offset to refX to remove gap between arrowhead and line when set to 0\n refX={0.5}\n refY={arrowWidth / 2}\n orient={orient}\n markerUnits=\"userSpaceOnUse\"\n >\n <StyledPolygon points={`0 0, ${arrowHeight} ${arrowWidth / 2}, 0 ${arrowWidth}`} color={color} />\n </marker>\n );\n});\n\nconst Link = memo(function Link(props: LinkProps) {\n const {\n id,\n sourcePosition,\n targetPosition,\n linkStyle,\n isBidirectional,\n color,\n showDirection,\n preferPorts,\n sourceSize,\n targetSize,\n width,\n } = props;\n const edgeWidth = Number.isFinite(width) ? width : DEFAULT_LINK_WIDTH;\n const linkRef = useRef(null);\n const sanitizedId = sanitizeSvgId(id); // sanitize id for use in SVG\n const arrowWidth = getArrowWidth(edgeWidth);\n const arrowHeight = getArrowHeight(edgeWidth, arrowWidth);\n // hide arrow and use straight linkstyle if the distance between source and target is too small\n const { effectiveLinkStyle, effectiveShowDirection } = getLinkRenderInfo({\n linkStyle,\n showDirection,\n preferPorts,\n sourcePosition,\n targetPosition,\n sourceSize,\n targetSize,\n arrowHeight,\n });\n\n const linkPath = getEdgePath({\n linkStyle: effectiveLinkStyle,\n sourcePosition,\n targetPosition,\n isBidirectional,\n showDirection: effectiveShowDirection,\n arrowHeight,\n arrowWidth,\n preferPorts,\n sourceNodeSize: sourceSize,\n targetNodeSize: targetSize,\n linkWidth: edgeWidth,\n });\n\n return (\n <g id={`link-${sanitizedId}`} ref={linkRef} data-test=\"link\">\n <defs>\n <ArrowMarker\n id={`arrowhead-${sanitizedId}`}\n orient=\"auto\"\n arrowWidth={arrowWidth}\n arrowHeight={arrowHeight}\n color={color}\n />\n <ArrowMarker\n id={`arrowhead-${sanitizedId}-opposite`}\n orient=\"auto-start-reverse\"\n arrowWidth={arrowWidth}\n arrowHeight={arrowHeight}\n color={color}\n />\n </defs>\n <LinkPath\n data-test=\"linkpath\"\n d={linkPath}\n color={color}\n edgeWidth={edgeWidth}\n id={`linkpath-${sanitizedId}`}\n markerEnd={effectiveShowDirection === 'none' ? undefined : `url(#arrowhead-${sanitizedId})`}\n markerStart={\n isBidirectional && effectiveShowDirection === 'bidirection'\n ? `url(#arrowhead-${sanitizedId}-opposite)`\n : undefined\n }\n />\n </g>\n );\n});\n\nexport default Link;\n", "import * as React from 'react';\nimport styled from 'styled-components';\nimport Popover from '@splunk/react-ui/Popover';\nimport { variables } from '@splunk/themes';\nimport { _ } from '@splunk/ui-utils/i18n';\n\nimport { MetaDataType } from '../utils/networkGraphShared';\n\ninterface TooltipProps {\n open: boolean;\n anchor: HTMLElement | null;\n headerValue: MetaDataType | MetaDataType[];\n nodeFields?: Record<string, MetaDataType | MetaDataType[]>;\n onRequestClose: () => void;\n}\n\nconst StyledPopover = styled(Popover)`\n font-size: ${variables.fontSizeSmall};\n max-width: 80ch;\n width: fit-content;\n`;\n\nconst Title = styled.div`\n font-weight: ${variables.fontWeightSemiBold};\n font-size: ${variables.fontSize};\n margin-bottom: 2px;\n color: ${variables.contentColorActive};\n`;\n\nconst StyledTable = styled.table`\n width: 100%;\n border-collapse: collapse;\n table-layout: auto;\n`;\n\nconst StyledLabelCell = styled.td`\n padding-right: 10px;\n color: ${variables.contentColorActive};\n white-space: normal;\n vertical-align: top;\n word-break: break-word;\n max-width: 34ch;\n min-width: 10ch;\n`;\n\nconst StyledValueCell = styled.td`\n text-align: right;\n color: ${variables.contentColorActive};\n white-space: pre-wrap;\n word-break: break-word;\n vertical-align: top;\n`;\n\nconst StyledWrapper = styled.div`\n padding: ${variables.spacingMedium};\n`;\n\nconst Tooltip = ({\n open,\n anchor,\n headerValue,\n nodeFields = {},\n onRequestClose,\n}: TooltipProps): React.ReactElement => (\n <StyledPopover\n data-test=\"network-graph-tooltip\"\n open={open}\n anchor={anchor}\n onRequestClose={onRequestClose}\n defaultPlacement=\"above\"\n >\n <StyledWrapper>\n <Title>{headerValue}</Title>\n <StyledTable>\n <tbody>\n {Object.entries(nodeFields).map(([field, value]) => (\n <tr key={field}>\n <StyledLabelCell>{_(field)}</StyledLabelCell>\n <StyledValueCell>{_(String(value))}</StyledValueCell>\n </tr>\n ))}\n </tbody>\n </StyledTable>\n </StyledWrapper>\n </StyledPopover>\n);\n\nexport default Tooltip;\n", "\nimport * as defaultImport from \"@splunk/react-ui/Popover\";\nexport * from \"@splunk/react-ui/Popover\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "// make a react component for ZoomControls\nimport * as React from 'react';\nimport { memo } from 'react';\nimport styled from 'styled-components';\nimport Plus from '@splunk/react-icons/Plus';\nimport Minus from '@splunk/react-icons/Minus';\nimport SquareAndCorners from '@splunk/react-icons/SquareAndCorners';\nimport Button from '@splunk/react-ui/Button';\nimport Tooltip from '@splunk/react-ui/Tooltip';\nimport variables from '@splunk/themes/variables';\nimport { _ } from '@splunk/ui-utils/i18n';\n\ninterface ZoomControlsProps {\n hideReset?: boolean;\n hideZoomControls?: boolean;\n handleZoomIn: () => void;\n handleZoomOut?: () => void;\n handleReset: () => void;\n disableZoomIn?: boolean;\n disableZoomOut?: boolean;\n}\n\nconst StyledZoomControlsContainer = styled.div`\n position: absolute;\n top: 16px;\n left: 16px;\n z-index: 2;\n`;\n\nconst StyledBaseContainer = styled.div`\n position: absolute;\n z-index: 2;\n width: 40px;\n border-radius: 4px;\n box-shadow: ${variables.overlayShadow};\n background-color: ${variables.backgroundColorPopup};\n`;\n\nconst StyledResetContainer = styled(StyledBaseContainer)<{ moveToTop?: boolean }>`\n top: ${props => (props.moveToTop ? 0 : '88px')};\n height: 40px;\n`;\n\nconst StyledButton = styled(Button)`\n width: 40px;\n height: 40px;\n svg {\n width: 24px;\n height: 24px;\n }\n`;\n\nconst StyledZoomInButton = styled(StyledButton)`\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n`;\n\nconst StyledZoomOutButton = styled(StyledButton)`\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n`;\n\nconst ZoomControls = memo(function ZoomControls(props: ZoomControlsProps) {\n const {\n handleZoomIn,\n handleZoomOut,\n handleReset,\n hideReset = false,\n hideZoomControls = false,\n disableZoomIn = false,\n disableZoomOut = false,\n } = props;\n return (\n <StyledZoomControlsContainer data-test=\"zoom-controls-container\">\n {!hideZoomControls && (\n <StyledBaseContainer data-test=\"zoom-buttons-container\">\n <Tooltip contentRelationship=\"label\" content={_('Zoom in')}>\n <StyledZoomInButton\n icon={<Plus />}\n appearance=\"subtle\"\n onClick={handleZoomIn}\n disabled={disableZoomIn}\n data-test=\"zoom-in-button\"\n />\n </Tooltip>\n <Tooltip contentRelationship=\"label\" content={_('Zoom out')}>\n <StyledZoomOutButton\n icon={<Minus />}\n appearance=\"subtle\"\n onClick={handleZoomOut}\n disabled={disableZoomOut}\n data-test=\"zoom-out-button\"\n />\n </Tooltip>\n </StyledBaseContainer>\n )}\n\n {!hideReset && (\n <StyledResetContainer moveToTop={hideZoomControls} data-test=\"reset-button-container\">\n <Tooltip contentRelationship=\"label\" content={_('Reset zoom')}>\n <StyledButton\n icon={<SquareAndCorners />}\n appearance=\"subtle\"\n onClick={handleReset}\n data-test=\"reset-button\"\n />\n </Tooltip>\n </StyledResetContainer>\n )}\n </StyledZoomControlsContainer>\n );\n});\n\nexport default ZoomControls;\n", "\nimport * as defaultImport from \"@splunk/react-icons/Plus\";\nexport * from \"@splunk/react-icons/Plus\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Minus\";\nexport * from \"@splunk/react-icons/Minus\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/SquareAndCorners\";\nexport * from \"@splunk/react-icons/SquareAndCorners\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-ui/Button\";\nexport * from \"@splunk/react-ui/Button\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-ui/Tooltip\";\nexport * from \"@splunk/react-ui/Tooltip\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import { _ } from '@splunk/ui-utils/i18n';\nimport { defaultPalettesConfig } from '@splunk/visualization-color-palettes/editors/PresetPalettes';\nimport { NetworkGraph as NetworkGraphIcon } from '@splunk/visualization-icons';\nimport { NetworkGraph as NetworkGraphPlaceholderIcon } from '@splunk/visualization-icons/placeholders';\nimport { networkGraphOptionsSchema as optionsSchema } from '@splunk/visualization-schemas';\nimport { variables } from '@splunk/themes';\nimport { DataContract } from '../common/interfaces/DataContract';\nimport { DefaultContext } from '../common/interfaces/DefaultContext';\nimport { EditorConfig } from '../common/interfaces/Editor';\nimport { ThemedDefaults } from '../common/interfaces/ThemedDefaults';\nimport { VizBehavior } from '../common/interfaces/VizBehavior';\nimport { VizCategory } from '../common/interfaces/VizCategory';\nimport { VizConfig } from '../common/interfaces/VizConfig';\nimport { VizSize } from '../common/interfaces/VizSize';\nimport { enhanceConfig } from '../common/utils/configUtils';\nimport { DEFAULT_CHART_HEIGHT, DEFAULT_CHART_WIDTH } from './PureNetworkGraph/utils/networkGraphShared';\nimport { defaultBackgroundColor } from '../common/ThemedDefaults';\nimport getBackgroundColorEditor from '../common/editorConfig/BackgroundColor';\nimport { getDefaultPreferPorts } from './PureNetworkGraph/utils/networkGraphUtils';\n\nconst isDynamicOption = (option, valuesName, contextName) => {\n if (\n option &&\n typeof option === 'string' &&\n (option.trim().startsWith(`> ${valuesName} | gradient(${contextName})`) ||\n option.trim().startsWith(`> ${valuesName} | rangeValue(${contextName})`) ||\n option.trim().startsWith(`> ${valuesName} | matchValue(${contextName})`))\n ) {\n return true;\n }\n return false;\n};\n\nconst defaultContext: DefaultContext = {\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};\n\nconst dataContract: DataContract = {\n requiredDataSources: [\n {\n name: 'primary',\n description: 'DataSource that powers the visualization',\n },\n ],\n optionalDataSources: [\n {\n name: 'nodeSource',\n description: 'DataSource that populates node data',\n },\n ],\n initialRequestParams: {\n primary: { offset: 0, count: 10000 },\n },\n};\n\nconst size: VizSize = {\n initialWidth: DEFAULT_CHART_WIDTH,\n initialHeight: DEFAULT_CHART_HEIGHT,\n};\n\nconst themes: ThemedDefaults = {\n defaultBackgroundColor,\n defaultNodeColor: props => variables.neutral100(props),\n defaultNodeIconColor: props => variables.contentColorActive(props),\n defaultLinkColor: props => variables.borderColorStrong(props),\n};\n\nconst editorConfig: EditorConfig[] = [\n {\n label: _('Data configurations'),\n layout: [\n [\n {\n label: _('Source'),\n option: 'source',\n editor: 'editor.columnSelector',\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n filterByTypes: ['string', 'number'],\n },\n },\n ],\n [\n {\n label: _('Target'),\n option: 'target',\n editor: 'editor.columnSelector',\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n filterByTypes: ['string', 'number'],\n },\n },\n ],\n [\n {\n label: _('Node labels'),\n option: 'nodeTexts',\n editor: 'editor.columnSelector',\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n filterByTypes: ['string'],\n },\n },\n ],\n [\n {\n label: _('Node values'),\n option: 'nodeValues',\n editor: 'editor.columnSelector',\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n filterByTypes: ['number'],\n },\n },\n ],\n [\n {\n label: _('Tooltip header field'),\n option: 'tooltipHeaderField',\n editor: 'editor.columnSelector',\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n shouldShowInternalFields: false,\n },\n },\n ],\n [\n {\n label: _('Tooltip node fields'),\n option: 'tooltipNodeFields',\n editor: 'editor.columnMultiSelectionByFieldNameEditor',\n },\n ],\n [\n {\n label: _('Result limit'),\n option: 'resultLimit',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n step: 1,\n max: 10000,\n },\n },\n ],\n ],\n },\n {\n label: _('Data display'),\n layout: [\n [\n {\n label: _('Layout'),\n option: 'layout',\n editor: 'editor.select',\n editorProps: {\n values: [\n {\n label: _('Grid'),\n value: 'grid',\n description: _('Arrange nodes in a grid layout.'),\n },\n {\n label: _('Preset'),\n value: 'preset',\n description: _('Use predefined positions for nodes.'),\n },\n {\n label: _('Hierarchical'),\n value: 'hierarchical',\n description: _('Arrange nodes in a hierarchy.'),\n },\n {\n label: _('Force'),\n value: 'force',\n description: _('Use a force-directed layout.'),\n },\n ],\n help: _('Some nodes may have custom positions. Changing the layout will reset them.'),\n showHelp: ({ options }) => options.layout === 'force',\n },\n },\n ],\n // grid only options\n [\n {\n label: _('Grid columns'),\n option: 'gridColumns',\n editor: 'editor.number',\n editorProps: {\n min: 1,\n // max should be same as result limit\n max: 1000,\n step: 1,\n },\n showEditor: ({ options }) => options.layout === 'grid' || options.layout === undefined,\n },\n ],\n // preset only options\n [\n {\n label: _('X positions'),\n option: 'xPositions',\n editor: 'editor.columnSelector',\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n filterByTypes: ['number'],\n },\n showEditor: ({ options }) => options.layout === 'preset',\n },\n ],\n [\n {\n label: _('Y positions'),\n option: 'yPositions',\n editor: 'editor.columnSelector',\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n filterByTypes: ['number'],\n },\n showEditor: ({ options }) => options.layout === 'preset',\n },\n ],\n // hierarchical only options\n [\n {\n label: _('Hierarchy direction'),\n option: 'hierarchyDirection',\n editor: 'editor.select',\n editorProps: {\n values: [\n { label: _('Top to Bottom'), value: 'topBottom' },\n { label: _('Bottom to Top'), value: 'bottomTop' },\n { label: _('Left to Right'), value: 'leftRight' },\n { label: _('Right to Left'), value: 'rightLeft' },\n ],\n },\n showEditor: ({ options }) => options.layout === 'hierarchical',\n },\n ],\n // force only options\n [\n {\n label: _('Charge strength'),\n option: 'chargeStrength',\n editor: 'editor.number',\n editorProps: {\n help: _(\n 'Strength of positive charge (attraction) or negative charge (repulsion) between nodes.'\n ),\n helpFormat: 'tooltip',\n step: 1,\n },\n showEditor: ({ options }) => options.layout === 'force',\n },\n {\n label: _('Charge theta'),\n option: 'chargeTheta',\n editor: 'editor.number',\n editorProps: {\n help: _(\n 'Higher value means faster performance but less predictable node positioning.'\n ),\n helpFormat: 'tooltip',\n step: 0.1,\n min: 0,\n },\n showEditor: ({ options }) => options.layout === 'force',\n },\n ],\n [\n {\n label: _('Charge distance minimum'),\n option: 'chargeDistanceMin',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n step: 1,\n help: _('Minimum distance between nodes to apply the charge force to.'),\n helpFormat: 'tooltip',\n },\n showEditor: ({ options }) => options.layout === 'force',\n },\n ],\n [\n {\n label: _('Charge distance maximum'),\n option: 'chargeDistanceMax',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n step: 1,\n help: _('Maximum distance between nodes to apply the charge force to.'),\n helpFormat: 'tooltip',\n },\n showEditor: ({ options }) => options.layout === 'force',\n },\n ],\n [\n {\n label: _('Collider padding'),\n option: 'collidePadding',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n step: 1,\n help: _('Padding around nodes for repulsion between nodes or clusters.'),\n helpFormat: 'tooltip',\n },\n showEditor: ({ options }) => options.layout === 'force',\n },\n {\n label: _('Collider strength'),\n option: 'collideStrength',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n step: 0.1,\n help: _('Strength of the collider used for node repulsion.'),\n helpFormat: 'tooltip',\n },\n showEditor: ({ options }) => options.layout === 'force',\n },\n ],\n [\n {\n label: _('Node cluster types'),\n option: 'nodeTypes',\n editor: 'editor.columnSelector',\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n tooltip: _('Array of node types used for clustering.'),\n filterByTypes: ['string'],\n },\n showEditor: ({ options }) => options.layout === 'force',\n },\n ],\n [\n {\n label: _('Cluster strength'),\n option: 'clusterStrength',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n max: 1,\n step: 0.01,\n help: _('Strength of clustering force between nodes of the same type.'),\n helpFormat: 'tooltip',\n },\n showEditor: ({ options }) =>\n options.layout === 'force' && options.nodeTypes !== undefined,\n },\n ],\n [\n {\n label: _('Link distance'),\n option: 'linkDistance',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n step: 1,\n help: _('Ideal distance between linked nodes. Enter a higher value for more space.'),\n helpFormat: 'tooltip',\n },\n showEditor: ({ options }) => options.layout === 'force',\n },\n {\n label: _('Link strength'),\n option: 'linkStrength',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n step: 0.1,\n help: _(\n 'Strength of spring force between linked nodes. Higher value makes link lengths closer to linkDistance.'\n ),\n helpFormat: 'tooltip',\n },\n showEditor: ({ options }) => options.layout === 'force',\n },\n ],\n [\n {\n label: _('Horizontal padding (px)'),\n option: 'nodeHorizontalPadding',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n step: 1,\n max: 500,\n },\n showEditor: ({ options }) =>\n options.layout === 'hierarchical' ||\n options.layout === 'grid' ||\n options.layout === undefined,\n },\n {\n label: _('Vertical padding (px)'),\n option: 'nodeVerticalPadding',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n step: 1,\n max: 500,\n },\n showEditor: ({ options }) =>\n options.layout === 'hierarchical' ||\n options.layout === 'grid' ||\n options.layout === undefined,\n },\n ],\n [\n {\n label: _('Link direction'),\n option: 'showDirection',\n editor: 'editor.radioBar',\n editorProps: {\n values: [\n { label: _('Bi-direction'), value: 'bidirection' },\n { label: _('One-way'), value: 'oneWay' },\n { label: _('None'), value: 'none' },\n ],\n },\n },\n ],\n [\n {\n label: _('Link connection style'),\n option: 'linkStyle',\n editor: 'editor.select',\n editorProps: {\n values: [\n { label: _('Straight'), value: 'straight' },\n { label: _('C Shape'), value: 'c' },\n { label: _('S Shape'), value: 's' },\n { label: _('Z Shape'), value: 'z' },\n ],\n },\n },\n ],\n [\n {\n label: _('Link port preference'),\n option: 'preferPorts',\n editor: 'editor.radioBar',\n editorProps: {\n values: [\n { label: _('Horizontal'), value: 'horizontal' },\n { label: _('Vertical'), value: 'vertical' },\n { label: _('None'), value: 'none' },\n ],\n },\n showEditor: ({ options }) => options.linkStyle === 's' || options.linkStyle === 'z',\n overrideDefaultValue: ({ options }) =>\n getDefaultPreferPorts(options?.layout, options?.hierarchyDirection),\n },\n ],\n [\n {\n label: _('Show zoom controls'),\n option: 'showZoomControls',\n editor: 'editor.checkbox',\n editorProps: {\n labelPosition: 'right',\n },\n },\n ],\n ],\n },\n {\n label: _('Color and style'),\n layout: [\n getBackgroundColorEditor({ themes }),\n\n [\n {\n label: _('Node color'),\n filterKeywords: ['range', 'match', 'gradient', 'dynamic coloring'],\n option: 'nodeColors',\n context: 'nodeColorsEditorConfig',\n editor: 'editor.networkGraphDynamicColor',\n editorProps: {\n themes,\n contextName: 'nodeColorsEditorConfig',\n defaultStaticColorValue: '> themes.defaultNodeColor',\n flyoutTitle: _('Dynamic coloring'),\n formatters: [\n {\n label: _('Gradient'),\n value: 'gradient',\n isDefault: true,\n defaults: {\n nodeColorValues: defaultContext.colorGradientConfig,\n },\n },\n {\n label: _('Ranges'),\n value: 'rangeValue',\n defaults: {\n nodeColorValues: defaultContext.colorRangeConfig,\n },\n },\n {\n label: _('Matches'),\n value: 'matchValue',\n defaults: {\n nodeColorValues: defaultContext.colorMatchConfig,\n },\n },\n ],\n dataSelectors: [\n {\n label: _('Node color values'),\n value: 'nodeColorValues',\n },\n ],\n defaultPalettesConfig,\n },\n },\n ],\n [\n {\n label: _('Node color data'),\n option: 'nodeColorValues',\n editor: 'editor.columnSelector',\n showEditor: ({ options }) =>\n isDynamicOption(options.nodeColors, 'nodeColorValues', 'nodeColorsEditorConfig'),\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n hideEditorWhenLoading: true,\n },\n },\n ],\n [\n {\n label: _('Node icon color'),\n filterKeywords: ['range', 'match', 'gradient', 'dynamic coloring'],\n option: 'nodeIconColors',\n editor: 'editor.networkGraphDynamicColor',\n context: 'nodeIconColorsEditorConfig',\n editorProps: {\n themes,\n contextName: 'nodeIconColorsEditorConfig',\n defaultStaticColorValue: '> themes.defaultNodeIconColor',\n flyoutTitle: _('Dynamic coloring'),\n formatters: [\n {\n label: _('Gradient'),\n value: 'gradient',\n isDefault: true,\n defaults: {\n nodeIconColorValues: defaultContext.colorGradientConfig,\n },\n },\n {\n label: _('Ranges'),\n value: 'rangeValue',\n defaults: {\n nodeIconColorValues: defaultContext.colorRangeConfig,\n },\n },\n {\n label: _('Matches'),\n value: 'matchValue',\n defaults: {\n nodeIconColorValues: defaultContext.colorMatchConfig,\n },\n },\n ],\n dataSelectors: [\n {\n label: _('Node Icon color values'),\n value: 'nodeIconColorValues',\n },\n ],\n defaultPalettesConfig,\n },\n },\n ],\n [\n {\n label: _('Node icon color data'),\n option: 'nodeIconColorValues',\n editor: 'editor.columnSelector',\n showEditor: ({ options }) =>\n isDynamicOption(\n options.nodeIconColors,\n 'nodeIconColorValues',\n 'nodeIconColorsEditorConfig'\n ),\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n hideEditorWhenLoading: true,\n },\n },\n ],\n [\n {\n label: _('Link color'),\n filterKeywords: ['range', 'match', 'gradient', 'dynamic coloring'],\n option: 'linkColors',\n context: 'linkColorsEditorConfig',\n editor: 'editor.networkGraphDynamicColor',\n editorProps: {\n themes,\n contextName: 'linkColorsEditorConfig',\n defaultStaticColorValue: '> themes.defaultLinkColor',\n flyoutTitle: _('Dynamic coloring'),\n formatters: [\n {\n label: _('Gradient'),\n value: 'gradient',\n isDefault: true,\n defaults: {\n linkColorValues: defaultContext.colorGradientConfig,\n },\n },\n {\n label: _('Ranges'),\n value: 'rangeValue',\n defaults: {\n linkColorValues: defaultContext.colorRangeConfig,\n },\n },\n {\n label: _('Matches'),\n value: 'matchValue',\n defaults: {\n linkColorValues: defaultContext.colorMatchConfig,\n },\n },\n ],\n dataSelectors: [\n {\n label: _('Link color values'),\n value: 'linkColorValues',\n },\n ],\n defaultPalettesConfig,\n },\n },\n ],\n [\n {\n label: _('Link color data'),\n option: 'linkColorValues',\n editor: 'editor.columnSelector',\n showEditor: ({ options }) =>\n isDynamicOption(options.linkColors, 'linkColorValues', 'linkColorsEditorConfig'),\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n hideEditorWhenLoading: true,\n },\n },\n ],\n ],\n },\n];\n\n/**\n * visualization configuration\n */\nconst config: VizConfig = {\n /**\n * unique viz key\n */\n key: 'splunk.networkGraph',\n /**\n * viz name\n */\n name: 'NetworkGraph',\n category: VizCategory.FLOW,\n status: 'preview',\n /**\n * viz icon, this needs to be updated\n */\n icon: NetworkGraphIcon,\n placeholderIcon: NetworkGraphPlaceholderIcon,\n dataContract,\n size,\n defaultContext,\n optionsSchema,\n editorConfig,\n events: {\n 'node.click': {\n description: 'triggered when user clicks a node',\n },\n 'node.mouseOver': {\n description: 'triggered when user moves the cursor onto a node',\n },\n 'node.mouseOut': {\n description: 'triggered when user moves the cursor away from a node',\n },\n 'node.drag': {\n description: 'triggered when user drags a node',\n },\n },\n supports: [VizBehavior.DYNAMIC_OPTIONS, VizBehavior.EVENTS, VizBehavior.PLACEHOLDER],\n themes,\n requiredProps: [],\n};\n\nexport default enhanceConfig(config);\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/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", "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", "\nimport * as defaultImport from \"@splunk/visualizations-shared/configUtils\";\nexport * from \"@splunk/visualizations-shared/configUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\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", "\nimport * as defaultImport from \"@splunk/themes/pick\";\nexport * from \"@splunk/themes/pick\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import { _ } from '@splunk/ui-utils/i18n';\nimport { EditorLayoutConfig } from '../interfaces/Editor';\nimport { ThemedDefaults } from '../interfaces/ThemedDefaults';\n\ninterface backgroundEditorProps {\n label?: string;\n themes: ThemedDefaults;\n labelPosition?: string;\n}\n\nconst background: ({ label, themes, labelPosition }: backgroundEditorProps) => EditorLayoutConfig[] = ({\n label,\n themes,\n labelPosition,\n}) => [\n {\n label: _(label || 'Background color'),\n option: 'backgroundColor',\n editor: 'editor.color',\n editorProps: {\n labelPosition: labelPosition || 'top',\n themes,\n },\n },\n];\n\nexport default background;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["", "\nimport * as defaultImport from \"@splunk/react-icons/ArrowsDoubleLeftRight.js\";\nexport * from \"@splunk/react-icons/ArrowsDoubleLeftRight.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ArrowsFourRightLeftUpDown.js\";\nexport * from \"@splunk/react-icons/ArrowsFourRightLeftUpDown.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ArrowsFourTowardUp.js\";\nexport * from \"@splunk/react-icons/ArrowsFourTowardUp.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Bell.js\";\nexport * from \"@splunk/react-icons/Bell.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Bookshelf.js\";\nexport * from \"@splunk/react-icons/Bookshelf.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Buildings.js\";\nexport * from \"@splunk/react-icons/Buildings.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/CellularGateway.js\";\nexport * from \"@splunk/react-icons/CellularGateway.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ChartColumnMagnifier.js\";\nexport * from \"@splunk/react-icons/ChartColumnMagnifier.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ChartColumnSquare.js\";\nexport * from \"@splunk/react-icons/ChartColumnSquare.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/CheckCircle.js\";\nexport * from \"@splunk/react-icons/CheckCircle.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ChevronsSlash.js\";\nexport * from \"@splunk/react-icons/ChevronsSlash.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Cloud.js\";\nexport * from \"@splunk/react-icons/Cloud.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/CogChevronsSlash.js\";\nexport * from \"@splunk/react-icons/CogChevronsSlash.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Containership.js\";\nexport * from \"@splunk/react-icons/Containership.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Cube.js\";\nexport * from \"@splunk/react-icons/Cube.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Cylinder.js\";\nexport * from \"@splunk/react-icons/Cylinder.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/CylinderIndexTable.js\";\nexport * from \"@splunk/react-icons/CylinderIndexTable.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/CylinderMetrics.js\";\nexport * from \"@splunk/react-icons/CylinderMetrics.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/CylinderMulti.js\";\nexport * from \"@splunk/react-icons/CylinderMulti.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/CylinderTrace.js\";\nexport * from \"@splunk/react-icons/CylinderTrace.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/CylinderWaves.js\";\nexport * from \"@splunk/react-icons/CylinderWaves.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/DeviceEdgeHub.js\";\nexport * from \"@splunk/react-icons/DeviceEdgeHub.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/DeviceSignalWaves.js\";\nexport * from \"@splunk/react-icons/DeviceSignalWaves.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/DotsThreeBalloon.js\";\nexport * from \"@splunk/react-icons/DotsThreeBalloon.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Drive.js\";\nexport * from \"@splunk/react-icons/Drive.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/DriveIndexTable.js\";\nexport * from \"@splunk/react-icons/DriveIndexTable.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/DriveMagnifier.js\";\nexport * from \"@splunk/react-icons/DriveMagnifier.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/DriveSliders.js\";\nexport * from \"@splunk/react-icons/DriveSliders.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Envelope.js\";\nexport * from \"@splunk/react-icons/Envelope.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/EthernetPort.js\";\nexport * from \"@splunk/react-icons/EthernetPort.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ExclamationTriangle.js\";\nexport * from \"@splunk/react-icons/ExclamationTriangle.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Factory.js\";\nexport * from \"@splunk/react-icons/Factory.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/File.js\";\nexport * from \"@splunk/react-icons/File.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/FileLogs.js\";\nexport * from \"@splunk/react-icons/FileLogs.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Filter.js\";\nexport * from \"@splunk/react-icons/Filter.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Folder.js\";\nexport * from \"@splunk/react-icons/Folder.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ForwarderHeavy.js\";\nexport * from \"@splunk/react-icons/ForwarderHeavy.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ForwarderUniversal.js\";\nexport * from \"@splunk/react-icons/ForwarderUniversal.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Gate.js\";\nexport * from \"@splunk/react-icons/Gate.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Globe.js\";\nexport * from \"@splunk/react-icons/Globe.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/IdentityCard.js\";\nexport * from \"@splunk/react-icons/IdentityCard.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/InformationCircle.js\";\nexport * from \"@splunk/react-icons/InformationCircle.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/InformationDiamond.js\";\nexport * from \"@splunk/react-icons/InformationDiamond.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/LaptopOpen.js\";\nexport * from \"@splunk/react-icons/LaptopOpen.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Layout.js\";\nexport * from \"@splunk/react-icons/Layout.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/License.js\";\nexport * from \"@splunk/react-icons/License.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/MobilePhone.js\";\nexport * from \"@splunk/react-icons/MobilePhone.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Monitor.js\";\nexport * from \"@splunk/react-icons/Monitor.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/MonitorPhone.js\";\nexport * from \"@splunk/react-icons/MonitorPhone.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/NetworkDevice.js\";\nexport * from \"@splunk/react-icons/NetworkDevice.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/NodeBranch.js\";\nexport * from \"@splunk/react-icons/NodeBranch.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/NodeModel.js\";\nexport * from \"@splunk/react-icons/NodeModel.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/NodeTopology.js\";\nexport * from \"@splunk/react-icons/NodeTopology.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Picture.js\";\nexport * from \"@splunk/react-icons/Picture.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Portrait.js\";\nexport * from \"@splunk/react-icons/Portrait.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/PortraitsTwo.js\";\nexport * from \"@splunk/react-icons/PortraitsTwo.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Printer.js\";\nexport * from \"@splunk/react-icons/Printer.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Processor.js\";\nexport * from \"@splunk/react-icons/Processor.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ReportDouble.js\";\nexport * from \"@splunk/react-icons/ReportDouble.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/SecurityCamera.js\";\nexport * from \"@splunk/react-icons/SecurityCamera.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Servers.js\";\nexport * from \"@splunk/react-icons/Servers.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ServersCloud.js\";\nexport * from \"@splunk/react-icons/ServersCloud.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/ShoppingCart.js\";\nexport * from \"@splunk/react-icons/ShoppingCart.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/SignalWavesAngled.js\";\nexport * from \"@splunk/react-icons/SignalWavesAngled.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/SingleIndex.js\";\nexport * from \"@splunk/react-icons/SingleIndex.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/SlidersTripleHorizontal.js\";\nexport * from \"@splunk/react-icons/SlidersTripleHorizontal.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/SquaresAndCircles.js\";\nexport * from \"@splunk/react-icons/SquaresAndCircles.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Star.js\";\nexport * from \"@splunk/react-icons/Star.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Store.js\";\nexport * from \"@splunk/react-icons/Store.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Telescope.js\";\nexport * from \"@splunk/react-icons/Telescope.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Token.js\";\nexport * from \"@splunk/react-icons/Token.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Truck.js\";\nexport * from \"@splunk/react-icons/Truck.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/WallBricks.js\";\nexport * from \"@splunk/react-icons/WallBricks.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/WiFiSignal.js\";\nexport * from \"@splunk/react-icons/WiFiSignal.js\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "export * from './NetworkGraph';\nexport { default } from './NetworkGraph';\n", "import * as React from 'react';\nimport { getDataSourceStateInfo } from '@splunk/visualizations-shared/dataSourceUtils';\nimport withDashboardViz, { DashboardVizOpts } from '../common/withDashboardViz';\nimport PureNetworkGraph from './PureNetworkGraph/PureNetworkGraph';\nimport config from './config';\nimport { DataSource } from '../common/interfaces/DataSource';\nimport { convertToArrOfObjects } from '../common/utils/dataUtils';\n\nexport const showPlaceHolderIcon = dataSources => {\n const columns = dataSources?.primary?.data?.columns;\n const noColumns = !(Array.isArray(columns) && columns.length);\n const dataSourceState = getDataSourceStateInfo(dataSources?.primary);\n return dataSourceState.hasError || dataSourceState.isLoading || dataSourceState.isMissing || noColumns;\n};\n\nexport const computeVizProps = ({ dataSources, onOptionsChange, themeFunc }): Record<string, unknown> => {\n const columns = dataSources?.primary?.data?.columns || [];\n const fields = dataSources?.primary?.data?.fields || [];\n const dataSourceData = dataSources?.primary?.data ?? {};\n const transformedData = convertToArrOfObjects(dataSourceData.columns, dataSourceData.fields);\n\n const themeColorVariables = [\n 'defaultBackgroundColor',\n 'defaultLinkColor',\n 'defaultNodeColor',\n 'defaultNodeIconColor',\n ];\n const themeColors: Record<string, unknown> = {};\n themeColorVariables.forEach(variable => {\n themeColors[variable] = themeFunc(variable);\n });\n\n return {\n fields: fields.map(field => (field?.name ? field.name : field)),\n columns,\n onOptionsChange,\n metadata: transformedData,\n ...themeColors,\n };\n};\n\nconst withTooltipFields = Viz => {\n const VizWithTooltipFields = ({ dataSources, options, ...otherProps }): JSX.Element => {\n if (!dataSources?.primary?.data) {\n return <Viz {...otherProps} options={options} />;\n }\n const updatedOptions = { ...options, tooltipHeaderFieldName: '> tooltipHeaderField | getField()' };\n return <Viz dataSources={dataSources} options={updatedOptions} {...otherProps} />;\n };\n\n VizWithTooltipFields.propTypes = Viz.propTypes;\n VizWithTooltipFields.defaultProps = Viz.defaultProps;\n VizWithTooltipFields.config = Viz.config;\n return VizWithTooltipFields;\n};\n\nconst NetworkGraph = withTooltipFields(\n withDashboardViz({\n ReactViz: PureNetworkGraph,\n vizConfig: config,\n computeVizProps,\n disableEditModeCover: true,\n useIconPlaceholder: (dataSources: { [name: string]: DataSource }) => showPlaceHolderIcon(dataSources),\n } as DashboardVizOpts)\n);\nconst { themes } = config;\nexport default NetworkGraph;\nexport { themes, config, PureNetworkGraph };\n", "\nimport * as defaultImport from \"react\";\nexport * from \"react\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/dataSourceUtils\";\nexport * from \"@splunk/visualizations-shared/dataSourceUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\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\";\nexport * from \"lodash\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\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 \"@splunk/ui-utils/id\";\nexport * from \"@splunk/ui-utils/id\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\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", "\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", "export enum VizBehavior {\n /**\n * Dynamic Options Behavior.\n * This allows visualization options to be powered by data\n *\n * **Example**\n *\n * sparklineValues: \">primary|seriesByIndex(0)\"\n * would configure sparklineValues with an array of data points\n * coming from the first series in the primary datasource\n *\n */\n DYNAMIC_OPTIONS = 'dynamic-options',\n EVENTS = 'events',\n DOWNSAMPLING = 'downsampling',\n /**\n * Placeholder behavior: visualization will display a placeholder rather than fail if any of the `requiredProps` is\n * missing.\n * @type {string}\n */\n PLACEHOLDER = 'placeholder',\n PAGE_AND_SORT = 'page-and-sort',\n TRELLIS = 'trellis',\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 { 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 { 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", "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", "\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/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 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", "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 { 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/colorUtils\";\nexport * from \"@splunk/visualizations-shared/colorUtils\";\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", "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 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", "\nimport * as defaultImport from \"@splunk/visualizations-shared/style\";\nexport * from \"@splunk/visualizations-shared/style\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\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", "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", "\nimport * as defaultImport from \"@splunk/visualizations-shared/numberUtils\";\nexport * from \"@splunk/visualizations-shared/numberUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "export * from './DashboardVizProps';\nexport * from './DataContract';\nexport * from './DataSource';\nexport * from './DefaultContext';\nexport * from './Editor';\nexport * from './ExtendedDashViz';\nexport * from './Object';\nexport * from './Overview';\nexport * from './ThemedDefaults';\nexport * from './VizActionHandler';\nexport * from './VizBehavior';\nexport * from './VizCategory';\nexport * from './VizConfig';\nexport * from './VizEvent';\nexport * from './VizProps';\nexport * from './VizRegistry';\nexport * from './VizSize';\nexport * from './VizStatus';\n", "import { DataSource } from './DataSource';\nimport { VizActionHandler } from './VizActionHandler';\nimport { KV } from './Object';\n\nexport interface DashboardVizProps {\n mode?: string;\n width: number | string;\n height: number | string;\n options?: KV;\n context?: KV;\n onOptionsChange?: (options: Record<string, unknown>) => void;\n dataSources: Record<string, DataSource>;\n onEventTrigger?: ({ type, payload, originalEvent }) => Record<string, unknown>;\n hasEventHandlers?: boolean;\n vizActionHandlerRef?: (actionHandler: VizActionHandler) => void;\n onComputedProps?: (...args: any) => void;\n loading?: boolean;\n theme?: Record<string, any>;\n onRequestParamsChange?: (dataSourceKey: string, payload) => void;\n}\n", "/**\n * A data structure used at runtime to wire up a visualization.\n */\n\ninterface InitialRequestParams {\n [key: string]: Record<string, unknown> | ((options?: Record<string, unknown>) => Record<string, unknown>);\n}\nexport interface DataContract {\n requiredDataSources: {\n name: string;\n description: string;\n }[];\n optionalDataSources?: {\n name: string;\n description: string;\n }[];\n initialRequestParams: InitialRequestParams;\n}\n", "interface Threshold {\n from?: number;\n to?: number;\n value: string | number;\n}\n\ninterface Gradient {\n stops?: number[];\n colors: string[];\n}\n\ninterface MatchValue {\n match: string;\n value: string;\n}\n\ntype Pick = string | number;\n\ninterface SetColorChannel {\n channel: string;\n value: string | number;\n}\n\ninterface MaxContrast {\n colors: string[];\n default?: string;\n}\n/**\n * represents the default context if any. Currently, the default context is range formatting\n */\nexport interface DefaultContext {\n [key: string]: Threshold[] | MatchValue[] | Gradient | Pick[] | SetColorChannel | MaxContrast | string;\n}\n", "/**\n * Provides the two dimensional layout in terms of rows of editable dimensions\n */\nexport interface EditorConfig {\n label: string;\n layout: EditorLayoutConfig[][];\n open?: boolean;\n}\n\n/**\n * Provides the info needed at runtime for an editor to make an option\n * configurable via an editor\n */\ninterface EditorLayoutObj {\n label?: string;\n key?: string; // for preset selector updates\n option?: string; // optional since preset selector does not have a 1-1 mapping when persisting options\n context?: string;\n editor: string;\n editorProps?: Record<string, unknown>;\n}\n\nexport type EditorLayoutConfig = EditorLayoutObj | Record<string, unknown>;\n", "import { DashboardVizProps } from './DashboardVizProps';\nimport { VizConfig } from './VizConfig';\n\nexport interface ExtendedDashViz extends React.FunctionComponent<DashboardVizProps> {\n config?: VizConfig;\n propTypes: any;\n}\n", "export interface KV {\n [key: string]: any;\n}\n", "export interface Variation {\n title: string;\n description: string;\n key: string;\n hideSandbox?: boolean;\n}\n\nexport interface Overview {\n type?: string;\n typeOfViz: string;\n overview: string;\n note?: string;\n tips: string[];\n variations: Variation[];\n}\n", "import { KV } from './Object';\n\nexport interface ThemedDefaults {\n [theme: string]: KV;\n}\n", "export enum VizCategory {\n SINGLE_VALUE = 'Single Value',\n TRENDS = 'Trends',\n COMPARISONS = 'Comparisons',\n TABLE = 'Table',\n TIMELINE = 'Timeline',\n GAUGE = 'Gauge',\n DISTRIBUTIONS = 'Distributions',\n CHOROPLETH = 'Choropleth Maps',\n SHAPES = 'Shapes',\n MISC = 'misc',\n FLOW = 'Flow',\n CORRELATION = 'Correlation',\n SPATIAL = 'Spatial',\n}\n", "import type { OptionsSchema } from '@splunk/visualization-schemas';\nimport type React from 'react';\nimport { DataContract } from './DataContract';\nimport { VizSize } from './VizSize';\nimport { DefaultContext } from './DefaultContext';\nimport { EditorConfig } from './Editor';\nimport { VizEvent } from './VizEvent';\nimport { VizBehavior } from './VizBehavior';\nimport { VizStatus } from './VizStatus';\nimport { VizCategory } from './VizCategory';\n/**\n * A static descriptor for a visualization\n */\nexport interface VizConfig {\n key: string;\n name: string;\n category: VizCategory;\n /**\n * Reflects whether the visualization is new (with the 'preview' value). This property allows us to\n * surface a message about the visualization in the visualization docs.\n */\n status?: VizStatus;\n icon?: React.ComponentType;\n placeholderIcon?: React.ComponentType;\n dataContract: DataContract;\n size: VizSize;\n defaultContext?: DefaultContext;\n optionsSchema: OptionsSchema;\n editorConfig: EditorConfig[];\n events?: VizEvent;\n supports: VizBehavior[];\n themes: any;\n // a list if properties that must be defined in order for the viz placeholder to be replaced with the actual viz.\n // The presence of the required properties is checked *after* DSL evaluation\n requiredProps?: string[];\n}\n", "export interface VizEvent {\n [key: string]: {\n description: string;\n payloadKeys?: string[];\n /**\n * Array of keys used to create nested parent object for event\n *\n * Example: [ 'a', 'b' ] -> { a: { b: event } }\n */\n parentKeys?: string[];\n };\n}\n", "import { VizActionHandler } from './VizActionHandler';\n\nexport interface VizProps {\n mode: string;\n width: number | string;\n height: number | string;\n vizActionHandlerRef?: (actionHandler: VizActionHandler) => void;\n}\n", "import { VizConfig } from './VizConfig';\n\nexport interface VizRegistry {\n visualizations: { [key: string]: VizConfig };\n}\n", "/**\n * represents the initial size, max and min size for visualizations,\n */\nexport interface VizSize {\n initialWidth: number;\n initialHeight: number;\n}\n", "export type VizStatus = 'preview';\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 * 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/visualization-context/FeatureFlags\";\nexport * from \"@splunk/visualization-context/FeatureFlags\";\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/visualizations-shared/trellisUtils\";\nexport * from \"@splunk/visualizations-shared/trellisUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\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", "\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", "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", "\nimport * as defaultImport from \"@splunk/react-icons/Triangle\";\nexport * from \"@splunk/react-icons/Triangle\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\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", "\nimport * as defaultImport from \"@splunk/visualization-schemas\";\nexport * from \"@splunk/visualization-schemas\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\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 React, { useState, useEffect, useMemo, useRef, ReactElement, useCallback } from 'react';\nimport styled from 'styled-components';\nimport 'd3-transition';\nimport { select } from 'd3-selection';\nimport { zoom, zoomIdentity, zoomTransform, ZoomBehavior } from 'd3-zoom';\nimport { toDimension } from '@splunk/visualizations-shared/style';\nimport { noop, pick } from 'lodash';\n\nimport {\n getUniqueNodesVisual,\n getUniqueLinks,\n getNodeMapWithPositions,\n getAutoZoomAndPan,\n updatePositions,\n LinkStyleType,\n ShowDirectionType,\n LayoutType,\n PreferPortsType,\n LayoutDirectionType,\n nearlyEqual,\n LayoutOptionsType,\n unsanitizeSvgId,\n createDynamicPayload,\n calculateMinZoomBounds,\n getZoomDisableState,\n MAX_ZOOM,\n getDefaultPreferPorts,\n} from './utils/networkGraphUtils';\nimport {\n getPointerInGraphSpaceFromMouseEvent,\n getInitialDragOffset,\n getDraggedNodePositionWithOffset,\n updateDraggedNodePosition,\n patchNodeMapWithDragPositionChanges,\n patchDragPositionsMap,\n DragStateType,\n PositionType,\n ZoomAndPanStateType,\n} from './utils/dragUtils';\nimport {\n DEFAULT_CHARGE_STRENGTH,\n DEFAULT_COLLIDE_PADDING,\n DEFAULT_LINK_DISTANCE,\n DEFAULT_COLLIDE_STRENGTH,\n DEFAULT_DISTANCE_MAX,\n DEFAULT_CHARGE_THETA,\n DEFAULT_DISTANCE_MIN,\n DEFAULT_CLUSTER_STRENGTH,\n} from './utils/forceLayout';\nimport {\n DEFAULT_CHART_HEIGHT,\n DEFAULT_CHART_WIDTH,\n DEFAULT_NODE_RADIUS,\n DEFAULT_LINK_WIDTH,\n IconType,\n NodeMetadataType,\n NodeClickEvent,\n NodeMouseOverEvent,\n NodeMouseOutEvent,\n NodeDragEvent,\n NodeMapStructuralType,\n} from './utils/networkGraphShared';\nimport NetworkGraphSvg from './components/NetworkGraphSvg';\nimport ZoomControls from './components/ZoomControls';\nimport { useDeepMemo } from '../../common/hooks/useDeepMemo';\n\nexport interface PureNetworkGraphProps {\n width?: number | string;\n height?: number | string;\n source?: string[];\n target?: (string | null)[];\n nodeIds?: string[];\n nodeTypes?: string[];\n nodeValues?: number[];\n nodeTexts?: string[];\n nodeSize?: number[] | number;\n nodeColors?: string[] | string;\n nodeIconColors?: string[] | string;\n nodeIcons?: IconType[];\n layout?: LayoutType;\n nodeHorizontalPadding?: number;\n nodeVerticalPadding?: number;\n hierarchyDirection?: LayoutDirectionType;\n xPositions?: number[];\n yPositions?: number[];\n gridColumns?: number;\n chargeStrength?: number;\n chargeTheta?: number;\n chargeDistanceMin?: number;\n chargeDistanceMax?: number;\n linkDistance?: number;\n linkStrength?: number;\n collidePadding?: number;\n collideStrength?: number;\n clusterStrength?: number;\n backgroundColor?: string;\n linkStyle?: LinkStyleType;\n linkColors?: string[] | string;\n linkWidth?: number[] | number;\n showDirection?: ShowDirectionType;\n preferPorts?: PreferPortsType;\n showZoomControls?: boolean;\n nodeDragPositions?: { [key: string]: { x: number; y: number } };\n metadata?: NodeMetadataType[];\n resultLimit?: number;\n tooltipNodeFields?: string[];\n tooltipHeaderFieldName?: string;\n onOptionsChange?: (options: Record<string, unknown>) => void;\n onNodeClick?: (event: NodeClickEvent) => void;\n onNodeMouseOver?: (event: NodeMouseOverEvent) => void;\n onNodeMouseOut?: (event: NodeMouseOutEvent) => void;\n onNodeDrag?: (event: NodeDragEvent) => void;\n}\n\nconst StyledWrapper = styled.div<{\n backgroundColor?: string;\n width?: number | string;\n height?: number | string;\n}>`\n ${props => toDimension(pick(props, ['width', 'height']))};\n background-color: ${props => props.backgroundColor};\n position: relative;\n overflow: hidden;\n`;\n\n// memoize default values to prevent unnecessary recalculations\nconst EMPTY_ARRAY = [];\nconst EMPTY_OBJECT = {};\n\n// helper to forward mouse events from d3-zoom to udf for viz selection.\n// This is needed because d3-zoom stops propagation of mouse events.\nexport const forwardMouseDownEvent = (\n event: MouseEvent | null | undefined,\n container: HTMLElement | null | undefined\n) => {\n if (event?.type !== 'mousedown') return;\n\n const forwarded = new MouseEvent('mousedown', event);\n container?.dispatchEvent(forwarded);\n};\n\nconst PureNetworkGraph = ({\n width = DEFAULT_CHART_WIDTH,\n height = DEFAULT_CHART_HEIGHT,\n source = EMPTY_ARRAY,\n target = EMPTY_ARRAY,\n nodeIds = EMPTY_ARRAY,\n nodeTypes = EMPTY_ARRAY,\n nodeValues = EMPTY_ARRAY,\n nodeTexts = EMPTY_ARRAY,\n nodeSize = DEFAULT_NODE_RADIUS * 2,\n nodeColors = EMPTY_ARRAY,\n nodeIconColors = EMPTY_ARRAY,\n nodeIcons = EMPTY_ARRAY,\n layout = 'grid',\n nodeHorizontalPadding = 0,\n nodeVerticalPadding = 0,\n hierarchyDirection = 'leftRight',\n xPositions = EMPTY_ARRAY,\n yPositions = EMPTY_ARRAY,\n chargeStrength = DEFAULT_CHARGE_STRENGTH,\n chargeTheta = DEFAULT_CHARGE_THETA,\n chargeDistanceMin = DEFAULT_DISTANCE_MIN,\n chargeDistanceMax = DEFAULT_DISTANCE_MAX,\n linkDistance = DEFAULT_LINK_DISTANCE,\n linkStrength = undefined,\n collidePadding = DEFAULT_COLLIDE_PADDING,\n collideStrength = DEFAULT_COLLIDE_STRENGTH,\n clusterStrength = DEFAULT_CLUSTER_STRENGTH,\n gridColumns = undefined,\n backgroundColor = null,\n linkStyle = 'straight',\n linkColors = EMPTY_ARRAY,\n linkWidth = DEFAULT_LINK_WIDTH,\n showDirection = 'bidirection',\n preferPorts,\n showZoomControls = true,\n nodeDragPositions = EMPTY_OBJECT,\n metadata = EMPTY_ARRAY,\n resultLimit = 1000,\n tooltipNodeFields = EMPTY_ARRAY,\n tooltipHeaderFieldName = '',\n onOptionsChange = noop,\n onNodeClick = noop,\n onNodeMouseOver = noop,\n onNodeMouseOut = noop,\n onNodeDrag = noop,\n}: PureNetworkGraphProps): ReactElement => {\n // used by d3-zoom\n const svgRef = useRef<SVGSVGElement>();\n const zoomContainerRef = useRef<SVGGElement>();\n // toDimension does not handle negative numbers correctly\n const cssWidth = typeof width === 'number' && width < 0 ? '0px' : width;\n const cssHeight = typeof height === 'number' && height < 0 ? '0px' : height;\n // used to get actual container dimensions for responsive sizing (vh used by full screen mode in dashboard)\n const containerRef = useRef<HTMLDivElement>(null);\n const prevLayoutRef = useRef(layout);\n const [containerSize, setContainerSize] = useState({\n width: typeof width === 'number' ? width : DEFAULT_CHART_WIDTH,\n height: typeof height === 'number' ? height : DEFAULT_CHART_HEIGHT,\n });\n const [isDragging, setIsDragging] = useState<DragStateType>({ dragStarted: false, id: null });\n const [parentZoomAndPanState, setParentZoomAndPanState] = useState<ZoomAndPanStateType>({\n zoom: null,\n x: null,\n y: null,\n });\n // Snapshot of node positions at drag start, used to keep auto-zoom inputs stable while dragging.\n const frozenNodeMapForZoomRef = useRef<NodeMapStructuralType | null>(null);\n // Stores pointer-to-node delta captured on drag start so dragging does not snap node center to cursor.\n const dragOffsetRef = useRef<PositionType | null>(null);\n // Caches the latest base layout output to detect when layout changed vs only drag overrides changed.\n const baseNodeMapRef = useRef<NodeMapStructuralType | null>(null);\n // Tracks previous drag override prop so we can diff and patch only changed nodes.\n const previousNodeDragPositionsRef = useRef(nodeDragPositions);\n // Accumulates committed drag overrides across interactions before emitting via onOptionsChange.\n const persistedDragPositionsRef = useRef<Record<string, { x: number; y: number }>>({\n ...nodeDragPositions,\n });\n\n const effectivePreferPorts = preferPorts ?? getDefaultPreferPorts(layout, hierarchyDirection);\n\n useEffect(() => {\n const updateSize = () => {\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n setContainerSize({\n width: rect.width,\n height: rect.height,\n });\n }\n };\n\n // Initial size calculation\n updateSize();\n\n // Update on window resize (for vh units)\n window.addEventListener('resize', updateSize);\n return () => window.removeEventListener('resize', updateSize);\n }, []);\n\n const linkMap = useMemo(() => {\n return getUniqueLinks(source, target, linkColors, linkWidth, resultLimit);\n }, [source, target, linkColors, linkWidth, resultLimit]);\n\n // split nodeMap into visual and structural parts to avoid rerunning layout algorithm on style changes\n const nodeMapVisual = useMemo(() => {\n return getUniqueNodesVisual({\n nodeIds,\n nodeColors,\n iconColors: nodeIconColors,\n icons: nodeIcons,\n nodeValues,\n resultLimit,\n tooltipHeaderField: tooltipHeaderFieldName,\n tooltipNodeFields,\n metadata,\n });\n }, [\n nodeIds,\n nodeColors,\n nodeIconColors,\n nodeIcons,\n nodeValues,\n resultLimit,\n metadata,\n tooltipNodeFields,\n tooltipHeaderFieldName,\n ]);\n\n // deep memo is needed to avoid rerunning layout algorithms when related options have not changed\n // note this works in storybooks without deep memo but fails in ESM tester\n const nodeMapStructWithPositions = useDeepMemo(() => {\n const layoutOptions: LayoutOptionsType = {\n nodeHorizontalPadding,\n nodeVerticalPadding,\n hierarchyDirection,\n xPositions,\n yPositions,\n gridColumns,\n chargeStrength,\n chargeTheta,\n chargeDistanceMin,\n chargeDistanceMax,\n linkDistance,\n linkStrength,\n collidePadding,\n collideStrength,\n clusterStrength,\n };\n\n return getNodeMapWithPositions({\n source,\n target,\n nodeIds,\n nodeTexts,\n nodeTypes,\n nodeSize,\n layout,\n layoutOptions,\n resultLimit,\n });\n }, [\n layout,\n source,\n nodeHorizontalPadding,\n nodeVerticalPadding,\n hierarchyDirection,\n xPositions,\n yPositions,\n gridColumns,\n chargeStrength,\n chargeTheta,\n chargeDistanceMin,\n chargeDistanceMax,\n linkDistance,\n linkStrength,\n collidePadding,\n collideStrength,\n clusterStrength,\n target,\n nodeIds,\n nodeSize,\n nodeTexts,\n nodeTypes,\n resultLimit,\n ]);\n\n // provide a nodeMap state so we can use it to update positions when dragging nodes\n const [nodeMapStruct, setNodeMapStruct] = useState(() =>\n updatePositions(nodeMapStructWithPositions, nodeDragPositions)\n );\n const [hideReset, setHideReset] = useState(true);\n // need this flag to avoid rendering nodes and links before initial auto zoom and pan is applied\n const [isReadyToRender, setIsReadyToRender] = useState(false);\n // state for highlighting nodes and neightbors\n const [highlightedNode, setHighlightedNode] = useState(null);\n\n // Use calculated container size when size is a string like 100vh\n const numberWidth = typeof width === 'string' ? containerSize.width : width;\n const numberHeight = typeof height === 'string' ? containerSize.height : height;\n const effectiveWidth = Math.max(numberWidth, 0);\n const effectiveHeight = Math.max(numberHeight, 0);\n\n // Freeze auto-zoom inputs while dragging so bounds/zoom math does not churn on every pointer move.\n const nodeMapForAutoZoom =\n isDragging.dragStarted && frozenNodeMapForZoomRef.current\n ? frozenNodeMapForZoomRef.current\n : nodeMapStruct;\n\n const { autoZoomLevel, autoCenter } = useMemo(() => {\n return getAutoZoomAndPan(nodeMapForAutoZoom, effectiveWidth, effectiveHeight);\n }, [nodeMapForAutoZoom, effectiveWidth, effectiveHeight]);\n\n const { minZoomLevel, minZoomWidth, minZoomHeight } = useMemo(() => {\n return calculateMinZoomBounds(autoZoomLevel, effectiveHeight, effectiveWidth);\n }, [autoZoomLevel, effectiveHeight, effectiveWidth]);\n\n const initialTransform = useMemo(\n () =>\n zoomIdentity\n // move viewport center to origin\n .translate(effectiveWidth / 2, effectiveHeight / 2)\n // scale around that point\n .scale(autoZoomLevel)\n // move data center into that origin\n .translate(-autoCenter[0], -autoCenter[1]),\n [autoCenter, autoZoomLevel, effectiveWidth, effectiveHeight]\n );\n\n const { disableZoomIn, disableZoomOut } = useMemo(\n () => getZoomDisableState(parentZoomAndPanState.zoom, autoZoomLevel, minZoomLevel),\n [parentZoomAndPanState.zoom, autoZoomLevel, minZoomLevel]\n );\n\n useEffect(() => {\n const baseNodeMap = baseNodeMapRef.current;\n if (!baseNodeMap) {\n // Initial state already applies layout + drag overrides, so skip a redundant mount update.\n baseNodeMapRef.current = nodeMapStructWithPositions;\n previousNodeDragPositionsRef.current = nodeDragPositions;\n return;\n }\n\n const baseLayoutChanged = baseNodeMap !== nodeMapStructWithPositions;\n baseNodeMapRef.current = nodeMapStructWithPositions;\n\n if (baseLayoutChanged) {\n setNodeMapStruct(updatePositions(nodeMapStructWithPositions, nodeDragPositions));\n } else {\n // Only patch nodes whose drag position changed instead of rebuilding the full node map.\n setNodeMapStruct(previousNodeMap =>\n patchNodeMapWithDragPositionChanges(\n previousNodeMap,\n baseNodeMap,\n previousNodeDragPositionsRef.current,\n nodeDragPositions\n )\n );\n }\n\n const nextPersistedDragPositions = patchDragPositionsMap(\n persistedDragPositionsRef.current,\n previousNodeDragPositionsRef.current,\n nodeDragPositions\n );\n persistedDragPositionsRef.current = nextPersistedDragPositions;\n previousNodeDragPositionsRef.current = nodeDragPositions;\n }, [nodeDragPositions, nodeMapStructWithPositions]);\n\n // zoom function used by d3-zoom, datum type is unknown because we are not using d3 data binding\n const zoomFunc: ZoomBehavior<SVGSVGElement, unknown> = useMemo(\n () =>\n zoom<SVGSVGElement, unknown>()\n .on('zoom', event => {\n if (zoomContainerRef.current) {\n select(zoomContainerRef.current).attr('transform', event.transform);\n }\n setParentZoomAndPanState({\n zoom: event.transform.k,\n x: event.transform.x,\n y: event.transform.y,\n });\n })\n // d3-zoom will stop propagation of mousedown events, so we need to forward it to udf for viz selection.\n .on('start', event => {\n const src = event.sourceEvent;\n forwardMouseDownEvent(src, containerRef.current);\n }),\n []\n );\n\n useEffect(() => {\n // if value is null we are using the initial transform so hide reset button\n const shouldHideReset =\n (!parentZoomAndPanState.zoom ||\n nearlyEqual(parentZoomAndPanState.zoom, initialTransform.k, 0.01, true)) &&\n (!parentZoomAndPanState.x || nearlyEqual(parentZoomAndPanState.x, initialTransform.x)) &&\n (!parentZoomAndPanState.y || nearlyEqual(parentZoomAndPanState.y, initialTransform.y));\n setHideReset(shouldHideReset);\n }, [parentZoomAndPanState, initialTransform]);\n\n // attach zoom function\n useEffect(() => {\n // reset any existing zoom handlers before applying new ones\n if (select(svgRef.current).on) select(svgRef.current).on('.zoom', null);\n\n // apply zoom bounds\n const minTopLeft = [autoCenter[0] - minZoomWidth / 2, autoCenter[1] - minZoomHeight / 2];\n const minBottomRight = [minTopLeft[0] + minZoomWidth, minTopLeft[1] + minZoomHeight];\n zoomFunc\n .scaleExtent([minZoomLevel, MAX_ZOOM])\n .translateExtent([minTopLeft as [number, number], minBottomRight as [number, number]]);\n\n select(svgRef.current).call(zoomFunc);\n\n // set initial zoom and pan state\n if (\n parentZoomAndPanState.zoom === null ||\n parentZoomAndPanState.x === null ||\n parentZoomAndPanState.y === null\n ) {\n select(svgRef.current).call(zoomFunc.transform, initialTransform);\n }\n\n // tell networkGraphSVG that it can now render nodes and links\n setIsReadyToRender(true);\n }, [\n zoomFunc,\n autoZoomLevel,\n parentZoomAndPanState.zoom,\n parentZoomAndPanState.x,\n parentZoomAndPanState.y,\n minZoomLevel,\n minZoomWidth,\n minZoomHeight,\n initialTransform,\n autoCenter,\n ]);\n\n // clear the custom dragged positions when layout changes\n useEffect(() => {\n if (prevLayoutRef.current !== layout) {\n persistedDragPositionsRef.current = {};\n onOptionsChange({\n nodeDragPositions: {},\n });\n }\n prevLayoutRef.current = layout;\n }, [layout, onOptionsChange]);\n\n const handleZoomIn = useCallback(() => {\n select(svgRef.current)\n .transition()\n .call(zoomFunc.scaleTo, zoomTransform(svgRef.current).k * 1.5);\n }, [zoomFunc]);\n\n const handleZoomOut = useCallback(() => {\n select(svgRef.current)\n .transition()\n .call(zoomFunc.scaleTo, zoomTransform(svgRef.current).k / 1.5);\n }, [zoomFunc]);\n\n const handleReset = useCallback(() => {\n select(svgRef.current).transition().call(zoomFunc.transform, initialTransform);\n }, [initialTransform, zoomFunc.transform]);\n\n const handlePan = useCallback(\n (dx: number, dy: number) => {\n select(svgRef.current)\n .transition()\n .call(\n zoomFunc.translateBy,\n // divide by scale to get consistent panning distance regardless of zoom level\n dx / zoomTransform(svgRef.current).k,\n dy / zoomTransform(svgRef.current).k\n );\n },\n [zoomFunc]\n );\n\n // add keyboard shortcuts for zoom and pan\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n switch (e.key) {\n case '+':\n case '=': // '=' is the same key as '+' without shift\n handleZoomIn();\n break;\n case '-':\n handleZoomOut();\n break;\n case 'ArrowLeft':\n handlePan(100, 0);\n break;\n case 'ArrowRight':\n handlePan(-100, 0);\n break;\n case 'ArrowUp':\n handlePan(0, 100);\n break;\n case 'ArrowDown':\n handlePan(0, -100);\n break;\n default:\n return;\n }\n\n e.preventDefault();\n },\n [handlePan, handleZoomIn, handleZoomOut]\n );\n\n const handleMouseDown = useCallback(\n // mousedown uses event from d3 which is typed to any\n (e: any) => {\n const unSanitizedId = unsanitizeSvgId(e.currentTarget.id);\n // Freeze current positions so auto-zoom math stays stable during drag.\n frozenNodeMapForZoomRef.current = nodeMapStruct;\n // Reset offset at drag start; it will be derived from this pointer down event.\n dragOffsetRef.current = null;\n const draggedNode = nodeMapStruct[unSanitizedId];\n if (draggedNode) {\n const pointerInGraphSpace = getPointerInGraphSpaceFromMouseEvent(\n e,\n svgRef.current,\n parentZoomAndPanState\n );\n dragOffsetRef.current = getInitialDragOffset(pointerInGraphSpace, {\n x: draggedNode.x,\n y: draggedNode.y,\n });\n }\n // this gets rid of the focus ring lag\n if (e?.preventDefault) {\n e.preventDefault();\n }\n setIsDragging({ dragStarted: true, id: unSanitizedId });\n\n // we currently stop the propagation of mousedown events to prevent panning during a node drag\n // but we need to forward it to udf for viz selection.\n forwardMouseDownEvent(e, containerRef.current);\n },\n [nodeMapStruct, parentZoomAndPanState, setIsDragging]\n );\n\n const handleMouseUp = useCallback(() => {\n // reset offset since drag is over\n dragOffsetRef.current = null;\n // reset frozen node map so auto-zoom can consider updated positions after drag\n frozenNodeMapForZoomRef.current = null;\n\n if (isDragging.id && nodeMapStruct[isDragging.id]) {\n // update persisted drag positions with the final position of the dragged node\n const nextPersistedDragPositions = {\n ...persistedDragPositionsRef.current,\n [isDragging.id]: {\n x: nodeMapStruct[isDragging.id].x,\n y: nodeMapStruct[isDragging.id].y,\n },\n };\n persistedDragPositionsRef.current = nextPersistedDragPositions;\n onOptionsChange({\n nodeDragPositions: nextPersistedDragPositions,\n });\n const metadataForNode = metadata[nodeMapVisual[isDragging.id].index] || {};\n\n onNodeDrag({\n type: 'node.drag',\n payload: {\n value: nodeMapVisual[isDragging.id].value,\n name: nodeMapVisual[isDragging.id].id,\n position: {\n x: nodeMapStruct[isDragging.id].x,\n y: nodeMapStruct[isDragging.id].y,\n },\n ...createDynamicPayload(metadataForNode),\n },\n });\n }\n setIsDragging({ dragStarted: false, id: null });\n }, [nodeMapStruct, isDragging.id, onOptionsChange, metadata, nodeMapVisual, onNodeDrag]);\n\n const handleDrag = useCallback(\n (x: number, y: number) => {\n if (!isDragging.dragStarted) {\n return;\n }\n const currentNode = nodeMapStruct[isDragging.id];\n\n // We want to use mouse offset to calculate the new position instead of letting the node snap to the cursor position.\n // This is done by calculating the offset between the pointer position and node position at the start of the drag,\n // and applying that offset to the pointer position during dragging.\n const dragPositionResult = getDraggedNodePositionWithOffset({\n pendingDragPosition: { x, y },\n zoomAndPanState: parentZoomAndPanState,\n currentNodePosition: currentNode ? { x: currentNode.x, y: currentNode.y } : null,\n existingDragOffset: dragOffsetRef.current,\n });\n if (!dragPositionResult) {\n return;\n }\n dragOffsetRef.current = dragPositionResult.resolvedDragOffset;\n\n setNodeMapStruct(prevNodeMapStruct =>\n updateDraggedNodePosition(\n prevNodeMapStruct,\n isDragging.id,\n dragPositionResult.adjustedPositionWithOffset\n )\n );\n },\n [isDragging, nodeMapStruct, parentZoomAndPanState]\n );\n\n const handleNodeClick = useCallback(\n (node): void => {\n if (node) {\n const metadataForNode = metadata[node.index] || {};\n\n onNodeClick({\n type: 'node.click',\n payload: {\n value: node.value,\n name: node.id,\n ...createDynamicPayload(metadataForNode),\n },\n });\n }\n },\n [metadata, onNodeClick]\n );\n\n const getTooltipContext = useCallback(\n (node: {\n x: number;\n y: number;\n }): {\n tooltipContext: { tooltipX: number; tooltipY: number };\n } => {\n const transform = svgRef.current ? zoomTransform(svgRef.current) : zoomIdentity;\n const [appliedX, appliedY] = transform.apply([node.x, node.y]);\n const tooltipYOffset = DEFAULT_NODE_RADIUS * transform.k;\n return {\n tooltipContext: {\n tooltipX: appliedX,\n tooltipY: appliedY - tooltipYOffset,\n },\n };\n },\n []\n );\n\n const handleNodeMouseOver = useCallback(\n (node): void => {\n if (node) {\n const metadataForNode = metadata[node.index] || {};\n const tooltipPosition = getTooltipContext(node);\n\n onNodeMouseOver({\n type: 'node.mouseOver',\n payload: {\n value: node.value,\n name: node.id,\n ...tooltipPosition,\n ...createDynamicPayload(metadataForNode),\n },\n });\n }\n },\n [getTooltipContext, metadata, onNodeMouseOver]\n );\n\n const handleNodeMouseOut = useCallback(\n (node): void => {\n if (node) {\n const metadataForNode = metadata[node.index] || {};\n const tooltipPosition = getTooltipContext(node);\n\n onNodeMouseOut({\n type: 'node.mouseOut',\n payload: {\n value: node.value,\n name: node.id,\n ...tooltipPosition,\n ...createDynamicPayload(metadataForNode),\n },\n });\n }\n },\n [getTooltipContext, metadata, onNodeMouseOut]\n );\n\n const currentZoomLevel = parentZoomAndPanState.zoom ?? autoZoomLevel ?? 1;\n\n return (\n <StyledWrapper\n ref={containerRef}\n data-test=\"network-graph-container\"\n backgroundColor={backgroundColor}\n width={cssWidth}\n height={cssHeight}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n >\n {nodeMapVisual && nodeMapStruct && (\n <>\n {isReadyToRender && (\n <ZoomControls\n handleReset={handleReset}\n handleZoomIn={handleZoomIn}\n handleZoomOut={handleZoomOut}\n hideReset={hideReset}\n disableZoomIn={disableZoomIn}\n disableZoomOut={disableZoomOut}\n hideZoomControls={!showZoomControls}\n />\n )}\n <NetworkGraphSvg\n nodeMapStruct={nodeMapStruct}\n nodeMapVisual={nodeMapVisual}\n linkMap={linkMap}\n linkStyle={linkStyle}\n showDirection={showDirection}\n preferPorts={effectivePreferPorts}\n svgRef={svgRef}\n zoomContainerRef={zoomContainerRef}\n isReadyToRender={isReadyToRender}\n zoomLevel={currentZoomLevel}\n hideTooltip={!tooltipHeaderFieldName && tooltipNodeFields.length === 0}\n handleMouseDown={handleMouseDown}\n handleMouseUp={handleMouseUp}\n handleDrag={handleDrag}\n handleNodeClick={handleNodeClick}\n handleNodeMouseOver={handleNodeMouseOver}\n handleNodeMouseOut={handleNodeMouseOut}\n highlightedNode={highlightedNode}\n setHighlightedNode={setHighlightedNode}\n isDragging={isDragging.dragStarted}\n />\n </>\n )}\n </StyledWrapper>\n );\n};\n\nexport default PureNetworkGraph;\n", "\nimport * as defaultImport from \"d3-transition\";\nexport * from \"d3-transition\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"d3-selection\";\nexport * from \"d3-selection\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"d3-zoom\";\nexport * from \"d3-zoom\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import dagre from 'dagre';\nimport { isRemoteIcon, isDataURI, isRelativeUrlPath } from '@splunk/visualizations-shared/iconUtils';\nimport { isColor } from '@splunk/visualization-encoding/utils/colorUtils';\nimport { truncateText, VIZ_FONT_FAMILY, computeTextWidth } from '../../../common/utils/textUtils';\nimport { getForceLayout, ForceLayoutOptionsType, ForceNodeType, ForceLinkType } from './forceLayout';\nimport type {\n IconType,\n NodeMapVisualType,\n NodeMapStructuralType,\n NodeTypeStructural,\n PositionMapType,\n NodePositionType,\n LinkMapType,\n ClusterLinkType,\n NodeMetadataType,\n NodeMetadataPayloadType,\n} from './networkGraphShared';\n\nimport {\n DEFAULT_NODE_RADIUS,\n MAX_NODE_DIAMETER,\n MIN_NODE_DIAMETER,\n DEFAULT_LINK_WIDTH,\n MIN_LINK_WIDTH,\n MAX_LINK_WIDTH,\n} from './networkGraphShared';\n\nexport const MAX_ZOOM = 4;\nexport const MAX_TEXT_WIDTH = 144;\n\nexport const RECT_HORIZONTAL_PADDING = 12;\nexport const RECT_VERTICAL_PADDING = 4;\nexport const LINE_HEIGHT = 16;\nexport const RECT_TOP_MARGIN = 4;\nexport const LABEL_FONT_SIZE = 12;\nexport const FONT = `${LABEL_FONT_SIZE}px ${VIZ_FONT_FAMILY}`;\nexport const DIM_OPACITY = 0.25;\nconst MIN_NODE_SPACING = 4;\nconst MIN_EDGE_LENGTH = 48;\nconst MIN_NODE_CONTAINER_SIZE = DEFAULT_NODE_RADIUS * 2 + MIN_EDGE_LENGTH;\nconst DEFAULT_NODE_HORIZONTAL_SPACING = 0;\nconst DEFAULT_NODE_VERTICAL_SPACING = 0;\nconst FORCE_NODE_PADDING = 24;\nexport type LinkStyleType = 's' | 'z' | 'c' | 'straight';\n\nexport type ShowDirectionType = 'bidirection' | 'oneWay' | 'none';\n\nexport type PreferPortsType = 'none' | 'horizontal' | 'vertical';\n\nexport type LayoutType = 'grid' | 'preset' | 'hierarchical' | 'force';\n\nexport type LayoutDirectionType =\n | 'horizontal'\n | 'vertical'\n | 'topBottom'\n | 'bottomTop'\n | 'leftRight'\n | 'rightLeft';\n\nexport type LayoutOptionsType = {\n // shared options\n nodeHorizontalPadding?: number;\n nodeVerticalPadding?: number;\n\n // hierarchical options\n hierarchyDirection?: LayoutDirectionType;\n\n // preset options\n xPositions?: number[];\n yPositions?: number[];\n\n // grid options\n gridColumns?: number;\n} & ForceLayoutOptionsType;\n\nexport type BoundingBoxType = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\nexport type IconRenderInfo = {\n iconUrl?: string;\n shouldRenderRemoteIcon: boolean;\n};\n\nexport const getIconRenderInfo = (icon?: IconType): IconRenderInfo => {\n const isIconString = typeof icon === 'string';\n const isRelativeIcon = isIconString ? isRelativeUrlPath(icon) : false;\n let iconUrl = isIconString ? icon : undefined;\n if (iconUrl && isRelativeIcon && typeof window !== 'undefined' && window.location?.origin) {\n iconUrl = `${window.location.origin}${iconUrl}`;\n }\n const shouldRenderRemoteIcon =\n !!iconUrl && isIconString && (isRemoteIcon(iconUrl) || isDataURI(iconUrl) || isRelativeIcon);\n\n return { iconUrl, shouldRenderRemoteIcon };\n};\n\n// sanitize id for use in SVG\nexport const sanitizeSvgId = (id: string): string => {\n const encoder = new TextEncoder();\n const bytes = encoder.encode(id.normalize('NFC')); // normalize for consistency\n const hex = Array.from(bytes)\n .map(b => b.toString(16).padStart(2, '0'))\n .join('');\n return `id_${hex}`;\n};\n\n// decode id back to original string\nexport const unsanitizeSvgId = (safeId: string): string => {\n // Remove the \"id_\" prefix if present\n const hex = safeId.startsWith('id_') ? safeId.slice(3) : safeId;\n\n // Convert every 2 hex chars into a byte\n const pairs = hex.match(/.{1,2}/g) || [];\n const bytes = new Uint8Array(pairs.map(byte => parseInt(byte, 16)));\n\n // Decode bytes back to string\n const decoder = new TextDecoder();\n return decoder.decode(bytes);\n};\n\n// create dynamic payload from metadata for event payloads\nexport const createDynamicPayload = (metadata: NodeMetadataType = {}): NodeMetadataPayloadType => {\n const dynamicPayload: NodeMetadataPayloadType = {};\n Object.entries(metadata).forEach(([key, value]) => {\n dynamicPayload[`row.${key}.value`] = value;\n });\n return dynamicPayload;\n};\n\nexport const shouldDimNode = (highlightedNode: NodeTypeStructural | null, currentNodeId: string): boolean => {\n if (!highlightedNode) return false;\n if (highlightedNode.id === currentNodeId) return false;\n if (highlightedNode.children?.includes(currentNodeId)) return false;\n if (highlightedNode.parents?.includes(currentNodeId)) return false;\n\n return true;\n};\n\nexport const shouldHighlightLink = (source: string, target: string, highlightedNode: string | null) => {\n if (!highlightedNode) return false;\n return source === highlightedNode || target === highlightedNode;\n};\n\n// generate node map visual\n// when visual changes occur only change visual node map\ntype UniqueNodesVisualParams = {\n nodeIds: string[];\n nodeColors: string[] | string;\n iconColors: string[] | string;\n icons: IconType[];\n nodeValues: number[];\n resultLimit?: number;\n tooltipHeaderField?: string;\n tooltipNodeFields?: string[];\n metadata?: NodeMetadataType[];\n};\n\nconst getValidColor = (nodeColors: string[] | string, index: number): string | null => {\n const color = typeof nodeColors === 'string' ? nodeColors : nodeColors[index];\n return isColor(color) ? color : null;\n};\n\nexport const getUniqueNodesVisual = ({\n nodeIds,\n nodeColors,\n iconColors,\n icons,\n nodeValues,\n resultLimit,\n tooltipHeaderField,\n tooltipNodeFields = [],\n metadata = [],\n}: UniqueNodesVisualParams): NodeMapVisualType => {\n const nodeMapVisual: NodeMapVisualType = {};\n // add nodes from datasource\n // note: we assume nodeIds match up with nodeTexts, nodeValues, nodeColors, icons, and iconColors\n // nodeIds can be the same as from if the user is not using a secondary data source\n nodeIds.slice(0, resultLimit).forEach((id, i) => {\n if (!nodeMapVisual[id]?.index) {\n const nodeMeta = metadata[i] || {};\n nodeMapVisual[id] = {\n id,\n index: i,\n color: getValidColor(nodeColors, i),\n icon: icons[i],\n iconColor: getValidColor(iconColors, i),\n value: nodeValues[i],\n tooltipFields:\n tooltipNodeFields.length > 0\n ? [...tooltipNodeFields].reduce((acc, fieldName) => {\n if (fieldName in nodeMeta) {\n acc[fieldName] = nodeMeta[fieldName];\n }\n return acc;\n }, {})\n : undefined,\n tooltipHeader: tooltipHeaderField ? nodeMeta[tooltipHeaderField] : undefined,\n };\n }\n });\n\n return nodeMapVisual;\n};\n\n// generate node map only used for structural changes to trigger layout recalculations\nexport const getUniqueNodesStruct = (\n source: string[],\n target: string[],\n nodeIds: string[],\n nodeTexts: string[],\n nodeTypes: string[],\n nodeSizes: number[] | number,\n resultLimit?: number\n): NodeMapStructuralType => {\n // for updates that do require a layout recalculation\n const nodeMapStruct: NodeMapStructuralType = {};\n\n // add nodes from datasource\n // note: we assume nodeIds match up with nodeTexts, nodeValues, nodeColors, icons, and iconColors\n // nodeIds can be the same as source if the user is not using a secondary data source\n nodeIds.slice(0, resultLimit).forEach((id, i) => {\n const truncatedText = truncateTextToMaxLines(nodeTexts[i], FONT, MAX_TEXT_WIDTH, 4);\n const textWidth = Math.max(...truncatedText.map(line => computeTextWidth(line, FONT)));\n const labelHeight =\n truncatedText.length > 0 ? RECT_VERTICAL_PADDING * 2 + LINE_HEIGHT * truncatedText.length : 0;\n const diameter = Math.max(\n MIN_NODE_DIAMETER,\n Math.min(\n MAX_NODE_DIAMETER,\n Array.isArray(nodeSizes) ? nodeSizes[i] : (nodeSizes ?? DEFAULT_NODE_RADIUS * 2)\n )\n );\n const nodeHeight = diameter + RECT_TOP_MARGIN + MIN_NODE_SPACING + labelHeight;\n const nodeWidth = Math.max(textWidth + RECT_HORIZONTAL_PADDING * 2, diameter + MIN_NODE_SPACING * 2);\n if (!nodeMapStruct[id]?.index) {\n nodeMapStruct[id] = {\n id,\n index: i,\n // need label to calculate node size, which will be used in the layout algorithm\n label: nodeTexts[i],\n height: nodeHeight,\n width: nodeWidth,\n type: nodeTypes?.[i],\n size: diameter,\n children: [],\n parents: [],\n x: undefined,\n y: undefined,\n };\n }\n });\n\n // add neighbors to nodes\n // this will make it easier to highlight neighbors on hover\n target.forEach((targetId, index) => {\n const sourceId = source[index];\n // add parent neighbors to nodeMap\n if (targetId && nodeMapStruct[targetId] && !nodeMapStruct[targetId].parents.includes(sourceId)) {\n nodeMapStruct[targetId].parents.push(sourceId);\n }\n // add child neighbors to nodeMap\n if (sourceId && nodeMapStruct[sourceId] && !nodeMapStruct[sourceId].children.includes(targetId)) {\n nodeMapStruct[sourceId].children.push(targetId);\n }\n });\n return nodeMapStruct;\n};\n\nexport const updatePositions = (\n nodeMap: NodeMapStructuralType,\n positions: PositionMapType\n): NodeMapStructuralType => {\n const updatedNodeMap: NodeMapStructuralType = {};\n Object.keys(nodeMap).forEach(id => {\n updatedNodeMap[id] = {\n ...nodeMap[id],\n x: positions?.[id] ? positions[id].x : nodeMap[id].x,\n y: positions?.[id] ? positions[id].y : nodeMap[id].y,\n };\n });\n return updatedNodeMap;\n};\n\nexport const getUniqueLinks = (\n source: string[],\n target: (string | null)[],\n linkColors: string[] | string,\n linkWidth: number[] | number,\n resultLimit?: number\n): LinkMapType => {\n const linkMap: LinkMapType = {};\n source.slice(0, resultLimit).forEach((sourceId, index) => {\n const targetId = target[index];\n const linkColor = getValidColor(linkColors, index);\n const width = typeof linkWidth === 'number' ? linkWidth : (linkWidth?.[index] ?? DEFAULT_LINK_WIDTH);\n const clampedWidth = Number.isNaN(width)\n ? DEFAULT_LINK_WIDTH\n : Math.min(MAX_LINK_WIDTH, Math.max(MIN_LINK_WIDTH, width));\n // check for toId, since we can have links with no target\n if (targetId) {\n const linkId = `${sourceId}-${targetId}`;\n // this will overwrite the link if it already exists, we use the last one in the list\n // this is what the splunkbase network graph does\n linkMap[linkId] = {\n id: linkId,\n source: sourceId,\n target: targetId,\n color: linkColor,\n width: clampedWidth,\n };\n }\n });\n return linkMap;\n};\n\n// generate grid x,y positions for nodes\nexport const getGridLayout = (\n nodeMap: NodeMapStructuralType,\n gridColumns: number | undefined,\n nodeHorizontalPadding = DEFAULT_NODE_HORIZONTAL_SPACING,\n nodeVerticalPadding = DEFAULT_NODE_VERTICAL_SPACING\n): PositionMapType => {\n const positions = {};\n const numOfCols = gridColumns ?? Math.ceil(Math.sqrt(Object.keys(nodeMap).length));\n const nodeMaxWidth = Math.max(...Object.values(nodeMap).map(node => node.width), 0);\n const nodeMaxHeight = Math.max(...Object.values(nodeMap).map(node => node.height), 0);\n const columnWidth = Math.max(nodeMaxWidth, MIN_NODE_CONTAINER_SIZE) + nodeHorizontalPadding;\n const rowHeight = Math.max(nodeMaxHeight, MIN_NODE_CONTAINER_SIZE) + nodeVerticalPadding;\n\n Object.keys(nodeMap).forEach((id, index) => {\n positions[id] = {\n x: (index % numOfCols) * columnWidth + MAX_TEXT_WIDTH,\n y: Math.floor(index / numOfCols) * rowHeight + DEFAULT_NODE_RADIUS,\n };\n });\n return positions;\n};\n\n// use user-defined x and y positions to preset the layout\nexport const getPresetLayout = (\n nodeMap: NodeMapStructuralType,\n xPositions: number[],\n yPositions: number[]\n): PositionMapType => {\n const positionsMap: PositionMapType = {};\n const xPosFormatted = xPositions?.map(x => x + 340);\n const yPosFormatted = yPositions?.map(y => y + 280);\n Object.keys(nodeMap).forEach(id => {\n const { index } = nodeMap[id];\n positionsMap[id] = {\n x: xPosFormatted[index],\n y: yPosFormatted[index],\n };\n });\n return positionsMap;\n};\n\n// this can take a long time for > 200 nodes\n// for 200 it takes 26ms, 1000 takes 2 seconds\n// eventually move to a webworker\nexport const getHierarchicalLayout = (\n nodeMap: NodeMapStructuralType,\n nodeHorizontalPadding = DEFAULT_NODE_HORIZONTAL_SPACING,\n nodeVerticalPadding = DEFAULT_NODE_VERTICAL_SPACING,\n hierarchyDirection: LayoutDirectionType = 'leftRight'\n): PositionMapType => {\n let rankdir: string;\n if (hierarchyDirection === 'topBottom' || hierarchyDirection === 'vertical') {\n rankdir = 'TB';\n } else if (hierarchyDirection === 'bottomTop') {\n rankdir = 'BT';\n } else if (hierarchyDirection === 'rightLeft') {\n rankdir = 'RL';\n } else {\n rankdir = 'LR';\n }\n const isVertical =\n hierarchyDirection === 'topBottom' ||\n hierarchyDirection === 'bottomTop' ||\n hierarchyDirection === 'vertical';\n const edgeSeparation = 24;\n const g = new dagre.graphlib.Graph();\n g.setGraph({\n rankdir,\n nodesep: isVertical ? nodeHorizontalPadding : nodeVerticalPadding,\n ranksep: isVertical ? nodeVerticalPadding : nodeHorizontalPadding,\n edgesep: edgeSeparation,\n });\n // set empty object by default to avoid errors\n g.setDefaultEdgeLabel(() => ({}));\n\n // Add nodes and edges\n Object.values(nodeMap).forEach(node => {\n g.setNode(node.id, {\n width: Math.max(node.width, MIN_NODE_CONTAINER_SIZE),\n // note: the label is beneath the node, so height is not symmetrical around the position, so we need to use the node size\n // add padding to make sure the link looks good in s and z shape\n height: Math.max(node.height, MIN_NODE_CONTAINER_SIZE),\n // useful for incremental layouting\n x: node.x || null,\n y: node.y || null,\n });\n });\n Object.values(nodeMap).forEach(node => {\n if (Array.isArray(node.children)) {\n node.children.forEach(childId => {\n if (nodeMap[childId]) {\n g.setEdge(node.id, childId);\n }\n });\n }\n });\n\n dagre.layout(g);\n\n // Convert result to position map\n const positionMap: PositionMapType = {};\n g.nodes().forEach(id => {\n const node = g.node(id);\n if (node && typeof node.x === 'number' && typeof node.y === 'number') {\n positionMap[id] = {\n // offset to keep top left corner within view\n // this should not be needed after autozoom\n x: node.x + 50,\n y: node.y + 16,\n };\n }\n });\n\n return positionMap;\n};\n\nexport const getLayout = (\n layout: LayoutType,\n nodeMapStruct: NodeMapStructuralType,\n layoutOptions: LayoutOptionsType\n): PositionMapType => {\n const {\n hierarchyDirection,\n xPositions,\n yPositions,\n nodeHorizontalPadding,\n nodeVerticalPadding,\n gridColumns,\n d3NodeList,\n d3LinkList,\n chargeStrength,\n chargeTheta,\n chargeDistanceMax,\n chargeDistanceMin,\n linkDistance,\n linkStrength,\n collidePadding,\n collideStrength,\n clusterStrength,\n } = layoutOptions;\n\n if (layout === 'preset' && xPositions && yPositions) {\n return getPresetLayout(nodeMapStruct, xPositions, yPositions);\n }\n if (layout === 'hierarchical') {\n return getHierarchicalLayout(\n nodeMapStruct,\n nodeHorizontalPadding,\n nodeVerticalPadding,\n hierarchyDirection\n );\n }\n if (layout === 'force' && d3NodeList && d3LinkList) {\n return getForceLayout({\n d3NodeList,\n d3LinkList,\n chargeStrength,\n chargeTheta,\n collidePadding,\n collideStrength,\n clusterStrength,\n chargeDistanceMax,\n chargeDistanceMin,\n linkDistance,\n linkStrength,\n });\n }\n return getGridLayout(nodeMapStruct, gridColumns, nodeHorizontalPadding, nodeVerticalPadding);\n};\n\ntype NodeMapWithPositionsParams = {\n source: string[];\n target: (string | null)[];\n nodeIds: string[];\n nodeTexts: string[];\n nodeTypes: string[];\n nodeSize?: number[] | number;\n layout: LayoutType;\n layoutOptions: LayoutOptionsType;\n resultLimit?: number;\n};\n\nexport const getNodeMapWithPositions = ({\n source,\n target,\n nodeIds,\n nodeTexts,\n nodeTypes,\n nodeSize,\n layout,\n layoutOptions,\n resultLimit,\n}: NodeMapWithPositionsParams) => {\n const nodeMapStruct = getUniqueNodesStruct(\n source,\n target,\n nodeIds,\n nodeTexts,\n nodeTypes,\n nodeSize,\n resultLimit\n );\n let updatedLayoutOptions = { ...layoutOptions };\n\n // generate node list and link list for d3-force algorithm, need a copy because d3-force modifies the objects\n if (layout === 'force') {\n const d3NodeList: ForceNodeType[] =\n layout === 'force' &&\n [...new Set(source.slice(0, resultLimit))].map(sourceId => ({\n id: sourceId,\n // add a type if clustering is on\n type: nodeMapStruct[sourceId]?.type,\n r: Number.isFinite(nodeMapStruct[sourceId]?.size)\n ? nodeMapStruct[sourceId].size / 2 + FORCE_NODE_PADDING\n : DEFAULT_NODE_RADIUS + FORCE_NODE_PADDING,\n }));\n\n const d3LinkList: ForceLinkType[] =\n layout === 'force' &&\n source\n .slice(0, resultLimit)\n .map((sourceId, index) => ({\n source: sourceId,\n target: target[index],\n // add a clusterType if clustering is on\n clusterType:\n nodeMapStruct[sourceId]?.type &&\n (nodeMapStruct[sourceId]?.type === nodeMapStruct[target[index]]?.type\n ? ('same' as ClusterLinkType)\n : ('mixed' as ClusterLinkType)),\n }))\n .filter(x => !!x.target && nodeMapStruct[x.source] && nodeMapStruct[x.target]);\n updatedLayoutOptions = { ...updatedLayoutOptions, d3NodeList, d3LinkList };\n }\n\n const positionMap = getLayout(layout, nodeMapStruct, updatedLayoutOptions);\n return updatePositions(nodeMapStruct, positionMap);\n};\n\n// get the substring that fits in the line\n// use binary search approach for performance\nconst fitCharacters = (context: CanvasRenderingContext2D, maxWidth: number, prefix: string, word: string) => {\n const space = prefix ? ' ' : '';\n let start = 0;\n let end = word.length;\n let bestFit = 0;\n while (start <= end) {\n const mid = Math.floor((start + end) / 2);\n const candidate = prefix ? `${prefix}${space}${word.slice(0, mid)}` : word.slice(0, mid);\n if (context.measureText(candidate).width <= maxWidth) {\n bestFit = mid;\n start = mid + 1;\n } else {\n end = mid - 1;\n }\n }\n return bestFit;\n};\n\nconst handleWordSplit = (\n context: CanvasRenderingContext2D,\n maxWidth: number,\n currentLineText: string,\n nextWord: string\n) => {\n const charsThatFit = fitCharacters(context, maxWidth, currentLineText, nextWord);\n const splitPart = nextWord.slice(0, Math.max(1, charsThatFit));\n const remainder = nextWord.slice(splitPart.length);\n const space = currentLineText ? ' ' : '';\n const currentLineWithSplitPart = `${currentLineText}${space}${splitPart}`;\n\n return { currentLineWithSplit: currentLineWithSplitPart, remainder };\n};\n\nexport const truncateTextToMaxLines = (\n text = '',\n font = `12px ${VIZ_FONT_FAMILY}`,\n maxWidth = 144,\n maxLines = 2\n): string[] => {\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) return [text];\n context.font = font;\n\n const wordQueue = text.split(/\\s+/).filter(Boolean);\n const outputLines: string[] = [];\n let currentLineText = '';\n\n while (wordQueue.length && outputLines.length < maxLines) {\n const space = currentLineText ? ' ' : '';\n\n // Handle last line with truncation\n if (outputLines.length === maxLines - 1) {\n const remainingText = `${currentLineText}${space}${wordQueue.join(' ')}`;\n const truncatedText = truncateText(remainingText, maxWidth, 'ellipsisEnd', font);\n outputLines.push(truncatedText);\n break;\n }\n\n const nextWord = wordQueue[0];\n const lineWithNextWord = `${currentLineText}${space}${nextWord}`;\n const fitsOnCurrentLine = context.measureText(lineWithNextWord).width <= maxWidth;\n const isNextWordLongerThanMaxWidth = context.measureText(nextWord).width > maxWidth;\n\n // Word fits fully on the current line\n if (fitsOnCurrentLine) {\n currentLineText = lineWithNextWord;\n wordQueue.shift();\n } else if (!isNextWordLongerThanMaxWidth) {\n // Word fits on an empty line but not current line\n outputLines.push(currentLineText);\n currentLineText = '';\n } else {\n // Word is longer than a line and needs to be split\n const { currentLineWithSplit, remainder } = handleWordSplit(\n context,\n maxWidth,\n currentLineText,\n nextWord\n );\n outputLines.push(currentLineWithSplit);\n currentLineText = '';\n wordQueue[0] = remainder;\n }\n }\n\n if (currentLineText && outputLines.length < maxLines) {\n outputLines.push(currentLineText);\n }\n\n return outputLines;\n};\n\nconst getNodeBounds = (node: NodeTypeStructural) => {\n if (!node) return undefined;\n\n const truncatedText = truncateTextToMaxLines(node.label ?? '', FONT, MAX_TEXT_WIDTH, 2);\n const textWidth = truncatedText.length\n ? Math.max(...truncatedText.map(line => computeTextWidth(line, FONT)))\n : 0;\n const labelHeight =\n truncatedText.length > 0 ? RECT_VERTICAL_PADDING * 2 + LINE_HEIGHT * truncatedText.length : 0;\n const nodeLabelHeightWithMargin = RECT_TOP_MARGIN + labelHeight;\n const nodeLabelWidth = textWidth + RECT_HORIZONTAL_PADDING * 2;\n const nodeDiameter = node.size ?? DEFAULT_NODE_RADIUS * 2;\n const nodeRadius = nodeDiameter / 2;\n\n return {\n x: node.x - Math.max(nodeRadius, nodeLabelWidth / 2),\n y: node.y - nodeRadius,\n x2: node.x - Math.max(nodeRadius, nodeLabelWidth / 2) + Math.max(nodeRadius * 2, nodeLabelWidth),\n y2: node.y + nodeRadius + nodeLabelHeightWithMargin,\n };\n};\n\nconst getFullVizBoundsWithPadding = (nodeMap: NodeMapStructuralType, padding: number): BoundingBoxType => {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n if (Object.keys(nodeMap).length === 0) {\n // Handle empty node map case\n return {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n };\n }\n\n // iterate through nodes to get the outmost nodes for bounds\n // make sure to include label size in the bounds\n Object.values(nodeMap).forEach(node => {\n // getNodeBounds does text truncation + width measurement, so compute once per node.\n const bounds = getNodeBounds(node);\n if (!bounds) return;\n if (!Number.isFinite(bounds.x) || !Number.isFinite(bounds.y)) return;\n if (!Number.isFinite(bounds.x2) || !Number.isFinite(bounds.y2)) return;\n\n minX = Math.min(minX, bounds.x);\n minY = Math.min(minY, bounds.y);\n maxX = Math.max(maxX, bounds.x2);\n maxY = Math.max(maxY, bounds.y2);\n });\n\n return {\n x: Number.isFinite(minX) ? minX - padding : 0,\n y: Number.isFinite(minY) ? minY - padding : 0,\n width: Number.isFinite(maxX) && Number.isFinite(minX) ? maxX - minX + padding * 2 : 0,\n height: Number.isFinite(maxY) && Number.isFinite(minY) ? maxY - minY + padding * 2 : 0,\n };\n};\n\nexport const getAutoZoomAndPan = (\n nodeMap: NodeMapStructuralType,\n containerWidth: number,\n containerHeight: number\n) => {\n if (Object.keys(nodeMap).length === 0) {\n // Handle empty node map case\n return {\n autoZoomLevel: 1,\n autoCenter: [0, 0],\n };\n }\n const { width, height, x, y } = getFullVizBoundsWithPadding(nodeMap, DEFAULT_NODE_RADIUS);\n\n // calculate the zoom level based on the bounding box size\n const zoomLevel = Math.min(containerWidth / width, containerHeight / height);\n\n const centerX = x + width / 2;\n const centerY = y + height / 2;\n\n return { autoZoomLevel: Math.min(zoomLevel, MAX_ZOOM), autoCenter: [centerX, centerY] };\n};\n\nexport const nearlyEqual = (a: number, b: number, tolerance = 1e-4, usePercentage = false) => {\n if (!usePercentage) {\n return Math.abs(a - b) < tolerance;\n }\n\n const maxAbs = Math.max(Math.abs(a), Math.abs(b));\n\n if (maxAbs === 0) {\n return Math.abs(a - b) < tolerance;\n }\n\n return Math.abs(a - b) / maxAbs <= tolerance;\n};\n\nexport const calculateMinZoomBounds = (autoZoomLevel: number, height, width) => {\n // min zoom value is 25% of auto zoom value\n // which is the same as clicking on the zoom out control twice\n const minZoomLevel = autoZoomLevel / (1.5 * 1.5);\n const minZoomWidth = width / minZoomLevel;\n const minZoomHeight = height / minZoomLevel;\n\n return { minZoomLevel, minZoomHeight, minZoomWidth };\n};\n\nexport const getZoomDisableState = (\n currentZoom: number | null | undefined,\n autoZoomLevel: number,\n minZoomLevel: number\n) => {\n const currentZoomLevel = currentZoom ?? autoZoomLevel;\n const zoomPercentTolerance = 0.001; // 0.1%\n const disableZoomIn =\n currentZoomLevel >= MAX_ZOOM || nearlyEqual(currentZoomLevel, MAX_ZOOM, zoomPercentTolerance, true);\n const disableZoomOut =\n currentZoomLevel <= minZoomLevel ||\n nearlyEqual(currentZoomLevel, minZoomLevel, zoomPercentTolerance, true);\n\n return { disableZoomIn, disableZoomOut };\n};\n\nexport const getDefaultPreferPorts = (\n layout: LayoutType,\n hierarchyDirection: LayoutDirectionType\n): PreferPortsType => {\n if (layout === 'hierarchical') {\n if (hierarchyDirection === 'topBottom' || hierarchyDirection === 'bottomTop') {\n return 'vertical';\n }\n return 'horizontal';\n }\n return 'none';\n};\n\n/// ////////////////////////////\n// LINK STYLING FUNCTIONS\n/// ////////////////////////////\n\ntype StartEndAngleParams = {\n sourcePosition: NodePositionType;\n targetPosition: NodePositionType;\n linkStyle: LinkStyleType;\n showDirection: ShowDirectionType;\n isBidirectional: boolean;\n preferPorts: PreferPortsType;\n startMargin: number;\n endMargin: number;\n linkWidth: number;\n arrowWidth: number;\n};\n\nconst getStartAndEndAngle = ({\n sourcePosition,\n targetPosition,\n linkStyle,\n showDirection,\n isBidirectional,\n preferPorts,\n startMargin,\n endMargin,\n linkWidth,\n arrowWidth,\n}: StartEndAngleParams) => {\n // this is the angle from the line that connects the start and end\n const angle = Math.atan2(targetPosition.y - sourcePosition.y, targetPosition.x - sourcePosition.x);\n\n // angle adjustment used to snap edge to nearest of 4 ports for z and s edges\n // also used to offset straight and c edges for one way edges\n let diffAngleStart;\n let diffAngleEnd;\n\n if (linkStyle === 'straight' || linkStyle === 'c') {\n diffAngleStart = Math.atan((linkWidth + arrowWidth) / startMargin) / 2;\n diffAngleEnd = Math.atan((linkWidth + arrowWidth) / endMargin) / 2;\n } else {\n // restrict to horizontal or vertical ports\n const portAngle = getIsHorizontalDominant(preferPorts, sourcePosition, targetPosition)\n ? Math.PI * Math.round(angle / Math.PI)\n : Math.PI * Math.round((angle + Math.PI / 2) / Math.PI) - Math.PI / 2;\n diffAngleStart = portAngle - angle;\n diffAngleEnd = diffAngleStart;\n }\n\n let startDiffToggle = 1;\n let endDiffToggle = 1;\n if (linkStyle === 'straight' || linkStyle === 'c') {\n // if direction is one-way and there are 2 directions, we want the lines to start slightly off center so they don't overlap\n startDiffToggle = showDirection === 'oneWay' && isBidirectional ? -1 : 0;\n endDiffToggle = showDirection === 'oneWay' && isBidirectional ? 1 : 0;\n }\n\n const startAngleOffset = startDiffToggle * diffAngleStart;\n const endAngleOffset = endDiffToggle * diffAngleEnd;\n\n return { startAngle: angle + startAngleOffset, endAngle: angle + endAngleOffset };\n};\n\nexport const getIsHorizontalDominant = (\n preferPorts: PreferPortsType,\n sourcePosition: NodePositionType,\n targetPosition: NodePositionType\n) => {\n const minDistanceHorizontal = 72;\n const minDistanceVertical = 72;\n\n const isHorizontalDistanceDominant =\n Math.abs(sourcePosition.x - targetPosition.x) > Math.abs(sourcePosition.y - targetPosition.y);\n\n // use none by default if value is invalid\n if (preferPorts === 'none' || (preferPorts !== 'horizontal' && preferPorts !== 'vertical')) {\n return isHorizontalDistanceDominant;\n }\n if (\n preferPorts === 'horizontal' &&\n (isHorizontalDistanceDominant ||\n Math.abs(sourcePosition.x - targetPosition.x) > minDistanceHorizontal)\n ) {\n return true;\n }\n if (preferPorts === 'vertical' && Math.abs(sourcePosition.y - targetPosition.y) < minDistanceVertical) {\n return true;\n }\n return false;\n};\n\ntype EdgePathParams = {\n sourcePosition: NodePositionType;\n targetPosition: NodePositionType;\n startWithArrowOffset: NodePositionType;\n endWithArrowOffset: NodePositionType;\n start: NodePositionType;\n end: NodePositionType;\n middle: NodePositionType;\n preferPorts: PreferPortsType;\n};\n\nconst getSPath = ({\n sourcePosition,\n targetPosition,\n startWithArrowOffset,\n endWithArrowOffset,\n start,\n end,\n middle,\n preferPorts,\n}: EdgePathParams) => {\n // Horizontal-dominant S\n const isHorizontalDominant = getIsHorizontalDominant(preferPorts, sourcePosition, targetPosition);\n\n if (isHorizontalDominant) {\n const segment = (end.x - start.x) / 7;\n return `\n M ${startWithArrowOffset.x} ${startWithArrowOffset.y} \n L ${start.x + segment} ${start.y} \n C ${middle.x + segment} ${start.y}, ${middle.x - segment} ${end.y}, ${end.x - segment} ${end.y} \n L ${endWithArrowOffset.x} ${endWithArrowOffset.y}\n `;\n }\n const segment = (end.y - start.y) / 7;\n // Vertical-dominant S\n return `\n M ${startWithArrowOffset.x} ${startWithArrowOffset.y} \n L ${start.x} ${start.y + segment} \n C ${start.x} ${middle.y + segment}, ${end.x} ${middle.y - segment}, ${end.x} ${end.y - segment}\n L ${endWithArrowOffset.x} ${endWithArrowOffset.y}\n `;\n};\n\nconst getZPath = ({\n sourcePosition,\n targetPosition,\n startWithArrowOffset,\n endWithArrowOffset,\n start,\n end,\n middle,\n preferPorts,\n}: EdgePathParams) => {\n // radius for corner rounding\n const radius = 8;\n // straight line, no need for Z\n if (\n Math.abs(sourcePosition.x - targetPosition.x) < radius * 2 ||\n Math.abs(sourcePosition.y - targetPosition.y) < radius * 2\n ) {\n return `\n M ${startWithArrowOffset.x} ${startWithArrowOffset.y} \n L ${endWithArrowOffset.x} ${endWithArrowOffset.y}\n `;\n }\n // Horizontal-dominant Z\n const isHorizontalDominant = getIsHorizontalDominant(preferPorts, sourcePosition, targetPosition);\n\n if (isHorizontalDominant) {\n const directionX = end.x > start.x ? 1 : -1;\n const directionY = end.y > start.y ? 1 : -1;\n\n return `\n M ${startWithArrowOffset.x} ${startWithArrowOffset.y}\n L ${middle.x - directionX * radius} ${start.y}\n Q ${middle.x} ${start.y} ${middle.x} ${start.y + directionY * radius}\n L ${middle.x} ${end.y - directionY * radius}\n Q ${middle.x} ${end.y} ${middle.x + directionX * radius} ${end.y}\n L ${endWithArrowOffset.x} ${endWithArrowOffset.y}\n `;\n }\n // Vertical-dominant Z\n const directionX = end.x > start.x ? 1 : -1;\n const directionY = end.y > start.y ? 1 : -1;\n\n return `\n M ${startWithArrowOffset.x} ${startWithArrowOffset.y}\n L ${start.x} ${middle.y - directionY * radius}\n Q ${start.x} ${middle.y} ${start.x + directionX * radius} ${middle.y}\n L ${end.x - directionX * radius} ${middle.y}\n Q ${end.x} ${middle.y} ${end.x} ${middle.y + directionY * radius}\n L ${endWithArrowOffset.x} ${endWithArrowOffset.y}\n `;\n};\n\nconst getCPath = (\n startWithArrowOffset: NodePositionType,\n endWithArrowOffset: NodePositionType,\n start: NodePositionType,\n end: NodePositionType\n) => {\n const angle = Math.atan2(end.y - start.y, end.x - start.x);\n const edgeCurve = 24;\n const dx = (end.x - start.x) ** 2;\n const dy = (end.y - start.y) ** 2;\n const ds = Math.sqrt(dx + dy);\n // control points used for curved edge\n const curvedqx =\n (end.x - start.x) / 2 + start.x - ((edgeCurve * ds) / 400) * Math.cos(angle + Math.PI / 2);\n const curvedqy =\n (end.y - start.y) / 2 + start.y - ((edgeCurve * ds) / 400) * Math.sin(angle + Math.PI / 2);\n\n const linkPath = `\n M ${startWithArrowOffset.x} ${startWithArrowOffset.y} \n Q ${curvedqx} ${curvedqy} ${endWithArrowOffset.x} ${endWithArrowOffset.y}\n `;\n return linkPath;\n};\n\nexport const getArrowHeight = (linkSize: number, linkWidth: number): number => {\n if (linkSize === 1) return 5;\n // min linkSize is 1 so this will not divide by 0\n return linkWidth * (0.5 + 1 / linkSize);\n};\n\nexport const getArrowWidth = (linkSize: number): number => {\n return Math.round(linkSize < 4 ? 8 : linkSize * (2.1 - linkSize / 40));\n};\n\nexport const getMinDistanceForArrow = (arrowHeight: number): number => {\n return arrowHeight + 12;\n};\n\nexport const getMinDistanceForCurve = (arrowHeight: number, linkStyle: LinkStyleType | undefined): number => {\n return linkStyle === 'c' ? arrowHeight * 2 + 12 : arrowHeight * 5 + 12;\n};\n\ntype LinkRenderInfoParams = {\n linkStyle: LinkStyleType;\n showDirection: ShowDirectionType;\n preferPorts: PreferPortsType;\n sourcePosition: NodePositionType;\n targetPosition: NodePositionType;\n sourceSize: number;\n targetSize: number;\n arrowHeight: number;\n};\n\nexport const getLinkRenderInfo = ({\n linkStyle,\n showDirection,\n preferPorts,\n sourcePosition,\n targetPosition,\n sourceSize,\n targetSize,\n arrowHeight,\n}: LinkRenderInfoParams) => {\n const isHorizontalDominant = getIsHorizontalDominant(preferPorts, sourcePosition, targetPosition);\n const verticalDistance = Math.abs(targetPosition.y - sourcePosition.y);\n const horizontalDistance = Math.abs(targetPosition.x - sourcePosition.x);\n const minDistanceForArrow = getMinDistanceForArrow(\n showDirection === 'bidirection' ? arrowHeight * 2 : arrowHeight\n );\n const minDistanceForCurve = getMinDistanceForCurve(arrowHeight, linkStyle);\n const distance = Math.hypot(horizontalDistance, verticalDistance) - (sourceSize / 2 + targetSize / 2);\n const shouldHideArrow = distance < minDistanceForArrow;\n const shouldShowBasicLinkStyle = isHorizontalDominant\n ? horizontalDistance - (sourceSize / 2 + targetSize / 2) < minDistanceForCurve\n : verticalDistance - (sourceSize / 2 + targetSize / 2) < minDistanceForCurve;\n const effectiveLinkStyle = shouldShowBasicLinkStyle ? 'straight' : linkStyle;\n const effectiveShowDirection = shouldHideArrow ? 'none' : showDirection;\n\n return { effectiveLinkStyle, effectiveShowDirection };\n};\n\n// generate edge path for svg, inspired from Tatsuya's code sandbox\n// https://codesandbox.io/p/devbox/network-graph-demo-forked-lv8pnr?file=%2Fsrc%2Findex.mjs%3A517%2C4&workspaceId=ws_TYfFvbbyHMCRyRr9xg5ppW\ntype GetEdgePathParams = {\n linkStyle: LinkStyleType;\n sourcePosition: NodePositionType;\n targetPosition: NodePositionType;\n isBidirectional: boolean;\n showDirection: ShowDirectionType;\n arrowHeight?: number;\n arrowWidth?: number;\n preferPorts?: PreferPortsType;\n sourceNodeSize?: number;\n targetNodeSize?: number;\n linkWidth?: number;\n};\n\nexport const getEdgePath = ({\n linkStyle,\n sourcePosition,\n targetPosition,\n isBidirectional,\n showDirection,\n arrowHeight = 6,\n arrowWidth = 8,\n preferPorts = 'none' as PreferPortsType,\n sourceNodeSize = DEFAULT_NODE_RADIUS * 2,\n targetNodeSize = DEFAULT_NODE_RADIUS * 2,\n linkWidth = 2,\n}: GetEdgePathParams) => {\n const getNodeMargin = (nodeSize?: number) => {\n const radius = (nodeSize ?? DEFAULT_NODE_RADIUS * 2) / 2;\n return radius + arrowHeight + MIN_NODE_SPACING;\n };\n const startMargin = getNodeMargin(sourceNodeSize);\n const endMargin = getNodeMargin(targetNodeSize);\n const validatedlinkStyleType =\n linkStyle !== 'c' && linkStyle !== 'z' && linkStyle !== 's' ? 'straight' : linkStyle;\n // offset to extend the line if there is no arrow tip, this may change depending on the width of the arrow\n const startArrowTipOffset = isBidirectional && showDirection === 'bidirection' ? 0 : -arrowHeight;\n const endArrowTipOffset = showDirection === 'none' ? -arrowHeight : 0;\n // get angle to draw edge\n const { startAngle, endAngle } = getStartAndEndAngle({\n sourcePosition,\n targetPosition,\n linkStyle: validatedlinkStyleType,\n showDirection,\n isBidirectional,\n preferPorts,\n startMargin,\n endMargin,\n linkWidth,\n arrowWidth,\n });\n\n // start and end position used for calculations\n const start = {\n x: sourcePosition.x + Math.cos(startAngle) * startMargin,\n y: sourcePosition.y + Math.sin(startAngle) * startMargin,\n };\n const end = {\n x: targetPosition.x - Math.cos(endAngle) * endMargin,\n y: targetPosition.y - Math.sin(endAngle) * endMargin,\n };\n // start and end position with offset for missing arrow tip\n const startWithArrowOffset = {\n x: start.x + Math.cos(startAngle) * startArrowTipOffset,\n y: start.y + Math.sin(startAngle) * startArrowTipOffset,\n };\n const endWithArrowOffset = {\n x: end.x - Math.cos(endAngle) * endArrowTipOffset,\n y: end.y - Math.sin(endAngle) * endArrowTipOffset,\n };\n // half-way position used as control points for z and s edges\n const middle = {\n x: (end.x - start.x) / 2 + start.x,\n y: (end.y - start.y) / 2 + start.y,\n };\n\n // Z edge\n if (linkStyle === 'z') {\n return getZPath({\n sourcePosition,\n targetPosition,\n startWithArrowOffset,\n endWithArrowOffset,\n start,\n end,\n middle,\n preferPorts,\n });\n }\n // S edge\n if (linkStyle === 's') {\n return getSPath({\n sourcePosition,\n targetPosition,\n startWithArrowOffset,\n endWithArrowOffset,\n start,\n end,\n middle,\n preferPorts,\n });\n }\n // Curved edge\n if (linkStyle === 'c') {\n return getCPath(startWithArrowOffset, endWithArrowOffset, start, end);\n }\n // Straight edge by default\n return `\n M ${startWithArrowOffset.x} ${startWithArrowOffset.y} \n L ${endWithArrowOffset.x} ${endWithArrowOffset.y}\n `;\n};\n", "\nimport * as defaultImport from \"dagre\";\nexport * from \"dagre\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/iconUtils\";\nexport * from \"@splunk/visualizations-shared/iconUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualization-encoding/utils/colorUtils\";\nexport * from \"@splunk/visualization-encoding/utils/colorUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\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 {\n forceSimulation,\n forceLink,\n forceCollide,\n forceCenter,\n forceManyBody,\n SimulationNodeDatum,\n SimulationLinkDatum,\n} from 'd3-force';\nimport { quadtree, Quadtree } from 'd3-quadtree';\nimport {\n NodePositionType,\n PositionMapType,\n ClusterLinkType,\n DEFAULT_CHART_HEIGHT,\n DEFAULT_CHART_WIDTH,\n DEFAULT_NODE_RADIUS,\n} from './networkGraphShared';\n\n// ---- d3 force simulation constants ---- //\n\n// The many-body (or n-body) force applies mutually amongst all nodes.\n// It can be used to simulate gravity (attraction) if the strength is positive,\n// or electrostatic charge (repulsion) if the strength is negative.\nexport const DEFAULT_CHARGE_STRENGTH = -30;\n// The Barnes-Hut approximation parameter for many-body forces. A higher value results in faster performance\n// but less accurate positioning.\nexport const DEFAULT_CHARGE_THETA = 0.9;\n// Used for performance, we will not apply many-body forces on nodes outside of this distance.\nexport const DEFAULT_DISTANCE_MIN = 1;\nexport const DEFAULT_DISTANCE_MAX = Infinity;\n\n// The link force pushes linked nodes together or apart according to the desired link distance.\nexport const DEFAULT_LINK_DISTANCE = 30;\n\n// The collide force treats nodes as circles with a given radius, rather than points, and prevents nodes from overlapping.\n// For clustering, this value is used to increase collision distance for nodes in different categories.\nexport const DEFAULT_COLLIDE_PADDING = 10;\n// The strength of the collider used for node repulsion. A higher value results in stronger repulsion,\n// causing nodes to spread out more.\nexport const DEFAULT_COLLIDE_STRENGTH = 1;\n\n// The strength of the force used to cluster nodes of the same type together. Must be between 0 and 1.\nexport const DEFAULT_CLUSTER_STRENGTH = 0.05;\n\nexport type ForceLayoutOptionsType = {\n d3NodeList?: ForceNodeType[];\n d3LinkList?: ForceLinkType[];\n chargeStrength?: number;\n chargeTheta?: number;\n chargeDistanceMin?: number;\n chargeDistanceMax?: number;\n\n linkDistance?: number;\n linkStrength?: number;\n collidePadding?: number;\n collideStrength?: number;\n clusterStrength?: number;\n};\n\nexport type ForceNodeType = SimulationNodeDatum & {\n id: string;\n r?: number;\n type?: string;\n};\n\nexport type ForceLinkType = SimulationLinkDatum<ForceNodeType> & {\n // d3-force automatically converts source and target to node references\n source: string | ForceNodeType;\n target: string | ForceNodeType;\n clusterType?: ClusterLinkType;\n};\n\n// find centroid of a set of nodes\nexport const calculateCentroid = (nodes: ForceNodeType[]): NodePositionType => {\n let x = 0;\n let y = 0;\n let z = 0;\n nodes.forEach(node => {\n const k = (node.r || 0) ** 2;\n x += (node.x || 0) * k;\n y += (node.y || 0) * k;\n z += k;\n });\n return z > 0 ? { x: x / z, y: y / z } : { x: 0, y: 0 };\n};\n\n// Helper to process collision between two nodes\nexport const processNodeCollision = (\n nodeA: ForceNodeType,\n nodeB: ForceNodeType,\n sameGroupPadding = 1,\n diffGroupPadding = DEFAULT_COLLIDE_PADDING,\n collideStrength = 1\n) => {\n if (!nodeA || !nodeB || nodeA === nodeB) return;\n const collisionRadius =\n (nodeA.r || 0) + (nodeB.r || 0) + (nodeA.type === nodeB.type ? sameGroupPadding : diffGroupPadding);\n\n const deltaX = (nodeA.x || 0) - (nodeB.x || 0);\n const deltaY = (nodeA.y || 0) - (nodeB.y || 0);\n const distance = Math.hypot(deltaX, deltaY);\n\n if (distance < collisionRadius && distance > 0) {\n const adjustmentFactor = ((distance - collisionRadius) / distance) * collideStrength;\n const adjustmentX = deltaX * adjustmentFactor;\n const adjustmentY = deltaY * adjustmentFactor;\n\n // need to ignore param-reassign because this is how d3-force works\n /* eslint-disable no-param-reassign */\n if (nodeA.x !== undefined) nodeA.x -= adjustmentX;\n if (nodeA.y !== undefined) nodeA.y -= adjustmentY;\n if (nodeB.x !== undefined) nodeB.x += adjustmentX;\n if (nodeB.y !== undefined) nodeB.y += adjustmentY;\n /* eslint-enable no-param-reassign */\n }\n};\n\n// Helper to process all collisions in a quadtree node\nexport const processQuadCollisions = (\n quadNode: Quadtree<ForceNodeType>,\n currentNode: ForceNodeType,\n sameGroupPadding = 1,\n diffGroupPadding = 50,\n collideStrength = 1\n) => {\n let currentQuadNode = quadNode;\n while (currentQuadNode) {\n if (currentQuadNode.data) {\n processNodeCollision(\n currentNode,\n currentQuadNode.data,\n sameGroupPadding,\n diffGroupPadding,\n collideStrength\n );\n }\n currentQuadNode = currentQuadNode.next;\n }\n};\n\n// Custom collision force for node clustering\nexport const createCustomForceCollide = (collidePadding: number, collideStrength: number) => {\n const sameGroupPadding = 1; // separation between same-type nodes\n const diffGroupPadding = collidePadding; // separation between diff-type nodes\n let nodes: ForceNodeType[] = [];\n let maxRadius = 0;\n\n const force = () => {\n // use a quadtree for efficient collision detection\n const tree: Quadtree<ForceNodeType> = quadtree(\n nodes,\n (d: ForceNodeType) => d.x || 0,\n (d: ForceNodeType) => d.y || 0\n );\n\n nodes.forEach(currentNode => {\n const radius = (currentNode.r || 0) + maxRadius;\n const leftBound = (currentNode.x || 0) - radius;\n const topBound = (currentNode.y || 0) - radius;\n const rightBound = (currentNode.x || 0) + radius;\n const bottomBound = (currentNode.y || 0) + radius;\n\n tree.visit((quad: Quadtree<ForceNodeType>, x1: number, y1: number, x2: number, y2: number) => {\n if (!quad.length) {\n processQuadCollisions(\n quad,\n currentNode,\n sameGroupPadding,\n diffGroupPadding,\n collideStrength\n );\n }\n // this will skip the quadrant and ignore nodes that don't collide with the current node\n return x1 > rightBound || x2 < leftBound || y1 > bottomBound || y2 < topBound;\n });\n });\n };\n\n force.initialize = (nodeList: SimulationNodeDatum[]) => {\n nodes = nodeList;\n const nodeRadii = nodes.map(d => d.r || 0);\n maxRadius =\n nodeRadii.length > 0\n ? Math.max(...nodeRadii) + Math.max(sameGroupPadding, diffGroupPadding)\n : Math.max(sameGroupPadding, diffGroupPadding);\n };\n\n return force;\n};\n\n// Custom clustering force - moved outside for reduced complexity\nexport const createForceCluster = (clusterStrength: number) => {\n let nodes: ForceNodeType[] = [];\n const validClusterStrength = Math.max(0, Math.min(clusterStrength, 1));\n\n const force = () => {\n const clusterGroups = new Map<string, ForceNodeType[]>();\n const centroids = new Map<string, NodePositionType>();\n\n // Group nodes by their type\n nodes.forEach(node => {\n const group = node.type || 'default';\n if (!clusterGroups.has(group)) {\n clusterGroups.set(group, []);\n }\n const groupNodes = clusterGroups.get(group);\n if (groupNodes) {\n groupNodes.push(node);\n }\n });\n\n // Compute the actual centroid for each group\n clusterGroups.forEach((groupNodes, groupKey) => {\n const centroid = calculateCentroid(groupNodes);\n centroids.set(groupKey, centroid);\n });\n\n const adjustmentStrength = validClusterStrength;\n nodes.forEach(node => {\n const group = node.type || 'default';\n const centroidPos = centroids.get(group);\n if (centroidPos && node.x !== undefined && node.y !== undefined) {\n const deltaX = (node.x - centroidPos.x) * adjustmentStrength;\n const deltaY = (node.y - centroidPos.y) * adjustmentStrength;\n\n // Apply velocity adjustments safely\n // eslint-disable-next-line no-param-reassign\n if (node.vx !== undefined) node.vx -= deltaX;\n // eslint-disable-next-line no-param-reassign\n if (node.vy !== undefined) node.vy -= deltaY;\n }\n });\n };\n\n force.initialize = (nodeList: ForceNodeType[]) => {\n nodes = nodeList;\n };\n\n return force;\n};\n\n// TODO: Move force layout to web worker\nexport const getForceLayout = (forceLayoutOptions: ForceLayoutOptionsType): PositionMapType => {\n const {\n d3NodeList = [],\n d3LinkList = [],\n chargeStrength = DEFAULT_CHARGE_STRENGTH,\n chargeTheta = DEFAULT_CHARGE_THETA,\n chargeDistanceMax = DEFAULT_DISTANCE_MAX,\n chargeDistanceMin = DEFAULT_DISTANCE_MIN,\n linkDistance = DEFAULT_LINK_DISTANCE,\n linkStrength = undefined,\n collidePadding = DEFAULT_COLLIDE_PADDING,\n collideStrength = DEFAULT_COLLIDE_STRENGTH,\n clusterStrength = DEFAULT_CLUSTER_STRENGTH,\n } = forceLayoutOptions;\n\n const updatedPositionMap: PositionMapType = {};\n\n if (d3NodeList.length === 0) {\n return updatedPositionMap;\n }\n\n const enableClustering = d3NodeList.some(node => Boolean(node.type));\n\n // Create link force\n let linkForce = forceLink(d3LinkList)\n .id((d: any) => d.id)\n .distance((link: any) => {\n if (!link.clusterType) return linkDistance;\n // Enhance clustering by adjusting link distances\n return link.clusterType === 'same' ? linkDistance * 0.1 : linkDistance * 3;\n });\n\n // Apply link strength if specified\n if (linkStrength !== undefined) {\n linkForce = linkForce.strength(linkStrength);\n }\n\n const getCollideRadius = (node: ForceNodeType): number => {\n const currentNode = node?.r || DEFAULT_NODE_RADIUS;\n return currentNode + collidePadding;\n };\n // Create collision force - use custom or default\n const collisionForce = enableClustering\n ? createCustomForceCollide(collidePadding, collideStrength)\n : forceCollide().radius(getCollideRadius).strength(collideStrength);\n\n // Build simulation\n const simulation = forceSimulation(d3NodeList)\n .force('link', linkForce)\n .force('collide', collisionForce)\n .force(\n 'charge',\n forceManyBody()\n .strength(chargeStrength)\n .theta(chargeTheta)\n .distanceMax(chargeDistanceMax)\n .distanceMin(chargeDistanceMin)\n )\n .force('center', forceCenter(DEFAULT_CHART_WIDTH / 2, DEFAULT_CHART_HEIGHT / 2));\n\n // Add clustering force if enabled\n if (enableClustering) {\n simulation.force('cluster', createForceCluster(clusterStrength));\n }\n\n // Run simulation\n simulation.tick(300);\n simulation.stop();\n\n // Extract final positions\n d3NodeList.forEach(node => {\n updatedPositionMap[node.id] = {\n x: node.x || 0,\n y: node.y || 0,\n };\n });\n\n return updatedPositionMap;\n};\n", "\nimport * as defaultImport from \"d3-force\";\nexport * from \"d3-force\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"d3-quadtree\";\nexport * from \"d3-quadtree\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "export const DEFAULT_CHART_WIDTH = 800;\nexport const DEFAULT_CHART_HEIGHT = 500;\nexport const DEFAULT_NODE_RADIUS = 24;\nexport const MIN_NODE_DIAMETER = 12;\nexport const MAX_NODE_DIAMETER = 200;\nexport const DEFAULT_LINK_WIDTH = 2;\nexport const MIN_LINK_WIDTH = 1;\nexport const MAX_LINK_WIDTH = 20;\n\nexport type NodeTypeStructural = {\n id: string;\n index: number;\n height: number;\n width: number;\n size?: number;\n label?: string;\n type?: string;\n children?: string[];\n parents?: string[];\n x?: number;\n y?: number;\n};\n\nexport type BuiltInIconType =\n | 'arrowsDoubleLeftRight'\n | 'arrowsFourRightLeftUpDown'\n | 'arrowsFourTowardUp'\n | 'bell'\n | 'bookshelf'\n | 'buildings'\n | 'chartColumnMagnifier'\n | 'chartColumnSquare'\n | 'checkCircle'\n | 'chevronsSlash'\n | 'cloud'\n | 'cogChevronsSlash'\n | 'containership'\n | 'cube'\n | 'cylinder'\n | 'cylinderIndexTable'\n | 'cylinderMetrics'\n | 'cylinderMulti'\n | 'cylinderTrace'\n | 'cylinderWaves'\n | 'deviceEdgeHub'\n | 'deviceSignalWaves'\n | 'dotsThreeBalloon'\n | 'drive'\n | 'driveIndexTable'\n | 'driveMagnifier'\n | 'driveSliders'\n | 'envelope'\n | 'ethernetPort'\n | 'exclamationTriangle'\n | 'factory'\n | 'file'\n | 'fileLogs'\n | 'filter'\n | 'folder'\n | 'forwarderHeavy'\n | 'forwarderUniversal'\n | 'gate'\n | 'globe'\n | 'identityCard'\n | 'informationCircle'\n | 'informationDiamond'\n | 'laptopOpen'\n | 'layout'\n | 'license'\n | 'mobilePhone'\n | 'monitor'\n | 'monitorPhone'\n | 'networkDevice'\n | 'nodeBranch'\n | 'nodeModel'\n | 'nodeTopology'\n | 'picture'\n | 'portrait'\n | 'portraitsTwo'\n | 'printer'\n | 'processor'\n | 'reportDouble'\n | 'securityCamera'\n | 'servers'\n | 'serversCloud'\n | 'shoppingCart'\n | 'signalWavesAngled'\n | 'singleIndex'\n | 'slidersTripleHorizontal'\n | 'squaresAndCircles'\n | 'star'\n | 'store'\n | 'telescope'\n | 'token'\n | 'truck'\n | 'wallBricks'\n | 'wifiSignal'\n | 'cellularGateway';\n\n// Brand external icons so plain `string` doesn't swallow the BuiltInIconType union.\ntype ExternalIconType = string & {\n __externalIconType?: never;\n};\n\nexport type IconType = BuiltInIconType | ExternalIconType;\n\nexport type NodeTypeVisual = {\n id: string;\n index: number;\n color?: string;\n icon?: IconType;\n iconColor?: string;\n value?: number;\n tooltipFields?: Record<string, MetaDataType | MetaDataType[]>;\n tooltipHeader?: MetaDataType | MetaDataType[];\n};\n\nexport type LinkType = {\n id: string;\n source: string;\n target: string;\n color?: string;\n width?: number;\n tooltipFields?: Record<string, MetaDataType | MetaDataType[]>;\n};\n\nexport type NodePositionType = {\n x: number;\n y: number;\n};\n\nexport type PositionMapType = {\n [id: string]: NodePositionType;\n};\n\nexport type NodeMapStructuralType = {\n [id: string]: NodeTypeStructural;\n};\n\nexport type NodeMapVisualType = {\n [id: string]: NodeTypeVisual;\n};\n\nexport type LinkMapType = {\n [id: string]: LinkType;\n};\n\nexport type ClusterLinkType = 'same' | 'mixed';\n\nexport type MetaDataType = string | number | boolean | null | undefined;\n\nexport type NodeMetadataType = {\n [key: string]: MetaDataType | MetaDataType[];\n};\n\nexport type NodeMetadataPayloadType = {\n [key: `row.${string}.value`]: MetaDataType | MetaDataType[];\n};\n\n// Event payload interfaces\nexport type NodeEventCallbackType = {\n id: string;\n value?: number;\n index: number;\n};\n\nexport type NodeEventCallbackWithPositionType = NodeEventCallbackType & {\n x: number;\n y: number;\n};\n\nexport type NodeEventPayloadType = {\n name: string;\n value?: number;\n} & NodeMetadataPayloadType;\n\nexport type NodeEventPayloadWithPosition = NodeEventPayloadType & {\n position: {\n x: number;\n y: number;\n };\n};\n\nexport type NodeEventPayloadWithTooltip = NodeEventPayloadType & {\n tooltipContext: {\n tooltipX: number;\n tooltipY: number;\n };\n};\n\n// Event objects\nexport interface NodeClickEvent {\n type: 'node.click';\n payload: NodeEventPayloadType;\n}\n\nexport interface NodeMouseOverEvent {\n type: 'node.mouseOver';\n payload: NodeEventPayloadWithTooltip;\n}\n\nexport interface NodeMouseOutEvent {\n type: 'node.mouseOut';\n payload: NodeEventPayloadWithTooltip;\n}\n\nexport interface NodeDragEvent {\n type: 'node.drag';\n payload: NodeEventPayloadWithPosition;\n}\n", "import type { NodeMapStructuralType } from './networkGraphShared';\n\nexport type DragStateType = {\n dragStarted: boolean;\n id: string | null;\n};\n\nexport type ZoomAndPanStateType = {\n zoom: number | null;\n x: number | null;\n y: number | null;\n};\n\nexport type PositionType = {\n x: number;\n y: number;\n};\n\nexport const isValidZoomAndPanState = (\n zoomAndPanState: ZoomAndPanStateType\n): zoomAndPanState is PositionType & {\n zoom: number;\n} =>\n Number.isFinite(zoomAndPanState.zoom) &&\n zoomAndPanState.zoom > 0 &&\n Number.isFinite(zoomAndPanState.x) &&\n Number.isFinite(zoomAndPanState.y);\n\n// Convert screen-space pointer coordinates into graph-space coordinates.\n// When zoom/pan is invalid, return the raw pointer position as a safe fallback.\nexport const getAdjustedDragPosition = (\n pendingDragPosition: PositionType | null,\n zoomAndPanState: ZoomAndPanStateType\n): PositionType | null => {\n if (!pendingDragPosition) {\n return null;\n }\n if (!isValidZoomAndPanState(zoomAndPanState)) {\n return pendingDragPosition;\n }\n\n return {\n x: (pendingDragPosition.x - zoomAndPanState.x) / zoomAndPanState.zoom,\n y: (pendingDragPosition.y - zoomAndPanState.y) / zoomAndPanState.zoom,\n };\n};\n\ntype MousePositionEvent = {\n clientX?: number;\n clientY?: number;\n};\n\ntype SvgPointerTarget = {\n getBoundingClientRect: () => { left: number; top: number; width: number; height: number };\n width?: { baseVal?: { value: number } };\n height?: { baseVal?: { value: number } };\n};\n\n// Convert a mouse event on the SVG into graph-space coordinates, accounting for SVG scaling and zoom/pan.\nexport const getPointerInGraphSpaceFromMouseEvent = (\n event: MousePositionEvent | null | undefined,\n svgElement: SvgPointerTarget | null | undefined,\n zoomAndPanState: ZoomAndPanStateType\n): PositionType | null => {\n if (!svgElement || !Number.isFinite(event?.clientX) || !Number.isFinite(event?.clientY)) {\n return null;\n }\n\n const rect = svgElement.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) {\n return null;\n }\n\n const svgWidth = svgElement.width?.baseVal?.value ?? rect.width;\n const svgHeight = svgElement.height?.baseVal?.value ?? rect.height;\n const scaleX = svgWidth / rect.width;\n const scaleY = svgHeight / rect.height;\n const pointerInSvgSpace = {\n x: (event.clientX - rect.left) * scaleX,\n y: (event.clientY - rect.top) * scaleY,\n };\n\n return getAdjustedDragPosition(pointerInSvgSpace, zoomAndPanState);\n};\n\n// Capture the fixed pointer-to-node delta at drag start so future moves preserve the grab point.\nexport const getInitialDragOffset = (\n pointerInGraphSpace: PositionType | null,\n nodePosition: PositionType | null\n): PositionType | null => {\n if (\n !pointerInGraphSpace ||\n !nodePosition ||\n !Number.isFinite(pointerInGraphSpace.x) ||\n !Number.isFinite(pointerInGraphSpace.y) ||\n !Number.isFinite(nodePosition.x) ||\n !Number.isFinite(nodePosition.y)\n ) {\n return null;\n }\n\n return {\n x: pointerInGraphSpace.x - nodePosition.x,\n y: pointerInGraphSpace.y - nodePosition.y,\n };\n};\n\ntype DraggedNodePositionParams = {\n pendingDragPosition: PositionType | null;\n zoomAndPanState: ZoomAndPanStateType;\n currentNodePosition: PositionType | null;\n existingDragOffset: PositionType | null;\n};\n\ntype DraggedNodePositionResult = {\n adjustedPositionWithOffset: PositionType;\n resolvedDragOffset: PositionType | null;\n};\n\n// Resolve dragged node position in graph-space while preserving the original cursor grab offset.\nexport const getDraggedNodePositionWithOffset = ({\n pendingDragPosition,\n zoomAndPanState,\n currentNodePosition,\n existingDragOffset,\n}: DraggedNodePositionParams): DraggedNodePositionResult | null => {\n const adjustedPendingPosition = getAdjustedDragPosition(pendingDragPosition, zoomAndPanState);\n if (!adjustedPendingPosition) {\n return null;\n }\n\n const resolvedDragOffset =\n existingDragOffset ?? getInitialDragOffset(adjustedPendingPosition, currentNodePosition);\n\n return {\n adjustedPositionWithOffset: {\n x: adjustedPendingPosition.x - (resolvedDragOffset?.x ?? 0),\n y: adjustedPendingPosition.y - (resolvedDragOffset?.y ?? 0),\n },\n resolvedDragOffset,\n };\n};\n\n// Return previous map reference when no effective movement occurred.\n// This avoids unnecessary React state updates while dragging.\nexport const updateDraggedNodePosition = (\n previousNodeMap: NodeMapStructuralType,\n nodeId: string | null,\n nextPosition: PositionType | null\n): NodeMapStructuralType => {\n if (!nodeId || !nextPosition) {\n return previousNodeMap;\n }\n\n const currentNode = previousNodeMap[nodeId];\n if (!currentNode) {\n return previousNodeMap;\n }\n\n if (currentNode.x === nextPosition.x && currentNode.y === nextPosition.y) {\n return previousNodeMap;\n }\n\n return {\n ...previousNodeMap,\n [nodeId]: {\n ...currentNode,\n x: nextPosition.x,\n y: nextPosition.y,\n },\n };\n};\n\n// Patch only nodes whose drag positions changed (added/updated/removed) and keep other node references stable.\nexport const patchNodeMapWithDragPositionChanges = (\n previousNodeMap: NodeMapStructuralType,\n baseNodeMap: NodeMapStructuralType,\n previousDragPositions: Record<string, { x: number; y: number }>,\n nextDragPositions: Record<string, { x: number; y: number }>\n) => {\n const changedNodeIds = new Set([\n ...Object.keys(previousDragPositions || {}),\n ...Object.keys(nextDragPositions || {}),\n ]);\n let updatedNodeMap = previousNodeMap;\n\n changedNodeIds.forEach(nodeId => {\n const currentNode = previousNodeMap[nodeId];\n const baseNode = baseNodeMap[nodeId];\n if (!currentNode || !baseNode) {\n return;\n }\n\n const nextPosition = nextDragPositions?.[nodeId];\n const resolvedPosition = nextPosition ?? { x: baseNode.x, y: baseNode.y };\n if (currentNode.x === resolvedPosition.x && currentNode.y === resolvedPosition.y) {\n return;\n }\n\n if (updatedNodeMap === previousNodeMap) {\n updatedNodeMap = { ...previousNodeMap };\n }\n updatedNodeMap[nodeId] = {\n ...currentNode,\n x: resolvedPosition.x,\n y: resolvedPosition.y,\n };\n });\n\n return updatedNodeMap;\n};\n\n// Patch persisted drag positions by applying only changed node ids from previous -> next drag maps.\nexport const patchDragPositionsMap = (\n baseMap: Record<string, { x: number; y: number }>,\n previousDragPositions: Record<string, { x: number; y: number }>,\n nextDragPositions: Record<string, { x: number; y: number }>\n) => {\n const patchedMap = { ...baseMap };\n const changedNodeIds = new Set([\n ...Object.keys(previousDragPositions || {}),\n ...Object.keys(nextDragPositions || {}),\n ]);\n\n changedNodeIds.forEach(nodeId => {\n const nextPosition = nextDragPositions?.[nodeId];\n if (nextPosition) {\n patchedMap[nodeId] = nextPosition;\n } else {\n delete patchedMap[nodeId];\n }\n });\n\n return patchedMap;\n};\n", "import * as React from 'react';\nimport { ReactElement, memo, RefObject, useEffect, useState, useCallback, useId } from 'react';\nimport { select } from 'd3-selection';\n\nimport Node from './Node';\nimport Link from './Link';\nimport Tooltip from './Tooltip';\nimport {\n LinkStyleType,\n ShowDirectionType,\n PreferPortsType,\n shouldDimNode,\n shouldHighlightLink,\n unsanitizeSvgId,\n DIM_OPACITY,\n} from '../utils/networkGraphUtils';\nimport type {\n NodeMapStructuralType,\n NodeMapVisualType,\n LinkMapType,\n NodeEventCallbackType,\n NodeEventCallbackWithPositionType,\n} from '../utils/networkGraphShared';\n\ninterface NetworkGraphSvgProps {\n nodeMapStruct?: NodeMapStructuralType;\n nodeMapVisual?: NodeMapVisualType;\n linkMap?: LinkMapType;\n linkStyle?: LinkStyleType;\n showDirection?: ShowDirectionType;\n preferPorts?: PreferPortsType;\n svgRef?: RefObject<SVGSVGElement>;\n zoomContainerRef?: RefObject<SVGGElement>;\n isReadyToRender?: boolean;\n hideTooltip?: boolean;\n zoomLevel?: number;\n handleMouseUp?: () => void;\n handleMouseDown?: (e: any) => void; // mousedown uses event from d3 which is typed to any\n handleDrag?: (x: number, y: number) => void;\n handleNodeClick?: (node: NodeEventCallbackType) => void;\n handleNodeMouseOver?: (node: NodeEventCallbackWithPositionType) => void;\n handleNodeMouseOut?: (node: NodeEventCallbackWithPositionType) => void;\n highlightedNode?: string | null;\n setHighlightedNode?: (id: string | null) => void;\n isDragging?: boolean;\n}\n\nconst NetworkGraphSvg = memo(function NetworkGraphSvg({\n nodeMapStruct = {},\n nodeMapVisual = {},\n linkMap = {},\n linkStyle = 'straight',\n showDirection = 'bidirection',\n preferPorts = 'none',\n hideTooltip = false,\n svgRef,\n zoomContainerRef,\n isReadyToRender,\n zoomLevel = 1,\n handleMouseUp,\n handleMouseDown,\n handleDrag,\n handleNodeClick,\n handleNodeMouseOver,\n handleNodeMouseOut,\n highlightedNode,\n setHighlightedNode = () => undefined,\n isDragging = false,\n}: NetworkGraphSvgProps): ReactElement {\n const graphId = useId();\n // state for popover\n const [open, setOpen] = useState(false);\n const [anchor, setAnchor] = useState(null);\n\n const handleAnchor = useCallback(el => setAnchor(el), []);\n const handleOpen = useCallback(() => {\n if (!hideTooltip) {\n setOpen(true);\n }\n }, [hideTooltip]);\n const handleRequestClose = useCallback(() => setOpen(false), []);\n\n const handleMouseMove = useCallback(\n e => {\n if (!handleDrag) return;\n const svg = e.currentTarget;\n const rect = svg.getBoundingClientRect();\n const viewBox = svg.viewBox?.baseVal;\n const width = viewBox?.width || svg.clientWidth || rect.width;\n const height = viewBox?.height || svg.clientHeight || rect.height;\n const scaleX = width / rect.width || 1;\n const scaleY = height / rect.height || 1;\n const x = (e.clientX - rect.left) * scaleX;\n const y = (e.clientY - rect.top) * scaleY;\n handleDrag(x, y);\n },\n [handleDrag]\n );\n\n const anchorId = anchor ? unsanitizeSvgId(anchor.id) : null;\n const anchorNodeVisual = anchorId ? nodeMapVisual[anchorId] : undefined;\n const headerValue = anchorNodeVisual?.tooltipHeader ?? '';\n const nodeFields = anchorNodeVisual?.tooltipFields ?? {};\n\n useEffect(() => {\n if (isReadyToRender) {\n select(svgRef?.current)\n .selectAll('circle')\n .on('mousedown', event => {\n // need to stop propogation when circle is clicked\n // because clicking a node means drilldown or drag, not pan\n // adding stopPropagation to the <circle> mouseDown itself does not work for some reason\n event.stopPropagation();\n handleMouseDown(event);\n });\n }\n }, [handleMouseDown, isReadyToRender, svgRef]);\n\n const { regularLinks, highlightedLinks } = Object.keys(linkMap).reduce(\n (acc, linkId) => {\n if (!isReadyToRender) return acc;\n const { source, target, color, width } = linkMap[linkId];\n if (!target) return acc; // Skip if no target for the source\n const sourcePosition = {\n x: nodeMapStruct[source]?.x,\n y: nodeMapStruct[source]?.y,\n };\n const targetPosition = {\n x: nodeMapStruct[target]?.x,\n y: nodeMapStruct[target]?.y,\n };\n\n // check if opposite direction link exists\n const oppositeLinkId = `${target}-${source}`;\n const isBidirectional = Object.keys(linkMap).includes(oppositeLinkId);\n const sourceAndTargetExist = nodeMapStruct[source] && nodeMapStruct[target];\n\n // if bidirectional, render link if source comes before target alphabetically\n // this will fail for self pointing nodes, need a separate case for that\n // also skip link if source or target node does not exist\n const shouldSkipLink =\n (showDirection !== 'oneWay' && isBidirectional && source > target) || !sourceAndTargetExist;\n\n if (shouldSkipLink) return acc;\n\n const sourceSize = nodeMapStruct[source]?.size;\n const targetSize = nodeMapStruct[target]?.size;\n const isHighlighted = shouldHighlightLink(source, target, highlightedNode);\n const linkDomId = `${graphId}-${source}-${target}`;\n\n const linkElement = (\n <Link\n key={`${source}-${target}`}\n id={linkDomId}\n sourcePosition={sourcePosition}\n targetPosition={targetPosition}\n linkStyle={linkStyle}\n preferPorts={preferPorts}\n isBidirectional={isBidirectional}\n showDirection={showDirection}\n sourceSize={sourceSize}\n targetSize={targetSize}\n color={color}\n width={width}\n />\n );\n\n if (isHighlighted) {\n acc.highlightedLinks.push(linkElement);\n } else {\n acc.regularLinks.push(linkElement);\n }\n\n return acc;\n },\n { regularLinks: [] as ReactElement[], highlightedLinks: [] as ReactElement[] }\n );\n\n return (\n <>\n {anchor && !hideTooltip && (\n <Tooltip\n open={open}\n anchor={anchor}\n onRequestClose={handleRequestClose}\n headerValue={headerValue}\n nodeFields={nodeFields}\n />\n )}\n\n <svg\n height=\"100%\"\n width=\"100%\"\n xmlns=\"http://www.w3.org/2000/svg\"\n ref={svgRef}\n data-test=\"network-graph-svg\"\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n >\n <g ref={zoomContainerRef}>\n {/* Render links between nodes. Apply opacity in group level so there are no overlapping colors */}\n <g opacity={highlightedNode ? DIM_OPACITY : 1}>{regularLinks}</g>\n {highlightedLinks}\n {Object.keys(nodeMapStruct).map(id => {\n const nodeStruct = nodeMapStruct[id];\n const nodeVisual = nodeMapVisual[id];\n const isDimmed = shouldDimNode(nodeMapStruct[highlightedNode], id);\n return (\n isReadyToRender && (\n <Node\n key={id}\n id={id}\n index={nodeStruct?.index}\n label={nodeStruct?.label}\n value={nodeVisual?.value}\n x={nodeStruct?.x}\n y={nodeStruct?.y}\n size={nodeStruct?.size}\n color={nodeVisual?.color}\n icon={nodeVisual?.icon}\n iconColor={nodeVisual?.iconColor}\n zoomLevel={zoomLevel}\n isDimmed={isDimmed}\n handleNodeClick={handleNodeClick}\n handleNodeMouseOver={handleNodeMouseOver}\n handleNodeMouseOut={handleNodeMouseOut}\n setHighlightedNode={setHighlightedNode}\n handleOpen={handleOpen}\n handleAnchor={handleAnchor}\n handleRequestClose={handleRequestClose}\n isDragging={isDragging}\n />\n )\n );\n })}\n </g>\n </svg>\n </>\n );\n});\n\nexport default NetworkGraphSvg;\n", "import * as React from 'react';\nimport { useRef, useCallback, memo, useMemo } from 'react';\nimport styled from 'styled-components';\nimport { useSplunkTheme, variables } from '@splunk/themes';\nimport { createGUID } from '@splunk/ui-utils/id';\nimport { _ } from '@splunk/ui-utils/i18n';\nimport RemoteIcon from '@splunk/visualizations-shared/RemoteIcon';\n\nimport iconLoader from '../utils/iconLoader';\n\nimport {\n DIM_OPACITY,\n RECT_HORIZONTAL_PADDING,\n RECT_VERTICAL_PADDING,\n LINE_HEIGHT,\n RECT_TOP_MARGIN,\n LABEL_FONT_SIZE,\n MAX_TEXT_WIDTH,\n FONT,\n sanitizeSvgId,\n truncateTextToMaxLines,\n getIconRenderInfo,\n} from '../utils/networkGraphUtils';\nimport { VIZ_FONT_FAMILY, computeTextWidth } from '../../../common/utils/textUtils';\nimport {\n DEFAULT_NODE_RADIUS,\n IconType,\n BuiltInIconType,\n NodeEventCallbackType,\n NodeEventCallbackWithPositionType,\n} from '../utils/networkGraphShared';\n\ninterface NodeProps {\n id: string;\n label?: string;\n x: number;\n y: number;\n zoomLevel?: number;\n icon?: IconType;\n color?: string;\n iconColor?: string;\n isDimmed?: boolean;\n index?: number;\n size?: number;\n value?: number;\n handleNodeClick?: (node: NodeEventCallbackType) => void;\n handleNodeMouseOver?: (node: NodeEventCallbackWithPositionType) => void;\n handleNodeMouseOut?: (node: NodeEventCallbackWithPositionType) => void;\n setHighlightedNode: (id: string | null) => void;\n handleOpen: () => void;\n handleAnchor: (anchor: any) => void;\n handleRequestClose: () => void;\n isDragging?: boolean;\n}\n\nconst NodeText = styled.text`\n font-family: ${VIZ_FONT_FAMILY};\n font-size: ${LABEL_FONT_SIZE}px;\n line-height: 16px;\n fill: ${variables.contentColorActive};\n pointer-events: none;\n user-select: none;\n -webkit-user-select: none;\n`;\n\nconst NodeRect = styled.rect`\n fill: ${variables.backgroundColorScrim};\n opacity: 0.8;\n rx: 4;\n ry: 4;\n`;\n\nconst NodeCircle = styled.circle<{\n color: string;\n}>`\n fill: ${props => props.color ?? variables.neutral100};\n cursor: pointer;\n`;\n\ntype SvgIconProps = {\n width: number;\n height: number;\n x: number;\n y: number;\n};\n\ntype IconComponentType = React.ComponentType<SvgIconProps>;\n\nconst IconElement = ({ icon, ...iconProps }: SvgIconProps & { icon: IconComponentType }) => {\n const IconComponent = icon;\n if (!IconComponent) {\n return null;\n }\n return <IconComponent {...iconProps} />;\n};\n\nconst isBuiltInIcon = (icon?: IconType): icon is BuiltInIconType =>\n typeof icon === 'string' && Object.hasOwn(iconLoader, icon);\n\nconst NodeIcon = styled(IconElement)<{\n color: string;\n opacity: number;\n}>`\n fill: ${props => props.color || variables.contentColorActive};\n pointer-events: none;\n opacity: ${props => props.opacity};\n user-select: none;\n -webkit-user-select: none;\n`;\n\nconst Node = memo(function Node(props: NodeProps) {\n const theme = useSplunkTheme();\n const {\n id,\n label,\n x,\n y,\n icon,\n color,\n iconColor,\n index,\n value,\n isDimmed,\n handleNodeClick,\n handleNodeMouseOver,\n handleNodeMouseOut,\n setHighlightedNode,\n handleOpen,\n handleAnchor,\n handleRequestClose,\n isDragging = false,\n } = props;\n const circleRef = useRef(null);\n const truncatedText = truncateTextToMaxLines(label, FONT, MAX_TEXT_WIDTH, 2);\n const textWidth = Math.max(...truncatedText.map(line => computeTextWidth(line, FONT)));\n const sanitizedId = sanitizeSvgId(id);\n const opacity = isDimmed ? DIM_OPACITY : 1;\n const zoomLevel = props.zoomLevel ?? 1;\n const diameter = props?.size ?? DEFAULT_NODE_RADIUS * 2;\n const currentSize = diameter * zoomLevel;\n const shouldHideIcon = currentSize < 16;\n const radius = diameter / 2;\n const iconSize = radius;\n const iconX = x - iconSize / 2;\n const iconY = y - iconSize / 2;\n const { iconUrl, shouldRenderRemoteIcon } = useMemo(() => getIconRenderInfo(icon), [icon]);\n const builtInIcon = useMemo(() => (isBuiltInIcon(icon) ? icon : null), [icon]);\n const [IconComponent, setIconComponent] = React.useState<IconComponentType | null>(null);\n\n React.useEffect(() => {\n if (!builtInIcon) {\n setIconComponent(null);\n return;\n }\n\n let isMounted = true;\n\n const loadIcon = async () => {\n const loadIconFn = iconLoader[builtInIcon];\n if (!loadIconFn) {\n if (isMounted) {\n setIconComponent(null);\n }\n return;\n }\n\n try {\n const importedIcon = await loadIconFn();\n if (isMounted) {\n setIconComponent(() => importedIcon.default);\n }\n } catch {\n if (isMounted) {\n setIconComponent(null);\n }\n }\n };\n\n loadIcon();\n\n // cleanup function to prevent setting state on an unmounted component\n // eslint-disable-next-line consistent-return\n return () => {\n isMounted = false;\n };\n }, [builtInIcon]);\n\n const nodeClickHandler = useCallback(() => {\n if (handleNodeClick) {\n handleNodeClick({ id, value, index });\n }\n }, [handleNodeClick, id, value, index]);\n const onKeyDown = useCallback(\n (event: React.KeyboardEvent<SVGCircleElement>) => {\n if (event.repeat) {\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n nodeClickHandler();\n }\n },\n [nodeClickHandler]\n );\n\n // highlight neighbor nodes and links on mouse enter\n const nodeWithPosition = useMemo(\n () => ({ id, value, index, x, y, size: diameter }),\n [id, index, value, x, y, diameter]\n );\n\n const onMouseEnter = useCallback(() => {\n if (isDragging) {\n handleRequestClose();\n return;\n }\n setHighlightedNode(id);\n if (handleNodeMouseOver) {\n handleNodeMouseOver(nodeWithPosition);\n }\n // update tooltip\n handleOpen();\n handleAnchor(circleRef.current);\n }, [\n handleNodeMouseOver,\n id,\n nodeWithPosition,\n setHighlightedNode,\n handleOpen,\n handleAnchor,\n isDragging,\n handleRequestClose,\n ]);\n\n // undo highlight on neighbor nodes and links on mouse leave\n const onMouseLeave = useCallback(() => {\n if (isDragging) {\n return;\n }\n setHighlightedNode(null);\n if (handleNodeMouseOut) {\n handleNodeMouseOut(nodeWithPosition);\n }\n handleRequestClose();\n }, [handleNodeMouseOut, nodeWithPosition, setHighlightedNode, handleRequestClose, isDragging]);\n\n React.useEffect(() => {\n if (isDragging) {\n handleRequestClose();\n }\n }, [isDragging, handleRequestClose]);\n\n return (\n <>\n <NodeCircle\n data-test=\"node\"\n r={radius}\n cx={x}\n cy={y}\n width={diameter}\n height={diameter}\n id={sanitizedId}\n ref={circleRef}\n tabIndex={0}\n role=\"button\"\n aria-label={label || _('Node')}\n color={color}\n opacity={opacity}\n onClick={nodeClickHandler}\n onKeyDown={onKeyDown}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onFocus={onMouseEnter}\n onBlur={onMouseLeave}\n />\n {!!IconComponent && !shouldHideIcon && (\n <NodeIcon\n data-test=\"node-icon\"\n icon={IconComponent}\n color={iconColor}\n width={iconSize}\n height={iconSize}\n x={iconX}\n y={iconY}\n opacity={opacity}\n />\n )}\n {shouldRenderRemoteIcon && iconUrl && !shouldHideIcon && (\n <g opacity={opacity}>\n <foreignObject\n data-test=\"node-icon\"\n x={iconX}\n y={iconY}\n width={iconSize}\n height={iconSize}\n style={{ pointerEvents: 'none', userSelect: 'none', WebkitUserSelect: 'none' }}\n >\n <RemoteIcon\n iconURL={iconUrl}\n color={iconColor ?? theme.contentColorActive}\n width={iconSize}\n height={iconSize}\n />\n </foreignObject>\n </g>\n )}\n <NodeRect\n x={x - textWidth / 2 - RECT_HORIZONTAL_PADDING}\n y={y + radius + RECT_TOP_MARGIN}\n width={textWidth + RECT_HORIZONTAL_PADDING * 2}\n height={LINE_HEIGHT * truncatedText.length + RECT_VERTICAL_PADDING * 2}\n />\n <NodeText x={x} y={y + radius + RECT_TOP_MARGIN} textAnchor=\"middle\">\n {truncatedText.map(line => (\n <tspan key={createGUID()} x={x} dy={LINE_HEIGHT} opacity={opacity}>\n {line}\n </tspan>\n ))}\n </NodeText>\n </>\n );\n});\n\nexport default Node;\n", "\nimport * as defaultImport from \"@splunk/themes\";\nexport * from \"@splunk/themes\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/visualizations-shared/RemoteIcon\";\nexport * from \"@splunk/visualizations-shared/RemoteIcon\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "const iconLoader = {\n arrowsDoubleLeftRight: () => import('@splunk/react-icons/ArrowsDoubleLeftRight.js'),\n arrowsFourRightLeftUpDown: () => import('@splunk/react-icons/ArrowsFourRightLeftUpDown.js'),\n arrowsFourTowardUp: () => import('@splunk/react-icons/ArrowsFourTowardUp.js'),\n bell: () => import('@splunk/react-icons/Bell.js'),\n bookshelf: () => import('@splunk/react-icons/Bookshelf.js'),\n buildings: () => import('@splunk/react-icons/Buildings.js'),\n cellularGateway: () => import('@splunk/react-icons/CellularGateway.js'),\n chartColumnMagnifier: () => import('@splunk/react-icons/ChartColumnMagnifier.js'),\n chartColumnSquare: () => import('@splunk/react-icons/ChartColumnSquare.js'),\n checkCircle: () => import('@splunk/react-icons/CheckCircle.js'),\n chevronsSlash: () => import('@splunk/react-icons/ChevronsSlash.js'),\n cloud: () => import('@splunk/react-icons/Cloud.js'),\n cogChevronsSlash: () => import('@splunk/react-icons/CogChevronsSlash.js'),\n containership: () => import('@splunk/react-icons/Containership.js'),\n cube: () => import('@splunk/react-icons/Cube.js'),\n cylinder: () => import('@splunk/react-icons/Cylinder.js'),\n cylinderIndexTable: () => import('@splunk/react-icons/CylinderIndexTable.js'),\n cylinderMetrics: () => import('@splunk/react-icons/CylinderMetrics.js'),\n cylinderMulti: () => import('@splunk/react-icons/CylinderMulti.js'),\n cylinderTrace: () => import('@splunk/react-icons/CylinderTrace.js'),\n cylinderWaves: () => import('@splunk/react-icons/CylinderWaves.js'),\n deviceEdgeHub: () => import('@splunk/react-icons/DeviceEdgeHub.js'),\n deviceSignalWaves: () => import('@splunk/react-icons/DeviceSignalWaves.js'),\n dotsThreeBalloon: () => import('@splunk/react-icons/DotsThreeBalloon.js'),\n drive: () => import('@splunk/react-icons/Drive.js'),\n driveIndexTable: () => import('@splunk/react-icons/DriveIndexTable.js'),\n driveMagnifier: () => import('@splunk/react-icons/DriveMagnifier.js'),\n driveSliders: () => import('@splunk/react-icons/DriveSliders.js'),\n envelope: () => import('@splunk/react-icons/Envelope.js'),\n ethernetPort: () => import('@splunk/react-icons/EthernetPort.js'),\n exclamationTriangle: () => import('@splunk/react-icons/ExclamationTriangle.js'),\n factory: () => import('@splunk/react-icons/Factory.js'),\n file: () => import('@splunk/react-icons/File.js'),\n fileLogs: () => import('@splunk/react-icons/FileLogs.js'),\n filter: () => import('@splunk/react-icons/Filter.js'),\n folder: () => import('@splunk/react-icons/Folder.js'),\n forwarderHeavy: () => import('@splunk/react-icons/ForwarderHeavy.js'),\n forwarderUniversal: () => import('@splunk/react-icons/ForwarderUniversal.js'),\n gate: () => import('@splunk/react-icons/Gate.js'),\n globe: () => import('@splunk/react-icons/Globe.js'),\n identityCard: () => import('@splunk/react-icons/IdentityCard.js'),\n informationCircle: () => import('@splunk/react-icons/InformationCircle.js'),\n informationDiamond: () => import('@splunk/react-icons/InformationDiamond.js'),\n laptopOpen: () => import('@splunk/react-icons/LaptopOpen.js'),\n layout: () => import('@splunk/react-icons/Layout.js'),\n license: () => import('@splunk/react-icons/License.js'),\n mobilePhone: () => import('@splunk/react-icons/MobilePhone.js'),\n monitor: () => import('@splunk/react-icons/Monitor.js'),\n monitorPhone: () => import('@splunk/react-icons/MonitorPhone.js'),\n networkDevice: () => import('@splunk/react-icons/NetworkDevice.js'),\n nodeBranch: () => import('@splunk/react-icons/NodeBranch.js'),\n nodeModel: () => import('@splunk/react-icons/NodeModel.js'),\n nodeTopology: () => import('@splunk/react-icons/NodeTopology.js'),\n picture: () => import('@splunk/react-icons/Picture.js'),\n portrait: () => import('@splunk/react-icons/Portrait.js'),\n portraitsTwo: () => import('@splunk/react-icons/PortraitsTwo.js'),\n printer: () => import('@splunk/react-icons/Printer.js'),\n processor: () => import('@splunk/react-icons/Processor.js'),\n reportDouble: () => import('@splunk/react-icons/ReportDouble.js'),\n securityCamera: () => import('@splunk/react-icons/SecurityCamera.js'),\n servers: () => import('@splunk/react-icons/Servers.js'),\n serversCloud: () => import('@splunk/react-icons/ServersCloud.js'),\n shoppingCart: () => import('@splunk/react-icons/ShoppingCart.js'),\n signalWavesAngled: () => import('@splunk/react-icons/SignalWavesAngled.js'),\n singleIndex: () => import('@splunk/react-icons/SingleIndex.js'),\n slidersTripleHorizontal: () => import('@splunk/react-icons/SlidersTripleHorizontal.js'),\n squaresAndCircles: () => import('@splunk/react-icons/SquaresAndCircles.js'),\n star: () => import('@splunk/react-icons/Star.js'),\n store: () => import('@splunk/react-icons/Store.js'),\n telescope: () => import('@splunk/react-icons/Telescope.js'),\n token: () => import('@splunk/react-icons/Token.js'),\n truck: () => import('@splunk/react-icons/Truck.js'),\n wallBricks: () => import('@splunk/react-icons/WallBricks.js'),\n wifiSignal: () => import('@splunk/react-icons/WiFiSignal.js'),\n};\n\nexport default iconLoader;\n", "import * as React from 'react';\nimport { useRef, memo } from 'react';\nimport styled from 'styled-components';\nimport { variables } from '@splunk/themes';\nimport {\n LinkStyleType,\n PreferPortsType,\n getEdgePath,\n sanitizeSvgId,\n getArrowHeight,\n getArrowWidth,\n getLinkRenderInfo,\n} from '../utils/networkGraphUtils';\nimport { DEFAULT_LINK_WIDTH, NodePositionType } from '../utils/networkGraphShared';\n\ninterface LinkProps {\n id: string;\n sourcePosition: NodePositionType;\n targetPosition: NodePositionType;\n linkStyle?: LinkStyleType;\n isBidirectional: boolean;\n color?: string;\n showDirection?: 'bidirection' | 'oneWay' | 'none';\n preferPorts?: PreferPortsType;\n sourceSize?: number;\n targetSize?: number;\n width?: number;\n}\n\nconst LinkPath = styled.path<{\n edgeWidth: number;\n color: string;\n}>`\n fill: none;\n stroke: ${props => props.color ?? variables.borderColorStrong};\n stroke-width: ${props => props.edgeWidth}px;\n pointer-events: none;\n stroke-linecap: butt;\n`;\n\nconst StyledPolygon = styled.polygon<{\n color: string;\n}>`\n fill: ${props => props.color ?? variables.borderColorStrong};\n`;\n\ninterface ArrowMarkerProps {\n id: string;\n orient: string;\n arrowWidth: number;\n arrowHeight: number;\n color?: string;\n}\n\nconst ArrowMarker = memo(function ArrowMarker({\n id,\n orient,\n arrowWidth,\n arrowHeight,\n color,\n}: ArrowMarkerProps) {\n // note: from the designs, arrowHeight is the horizontal size and arrowWidth is vertical, when the arrow looks like -->\n // this is slightly confusing because markerWidth and markerHeight is the opposite.\n return (\n <marker\n id={id}\n markerWidth={arrowHeight}\n markerHeight={arrowWidth}\n // add small offset to refX to remove gap between arrowhead and line when set to 0\n refX={0.5}\n refY={arrowWidth / 2}\n orient={orient}\n markerUnits=\"userSpaceOnUse\"\n >\n <StyledPolygon points={`0 0, ${arrowHeight} ${arrowWidth / 2}, 0 ${arrowWidth}`} color={color} />\n </marker>\n );\n});\n\nconst Link = memo(function Link(props: LinkProps) {\n const {\n id,\n sourcePosition,\n targetPosition,\n linkStyle,\n isBidirectional,\n color,\n showDirection,\n preferPorts,\n sourceSize,\n targetSize,\n width,\n } = props;\n const edgeWidth = Number.isFinite(width) ? width : DEFAULT_LINK_WIDTH;\n const linkRef = useRef(null);\n const sanitizedId = sanitizeSvgId(id); // sanitize id for use in SVG\n const arrowWidth = getArrowWidth(edgeWidth);\n const arrowHeight = getArrowHeight(edgeWidth, arrowWidth);\n // hide arrow and use straight linkstyle if the distance between source and target is too small\n const { effectiveLinkStyle, effectiveShowDirection } = getLinkRenderInfo({\n linkStyle,\n showDirection,\n preferPorts,\n sourcePosition,\n targetPosition,\n sourceSize,\n targetSize,\n arrowHeight,\n });\n\n const linkPath = getEdgePath({\n linkStyle: effectiveLinkStyle,\n sourcePosition,\n targetPosition,\n isBidirectional,\n showDirection: effectiveShowDirection,\n arrowHeight,\n arrowWidth,\n preferPorts,\n sourceNodeSize: sourceSize,\n targetNodeSize: targetSize,\n linkWidth: edgeWidth,\n });\n\n return (\n <g id={`link-${sanitizedId}`} ref={linkRef} data-test=\"link\">\n <defs>\n <ArrowMarker\n id={`arrowhead-${sanitizedId}`}\n orient=\"auto\"\n arrowWidth={arrowWidth}\n arrowHeight={arrowHeight}\n color={color}\n />\n <ArrowMarker\n id={`arrowhead-${sanitizedId}-opposite`}\n orient=\"auto-start-reverse\"\n arrowWidth={arrowWidth}\n arrowHeight={arrowHeight}\n color={color}\n />\n </defs>\n <LinkPath\n data-test=\"linkpath\"\n d={linkPath}\n color={color}\n edgeWidth={edgeWidth}\n id={`linkpath-${sanitizedId}`}\n markerEnd={effectiveShowDirection === 'none' ? undefined : `url(#arrowhead-${sanitizedId})`}\n markerStart={\n isBidirectional && effectiveShowDirection === 'bidirection'\n ? `url(#arrowhead-${sanitizedId}-opposite)`\n : undefined\n }\n />\n </g>\n );\n});\n\nexport default Link;\n", "import * as React from 'react';\nimport styled from 'styled-components';\nimport Popover from '@splunk/react-ui/Popover';\nimport { variables } from '@splunk/themes';\nimport { _ } from '@splunk/ui-utils/i18n';\n\nimport { MetaDataType } from '../utils/networkGraphShared';\n\ninterface TooltipProps {\n open: boolean;\n anchor: HTMLElement | null;\n headerValue: MetaDataType | MetaDataType[];\n nodeFields?: Record<string, MetaDataType | MetaDataType[]>;\n onRequestClose: () => void;\n}\n\nconst StyledPopover = styled(Popover)`\n font-size: ${variables.fontSizeSmall};\n max-width: 80ch;\n width: fit-content;\n`;\n\nconst Title = styled.div`\n font-weight: ${variables.fontWeightSemiBold};\n font-size: ${variables.fontSize};\n margin-bottom: 2px;\n color: ${variables.contentColorActive};\n`;\n\nconst StyledTable = styled.table`\n width: 100%;\n border-collapse: collapse;\n table-layout: auto;\n`;\n\nconst StyledLabelCell = styled.td`\n padding-right: 10px;\n color: ${variables.contentColorActive};\n white-space: normal;\n vertical-align: top;\n word-break: break-word;\n max-width: 34ch;\n min-width: 10ch;\n`;\n\nconst StyledValueCell = styled.td`\n text-align: right;\n color: ${variables.contentColorActive};\n white-space: pre-wrap;\n word-break: break-word;\n vertical-align: top;\n`;\n\nconst StyledWrapper = styled.div`\n padding: ${variables.spacingMedium};\n`;\n\nconst Tooltip = ({\n open,\n anchor,\n headerValue,\n nodeFields = {},\n onRequestClose,\n}: TooltipProps): React.ReactElement => (\n <StyledPopover\n data-test=\"network-graph-tooltip\"\n open={open}\n anchor={anchor}\n onRequestClose={onRequestClose}\n defaultPlacement=\"above\"\n >\n <StyledWrapper>\n <Title>{headerValue}</Title>\n <StyledTable>\n <tbody>\n {Object.entries(nodeFields).map(([field, value]) => (\n <tr key={field}>\n <StyledLabelCell>{_(field)}</StyledLabelCell>\n <StyledValueCell>{_(String(value))}</StyledValueCell>\n </tr>\n ))}\n </tbody>\n </StyledTable>\n </StyledWrapper>\n </StyledPopover>\n);\n\nexport default Tooltip;\n", "\nimport * as defaultImport from \"@splunk/react-ui/Popover\";\nexport * from \"@splunk/react-ui/Popover\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "// make a react component for ZoomControls\nimport * as React from 'react';\nimport { memo } from 'react';\nimport styled from 'styled-components';\nimport Plus from '@splunk/react-icons/Plus';\nimport Minus from '@splunk/react-icons/Minus';\nimport SquareAndCorners from '@splunk/react-icons/SquareAndCorners';\nimport Button from '@splunk/react-ui/Button';\nimport Tooltip from '@splunk/react-ui/Tooltip';\nimport variables from '@splunk/themes/variables';\nimport { _ } from '@splunk/ui-utils/i18n';\n\ninterface ZoomControlsProps {\n hideReset?: boolean;\n hideZoomControls?: boolean;\n handleZoomIn: () => void;\n handleZoomOut?: () => void;\n handleReset: () => void;\n disableZoomIn?: boolean;\n disableZoomOut?: boolean;\n}\n\nconst StyledZoomControlsContainer = styled.div`\n position: absolute;\n top: 16px;\n left: 16px;\n z-index: 2;\n`;\n\nconst StyledBaseContainer = styled.div`\n position: absolute;\n z-index: 2;\n width: 40px;\n border-radius: 4px;\n box-shadow: ${variables.overlayShadow};\n background-color: ${variables.backgroundColorPopup};\n`;\n\nconst StyledResetContainer = styled(StyledBaseContainer)<{ moveToTop?: boolean }>`\n top: ${props => (props.moveToTop ? 0 : '88px')};\n height: 40px;\n`;\n\nconst StyledButton = styled(Button)`\n width: 40px;\n height: 40px;\n svg {\n width: 24px;\n height: 24px;\n }\n`;\n\nconst StyledZoomInButton = styled(StyledButton)`\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n`;\n\nconst StyledZoomOutButton = styled(StyledButton)`\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n`;\n\nconst ZoomControls = memo(function ZoomControls(props: ZoomControlsProps) {\n const {\n handleZoomIn,\n handleZoomOut,\n handleReset,\n hideReset = false,\n hideZoomControls = false,\n disableZoomIn = false,\n disableZoomOut = false,\n } = props;\n return (\n <StyledZoomControlsContainer data-test=\"zoom-controls-container\">\n {!hideZoomControls && (\n <StyledBaseContainer data-test=\"zoom-buttons-container\">\n <Tooltip contentRelationship=\"label\" content={_('Zoom in')}>\n <StyledZoomInButton\n icon={<Plus />}\n appearance=\"subtle\"\n onClick={handleZoomIn}\n disabled={disableZoomIn}\n data-test=\"zoom-in-button\"\n />\n </Tooltip>\n <Tooltip contentRelationship=\"label\" content={_('Zoom out')}>\n <StyledZoomOutButton\n icon={<Minus />}\n appearance=\"subtle\"\n onClick={handleZoomOut}\n disabled={disableZoomOut}\n data-test=\"zoom-out-button\"\n />\n </Tooltip>\n </StyledBaseContainer>\n )}\n\n {!hideReset && (\n <StyledResetContainer moveToTop={hideZoomControls} data-test=\"reset-button-container\">\n <Tooltip contentRelationship=\"label\" content={_('Reset zoom')}>\n <StyledButton\n icon={<SquareAndCorners />}\n appearance=\"subtle\"\n onClick={handleReset}\n data-test=\"reset-button\"\n />\n </Tooltip>\n </StyledResetContainer>\n )}\n </StyledZoomControlsContainer>\n );\n});\n\nexport default ZoomControls;\n", "\nimport * as defaultImport from \"@splunk/react-icons/Plus\";\nexport * from \"@splunk/react-icons/Plus\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/Minus\";\nexport * from \"@splunk/react-icons/Minus\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-icons/SquareAndCorners\";\nexport * from \"@splunk/react-icons/SquareAndCorners\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-ui/Button\";\nexport * from \"@splunk/react-ui/Button\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "\nimport * as defaultImport from \"@splunk/react-ui/Tooltip\";\nexport * from \"@splunk/react-ui/Tooltip\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import { _ } from '@splunk/ui-utils/i18n';\nimport { defaultPalettesConfig } from '@splunk/visualization-color-palettes/editors/PresetPalettes';\nimport { NetworkGraph as NetworkGraphIcon } from '@splunk/visualization-icons';\nimport { NetworkGraph as NetworkGraphPlaceholderIcon } from '@splunk/visualization-icons/placeholders';\nimport { networkGraphOptionsSchema as optionsSchema } from '@splunk/visualization-schemas';\nimport { variables } from '@splunk/themes';\nimport { DataContract } from '../common/interfaces/DataContract';\nimport { DefaultContext } from '../common/interfaces/DefaultContext';\nimport { EditorConfig } from '../common/interfaces/Editor';\nimport { ThemedDefaults } from '../common/interfaces/ThemedDefaults';\nimport { VizBehavior } from '../common/interfaces/VizBehavior';\nimport { VizCategory } from '../common/interfaces/VizCategory';\nimport { VizConfig } from '../common/interfaces/VizConfig';\nimport { VizSize } from '../common/interfaces/VizSize';\nimport { enhanceConfig } from '../common/utils/configUtils';\nimport { DEFAULT_CHART_HEIGHT, DEFAULT_CHART_WIDTH } from './PureNetworkGraph/utils/networkGraphShared';\nimport { defaultBackgroundColor } from '../common/ThemedDefaults';\nimport getBackgroundColorEditor from '../common/editorConfig/BackgroundColor';\nimport { getDefaultPreferPorts } from './PureNetworkGraph/utils/networkGraphUtils';\n\nconst isDynamicOption = (option, valuesName, contextName) => {\n if (\n option &&\n typeof option === 'string' &&\n (option.trim().startsWith(`> ${valuesName} | gradient(${contextName})`) ||\n option.trim().startsWith(`> ${valuesName} | rangeValue(${contextName})`) ||\n option.trim().startsWith(`> ${valuesName} | matchValue(${contextName})`))\n ) {\n return true;\n }\n return false;\n};\n\nconst defaultContext: DefaultContext = {\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};\n\nconst dataContract: DataContract = {\n requiredDataSources: [\n {\n name: 'primary',\n description: 'DataSource that powers the visualization',\n },\n ],\n optionalDataSources: [\n {\n name: 'nodeSource',\n description: 'DataSource that populates node data',\n },\n ],\n initialRequestParams: {\n primary: { offset: 0, count: 10000 },\n },\n};\n\nconst size: VizSize = {\n initialWidth: DEFAULT_CHART_WIDTH,\n initialHeight: DEFAULT_CHART_HEIGHT,\n};\n\nconst themes: ThemedDefaults = {\n defaultBackgroundColor,\n defaultNodeColor: props => variables.neutral100(props),\n defaultNodeIconColor: props => variables.contentColorActive(props),\n defaultLinkColor: props => variables.borderColorStrong(props),\n};\n\nconst editorConfig: EditorConfig[] = [\n {\n label: _('Data configurations'),\n layout: [\n [\n {\n label: _('Source'),\n option: 'source',\n editor: 'editor.columnSelector',\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n filterByTypes: ['string', 'number'],\n },\n },\n ],\n [\n {\n label: _('Target'),\n option: 'target',\n editor: 'editor.columnSelector',\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n filterByTypes: ['string', 'number'],\n },\n },\n ],\n [\n {\n label: _('Node labels'),\n option: 'nodeTexts',\n editor: 'editor.columnSelector',\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n filterByTypes: ['string'],\n },\n },\n ],\n [\n {\n label: _('Node values'),\n option: 'nodeValues',\n editor: 'editor.columnSelector',\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n filterByTypes: ['number'],\n },\n },\n ],\n [\n {\n label: _('Tooltip header field'),\n option: 'tooltipHeaderField',\n editor: 'editor.columnSelector',\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n shouldShowInternalFields: false,\n },\n },\n ],\n [\n {\n label: _('Tooltip node fields'),\n option: 'tooltipNodeFields',\n editor: 'editor.columnMultiSelectionByFieldNameEditor',\n },\n ],\n [\n {\n label: _('Result limit'),\n option: 'resultLimit',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n step: 1,\n max: 10000,\n },\n },\n ],\n ],\n },\n {\n label: _('Data display'),\n layout: [\n [\n {\n label: _('Layout'),\n option: 'layout',\n editor: 'editor.select',\n editorProps: {\n values: [\n {\n label: _('Grid'),\n value: 'grid',\n description: _('Arrange nodes in a grid layout.'),\n },\n {\n label: _('Preset'),\n value: 'preset',\n description: _('Use predefined positions for nodes.'),\n },\n {\n label: _('Hierarchical'),\n value: 'hierarchical',\n description: _('Arrange nodes in a hierarchy.'),\n },\n {\n label: _('Force'),\n value: 'force',\n description: _('Use a force-directed layout.'),\n },\n ],\n help: _('Some nodes may have custom positions. Changing the layout will reset them.'),\n showHelp: ({ options }) => options.layout === 'force',\n },\n },\n ],\n // grid only options\n [\n {\n label: _('Grid columns'),\n option: 'gridColumns',\n editor: 'editor.number',\n editorProps: {\n min: 1,\n // max should be same as result limit\n max: 1000,\n step: 1,\n },\n showEditor: ({ options }) => options.layout === 'grid' || options.layout === undefined,\n },\n ],\n // preset only options\n [\n {\n label: _('X positions'),\n option: 'xPositions',\n editor: 'editor.columnSelector',\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n filterByTypes: ['number'],\n },\n showEditor: ({ options }) => options.layout === 'preset',\n },\n ],\n [\n {\n label: _('Y positions'),\n option: 'yPositions',\n editor: 'editor.columnSelector',\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n filterByTypes: ['number'],\n },\n showEditor: ({ options }) => options.layout === 'preset',\n },\n ],\n // hierarchical only options\n [\n {\n label: _('Hierarchy direction'),\n option: 'hierarchyDirection',\n editor: 'editor.select',\n editorProps: {\n values: [\n { label: _('Top to Bottom'), value: 'topBottom' },\n { label: _('Bottom to Top'), value: 'bottomTop' },\n { label: _('Left to Right'), value: 'leftRight' },\n { label: _('Right to Left'), value: 'rightLeft' },\n ],\n },\n showEditor: ({ options }) => options.layout === 'hierarchical',\n },\n ],\n // force only options\n [\n {\n label: _('Charge strength'),\n option: 'chargeStrength',\n editor: 'editor.number',\n editorProps: {\n help: _(\n 'Strength of positive charge (attraction) or negative charge (repulsion) between nodes.'\n ),\n helpFormat: 'tooltip',\n step: 1,\n },\n showEditor: ({ options }) => options.layout === 'force',\n },\n {\n label: _('Charge theta'),\n option: 'chargeTheta',\n editor: 'editor.number',\n editorProps: {\n help: _(\n 'Higher value means faster performance but less predictable node positioning.'\n ),\n helpFormat: 'tooltip',\n step: 0.1,\n min: 0,\n },\n showEditor: ({ options }) => options.layout === 'force',\n },\n ],\n [\n {\n label: _('Charge distance minimum'),\n option: 'chargeDistanceMin',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n step: 1,\n help: _('Minimum distance between nodes to apply the charge force to.'),\n helpFormat: 'tooltip',\n },\n showEditor: ({ options }) => options.layout === 'force',\n },\n ],\n [\n {\n label: _('Charge distance maximum'),\n option: 'chargeDistanceMax',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n step: 1,\n help: _('Maximum distance between nodes to apply the charge force to.'),\n helpFormat: 'tooltip',\n },\n showEditor: ({ options }) => options.layout === 'force',\n },\n ],\n [\n {\n label: _('Collider padding'),\n option: 'collidePadding',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n step: 1,\n help: _('Padding around nodes for repulsion between nodes or clusters.'),\n helpFormat: 'tooltip',\n },\n showEditor: ({ options }) => options.layout === 'force',\n },\n {\n label: _('Collider strength'),\n option: 'collideStrength',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n step: 0.1,\n help: _('Strength of the collider used for node repulsion.'),\n helpFormat: 'tooltip',\n },\n showEditor: ({ options }) => options.layout === 'force',\n },\n ],\n [\n {\n label: _('Node cluster types'),\n option: 'nodeTypes',\n editor: 'editor.columnSelector',\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n tooltip: _('Array of node types used for clustering.'),\n filterByTypes: ['string'],\n },\n showEditor: ({ options }) => options.layout === 'force',\n },\n ],\n [\n {\n label: _('Cluster strength'),\n option: 'clusterStrength',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n max: 1,\n step: 0.01,\n help: _('Strength of clustering force between nodes of the same type.'),\n helpFormat: 'tooltip',\n },\n showEditor: ({ options }) =>\n options.layout === 'force' && options.nodeTypes !== undefined,\n },\n ],\n [\n {\n label: _('Link distance'),\n option: 'linkDistance',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n step: 1,\n help: _('Ideal distance between linked nodes. Enter a higher value for more space.'),\n helpFormat: 'tooltip',\n },\n showEditor: ({ options }) => options.layout === 'force',\n },\n {\n label: _('Link strength'),\n option: 'linkStrength',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n step: 0.1,\n max: 1,\n help: _(\n 'Strength of spring force between linked nodes. Higher value makes link lengths closer to linkDistance.'\n ),\n helpFormat: 'tooltip',\n },\n showEditor: ({ options }) => options.layout === 'force',\n },\n ],\n [\n {\n label: _('Horizontal padding (px)'),\n option: 'nodeHorizontalPadding',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n step: 1,\n max: 500,\n },\n showEditor: ({ options }) =>\n options.layout === 'hierarchical' ||\n options.layout === 'grid' ||\n options.layout === undefined,\n },\n {\n label: _('Vertical padding (px)'),\n option: 'nodeVerticalPadding',\n editor: 'editor.number',\n editorProps: {\n min: 0,\n step: 1,\n max: 500,\n },\n showEditor: ({ options }) =>\n options.layout === 'hierarchical' ||\n options.layout === 'grid' ||\n options.layout === undefined,\n },\n ],\n [\n {\n label: _('Link direction'),\n option: 'showDirection',\n editor: 'editor.radioBar',\n editorProps: {\n values: [\n { label: _('Bi-direction'), value: 'bidirection' },\n { label: _('One-way'), value: 'oneWay' },\n { label: _('None'), value: 'none' },\n ],\n },\n },\n ],\n [\n {\n label: _('Link connection style'),\n option: 'linkStyle',\n editor: 'editor.select',\n editorProps: {\n values: [\n { label: _('Straight'), value: 'straight' },\n { label: _('C Shape'), value: 'c' },\n { label: _('S Shape'), value: 's' },\n { label: _('Z Shape'), value: 'z' },\n ],\n },\n },\n ],\n [\n {\n label: _('Link port preference'),\n option: 'preferPorts',\n editor: 'editor.radioBar',\n editorProps: {\n values: [\n { label: _('Horizontal'), value: 'horizontal' },\n { label: _('Vertical'), value: 'vertical' },\n { label: _('None'), value: 'none' },\n ],\n },\n showEditor: ({ options }) => options.linkStyle === 's' || options.linkStyle === 'z',\n overrideDefaultValue: ({ options }) =>\n getDefaultPreferPorts(options?.layout, options?.hierarchyDirection),\n },\n ],\n [\n {\n label: _('Show zoom controls'),\n option: 'showZoomControls',\n editor: 'editor.checkbox',\n editorProps: {\n labelPosition: 'right',\n },\n },\n ],\n ],\n },\n {\n label: _('Color and style'),\n layout: [\n getBackgroundColorEditor({ themes }),\n\n [\n {\n label: _('Node color'),\n filterKeywords: ['range', 'match', 'gradient', 'dynamic coloring'],\n option: 'nodeColors',\n context: 'nodeColorsEditorConfig',\n editor: 'editor.networkGraphDynamicColor',\n editorProps: {\n themes,\n contextName: 'nodeColorsEditorConfig',\n defaultStaticColorValue: '> themes.defaultNodeColor',\n flyoutTitle: _('Dynamic coloring'),\n formatters: [\n {\n label: _('Gradient'),\n value: 'gradient',\n isDefault: true,\n defaults: {\n nodeColorValues: defaultContext.colorGradientConfig,\n },\n },\n {\n label: _('Ranges'),\n value: 'rangeValue',\n defaults: {\n nodeColorValues: defaultContext.colorRangeConfig,\n },\n },\n {\n label: _('Matches'),\n value: 'matchValue',\n defaults: {\n nodeColorValues: defaultContext.colorMatchConfig,\n },\n },\n ],\n dataSelectors: [\n {\n label: _('Node color values'),\n value: 'nodeColorValues',\n },\n ],\n defaultPalettesConfig,\n },\n },\n ],\n [\n {\n label: _('Node color data'),\n option: 'nodeColorValues',\n editor: 'editor.columnSelector',\n showEditor: ({ options }) =>\n isDynamicOption(options.nodeColors, 'nodeColorValues', 'nodeColorsEditorConfig'),\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n hideEditorWhenLoading: true,\n },\n },\n ],\n [\n {\n label: _('Node icon color'),\n filterKeywords: ['range', 'match', 'gradient', 'dynamic coloring'],\n option: 'nodeIconColors',\n editor: 'editor.networkGraphDynamicColor',\n context: 'nodeIconColorsEditorConfig',\n editorProps: {\n themes,\n contextName: 'nodeIconColorsEditorConfig',\n defaultStaticColorValue: '> themes.defaultNodeIconColor',\n flyoutTitle: _('Dynamic coloring'),\n formatters: [\n {\n label: _('Gradient'),\n value: 'gradient',\n isDefault: true,\n defaults: {\n nodeIconColorValues: defaultContext.colorGradientConfig,\n },\n },\n {\n label: _('Ranges'),\n value: 'rangeValue',\n defaults: {\n nodeIconColorValues: defaultContext.colorRangeConfig,\n },\n },\n {\n label: _('Matches'),\n value: 'matchValue',\n defaults: {\n nodeIconColorValues: defaultContext.colorMatchConfig,\n },\n },\n ],\n dataSelectors: [\n {\n label: _('Node Icon color values'),\n value: 'nodeIconColorValues',\n },\n ],\n defaultPalettesConfig,\n },\n },\n ],\n [\n {\n label: _('Node icon color data'),\n option: 'nodeIconColorValues',\n editor: 'editor.columnSelector',\n showEditor: ({ options }) =>\n isDynamicOption(\n options.nodeIconColors,\n 'nodeIconColorValues',\n 'nodeIconColorsEditorConfig'\n ),\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n hideEditorWhenLoading: true,\n },\n },\n ],\n [\n {\n label: _('Link color'),\n filterKeywords: ['range', 'match', 'gradient', 'dynamic coloring'],\n option: 'linkColors',\n context: 'linkColorsEditorConfig',\n editor: 'editor.networkGraphDynamicColor',\n editorProps: {\n themes,\n contextName: 'linkColorsEditorConfig',\n defaultStaticColorValue: '> themes.defaultLinkColor',\n flyoutTitle: _('Dynamic coloring'),\n formatters: [\n {\n label: _('Gradient'),\n value: 'gradient',\n isDefault: true,\n defaults: {\n linkColorValues: defaultContext.colorGradientConfig,\n },\n },\n {\n label: _('Ranges'),\n value: 'rangeValue',\n defaults: {\n linkColorValues: defaultContext.colorRangeConfig,\n },\n },\n {\n label: _('Matches'),\n value: 'matchValue',\n defaults: {\n linkColorValues: defaultContext.colorMatchConfig,\n },\n },\n ],\n dataSelectors: [\n {\n label: _('Link color values'),\n value: 'linkColorValues',\n },\n ],\n defaultPalettesConfig,\n },\n },\n ],\n [\n {\n label: _('Link color data'),\n option: 'linkColorValues',\n editor: 'editor.columnSelector',\n showEditor: ({ options }) =>\n isDynamicOption(options.linkColors, 'linkColorValues', 'linkColorsEditorConfig'),\n editorProps: {\n dataSourceKey: 'primary',\n supportsDSL: true,\n expectedDataPrimitive: ['series'],\n hideEditorWhenLoading: true,\n },\n },\n ],\n ],\n },\n];\n\n/**\n * visualization configuration\n */\nconst config: VizConfig = {\n /**\n * unique viz key\n */\n key: 'splunk.networkGraph',\n /**\n * viz name\n */\n name: 'NetworkGraph',\n category: VizCategory.FLOW,\n status: 'preview',\n /**\n * viz icon, this needs to be updated\n */\n icon: NetworkGraphIcon,\n placeholderIcon: NetworkGraphPlaceholderIcon,\n dataContract,\n size,\n defaultContext,\n optionsSchema,\n editorConfig,\n events: {\n 'node.click': {\n description: 'triggered when user clicks a node',\n },\n 'node.mouseOver': {\n description: 'triggered when user moves the cursor onto a node',\n },\n 'node.mouseOut': {\n description: 'triggered when user moves the cursor away from a node',\n },\n 'node.drag': {\n description: 'triggered when user drags a node',\n },\n },\n supports: [VizBehavior.DYNAMIC_OPTIONS, VizBehavior.EVENTS, VizBehavior.PLACEHOLDER],\n themes,\n requiredProps: [],\n};\n\nexport default enhanceConfig(config);\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/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", "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", "\nimport * as defaultImport from \"@splunk/visualizations-shared/configUtils\";\nexport * from \"@splunk/visualizations-shared/configUtils\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\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", "\nimport * as defaultImport from \"@splunk/themes/pick\";\nexport * from \"@splunk/themes/pick\";\nexport default ('default' in defaultImport ? defaultImport.default : defaultImport);\n", "import { _ } from '@splunk/ui-utils/i18n';\nimport { EditorLayoutConfig } from '../interfaces/Editor';\nimport { ThemedDefaults } from '../interfaces/ThemedDefaults';\n\ninterface backgroundEditorProps {\n label?: string;\n themes: ThemedDefaults;\n labelPosition?: string;\n}\n\nconst background: ({ label, themes, labelPosition }: backgroundEditorProps) => EditorLayoutConfig[] = ({\n label,\n themes,\n labelPosition,\n}) => [\n {\n label: _(label || 'Background color'),\n option: 'backgroundColor',\n editor: 'editor.color',\n editorProps: {\n labelPosition: labelPosition || 'top',\n themes,\n },\n },\n];\n\nexport default background;\n"],
5
+ "mappings": "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",
6
6
  "names": ["defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "themes", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "config", "themes", "defaultImport", "Opts", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "getFieldName", "defaultImport", "getFieldName", "range", "computeVizProps", "_a", "Opts", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "colorUtils_exports", "colorUtils_default", "defaultImport", "defaultImport", "defaultImport", "segment", "directionX", "directionY", "defaultImport", "defaultImport", "Node", "ArrowMarker", "Link", "defaultImport", "NetworkGraphSvg", "_a", "_b", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "Tooltip_default", "defaultImport", "ZoomControls", "Tooltip_default", "StyledWrapper", "defaultImport", "defaultImport", "defaultImport", "defaultImport", "config", "defaultImport", "themes", "isDynamicOption", "NetworkGraphIcon", "NetworkGraphPlaceholderIcon", "optionsSchema", "_a", "themes"]
7
7
  }