@perses-dev/components 0.55.0-beta.2 → 0.55.0-beta.3
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.
- package/dist/ColorPicker/ColorPicker.d.ts.map +1 -1
- package/dist/ColorPicker/ColorPicker.js +2 -2
- package/dist/ColorPicker/ColorPicker.js.map +1 -1
- package/dist/ColorPicker/OptionsColorPicker.d.ts.map +1 -1
- package/dist/ColorPicker/OptionsColorPicker.js +1 -1
- package/dist/ColorPicker/OptionsColorPicker.js.map +1 -1
- package/dist/ContentWithLegend/ContentWithLegend.d.ts.map +1 -1
- package/dist/ContentWithLegend/ContentWithLegend.js +2 -2
- package/dist/ContentWithLegend/ContentWithLegend.js.map +1 -1
- package/dist/ContentWithLegend/model/content-with-legend-model.d.ts +1 -2
- package/dist/ContentWithLegend/model/content-with-legend-model.d.ts.map +1 -1
- package/dist/ContentWithLegend/model/content-with-legend-model.js.map +1 -1
- package/dist/DensitySelector/DensitySelector.d.ts.map +1 -1
- package/dist/DensitySelector/DensitySelector.js.map +1 -1
- package/dist/Dialog/Dialog.d.ts.map +1 -1
- package/dist/Dialog/Dialog.js.map +1 -1
- package/dist/Dialog/DiscardChangesConfirmationDialog.d.ts.map +1 -1
- package/dist/Dialog/DiscardChangesConfirmationDialog.js.map +1 -1
- package/dist/DragAndDrop/DragAndDropList.d.ts.map +1 -1
- package/dist/DragAndDrop/DragAndDropList.js +4 -4
- package/dist/DragAndDrop/DragAndDropList.js.map +1 -1
- package/dist/DragAndDrop/DragButton.d.ts +0 -1
- package/dist/DragAndDrop/DragButton.d.ts.map +1 -1
- package/dist/DragAndDrop/DragButton.js.map +1 -1
- package/dist/Drawer/Drawer.d.ts.map +1 -1
- package/dist/Drawer/Drawer.js.map +1 -1
- package/dist/EChart/EChart.d.ts +2 -2
- package/dist/EChart/EChart.d.ts.map +1 -1
- package/dist/EChart/EChart.js +5 -5
- package/dist/EChart/EChart.js.map +1 -1
- package/dist/EChart/timezone-formatter.d.ts.map +1 -1
- package/dist/FontSizeSelector/FontSizeSelector.d.ts.map +1 -1
- package/dist/FontSizeSelector/FontSizeSelector.js.map +1 -1
- package/dist/FormatControls/FormatControls.d.ts.map +1 -1
- package/dist/FormatControls/FormatControls.js +1 -1
- package/dist/FormatControls/FormatControls.js.map +1 -1
- package/dist/FormatControls/UnitSelector.d.ts.map +1 -1
- package/dist/FormatControls/UnitSelector.js +1 -1
- package/dist/FormatControls/UnitSelector.js.map +1 -1
- package/dist/InfoTooltip/InfoTooltip.d.ts.map +1 -1
- package/dist/InfoTooltip/InfoTooltip.js +1 -1
- package/dist/InfoTooltip/InfoTooltip.js.map +1 -1
- package/dist/JSONEditor.d.ts +1 -1
- package/dist/JSONEditor.d.ts.map +1 -1
- package/dist/JSONEditor.js +2 -2
- package/dist/JSONEditor.js.map +1 -1
- package/dist/Legend/CompactLegend.d.ts +1 -1
- package/dist/Legend/CompactLegend.d.ts.map +1 -1
- package/dist/Legend/CompactLegend.js +1 -1
- package/dist/Legend/CompactLegend.js.map +1 -1
- package/dist/Legend/Legend.d.ts +1 -1
- package/dist/Legend/Legend.d.ts.map +1 -1
- package/dist/Legend/Legend.js +1 -1
- package/dist/Legend/Legend.js.map +1 -1
- package/dist/Legend/LegendColorBadge.d.ts +0 -1
- package/dist/Legend/LegendColorBadge.d.ts.map +1 -1
- package/dist/Legend/LegendColorBadge.js +1 -1
- package/dist/Legend/LegendColorBadge.js.map +1 -1
- package/dist/Legend/ListLegend.d.ts +1 -1
- package/dist/Legend/ListLegend.d.ts.map +1 -1
- package/dist/Legend/ListLegend.js +5 -4
- package/dist/Legend/ListLegend.js.map +1 -1
- package/dist/Legend/ListLegendItem.d.ts +1 -1
- package/dist/Legend/ListLegendItem.d.ts.map +1 -1
- package/dist/Legend/ListLegendItem.js +4 -3
- package/dist/Legend/ListLegendItem.js.map +1 -1
- package/dist/Legend/TableLegend.d.ts.map +1 -1
- package/dist/Legend/TableLegend.js.map +1 -1
- package/dist/Legend/legend-model.d.ts.map +1 -1
- package/dist/Legend/legend-model.js.map +1 -1
- package/dist/LinksEditor/LinkEditorForm.d.ts.map +1 -1
- package/dist/LinksEditor/LinkEditorForm.js.map +1 -1
- package/dist/ModeSelector/ModeSelector.d.ts.map +1 -1
- package/dist/ModeSelector/ModeSelector.js.map +1 -1
- package/dist/OptionsEditorLayout/OptionsEditorColumn.d.ts.map +1 -1
- package/dist/OptionsEditorLayout/OptionsEditorControl.d.ts.map +1 -1
- package/dist/OptionsEditorLayout/OptionsEditorControl.js +2 -2
- package/dist/OptionsEditorLayout/OptionsEditorControl.js.map +1 -1
- package/dist/OptionsEditorLayout/OptionsEditorGrid.d.ts.map +1 -1
- package/dist/OptionsEditorLayout/OptionsEditorGroup.d.ts.map +1 -1
- package/dist/RefreshIntervalPicker/RefreshIntervalPicker.d.ts.map +1 -1
- package/dist/RefreshIntervalPicker/RefreshIntervalPicker.js.map +1 -1
- package/dist/RepeatGrid/RepeatGrid.d.ts +15 -0
- package/dist/RepeatGrid/RepeatGrid.d.ts.map +1 -0
- package/dist/RepeatGrid/RepeatGrid.js +68 -0
- package/dist/RepeatGrid/RepeatGrid.js.map +1 -0
- package/dist/RepeatGrid/index.d.ts +2 -0
- package/dist/RepeatGrid/index.d.ts.map +1 -0
- package/dist/RepeatGrid/index.js +15 -0
- package/dist/RepeatGrid/index.js.map +1 -0
- package/dist/SettingsAutocomplete/SettingsAutocomplete.js.map +1 -1
- package/dist/SortSelector/SortSelector.d.ts.map +1 -1
- package/dist/SortSelector/SortSelector.js.map +1 -1
- package/dist/SortSelector/SortSelectorButtons.d.ts.map +1 -1
- package/dist/SortSelector/SortSelectorButtons.js.map +1 -1
- package/dist/Table/InnerTable.d.ts +0 -1
- package/dist/Table/InnerTable.d.ts.map +1 -1
- package/dist/Table/InnerTable.js.map +1 -1
- package/dist/Table/Table.d.ts.map +1 -1
- package/dist/Table/Table.js +1 -1
- package/dist/Table/Table.js.map +1 -1
- package/dist/Table/TableBody.d.ts +0 -1
- package/dist/Table/TableBody.d.ts.map +1 -1
- package/dist/Table/TableCell.d.ts.map +1 -1
- package/dist/Table/TableCell.js.map +1 -1
- package/dist/Table/TableCheckbox.d.ts.map +1 -1
- package/dist/Table/TableCheckbox.js.map +1 -1
- package/dist/Table/TableFoot.d.ts +0 -1
- package/dist/Table/TableFoot.d.ts.map +1 -1
- package/dist/Table/TableHead.d.ts +0 -1
- package/dist/Table/TableHead.d.ts.map +1 -1
- package/dist/Table/TableHeaderCell.d.ts +1 -1
- package/dist/Table/TableHeaderCell.d.ts.map +1 -1
- package/dist/Table/TableHeaderCell.js.map +1 -1
- package/dist/Table/TableRow.d.ts +0 -1
- package/dist/Table/TableRow.d.ts.map +1 -1
- package/dist/Table/TableRow.js.map +1 -1
- package/dist/Table/TableToolbar.d.ts.map +1 -1
- package/dist/Table/TableToolbar.js +4 -4
- package/dist/Table/TableToolbar.js.map +1 -1
- package/dist/Table/VirtualizedTable.d.ts +1 -1
- package/dist/Table/VirtualizedTable.d.ts.map +1 -1
- package/dist/Table/VirtualizedTable.js +8 -8
- package/dist/Table/VirtualizedTable.js.map +1 -1
- package/dist/Table/VirtualizedTableContainer.d.ts +0 -1
- package/dist/Table/VirtualizedTableContainer.d.ts.map +1 -1
- package/dist/Table/VirtualizedTableContainer.js.map +1 -1
- package/dist/Table/hooks/useFuzzySearch.d.ts +1 -1
- package/dist/Table/hooks/useFuzzySearch.d.ts.map +1 -1
- package/dist/Table/hooks/useFuzzySearch.js +1 -1
- package/dist/Table/hooks/useFuzzySearch.js.map +1 -1
- package/dist/Table/hooks/useTableKeyboardNav.js.map +1 -1
- package/dist/Table/hooks/useVirtualizedTableKeyboardNav.d.ts +1 -1
- package/dist/Table/hooks/useVirtualizedTableKeyboardNav.d.ts.map +1 -1
- package/dist/Table/hooks/useVirtualizedTableKeyboardNav.js.map +1 -1
- package/dist/Table/model/table-model.d.ts +1 -1
- package/dist/Table/model/table-model.d.ts.map +1 -1
- package/dist/Table/model/table-model.js.map +1 -1
- package/dist/ThresholdsEditor/ThresholdInput.d.ts.map +1 -1
- package/dist/ThresholdsEditor/ThresholdInput.js +1 -1
- package/dist/ThresholdsEditor/ThresholdInput.js.map +1 -1
- package/dist/ThresholdsEditor/ThresholdsEditor.d.ts.map +1 -1
- package/dist/ThresholdsEditor/ThresholdsEditor.js +5 -5
- package/dist/ThresholdsEditor/ThresholdsEditor.js.map +1 -1
- package/dist/TimeRangeSelector/DateTimeRangePicker.d.ts +1 -1
- package/dist/TimeRangeSelector/DateTimeRangePicker.d.ts.map +1 -1
- package/dist/TimeRangeSelector/DateTimeRangePicker.js +3 -3
- package/dist/TimeRangeSelector/DateTimeRangePicker.js.map +1 -1
- package/dist/TimeRangeSelector/TimeRangeSelector.d.ts +1 -1
- package/dist/TimeRangeSelector/TimeRangeSelector.d.ts.map +1 -1
- package/dist/TimeRangeSelector/TimeRangeSelector.js +1 -1
- package/dist/TimeRangeSelector/TimeRangeSelector.js.map +1 -1
- package/dist/TimeRangeSelector/utils.d.ts.map +1 -1
- package/dist/TimeRangeSelector/utils.js +1 -1
- package/dist/TimeRangeSelector/utils.js.map +1 -1
- package/dist/TimeSeriesTooltip/SeriesInfo.d.ts.map +1 -1
- package/dist/TimeSeriesTooltip/SeriesInfo.js +1 -1
- package/dist/TimeSeriesTooltip/SeriesInfo.js.map +1 -1
- package/dist/TimeSeriesTooltip/SeriesLabelsStack.d.ts.map +1 -1
- package/dist/TimeSeriesTooltip/SeriesLabelsStack.js.map +1 -1
- package/dist/TimeSeriesTooltip/SeriesMarker.d.ts.map +1 -1
- package/dist/TimeSeriesTooltip/SeriesMarker.js.map +1 -1
- package/dist/TimeSeriesTooltip/TimeChartTooltip.d.ts +2 -2
- package/dist/TimeSeriesTooltip/TimeChartTooltip.d.ts.map +1 -1
- package/dist/TimeSeriesTooltip/TimeChartTooltip.js +4 -4
- package/dist/TimeSeriesTooltip/TimeChartTooltip.js.map +1 -1
- package/dist/TimeSeriesTooltip/TooltipContent.d.ts.map +1 -1
- package/dist/TimeSeriesTooltip/TooltipContent.js +1 -1
- package/dist/TimeSeriesTooltip/TooltipContent.js.map +1 -1
- package/dist/TimeSeriesTooltip/TooltipHeader.d.ts +0 -1
- package/dist/TimeSeriesTooltip/TooltipHeader.d.ts.map +1 -1
- package/dist/TimeSeriesTooltip/TooltipHeader.js.map +1 -1
- package/dist/TimeSeriesTooltip/nearby-series.d.ts +1 -1
- package/dist/TimeSeriesTooltip/nearby-series.d.ts.map +1 -1
- package/dist/TimeSeriesTooltip/nearby-series.js.map +1 -1
- package/dist/TimeSeriesTooltip/tooltip-model.d.ts +1 -1
- package/dist/TimeSeriesTooltip/tooltip-model.d.ts.map +1 -1
- package/dist/TimeSeriesTooltip/tooltip-model.js.map +1 -1
- package/dist/TimeSeriesTooltip/utils.d.ts.map +1 -1
- package/dist/TimeSeriesTooltip/utils.js.map +1 -1
- package/dist/TimeZoneSelector.d.ts +1 -1
- package/dist/TimeZoneSelector.d.ts.map +1 -1
- package/dist/TimeZoneSelector.js +5 -2
- package/dist/TimeZoneSelector.js.map +1 -1
- package/dist/ToolbarIconButton/ToolbarIconButton.d.ts +0 -1
- package/dist/ToolbarIconButton/ToolbarIconButton.d.ts.map +1 -1
- package/dist/ToolbarIconButton/ToolbarIconButton.js +1 -1
- package/dist/ToolbarIconButton/ToolbarIconButton.js.map +1 -1
- package/dist/TransformsEditor/TransformEditor.d.ts.map +1 -1
- package/dist/TransformsEditor/TransformEditor.js.map +1 -1
- package/dist/TransformsEditor/TransformEditorContainer.d.ts.map +1 -1
- package/dist/TransformsEditor/TransformEditorContainer.js +2 -2
- package/dist/TransformsEditor/TransformEditorContainer.js.map +1 -1
- package/dist/TransformsEditor/TransformsEditor.d.ts.map +1 -1
- package/dist/TransformsEditor/TransformsEditor.js +1 -1
- package/dist/TransformsEditor/TransformsEditor.js.map +1 -1
- package/dist/ValueMappingEditor/ValueMappingEditor.d.ts.map +1 -1
- package/dist/ValueMappingEditor/ValueMappingEditor.js.map +1 -1
- package/dist/ValueMappingEditor/ValueMappingsEditor.d.ts.map +1 -1
- package/dist/ValueMappingEditor/ValueMappingsEditor.js +1 -1
- package/dist/ValueMappingEditor/ValueMappingsEditor.js.map +1 -1
- package/dist/cjs/ColorPicker/ColorPicker.js +2 -2
- package/dist/cjs/ColorPicker/OptionsColorPicker.js +1 -1
- package/dist/cjs/ContentWithLegend/ContentWithLegend.js +1 -1
- package/dist/cjs/DragAndDrop/DragAndDropList.js +4 -4
- package/dist/cjs/EChart/EChart.js +4 -4
- package/dist/cjs/FormatControls/FormatControls.js +1 -1
- package/dist/cjs/FormatControls/UnitSelector.js +1 -1
- package/dist/cjs/JSONEditor.js +2 -2
- package/dist/cjs/Legend/CompactLegend.js +1 -1
- package/dist/cjs/Legend/Legend.js +1 -1
- package/dist/cjs/Legend/LegendColorBadge.js +1 -1
- package/dist/cjs/Legend/ListLegend.js +4 -3
- package/dist/cjs/Legend/ListLegendItem.js +4 -3
- package/dist/cjs/OptionsEditorLayout/OptionsEditorControl.js +2 -2
- package/dist/cjs/RepeatGrid/RepeatGrid.js +76 -0
- package/dist/cjs/RepeatGrid/index.js +30 -0
- package/dist/cjs/Table/Table.js +1 -1
- package/dist/cjs/Table/TableToolbar.js +4 -4
- package/dist/cjs/Table/VirtualizedTable.js +8 -8
- package/dist/cjs/Table/hooks/useFuzzySearch.js +1 -1
- package/dist/cjs/ThresholdsEditor/ThresholdInput.js +1 -1
- package/dist/cjs/ThresholdsEditor/ThresholdsEditor.js +5 -5
- package/dist/cjs/TimeRangeSelector/DateTimeRangePicker.js +3 -3
- package/dist/cjs/TimeRangeSelector/TimeRangeSelector.js +1 -1
- package/dist/cjs/TimeRangeSelector/utils.js +1 -1
- package/dist/cjs/TimeSeriesTooltip/SeriesInfo.js +1 -1
- package/dist/cjs/TimeSeriesTooltip/TimeChartTooltip.js +4 -4
- package/dist/cjs/TimeSeriesTooltip/TooltipContent.js +1 -1
- package/dist/cjs/TimeZoneSelector.js +5 -2
- package/dist/cjs/ToolbarIconButton/ToolbarIconButton.js +1 -1
- package/dist/cjs/TransformsEditor/TransformEditorContainer.js +2 -2
- package/dist/cjs/TransformsEditor/TransformsEditor.js +1 -1
- package/dist/cjs/ValueMappingEditor/ValueMappingsEditor.js +1 -1
- package/dist/cjs/context/SnackbarProvider.js +1 -1
- package/dist/cjs/controls/TextField.js +1 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/model/bits.js +1 -1
- package/dist/cjs/model/bytes.js +1 -1
- package/dist/cjs/model/currency.js +1 -1
- package/dist/cjs/model/throughput.js +2 -2
- package/dist/cjs/model/units.js +4 -4
- package/dist/cjs/test/render.js +1 -1
- package/dist/cjs/test/setup-tests.js +9 -3
- package/dist/cjs/theme/palette/palette-options.js +4 -4
- package/dist/cjs/utils/format.js +6 -1
- package/dist/cjs/utils/memo.js +1 -1
- package/dist/cjs/utils/request-interpolation.js +1 -1
- package/dist/context/ChartsProvider.d.ts.map +1 -1
- package/dist/context/ChartsProvider.js.map +1 -1
- package/dist/context/ItemActionsProvider.js.map +1 -1
- package/dist/context/SelectionProvider.js.map +1 -1
- package/dist/context/SnackbarProvider.d.ts +1 -1
- package/dist/context/SnackbarProvider.d.ts.map +1 -1
- package/dist/context/SnackbarProvider.js +1 -1
- package/dist/context/SnackbarProvider.js.map +1 -1
- package/dist/context/TimeZoneProvider.d.ts.map +1 -1
- package/dist/context/TimeZoneProvider.js.map +1 -1
- package/dist/controls/TextField.d.ts +0 -1
- package/dist/controls/TextField.d.ts.map +1 -1
- package/dist/controls/TextField.js +1 -1
- package/dist/controls/TextField.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/model/bits.d.ts.map +1 -1
- package/dist/model/bits.js +1 -1
- package/dist/model/bits.js.map +1 -1
- package/dist/model/bytes.d.ts.map +1 -1
- package/dist/model/bytes.js +1 -1
- package/dist/model/bytes.js.map +1 -1
- package/dist/model/currency.d.ts.map +1 -1
- package/dist/model/currency.js +1 -1
- package/dist/model/currency.js.map +1 -1
- package/dist/model/formatterCache.js.map +1 -1
- package/dist/model/graph.d.ts.map +1 -1
- package/dist/model/graph.js.map +1 -1
- package/dist/model/temperature.d.ts.map +1 -1
- package/dist/model/theme.d.ts.map +1 -1
- package/dist/model/theme.js.map +1 -1
- package/dist/model/throughput.d.ts.map +1 -1
- package/dist/model/throughput.js +2 -2
- package/dist/model/throughput.js.map +1 -1
- package/dist/model/types.d.ts +1 -1
- package/dist/model/types.d.ts.map +1 -1
- package/dist/model/types.js.map +1 -1
- package/dist/model/units.d.ts +8 -8
- package/dist/model/units.d.ts.map +1 -1
- package/dist/model/units.js +4 -4
- package/dist/model/units.js.map +1 -1
- package/dist/test/render.d.ts.map +1 -1
- package/dist/test/render.js +1 -1
- package/dist/test/render.js.map +1 -1
- package/dist/test/setup-tests.d.ts +1 -1
- package/dist/test/setup-tests.d.ts.map +1 -1
- package/dist/test/setup-tests.js +3 -2
- package/dist/test/setup-tests.js.map +1 -1
- package/dist/test-utils/theme.d.ts +1 -1
- package/dist/test-utils/theme.d.ts.map +1 -1
- package/dist/test-utils/theme.js.map +1 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/palette/background.d.ts +1 -1
- package/dist/theme/palette/background.d.ts.map +1 -1
- package/dist/theme/palette/background.js.map +1 -1
- package/dist/theme/palette/error.d.ts.map +1 -1
- package/dist/theme/palette/error.js.map +1 -1
- package/dist/theme/palette/grey.d.ts +1 -1
- package/dist/theme/palette/grey.d.ts.map +1 -1
- package/dist/theme/palette/grey.js.map +1 -1
- package/dist/theme/palette/palette-options.d.ts.map +1 -1
- package/dist/theme/palette/palette-options.js +4 -4
- package/dist/theme/palette/palette-options.js.map +1 -1
- package/dist/theme/palette/primary.d.ts.map +1 -1
- package/dist/theme/palette/primary.js.map +1 -1
- package/dist/theme/palette/secondary.d.ts.map +1 -1
- package/dist/theme/palette/secondary.js.map +1 -1
- package/dist/theme/palette/success.d.ts.map +1 -1
- package/dist/theme/palette/success.js.map +1 -1
- package/dist/theme/palette/text.d.ts +1 -1
- package/dist/theme/palette/text.d.ts.map +1 -1
- package/dist/theme/palette/text.js.map +1 -1
- package/dist/theme/palette/warning.d.ts.map +1 -1
- package/dist/theme/palette/warning.js.map +1 -1
- package/dist/theme/theme.d.ts.map +1 -1
- package/dist/theme/theme.js.map +1 -1
- package/dist/utils/axis.d.ts.map +1 -1
- package/dist/utils/axis.js.map +1 -1
- package/dist/utils/browser-storage.js.map +1 -1
- package/dist/utils/chart-actions.d.ts +1 -1
- package/dist/utils/chart-actions.d.ts.map +1 -1
- package/dist/utils/chart-actions.js.map +1 -1
- package/dist/utils/data-field-interpolation.js.map +1 -1
- package/dist/utils/format.d.ts.map +1 -1
- package/dist/utils/format.js +6 -1
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/mathjs.d.ts +1 -1
- package/dist/utils/memo.d.ts.map +1 -1
- package/dist/utils/memo.js +1 -1
- package/dist/utils/memo.js.map +1 -1
- package/dist/utils/request-interpolation.d.ts.map +1 -1
- package/dist/utils/request-interpolation.js +1 -1
- package/dist/utils/request-interpolation.js.map +1 -1
- package/dist/utils/selection-interpolation.js.map +1 -1
- package/dist/utils/theme-gen.d.ts.map +1 -1
- package/dist/utils/theme-gen.js.map +1 -1
- package/dist/utils/time-series-data.d.ts.map +1 -1
- package/dist/utils/time-series-data.js.map +1 -1
- package/dist/utils/transform-data.js.map +1 -1
- package/dist/utils/variable-interpolation.js.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/TimeSeriesTooltip/nearby-series.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { ECharts as EChartsInstance } from 'echarts/core';\nimport { BarSeriesOption } from 'echarts/charts';\nimport { TimeSeries, TimeSeriesValueTuple } from '@perses-dev/spec';\nimport {\n EChartsDataFormat,\n OPTIMIZED_MODE_SERIES_LIMIT,\n TimeChartSeriesMapping,\n DatapointInfo,\n FormatOptions,\n formatValue,\n} from '../model';\nimport { batchDispatchNearbySeriesActions, getPointInGrid, getClosestTimestamp } from '../utils';\nimport { CursorCoordinates, CursorData, EMPTY_TOOLTIP_DATA } from './tooltip-model';\nimport {\n calculateBarBandwidth,\n calculateBarSegmentBounds,\n calculateBarYBounds,\n calculateVisualYForSeries,\n getPixelXFromGrid,\n} from './utils';\nimport { Candidate, GetYBufferParams, IsWithinPercentageRangeParams, NearbySeriesArray } from './types';\n\nexport type { NearbySeriesArray, NearbySeriesInfo } from './types';\n\n// increase multipliers to show more series in tooltip\nexport const INCREASE_NEARBY_SERIES_MULTIPLIER = 5.5; // adjusts how many series show in tooltip (higher == more series shown)\nexport const DYNAMIC_NEARBY_SERIES_MULTIPLIER = 30; // used for adjustment after series number divisor\nexport const SHOW_FEWER_SERIES_LIMIT = 5;\n\nfunction gatherCandidates(\n data: TimeSeries[],\n seriesMapping: TimeChartSeriesMapping,\n closestTimestamp: number,\n cursorX: number,\n cursorY: number,\n cursorXPixel: number | null,\n cursorPixelY: number | undefined,\n yBuffer: number,\n yBufferPixels: number | null,\n chart: EChartsInstance\n): Candidate[] {\n const candidates: Candidate[] = [];\n const totalSeries = data.length;\n\n const stackTotals = new Map<string, number>();\n\n let sortedTimestamps: number[] = [];\n const firstValues = data[0]?.values;\n if (firstValues && firstValues.length > 0) {\n const seen = new Set<number>();\n for (const [ts] of firstValues) {\n if (!seen.has(ts)) {\n seen.add(ts);\n sortedTimestamps.push(ts);\n }\n }\n sortedTimestamps = sortedTimestamps.sort((a, b) => a - b);\n }\n\n // Bar-only indexes: ECharts groups bars independently of lines, so bar-relative index and count must exclude line series.\n const barSeriesIndexes: number[] = [];\n for (let i = 0; i < totalSeries; i++) {\n if ((seriesMapping[i]?.type ?? 'line') === 'bar') barSeriesIndexes.push(i);\n }\n\n // Computed once outside the loop — both depend only on the timestamp, not the series index.\n let barBandwidth: number | null = null;\n let barCenterPixelX: number | null = null;\n if (barSeriesIndexes.length > 0 && cursorXPixel !== null) {\n barBandwidth = calculateBarBandwidth(closestTimestamp, sortedTimestamps, chart);\n barCenterPixelX = getPixelXFromGrid(closestTimestamp, chart);\n }\n\n for (let seriesIdx = 0; seriesIdx < totalSeries; seriesIdx++) {\n const currentSeries = seriesMapping[seriesIdx];\n if (!currentSeries) continue;\n\n const currentDataset = data[seriesIdx];\n if (!currentDataset) continue;\n\n const currentDatasetValues: TimeSeriesValueTuple[] | undefined = currentDataset.values;\n if (!currentDatasetValues || !Array.isArray(currentDatasetValues)) continue;\n\n const seriesType = currentSeries.type ?? 'line';\n const currentSeriesName = currentSeries.name ? currentSeries.name.toString() : '';\n const seriesId = currentSeries.id ? currentSeries.id.toString() : '';\n const markerColor = (currentSeries.color ?? '#000').toString();\n\n let datumIdx = -1;\n let xValue = 0;\n let yValue: number | null | undefined;\n for (let i = 0; i < currentDatasetValues.length; i++) {\n const tuple = currentDatasetValues[i];\n if (!tuple) continue;\n if (tuple[0] === closestTimestamp) {\n datumIdx = i;\n xValue = tuple[0];\n yValue = tuple[1];\n break;\n }\n }\n if (datumIdx === -1) continue;\n\n if (yValue === null || yValue === undefined) continue;\n\n let isCandidate = false;\n let visualY = yValue;\n let distance = Infinity;\n\n if (seriesType === 'line') {\n visualY = calculateVisualYForSeries(seriesIdx, yValue, seriesMapping, stackTotals);\n\n if (cursorPixelY !== undefined && yBufferPixels !== null) {\n try {\n const dataPointPixel = chart.convertToPixel({ seriesIndex: seriesIdx }, [datumIdx, visualY]);\n if (dataPointPixel && dataPointPixel[1] !== undefined) {\n const pixelDistance = Math.abs(cursorPixelY - dataPointPixel[1]);\n isCandidate = pixelDistance <= yBufferPixels;\n distance = pixelDistance;\n } else {\n const verticalDistance = Math.abs(visualY - cursorY);\n isCandidate = verticalDistance <= yBuffer;\n distance = verticalDistance;\n }\n } catch {\n const verticalDistance = Math.abs(visualY - cursorY);\n isCandidate = verticalDistance <= yBuffer;\n distance = verticalDistance;\n }\n } else {\n const verticalDistance = Math.abs(visualY - cursorY);\n isCandidate = verticalDistance <= yBuffer;\n distance = verticalDistance;\n }\n } else if (seriesType === 'bar') {\n if (cursorXPixel === null || barBandwidth === null || barCenterPixelX === null) continue;\n\n const barRelativeIdx = barSeriesIndexes.indexOf(seriesIdx);\n if (barRelativeIdx === -1) continue;\n\n const segmentBounds = calculateBarSegmentBounds(\n barRelativeIdx,\n barBandwidth,\n barCenterPixelX,\n barSeriesIndexes.length\n );\n\n const isWithinXBounds = cursorXPixel >= segmentBounds.left && cursorXPixel <= segmentBounds.right;\n if (!isWithinXBounds) continue;\n\n const stackId = (currentSeries as BarSeriesOption).stack;\n let isHoveringYBounds = true;\n\n if (stackId) {\n const stackIdStr = stackId.toString();\n const visualYBottom = stackTotals.get(stackIdStr) ?? 0;\n visualY = calculateVisualYForSeries(seriesIdx, yValue, seriesMapping, stackTotals);\n const yBounds = calculateBarYBounds(visualYBottom, visualY, chart);\n\n if (yBounds) {\n const cursorYPixel = chart.convertToPixel('grid', [0, cursorY]);\n if (cursorYPixel && cursorYPixel[1] !== undefined) {\n isHoveringYBounds = cursorYPixel[1] >= yBounds.top && cursorYPixel[1] <= yBounds.bottom;\n }\n }\n } else {\n visualY = yValue;\n }\n\n if (!isHoveringYBounds) continue;\n\n const segmentCenter = (segmentBounds.left + segmentBounds.right) / 2;\n distance = Math.abs(cursorXPixel - segmentCenter);\n isCandidate = true;\n }\n\n if (isCandidate) {\n candidates.push({\n seriesIdx,\n datumIdx,\n seriesId,\n seriesName: currentSeriesName,\n date: closestTimestamp,\n markerColor,\n x: xValue,\n y: yValue,\n visualY,\n distance,\n });\n }\n }\n\n return candidates;\n}\n\nfunction findClosestCandidate(candidates: Candidate[]): Candidate | null {\n if (candidates.length === 0) return null;\n let winner: Candidate | null = null;\n for (const candidate of candidates) {\n if (winner === null || candidate.distance < winner.distance) {\n winner = candidate;\n }\n }\n return winner;\n}\n\nfunction processCandidates(\n candidates: Candidate[],\n winner: Candidate | null,\n format: FormatOptions | undefined,\n seriesFormatMap: Map<string, FormatOptions> | undefined,\n chart: EChartsInstance,\n nonCandidateSeriesIndexes: number[]\n): NearbySeriesArray {\n const nearbySeriesIndexes: number[] = [];\n const emphasizedSeriesIndexes: number[] = [];\n const nonEmphasizedSeriesIndexes: number[] = [...nonCandidateSeriesIndexes];\n const emphasizedDatapoints: DatapointInfo[] = [];\n const duplicateDatapoints: DatapointInfo[] = [];\n const yValueCounts: Map<number, number> = new Map();\n\n const result: NearbySeriesArray = [];\n\n for (const candidate of candidates) {\n const seriesFormat = seriesFormatMap?.get(candidate.seriesId) ?? format;\n // Use raw y, not visualY — visualY is for proximity detection only.\n const displayY = candidate.y;\n const formattedY = formatValue(displayY, seriesFormat);\n const isClosestToCursor = winner !== null && candidate.seriesIdx === winner.seriesIdx;\n\n if (isClosestToCursor) {\n emphasizedSeriesIndexes.push(candidate.seriesIdx);\n\n const duplicateValuesCount = yValueCounts.get(displayY) ?? 0;\n yValueCounts.set(displayY, duplicateValuesCount + 1);\n if (duplicateValuesCount > 0) {\n duplicateDatapoints.push({\n seriesIndex: candidate.seriesIdx,\n dataIndex: candidate.datumIdx,\n seriesName: candidate.seriesName,\n yValue: displayY,\n });\n }\n\n emphasizedDatapoints.push({\n seriesIndex: candidate.seriesIdx,\n dataIndex: candidate.datumIdx,\n seriesName: candidate.seriesName,\n yValue: displayY,\n });\n } else {\n nonEmphasizedSeriesIndexes.push(candidate.seriesIdx);\n }\n\n result.push({\n seriesIdx: candidate.seriesIdx,\n datumIdx: candidate.datumIdx,\n seriesName: candidate.seriesName,\n date: candidate.date,\n x: candidate.x,\n y: displayY,\n formattedY,\n markerColor: candidate.markerColor,\n isClosestToCursor,\n });\n\n nearbySeriesIndexes.push(candidate.seriesIdx);\n }\n\n batchDispatchNearbySeriesActions(\n chart,\n nearbySeriesIndexes,\n emphasizedSeriesIndexes,\n nonEmphasizedSeriesIndexes,\n emphasizedDatapoints,\n duplicateDatapoints\n );\n\n return result;\n}\n\n/**\n * Returns formatted series data for the points that are close to the user's cursor.\n * Adjust xBuffer and yBuffer to increase or decrease number of series shown.\n */\nexport function checkforNearbyTimeSeries(\n data: TimeSeries[],\n seriesMapping: TimeChartSeriesMapping,\n pointInGrid: number[],\n yBuffer: number,\n chart: EChartsInstance,\n format?: FormatOptions,\n seriesFormatMap?: Map<string, FormatOptions>,\n // in the case of multi-axis, we need the cursor Y position in pixel space\n cursorPixelY?: number,\n cursorXPixel?: number | null\n): NearbySeriesArray {\n const cursorX: number | null = pointInGrid[0] ?? null;\n const cursorY: number | null = pointInGrid[1] ?? null;\n\n if (cursorX === null || cursorY === null) return EMPTY_TOOLTIP_DATA;\n if (chart.dispatchAction === undefined) return EMPTY_TOOLTIP_DATA;\n if (!Array.isArray(data)) return EMPTY_TOOLTIP_DATA;\n\n // All series share the same x-axis timestamps (enforced by getCommonTimeScale).\n const firstTimeSeriesValues = data[0]?.values;\n const closestTimestamp = getClosestTimestamp(firstTimeSeriesValues, cursorX);\n if (closestTimestamp === null) return EMPTY_TOOLTIP_DATA;\n\n let yBufferPixels: number | null = null;\n if (cursorPixelY !== undefined) {\n const cursorPoint = chart.convertToPixel('grid', [0, cursorY]);\n const bufferPoint = chart.convertToPixel('grid', [0, cursorY + yBuffer]);\n if (cursorPoint && bufferPoint && cursorPoint[1] !== undefined && bufferPoint[1] !== undefined) {\n yBufferPixels = Math.abs(bufferPoint[1] - cursorPoint[1]);\n }\n }\n\n const resolvedCursorXPixel = cursorXPixel ?? getPixelXFromGrid(closestTimestamp, chart);\n\n const candidates = gatherCandidates(\n data,\n seriesMapping,\n closestTimestamp,\n cursorX,\n cursorY,\n resolvedCursorXPixel,\n cursorPixelY,\n yBuffer,\n yBufferPixels,\n chart\n );\n\n const winner = findClosestCandidate(candidates);\n\n const candidateIndexes = new Set<number>();\n for (const candidate of candidates) candidateIndexes.add(candidate.seriesIdx);\n const nonCandidateSeriesIndexes: number[] = [];\n for (let idx = 0; idx < data.length; idx++) {\n if (!candidateIndexes.has(idx)) nonCandidateSeriesIndexes.push(idx);\n }\n\n return processCandidates(candidates, winner, format, seriesFormatMap, chart, nonCandidateSeriesIndexes);\n}\n\n/**\n * [DEPRECATED] Returns formatted series data for the points that are close to the user's cursor\n * Adjust yBuffer to increase or decrease number of series shown\n */\nexport function legacyCheckforNearbySeries(\n data: EChartsDataFormat,\n pointInGrid: number[],\n yBuffer: number,\n chart?: EChartsInstance,\n format?: FormatOptions\n): NearbySeriesArray {\n const currentNearbySeriesData: NearbySeriesArray = [];\n const cursorX: number | null = pointInGrid[0] ?? null;\n const cursorY: number | null = pointInGrid[1] ?? null;\n\n if (cursorX === null || cursorY === null) {\n return currentNearbySeriesData;\n }\n\n const nearbySeriesIndexes: number[] = [];\n const emphasizedSeriesIndexes: number[] = [];\n const nonEmphasizedSeriesIndexes: number[] = [];\n const totalSeries = data.timeSeries.length;\n if (Array.isArray(data.xAxis) && Array.isArray(data.timeSeries)) {\n for (let seriesIdx = 0; seriesIdx < totalSeries; seriesIdx++) {\n const currentSeries = data.timeSeries[seriesIdx];\n if (currentSeries === undefined) break;\n if (currentNearbySeriesData.length >= OPTIMIZED_MODE_SERIES_LIMIT) break;\n\n const currentSeriesName = currentSeries.name ? currentSeries.name.toString() : '';\n const markerColor = currentSeries.color ?? '#000';\n if (Array.isArray(currentSeries.data)) {\n for (let datumIdx = 0; datumIdx < currentSeries.data.length; datumIdx++) {\n const xValue = data.xAxis[datumIdx] ?? 0;\n const yValue = currentSeries.data[datumIdx];\n // ensure null values not displayed in tooltip\n if (yValue !== undefined && yValue !== null && cursorX === datumIdx) {\n if (yValue !== '-' && cursorY <= yValue + yBuffer && cursorY >= yValue - yBuffer) {\n // show fewer bold series in tooltip when many total series\n const minPercentRange = totalSeries > SHOW_FEWER_SERIES_LIMIT ? 2 : 5;\n const percentRangeToCheck = Math.max(minPercentRange, 100 / totalSeries);\n const isClosestToCursor = isWithinPercentageRange({\n valueToCheck: cursorY,\n baseValue: yValue,\n percentage: percentRangeToCheck,\n });\n if (isClosestToCursor) {\n emphasizedSeriesIndexes.push(seriesIdx);\n } else {\n nonEmphasizedSeriesIndexes.push(seriesIdx);\n // ensure series not close to cursor are not highlighted\n if (chart?.dispatchAction !== undefined) {\n chart.dispatchAction({\n type: 'downplay',\n seriesIndex: seriesIdx,\n });\n }\n }\n\n // determine whether to convert timestamp to ms, see: https://stackoverflow.com/a/23982005/17575201\n const xValueMilliSeconds = xValue > 99999999999 ? xValue : xValue * 1000;\n const formattedY = formatValue(yValue, format);\n currentNearbySeriesData.push({\n seriesIdx: seriesIdx,\n datumIdx: datumIdx,\n seriesName: currentSeriesName,\n date: xValueMilliSeconds,\n x: xValue,\n y: yValue,\n formattedY: formattedY,\n markerColor: markerColor.toString(),\n isClosestToCursor,\n });\n nearbySeriesIndexes.push(seriesIdx);\n }\n }\n }\n }\n }\n }\n if (chart?.dispatchAction !== undefined) {\n // Clears emphasis state of all lines that are not emphasized.\n // Emphasized is a subset of just the nearby series that are closest to cursor.\n chart.dispatchAction({\n type: 'downplay',\n seriesIndex: nonEmphasizedSeriesIndexes,\n });\n\n // https://echarts.apache.org/en/api.html#action.highlight\n if (emphasizedSeriesIndexes.length > 0) {\n // Fadeout opacity of all series not closest to cursor.\n chart.dispatchAction({\n type: 'highlight',\n seriesIndex: emphasizedSeriesIndexes,\n notBlur: false, // ensure blur IS triggered, this is default but setting so it is explicit\n escapeConnect: true, // shared crosshair should not emphasize series on adjacent charts\n });\n } else {\n // When no emphasized series with bold text, notBlur allows opacity fadeout to not trigger.\n chart.dispatchAction({\n type: 'highlight',\n seriesIndex: nearbySeriesIndexes,\n notBlur: true, // do not trigger blur state when cursor is not immediately close to any series\n escapeConnect: true, // shared crosshair should not emphasize series on adjacent charts\n });\n }\n }\n\n return currentNearbySeriesData;\n}\n\n/**\n * Uses mouse position to determine whether user is hovering over a chart canvas\n * If yes, convert from pixel values to logical cartesian coordinates and return all nearby series\n */\nexport function getNearbySeriesData({\n mousePos,\n pinnedPos,\n data,\n seriesMapping,\n chart,\n format,\n seriesFormatMap,\n showAllSeries = false,\n}: {\n mousePos: CursorData['coords'];\n pinnedPos: CursorCoordinates | null;\n data: TimeSeries[];\n seriesMapping: TimeChartSeriesMapping;\n chart?: EChartsInstance;\n format?: FormatOptions;\n seriesFormatMap?: Map<string, FormatOptions>;\n showAllSeries?: boolean;\n}): NearbySeriesArray {\n if (chart === undefined || mousePos === null) return EMPTY_TOOLTIP_DATA;\n\n // prevents multiple tooltips showing from adjacent charts unless tooltip is pinned\n let cursorTargetMatchesChart = false;\n if (mousePos.target !== null) {\n const currentParent = (<HTMLElement>mousePos.target).parentElement;\n if (currentParent !== null) {\n const currentGrandparent = currentParent.parentElement;\n if (currentGrandparent !== null) {\n const chartDom = chart.getDom();\n if (chartDom === currentGrandparent) {\n cursorTargetMatchesChart = true;\n }\n }\n }\n }\n\n // allows moving cursor inside tooltip without it fading away\n if (pinnedPos !== null) {\n mousePos = pinnedPos;\n cursorTargetMatchesChart = true;\n }\n\n if (cursorTargetMatchesChart === false || data === null || chart['_model'] === undefined) return EMPTY_TOOLTIP_DATA;\n\n if (mousePos.plotCanvas.x === undefined || mousePos.plotCanvas.y === undefined) return EMPTY_TOOLTIP_DATA;\n\n const cursorPixelY = mousePos.plotCanvas.y;\n const cursorXPixel = mousePos.plotCanvas.x;\n const pointInGrid = getPointInGrid(cursorXPixel, cursorPixelY, chart);\n if (pointInGrid !== null) {\n const chartModel = chart['_model'];\n const yAxisScale = chartModel.getComponent('yAxis').axis.scale;\n const isLogScale = yAxisScale.type === 'log';\n let yInterval = yAxisScale._interval;\n // For log scales, convert from log-space extent to actual data range and use 1% as the interval.\n if (isLogScale && yAxisScale.base) {\n const logBase = yAxisScale.base;\n const extent = yAxisScale._extent;\n // e.g. extent [0, 2] → 10^0..10^2\n const actualMin = logBase ** extent[0];\n const actualMax = logBase ** extent[1];\n yInterval = (actualMax - actualMin) / 100;\n }\n const totalSeries = data.length;\n const yBuffer = getYBuffer({ yInterval, totalSeries, showAllSeries });\n\n const hasMultipleYAxes = seriesMapping.some((series) => series.yAxisIndex !== undefined && series.yAxisIndex > 0);\n\n return checkforNearbyTimeSeries(\n data,\n seriesMapping,\n pointInGrid,\n yBuffer,\n chart,\n format,\n seriesFormatMap,\n hasMultipleYAxes ? cursorPixelY : undefined,\n cursorXPixel\n );\n }\n\n // no nearby series found\n return EMPTY_TOOLTIP_DATA;\n}\n\n/*\n * Check if two numbers are within a specified percentage range\n */\nexport function isWithinPercentageRange({\n valueToCheck,\n baseValue,\n percentage,\n}: IsWithinPercentageRangeParams): boolean {\n const range = (percentage / 100) * baseValue;\n const lowerBound = baseValue - range;\n const upperBound = baseValue + range;\n return valueToCheck >= lowerBound && valueToCheck <= upperBound;\n}\n\n/*\n * Get range to check within for nearby series to show in tooltip.\n */\nexport function getYBuffer({ yInterval, totalSeries, showAllSeries = false }: GetYBufferParams): number {\n if (showAllSeries) {\n return yInterval * 10; // roughly correlates with grid so entire canvas is searched\n }\n // never let nearby series range be less than roughly the size of a single tick\n const yBufferMin = yInterval * 0.3;\n\n // tooltip trigger area gets smaller with more series\n if (totalSeries > SHOW_FEWER_SERIES_LIMIT) {\n const adjustedBuffer = (yInterval * DYNAMIC_NEARBY_SERIES_MULTIPLIER) / totalSeries;\n return Math.max(yBufferMin, adjustedBuffer);\n }\n // increase multiplier to expand nearby series range\n return Math.max(yBufferMin, yInterval * INCREASE_NEARBY_SERIES_MULTIPLIER);\n}\n"],"names":["OPTIMIZED_MODE_SERIES_LIMIT","formatValue","batchDispatchNearbySeriesActions","getPointInGrid","getClosestTimestamp","EMPTY_TOOLTIP_DATA","calculateBarBandwidth","calculateBarSegmentBounds","calculateBarYBounds","calculateVisualYForSeries","getPixelXFromGrid","INCREASE_NEARBY_SERIES_MULTIPLIER","DYNAMIC_NEARBY_SERIES_MULTIPLIER","SHOW_FEWER_SERIES_LIMIT","gatherCandidates","data","seriesMapping","closestTimestamp","cursorX","cursorY","cursorXPixel","cursorPixelY","yBuffer","yBufferPixels","chart","candidates","totalSeries","length","stackTotals","Map","sortedTimestamps","firstValues","values","seen","Set","ts","has","add","push","sort","a","b","barSeriesIndexes","i","type","barBandwidth","barCenterPixelX","seriesIdx","currentSeries","currentDataset","currentDatasetValues","Array","isArray","seriesType","currentSeriesName","name","toString","seriesId","id","markerColor","color","datumIdx","xValue","yValue","tuple","undefined","isCandidate","visualY","distance","Infinity","dataPointPixel","convertToPixel","seriesIndex","pixelDistance","Math","abs","verticalDistance","barRelativeIdx","indexOf","segmentBounds","isWithinXBounds","left","right","stackId","stack","isHoveringYBounds","stackIdStr","visualYBottom","get","yBounds","cursorYPixel","top","bottom","segmentCenter","seriesName","date","x","y","findClosestCandidate","winner","candidate","processCandidates","format","seriesFormatMap","nonCandidateSeriesIndexes","nearbySeriesIndexes","emphasizedSeriesIndexes","nonEmphasizedSeriesIndexes","emphasizedDatapoints","duplicateDatapoints","yValueCounts","result","seriesFormat","displayY","formattedY","isClosestToCursor","duplicateValuesCount","set","dataIndex","checkforNearbyTimeSeries","pointInGrid","dispatchAction","firstTimeSeriesValues","cursorPoint","bufferPoint","resolvedCursorXPixel","candidateIndexes","idx","legacyCheckforNearbySeries","currentNearbySeriesData","timeSeries","xAxis","minPercentRange","percentRangeToCheck","max","isWithinPercentageRange","valueToCheck","baseValue","percentage","xValueMilliSeconds","notBlur","escapeConnect","getNearbySeriesData","mousePos","pinnedPos","showAllSeries","cursorTargetMatchesChart","target","currentParent","parentElement","currentGrandparent","chartDom","getDom","plotCanvas","chartModel","yAxisScale","getComponent","axis","scale","isLogScale","yInterval","_interval","base","logBase","extent","_extent","actualMin","actualMax","getYBuffer","hasMultipleYAxes","some","series","yAxisIndex","range","lowerBound","upperBound","yBufferMin","adjustedBuffer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/TimeSeriesTooltip/nearby-series.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { TimeSeries, TimeSeriesValueTuple } from '@perses-dev/spec';\nimport { BarSeriesOption } from 'echarts/charts';\nimport { ECharts as EChartsInstance } from 'echarts/core';\n\nimport {\n EChartsDataFormat,\n OPTIMIZED_MODE_SERIES_LIMIT,\n TimeChartSeriesMapping,\n DatapointInfo,\n FormatOptions,\n formatValue,\n} from '../model';\nimport { batchDispatchNearbySeriesActions, getPointInGrid, getClosestTimestamp } from '../utils';\nimport { CursorCoordinates, CursorData, EMPTY_TOOLTIP_DATA } from './tooltip-model';\nimport { Candidate, GetYBufferParams, IsWithinPercentageRangeParams, NearbySeriesArray } from './types';\nimport {\n calculateBarBandwidth,\n calculateBarSegmentBounds,\n calculateBarYBounds,\n calculateVisualYForSeries,\n getPixelXFromGrid,\n} from './utils';\n\nexport type { NearbySeriesArray, NearbySeriesInfo } from './types';\n\n// increase multipliers to show more series in tooltip\nexport const INCREASE_NEARBY_SERIES_MULTIPLIER = 5.5; // adjusts how many series show in tooltip (higher == more series shown)\nexport const DYNAMIC_NEARBY_SERIES_MULTIPLIER = 30; // used for adjustment after series number divisor\nexport const SHOW_FEWER_SERIES_LIMIT = 5;\n\nfunction gatherCandidates(\n data: TimeSeries[],\n seriesMapping: TimeChartSeriesMapping,\n closestTimestamp: number,\n cursorX: number,\n cursorY: number,\n cursorXPixel: number | null,\n cursorPixelY: number | undefined,\n yBuffer: number,\n yBufferPixels: number | null,\n chart: EChartsInstance,\n): Candidate[] {\n const candidates: Candidate[] = [];\n const totalSeries = data.length;\n\n const stackTotals = new Map<string, number>();\n\n let sortedTimestamps: number[] = [];\n const firstValues = data[0]?.values;\n if (firstValues && firstValues.length > 0) {\n const seen = new Set<number>();\n for (const [ts] of firstValues) {\n if (!seen.has(ts)) {\n seen.add(ts);\n sortedTimestamps.push(ts);\n }\n }\n sortedTimestamps = sortedTimestamps.sort((a, b) => a - b);\n }\n\n // Bar-only indexes: ECharts groups bars independently of lines, so bar-relative index and count must exclude line series.\n const barSeriesIndexes: number[] = [];\n for (let i = 0; i < totalSeries; i++) {\n if ((seriesMapping[i]?.type ?? 'line') === 'bar') barSeriesIndexes.push(i);\n }\n\n // Computed once outside the loop — both depend only on the timestamp, not the series index.\n let barBandwidth: number | null = null;\n let barCenterPixelX: number | null = null;\n if (barSeriesIndexes.length > 0 && cursorXPixel !== null) {\n barBandwidth = calculateBarBandwidth(closestTimestamp, sortedTimestamps, chart);\n barCenterPixelX = getPixelXFromGrid(closestTimestamp, chart);\n }\n\n for (let seriesIdx = 0; seriesIdx < totalSeries; seriesIdx++) {\n const currentSeries = seriesMapping[seriesIdx];\n if (!currentSeries) continue;\n\n const currentDataset = data[seriesIdx];\n if (!currentDataset) continue;\n\n const currentDatasetValues: TimeSeriesValueTuple[] | undefined = currentDataset.values;\n if (!currentDatasetValues || !Array.isArray(currentDatasetValues)) continue;\n\n const seriesType = currentSeries.type ?? 'line';\n const currentSeriesName = currentSeries.name ? currentSeries.name.toString() : '';\n const seriesId = currentSeries.id ? currentSeries.id.toString() : '';\n const markerColor = (currentSeries.color ?? '#000').toString();\n\n let datumIdx = -1;\n let xValue = 0;\n let yValue: number | null | undefined;\n for (let i = 0; i < currentDatasetValues.length; i++) {\n const tuple = currentDatasetValues[i];\n if (!tuple) continue;\n if (tuple[0] === closestTimestamp) {\n datumIdx = i;\n xValue = tuple[0];\n yValue = tuple[1];\n break;\n }\n }\n if (datumIdx === -1) continue;\n\n if (yValue === null || yValue === undefined) continue;\n\n let isCandidate = false;\n let visualY = yValue;\n let distance = Infinity;\n\n if (seriesType === 'line') {\n visualY = calculateVisualYForSeries(seriesIdx, yValue, seriesMapping, stackTotals);\n\n if (cursorPixelY !== undefined && yBufferPixels !== null) {\n try {\n const dataPointPixel = chart.convertToPixel({ seriesIndex: seriesIdx }, [datumIdx, visualY]);\n if (dataPointPixel && dataPointPixel[1] !== undefined) {\n const pixelDistance = Math.abs(cursorPixelY - dataPointPixel[1]);\n isCandidate = pixelDistance <= yBufferPixels;\n distance = pixelDistance;\n } else {\n const verticalDistance = Math.abs(visualY - cursorY);\n isCandidate = verticalDistance <= yBuffer;\n distance = verticalDistance;\n }\n } catch {\n const verticalDistance = Math.abs(visualY - cursorY);\n isCandidate = verticalDistance <= yBuffer;\n distance = verticalDistance;\n }\n } else {\n const verticalDistance = Math.abs(visualY - cursorY);\n isCandidate = verticalDistance <= yBuffer;\n distance = verticalDistance;\n }\n } else if (seriesType === 'bar') {\n if (cursorXPixel === null || barBandwidth === null || barCenterPixelX === null) continue;\n\n const barRelativeIdx = barSeriesIndexes.indexOf(seriesIdx);\n if (barRelativeIdx === -1) continue;\n\n const segmentBounds = calculateBarSegmentBounds(\n barRelativeIdx,\n barBandwidth,\n barCenterPixelX,\n barSeriesIndexes.length,\n );\n\n const isWithinXBounds = cursorXPixel >= segmentBounds.left && cursorXPixel <= segmentBounds.right;\n if (!isWithinXBounds) continue;\n\n const stackId = (currentSeries as BarSeriesOption).stack;\n let isHoveringYBounds = true;\n\n if (stackId) {\n const stackIdStr = stackId.toString();\n const visualYBottom = stackTotals.get(stackIdStr) ?? 0;\n visualY = calculateVisualYForSeries(seriesIdx, yValue, seriesMapping, stackTotals);\n const yBounds = calculateBarYBounds(visualYBottom, visualY, chart);\n\n if (yBounds) {\n const cursorYPixel = chart.convertToPixel('grid', [0, cursorY]);\n if (cursorYPixel && cursorYPixel[1] !== undefined) {\n isHoveringYBounds = cursorYPixel[1] >= yBounds.top && cursorYPixel[1] <= yBounds.bottom;\n }\n }\n } else {\n visualY = yValue;\n }\n\n if (!isHoveringYBounds) continue;\n\n const segmentCenter = (segmentBounds.left + segmentBounds.right) / 2;\n distance = Math.abs(cursorXPixel - segmentCenter);\n isCandidate = true;\n }\n\n if (isCandidate) {\n candidates.push({\n seriesIdx,\n datumIdx,\n seriesId,\n seriesName: currentSeriesName,\n date: closestTimestamp,\n markerColor,\n x: xValue,\n y: yValue,\n visualY,\n distance,\n });\n }\n }\n\n return candidates;\n}\n\nfunction findClosestCandidate(candidates: Candidate[]): Candidate | null {\n if (candidates.length === 0) return null;\n let winner: Candidate | null = null;\n for (const candidate of candidates) {\n if (winner === null || candidate.distance < winner.distance) {\n winner = candidate;\n }\n }\n return winner;\n}\n\nfunction processCandidates(\n candidates: Candidate[],\n winner: Candidate | null,\n format: FormatOptions | undefined,\n seriesFormatMap: Map<string, FormatOptions> | undefined,\n chart: EChartsInstance,\n nonCandidateSeriesIndexes: number[],\n): NearbySeriesArray {\n const nearbySeriesIndexes: number[] = [];\n const emphasizedSeriesIndexes: number[] = [];\n const nonEmphasizedSeriesIndexes: number[] = [...nonCandidateSeriesIndexes];\n const emphasizedDatapoints: DatapointInfo[] = [];\n const duplicateDatapoints: DatapointInfo[] = [];\n const yValueCounts: Map<number, number> = new Map();\n\n const result: NearbySeriesArray = [];\n\n for (const candidate of candidates) {\n const seriesFormat = seriesFormatMap?.get(candidate.seriesId) ?? format;\n // Use raw y, not visualY — visualY is for proximity detection only.\n const displayY = candidate.y;\n const formattedY = formatValue(displayY, seriesFormat);\n const isClosestToCursor = winner !== null && candidate.seriesIdx === winner.seriesIdx;\n\n if (isClosestToCursor) {\n emphasizedSeriesIndexes.push(candidate.seriesIdx);\n\n const duplicateValuesCount = yValueCounts.get(displayY) ?? 0;\n yValueCounts.set(displayY, duplicateValuesCount + 1);\n if (duplicateValuesCount > 0) {\n duplicateDatapoints.push({\n seriesIndex: candidate.seriesIdx,\n dataIndex: candidate.datumIdx,\n seriesName: candidate.seriesName,\n yValue: displayY,\n });\n }\n\n emphasizedDatapoints.push({\n seriesIndex: candidate.seriesIdx,\n dataIndex: candidate.datumIdx,\n seriesName: candidate.seriesName,\n yValue: displayY,\n });\n } else {\n nonEmphasizedSeriesIndexes.push(candidate.seriesIdx);\n }\n\n result.push({\n seriesIdx: candidate.seriesIdx,\n datumIdx: candidate.datumIdx,\n seriesName: candidate.seriesName,\n date: candidate.date,\n x: candidate.x,\n y: displayY,\n formattedY,\n markerColor: candidate.markerColor,\n isClosestToCursor,\n });\n\n nearbySeriesIndexes.push(candidate.seriesIdx);\n }\n\n batchDispatchNearbySeriesActions(\n chart,\n nearbySeriesIndexes,\n emphasizedSeriesIndexes,\n nonEmphasizedSeriesIndexes,\n emphasizedDatapoints,\n duplicateDatapoints,\n );\n\n return result;\n}\n\n/**\n * Returns formatted series data for the points that are close to the user's cursor.\n * Adjust xBuffer and yBuffer to increase or decrease number of series shown.\n */\nexport function checkforNearbyTimeSeries(\n data: TimeSeries[],\n seriesMapping: TimeChartSeriesMapping,\n pointInGrid: number[],\n yBuffer: number,\n chart: EChartsInstance,\n format?: FormatOptions,\n seriesFormatMap?: Map<string, FormatOptions>,\n // in the case of multi-axis, we need the cursor Y position in pixel space\n cursorPixelY?: number,\n cursorXPixel?: number | null,\n): NearbySeriesArray {\n const cursorX: number | null = pointInGrid[0] ?? null;\n const cursorY: number | null = pointInGrid[1] ?? null;\n\n if (cursorX === null || cursorY === null) return EMPTY_TOOLTIP_DATA;\n if (chart.dispatchAction === undefined) return EMPTY_TOOLTIP_DATA;\n if (!Array.isArray(data)) return EMPTY_TOOLTIP_DATA;\n\n // All series share the same x-axis timestamps (enforced by getCommonTimeScale).\n const firstTimeSeriesValues = data[0]?.values;\n const closestTimestamp = getClosestTimestamp(firstTimeSeriesValues, cursorX);\n if (closestTimestamp === null) return EMPTY_TOOLTIP_DATA;\n\n let yBufferPixels: number | null = null;\n if (cursorPixelY !== undefined) {\n const cursorPoint = chart.convertToPixel('grid', [0, cursorY]);\n const bufferPoint = chart.convertToPixel('grid', [0, cursorY + yBuffer]);\n if (cursorPoint && bufferPoint && cursorPoint[1] !== undefined && bufferPoint[1] !== undefined) {\n yBufferPixels = Math.abs(bufferPoint[1] - cursorPoint[1]);\n }\n }\n\n const resolvedCursorXPixel = cursorXPixel ?? getPixelXFromGrid(closestTimestamp, chart);\n\n const candidates = gatherCandidates(\n data,\n seriesMapping,\n closestTimestamp,\n cursorX,\n cursorY,\n resolvedCursorXPixel,\n cursorPixelY,\n yBuffer,\n yBufferPixels,\n chart,\n );\n\n const winner = findClosestCandidate(candidates);\n\n const candidateIndexes = new Set<number>();\n for (const candidate of candidates) candidateIndexes.add(candidate.seriesIdx);\n const nonCandidateSeriesIndexes: number[] = [];\n for (let idx = 0; idx < data.length; idx++) {\n if (!candidateIndexes.has(idx)) nonCandidateSeriesIndexes.push(idx);\n }\n\n return processCandidates(candidates, winner, format, seriesFormatMap, chart, nonCandidateSeriesIndexes);\n}\n\n/**\n * [DEPRECATED] Returns formatted series data for the points that are close to the user's cursor\n * Adjust yBuffer to increase or decrease number of series shown\n */\nexport function legacyCheckforNearbySeries(\n data: EChartsDataFormat,\n pointInGrid: number[],\n yBuffer: number,\n chart?: EChartsInstance,\n format?: FormatOptions,\n): NearbySeriesArray {\n const currentNearbySeriesData: NearbySeriesArray = [];\n const cursorX: number | null = pointInGrid[0] ?? null;\n const cursorY: number | null = pointInGrid[1] ?? null;\n\n if (cursorX === null || cursorY === null) {\n return currentNearbySeriesData;\n }\n\n const nearbySeriesIndexes: number[] = [];\n const emphasizedSeriesIndexes: number[] = [];\n const nonEmphasizedSeriesIndexes: number[] = [];\n const totalSeries = data.timeSeries.length;\n if (Array.isArray(data.xAxis) && Array.isArray(data.timeSeries)) {\n for (let seriesIdx = 0; seriesIdx < totalSeries; seriesIdx++) {\n const currentSeries = data.timeSeries[seriesIdx];\n if (currentSeries === undefined) break;\n if (currentNearbySeriesData.length >= OPTIMIZED_MODE_SERIES_LIMIT) break;\n\n const currentSeriesName = currentSeries.name ? currentSeries.name.toString() : '';\n const markerColor = currentSeries.color ?? '#000';\n if (Array.isArray(currentSeries.data)) {\n for (let datumIdx = 0; datumIdx < currentSeries.data.length; datumIdx++) {\n const xValue = data.xAxis[datumIdx] ?? 0;\n const yValue = currentSeries.data[datumIdx];\n // ensure null values not displayed in tooltip\n if (yValue !== undefined && yValue !== null && cursorX === datumIdx) {\n if (yValue !== '-' && cursorY <= yValue + yBuffer && cursorY >= yValue - yBuffer) {\n // show fewer bold series in tooltip when many total series\n const minPercentRange = totalSeries > SHOW_FEWER_SERIES_LIMIT ? 2 : 5;\n const percentRangeToCheck = Math.max(minPercentRange, 100 / totalSeries);\n const isClosestToCursor = isWithinPercentageRange({\n valueToCheck: cursorY,\n baseValue: yValue,\n percentage: percentRangeToCheck,\n });\n if (isClosestToCursor) {\n emphasizedSeriesIndexes.push(seriesIdx);\n } else {\n nonEmphasizedSeriesIndexes.push(seriesIdx);\n // ensure series not close to cursor are not highlighted\n if (chart?.dispatchAction !== undefined) {\n chart.dispatchAction({\n type: 'downplay',\n seriesIndex: seriesIdx,\n });\n }\n }\n\n // determine whether to convert timestamp to ms, see: https://stackoverflow.com/a/23982005/17575201\n const xValueMilliSeconds = xValue > 99999999999 ? xValue : xValue * 1000;\n const formattedY = formatValue(yValue, format);\n currentNearbySeriesData.push({\n seriesIdx: seriesIdx,\n datumIdx: datumIdx,\n seriesName: currentSeriesName,\n date: xValueMilliSeconds,\n x: xValue,\n y: yValue,\n formattedY: formattedY,\n markerColor: markerColor.toString(),\n isClosestToCursor,\n });\n nearbySeriesIndexes.push(seriesIdx);\n }\n }\n }\n }\n }\n }\n if (chart?.dispatchAction !== undefined) {\n // Clears emphasis state of all lines that are not emphasized.\n // Emphasized is a subset of just the nearby series that are closest to cursor.\n chart.dispatchAction({\n type: 'downplay',\n seriesIndex: nonEmphasizedSeriesIndexes,\n });\n\n // https://echarts.apache.org/en/api.html#action.highlight\n if (emphasizedSeriesIndexes.length > 0) {\n // Fadeout opacity of all series not closest to cursor.\n chart.dispatchAction({\n type: 'highlight',\n seriesIndex: emphasizedSeriesIndexes,\n notBlur: false, // ensure blur IS triggered, this is default but setting so it is explicit\n escapeConnect: true, // shared crosshair should not emphasize series on adjacent charts\n });\n } else {\n // When no emphasized series with bold text, notBlur allows opacity fadeout to not trigger.\n chart.dispatchAction({\n type: 'highlight',\n seriesIndex: nearbySeriesIndexes,\n notBlur: true, // do not trigger blur state when cursor is not immediately close to any series\n escapeConnect: true, // shared crosshair should not emphasize series on adjacent charts\n });\n }\n }\n\n return currentNearbySeriesData;\n}\n\n/**\n * Uses mouse position to determine whether user is hovering over a chart canvas\n * If yes, convert from pixel values to logical cartesian coordinates and return all nearby series\n */\nexport function getNearbySeriesData({\n mousePos,\n pinnedPos,\n data,\n seriesMapping,\n chart,\n format,\n seriesFormatMap,\n showAllSeries = false,\n}: {\n mousePos: CursorData['coords'];\n pinnedPos: CursorCoordinates | null;\n data: TimeSeries[];\n seriesMapping: TimeChartSeriesMapping;\n chart?: EChartsInstance;\n format?: FormatOptions;\n seriesFormatMap?: Map<string, FormatOptions>;\n showAllSeries?: boolean;\n}): NearbySeriesArray {\n if (chart === undefined || mousePos === null) return EMPTY_TOOLTIP_DATA;\n\n // prevents multiple tooltips showing from adjacent charts unless tooltip is pinned\n let cursorTargetMatchesChart = false;\n if (mousePos.target !== null) {\n const currentParent = (<HTMLElement>mousePos.target).parentElement;\n if (currentParent !== null) {\n const currentGrandparent = currentParent.parentElement;\n if (currentGrandparent !== null) {\n const chartDom = chart.getDom();\n if (chartDom === currentGrandparent) {\n cursorTargetMatchesChart = true;\n }\n }\n }\n }\n\n // allows moving cursor inside tooltip without it fading away\n if (pinnedPos !== null) {\n mousePos = pinnedPos;\n cursorTargetMatchesChart = true;\n }\n\n if (cursorTargetMatchesChart === false || data === null || chart['_model'] === undefined) return EMPTY_TOOLTIP_DATA;\n\n if (mousePos.plotCanvas.x === undefined || mousePos.plotCanvas.y === undefined) return EMPTY_TOOLTIP_DATA;\n\n const cursorPixelY = mousePos.plotCanvas.y;\n const cursorXPixel = mousePos.plotCanvas.x;\n const pointInGrid = getPointInGrid(cursorXPixel, cursorPixelY, chart);\n if (pointInGrid !== null) {\n const chartModel = chart['_model'];\n const yAxisScale = chartModel.getComponent('yAxis').axis.scale;\n const isLogScale = yAxisScale.type === 'log';\n let yInterval = yAxisScale._interval;\n // For log scales, convert from log-space extent to actual data range and use 1% as the interval.\n if (isLogScale && yAxisScale.base) {\n const logBase = yAxisScale.base;\n const extent = yAxisScale._extent;\n // e.g. extent [0, 2] → 10^0..10^2\n const actualMin = logBase ** extent[0];\n const actualMax = logBase ** extent[1];\n yInterval = (actualMax - actualMin) / 100;\n }\n const totalSeries = data.length;\n const yBuffer = getYBuffer({ yInterval, totalSeries, showAllSeries });\n\n const hasMultipleYAxes = seriesMapping.some((series) => series.yAxisIndex !== undefined && series.yAxisIndex > 0);\n\n return checkforNearbyTimeSeries(\n data,\n seriesMapping,\n pointInGrid,\n yBuffer,\n chart,\n format,\n seriesFormatMap,\n hasMultipleYAxes ? cursorPixelY : undefined,\n cursorXPixel,\n );\n }\n\n // no nearby series found\n return EMPTY_TOOLTIP_DATA;\n}\n\n/*\n * Check if two numbers are within a specified percentage range\n */\nexport function isWithinPercentageRange({\n valueToCheck,\n baseValue,\n percentage,\n}: IsWithinPercentageRangeParams): boolean {\n const range = (percentage / 100) * baseValue;\n const lowerBound = baseValue - range;\n const upperBound = baseValue + range;\n return valueToCheck >= lowerBound && valueToCheck <= upperBound;\n}\n\n/*\n * Get range to check within for nearby series to show in tooltip.\n */\nexport function getYBuffer({ yInterval, totalSeries, showAllSeries = false }: GetYBufferParams): number {\n if (showAllSeries) {\n return yInterval * 10; // roughly correlates with grid so entire canvas is searched\n }\n // never let nearby series range be less than roughly the size of a single tick\n const yBufferMin = yInterval * 0.3;\n\n // tooltip trigger area gets smaller with more series\n if (totalSeries > SHOW_FEWER_SERIES_LIMIT) {\n const adjustedBuffer = (yInterval * DYNAMIC_NEARBY_SERIES_MULTIPLIER) / totalSeries;\n return Math.max(yBufferMin, adjustedBuffer);\n }\n // increase multiplier to expand nearby series range\n return Math.max(yBufferMin, yInterval * INCREASE_NEARBY_SERIES_MULTIPLIER);\n}\n"],"names":["OPTIMIZED_MODE_SERIES_LIMIT","formatValue","batchDispatchNearbySeriesActions","getPointInGrid","getClosestTimestamp","EMPTY_TOOLTIP_DATA","calculateBarBandwidth","calculateBarSegmentBounds","calculateBarYBounds","calculateVisualYForSeries","getPixelXFromGrid","INCREASE_NEARBY_SERIES_MULTIPLIER","DYNAMIC_NEARBY_SERIES_MULTIPLIER","SHOW_FEWER_SERIES_LIMIT","gatherCandidates","data","seriesMapping","closestTimestamp","cursorX","cursorY","cursorXPixel","cursorPixelY","yBuffer","yBufferPixels","chart","candidates","totalSeries","length","stackTotals","Map","sortedTimestamps","firstValues","values","seen","Set","ts","has","add","push","sort","a","b","barSeriesIndexes","i","type","barBandwidth","barCenterPixelX","seriesIdx","currentSeries","currentDataset","currentDatasetValues","Array","isArray","seriesType","currentSeriesName","name","toString","seriesId","id","markerColor","color","datumIdx","xValue","yValue","tuple","undefined","isCandidate","visualY","distance","Infinity","dataPointPixel","convertToPixel","seriesIndex","pixelDistance","Math","abs","verticalDistance","barRelativeIdx","indexOf","segmentBounds","isWithinXBounds","left","right","stackId","stack","isHoveringYBounds","stackIdStr","visualYBottom","get","yBounds","cursorYPixel","top","bottom","segmentCenter","seriesName","date","x","y","findClosestCandidate","winner","candidate","processCandidates","format","seriesFormatMap","nonCandidateSeriesIndexes","nearbySeriesIndexes","emphasizedSeriesIndexes","nonEmphasizedSeriesIndexes","emphasizedDatapoints","duplicateDatapoints","yValueCounts","result","seriesFormat","displayY","formattedY","isClosestToCursor","duplicateValuesCount","set","dataIndex","checkforNearbyTimeSeries","pointInGrid","dispatchAction","firstTimeSeriesValues","cursorPoint","bufferPoint","resolvedCursorXPixel","candidateIndexes","idx","legacyCheckforNearbySeries","currentNearbySeriesData","timeSeries","xAxis","minPercentRange","percentRangeToCheck","max","isWithinPercentageRange","valueToCheck","baseValue","percentage","xValueMilliSeconds","notBlur","escapeConnect","getNearbySeriesData","mousePos","pinnedPos","showAllSeries","cursorTargetMatchesChart","target","currentParent","parentElement","currentGrandparent","chartDom","getDom","plotCanvas","chartModel","yAxisScale","getComponent","axis","scale","isLogScale","yInterval","_interval","base","logBase","extent","_extent","actualMin","actualMax","getYBuffer","hasMultipleYAxes","some","series","yAxisIndex","range","lowerBound","upperBound","yBufferMin","adjustedBuffer"],"mappings":"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"}
|
|
@@ -58,7 +58,7 @@ type ZREventProperties = {
|
|
|
58
58
|
zrByTouch?: boolean;
|
|
59
59
|
};
|
|
60
60
|
export type ZRRawMouseEvent = MouseEvent & ZREventProperties;
|
|
61
|
-
export declare const useMousePosition: () => CursorData[
|
|
61
|
+
export declare const useMousePosition: () => CursorData["coords"];
|
|
62
62
|
export type TooltipConfig = {
|
|
63
63
|
wrapLabels: boolean;
|
|
64
64
|
hidden?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tooltip-model.d.ts","sourceRoot":"","sources":["../../src/TimeSeriesTooltip/tooltip-model.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tooltip-model.d.ts","sourceRoot":"","sources":["../../src/TimeSeriesTooltip/tooltip-model.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE5C,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,iBAAiB,MAAM,CAAC;AACrC,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,wBAAwB,QAA0B,CAAC;AAChE,eAAO,MAAM,+BAA+B,OAAO,CAAC;AACpD,eAAO,MAAM,eAAe,IAAI,CAAC;AAEjC,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC,eAAO,MAAM,yBAAyB,qCAAqC,CAAC;AAC5E,eAAO,MAAM,6BAA6B,iDAAiD,CAAC;AAE5F,eAAO,MAAM,yBAAyB,YAAY,CAAC;AAEnD,eAAO,MAAM,mBAAmB,qBAQ9B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;CAa7B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,iBAAsB,CAAC;AAExD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,YAAY,CAAC;IACzB,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACxC,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,KAAK,iBAAiB,GAAG;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,cAAc,GAAG,gBAAgB,CAAC;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,iBAAiB,CAAC;AAE7D,eAAO,MAAM,gBAAgB,QAAO,UAAU,CAAC,QAAQ,CAkCtD,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,aAGpC,CAAC;AAEF,eAAO,MAAM,qBAAqB,uBAAuB,CAAC;AAE1D,eAAO,MAAM,uBAAuB,yBAAyB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/TimeSeriesTooltip/tooltip-model.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { useEffect, useState } from 'react';\nimport { NearbySeriesArray } from './types';\n\nexport const TOOLTIP_MIN_WIDTH = 375;\nexport const TOOLTIP_MAX_WIDTH = 650;\nexport const TOOLTIP_MAX_HEIGHT = 650;\nexport const TOOLTIP_LABELS_MAX_WIDTH = TOOLTIP_MAX_WIDTH - 150;\nexport const TOOLTIP_ADJUST_Y_POS_MULTIPLIER = 0.75;\nexport const TOOLTIP_PADDING = 8;\n\nexport const FALLBACK_CHART_WIDTH = 750;\n\nexport const NEARBY_SERIES_DESCRIPTION = 'nearby series showing in tooltip';\nexport const EMPHASIZED_SERIES_DESCRIPTION = 'emphasized series showing as bold in tooltip';\n\nexport const TOOLTIP_BG_COLOR_FALLBACK = '#2E313E';\n\nexport const TOOLTIP_DATE_FORMAT = new Intl.DateTimeFormat(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n hour12: true,\n});\n\nexport const defaultCursorData = {\n coords: {\n plotCanvas: {\n x: 0,\n y: 0,\n },\n zrender: {\n x: 0,\n y: 0,\n },\n target: null,\n },\n chartWidth: 0,\n};\n\nexport const EMPTY_TOOLTIP_DATA: NearbySeriesArray = [];\n\n/**\n * ECharts is built with zrender, zrX and zrY are undefined when not hovering over a chart canvas\n */\nexport interface ZRCoordinate {\n x?: number;\n y?: number;\n}\n\nexport interface Coordinate {\n x: number;\n y: number;\n}\n\nexport interface CursorCoordinates {\n page: Coordinate;\n client: Coordinate;\n plotCanvas: ZRCoordinate;\n target: EventTarget | null;\n}\n\nexport interface CursorData {\n coords: CursorCoordinates | null;\n chartWidth?: number;\n}\n\nexport interface TooltipData {\n focusedSeries: NearbySeriesArray | null;\n cursor: CursorData;\n}\n\ntype ZREventProperties = {\n zrX?: number;\n zrY?: number;\n zrDelta?: number;\n zrEventControl?: 'no_globalout' | 'only_globalout';\n zrByTouch?: boolean;\n};\n\nexport type ZRRawMouseEvent = MouseEvent & ZREventProperties;\n\nexport const useMousePosition = (): CursorData['coords'] => {\n const [coords, setCoords] = useState<CursorData['coords']>(null);\n\n useEffect(() => {\n const setFromEvent = (e: ZRRawMouseEvent): void => {\n return setCoords({\n page: {\n x: e.pageX,\n y: e.pageY,\n },\n client: {\n x: e.clientX,\n y: e.clientY,\n },\n plotCanvas: {\n // Default to zrender mousemove coords since they handle browser inconsistencies for us\n // ex: Firefox and Chrome have slightly different implementations of offsetX and offsetY\n // more info: https://github.com/ecomfe/zrender/blob/5.5.0/src/core/event.ts#L46-L120\n // Fallback to offsetX and offsetY to ensure tooltip works correctly in Edge\n x: e.zrX ?? e.offsetX,\n y: e.zrY ?? e.offsetY,\n },\n // necessary to check whether cursor target matches correct chart canvas (since each chart has its own mousemove listener)\n target: e.target,\n });\n };\n window.addEventListener('mousemove', setFromEvent);\n\n return (): void => {\n window.removeEventListener('mousemove', setFromEvent);\n };\n }, []);\n\n return coords;\n};\n\nexport type TooltipConfig = {\n wrapLabels: boolean;\n hidden?: boolean;\n enablePinning?: boolean;\n};\n\nexport const DEFAULT_TOOLTIP_CONFIG: TooltipConfig = {\n wrapLabels: true,\n enablePinning: true,\n};\n\nexport const PIN_TOOLTIP_HELP_TEXT = 'Click chart to pin';\n\nexport const UNPIN_TOOLTIP_HELP_TEXT = 'Click chart to unpin';\n"],"names":["useEffect","useState","TOOLTIP_MIN_WIDTH","TOOLTIP_MAX_WIDTH","TOOLTIP_MAX_HEIGHT","TOOLTIP_LABELS_MAX_WIDTH","TOOLTIP_ADJUST_Y_POS_MULTIPLIER","TOOLTIP_PADDING","FALLBACK_CHART_WIDTH","NEARBY_SERIES_DESCRIPTION","EMPHASIZED_SERIES_DESCRIPTION","TOOLTIP_BG_COLOR_FALLBACK","TOOLTIP_DATE_FORMAT","Intl","DateTimeFormat","undefined","year","month","day","hour","minute","second","hour12","defaultCursorData","coords","plotCanvas","x","y","zrender","target","chartWidth","EMPTY_TOOLTIP_DATA","useMousePosition","setCoords","setFromEvent","e","page","pageX","pageY","client","clientX","clientY","zrX","offsetX","zrY","offsetY","window","addEventListener","removeEventListener","DEFAULT_TOOLTIP_CONFIG","wrapLabels","enablePinning","PIN_TOOLTIP_HELP_TEXT","UNPIN_TOOLTIP_HELP_TEXT"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,SAASA,SAAS,EAAEC,QAAQ,QAAQ,QAAQ;
|
|
1
|
+
{"version":3,"sources":["../../src/TimeSeriesTooltip/tooltip-model.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { useEffect, useState } from 'react';\n\nimport { NearbySeriesArray } from './types';\n\nexport const TOOLTIP_MIN_WIDTH = 375;\nexport const TOOLTIP_MAX_WIDTH = 650;\nexport const TOOLTIP_MAX_HEIGHT = 650;\nexport const TOOLTIP_LABELS_MAX_WIDTH = TOOLTIP_MAX_WIDTH - 150;\nexport const TOOLTIP_ADJUST_Y_POS_MULTIPLIER = 0.75;\nexport const TOOLTIP_PADDING = 8;\n\nexport const FALLBACK_CHART_WIDTH = 750;\n\nexport const NEARBY_SERIES_DESCRIPTION = 'nearby series showing in tooltip';\nexport const EMPHASIZED_SERIES_DESCRIPTION = 'emphasized series showing as bold in tooltip';\n\nexport const TOOLTIP_BG_COLOR_FALLBACK = '#2E313E';\n\nexport const TOOLTIP_DATE_FORMAT = new Intl.DateTimeFormat(undefined, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: 'numeric',\n minute: 'numeric',\n second: 'numeric',\n hour12: true,\n});\n\nexport const defaultCursorData = {\n coords: {\n plotCanvas: {\n x: 0,\n y: 0,\n },\n zrender: {\n x: 0,\n y: 0,\n },\n target: null,\n },\n chartWidth: 0,\n};\n\nexport const EMPTY_TOOLTIP_DATA: NearbySeriesArray = [];\n\n/**\n * ECharts is built with zrender, zrX and zrY are undefined when not hovering over a chart canvas\n */\nexport interface ZRCoordinate {\n x?: number;\n y?: number;\n}\n\nexport interface Coordinate {\n x: number;\n y: number;\n}\n\nexport interface CursorCoordinates {\n page: Coordinate;\n client: Coordinate;\n plotCanvas: ZRCoordinate;\n target: EventTarget | null;\n}\n\nexport interface CursorData {\n coords: CursorCoordinates | null;\n chartWidth?: number;\n}\n\nexport interface TooltipData {\n focusedSeries: NearbySeriesArray | null;\n cursor: CursorData;\n}\n\ntype ZREventProperties = {\n zrX?: number;\n zrY?: number;\n zrDelta?: number;\n zrEventControl?: 'no_globalout' | 'only_globalout';\n zrByTouch?: boolean;\n};\n\nexport type ZRRawMouseEvent = MouseEvent & ZREventProperties;\n\nexport const useMousePosition = (): CursorData['coords'] => {\n const [coords, setCoords] = useState<CursorData['coords']>(null);\n\n useEffect(() => {\n const setFromEvent = (e: ZRRawMouseEvent): void => {\n return setCoords({\n page: {\n x: e.pageX,\n y: e.pageY,\n },\n client: {\n x: e.clientX,\n y: e.clientY,\n },\n plotCanvas: {\n // Default to zrender mousemove coords since they handle browser inconsistencies for us\n // ex: Firefox and Chrome have slightly different implementations of offsetX and offsetY\n // more info: https://github.com/ecomfe/zrender/blob/5.5.0/src/core/event.ts#L46-L120\n // Fallback to offsetX and offsetY to ensure tooltip works correctly in Edge\n x: e.zrX ?? e.offsetX,\n y: e.zrY ?? e.offsetY,\n },\n // necessary to check whether cursor target matches correct chart canvas (since each chart has its own mousemove listener)\n target: e.target,\n });\n };\n window.addEventListener('mousemove', setFromEvent);\n\n return (): void => {\n window.removeEventListener('mousemove', setFromEvent);\n };\n }, []);\n\n return coords;\n};\n\nexport type TooltipConfig = {\n wrapLabels: boolean;\n hidden?: boolean;\n enablePinning?: boolean;\n};\n\nexport const DEFAULT_TOOLTIP_CONFIG: TooltipConfig = {\n wrapLabels: true,\n enablePinning: true,\n};\n\nexport const PIN_TOOLTIP_HELP_TEXT = 'Click chart to pin';\n\nexport const UNPIN_TOOLTIP_HELP_TEXT = 'Click chart to unpin';\n"],"names":["useEffect","useState","TOOLTIP_MIN_WIDTH","TOOLTIP_MAX_WIDTH","TOOLTIP_MAX_HEIGHT","TOOLTIP_LABELS_MAX_WIDTH","TOOLTIP_ADJUST_Y_POS_MULTIPLIER","TOOLTIP_PADDING","FALLBACK_CHART_WIDTH","NEARBY_SERIES_DESCRIPTION","EMPHASIZED_SERIES_DESCRIPTION","TOOLTIP_BG_COLOR_FALLBACK","TOOLTIP_DATE_FORMAT","Intl","DateTimeFormat","undefined","year","month","day","hour","minute","second","hour12","defaultCursorData","coords","plotCanvas","x","y","zrender","target","chartWidth","EMPTY_TOOLTIP_DATA","useMousePosition","setCoords","setFromEvent","e","page","pageX","pageY","client","clientX","clientY","zrX","offsetX","zrY","offsetY","window","addEventListener","removeEventListener","DEFAULT_TOOLTIP_CONFIG","wrapLabels","enablePinning","PIN_TOOLTIP_HELP_TEXT","UNPIN_TOOLTIP_HELP_TEXT"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,SAASA,SAAS,EAAEC,QAAQ,QAAQ,QAAQ;AAI5C,OAAO,MAAMC,oBAAoB,IAAI;AACrC,OAAO,MAAMC,oBAAoB,IAAI;AACrC,OAAO,MAAMC,qBAAqB,IAAI;AACtC,OAAO,MAAMC,2BAA2BF,oBAAoB,IAAI;AAChE,OAAO,MAAMG,kCAAkC,KAAK;AACpD,OAAO,MAAMC,kBAAkB,EAAE;AAEjC,OAAO,MAAMC,uBAAuB,IAAI;AAExC,OAAO,MAAMC,4BAA4B,mCAAmC;AAC5E,OAAO,MAAMC,gCAAgC,+CAA+C;AAE5F,OAAO,MAAMC,4BAA4B,UAAU;AAEnD,OAAO,MAAMC,sBAAsB,IAAIC,KAAKC,cAAc,CAACC,WAAW;IACpEC,MAAM;IACNC,OAAO;IACPC,KAAK;IACLC,MAAM;IACNC,QAAQ;IACRC,QAAQ;IACRC,QAAQ;AACV,GAAG;AAEH,OAAO,MAAMC,oBAAoB;IAC/BC,QAAQ;QACNC,YAAY;YACVC,GAAG;YACHC,GAAG;QACL;QACAC,SAAS;YACPF,GAAG;YACHC,GAAG;QACL;QACAE,QAAQ;IACV;IACAC,YAAY;AACd,EAAE;AAEF,OAAO,MAAMC,qBAAwC,EAAE,CAAC;AA0CxD,OAAO,MAAMC,mBAAmB;IAC9B,MAAM,CAACR,QAAQS,UAAU,GAAGhC,SAA+B;IAE3DD,UAAU;QACR,MAAMkC,eAAe,CAACC;YACpB,OAAOF,UAAU;gBACfG,MAAM;oBACJV,GAAGS,EAAEE,KAAK;oBACVV,GAAGQ,EAAEG,KAAK;gBACZ;gBACAC,QAAQ;oBACNb,GAAGS,EAAEK,OAAO;oBACZb,GAAGQ,EAAEM,OAAO;gBACd;gBACAhB,YAAY;oBACV,uFAAuF;oBACvF,wFAAwF;oBACxF,qFAAqF;oBACrF,4EAA4E;oBAC5EC,GAAGS,EAAEO,GAAG,IAAIP,EAAEQ,OAAO;oBACrBhB,GAAGQ,EAAES,GAAG,IAAIT,EAAEU,OAAO;gBACvB;gBACA,0HAA0H;gBAC1HhB,QAAQM,EAAEN,MAAM;YAClB;QACF;QACAiB,OAAOC,gBAAgB,CAAC,aAAab;QAErC,OAAO;YACLY,OAAOE,mBAAmB,CAAC,aAAad;QAC1C;IACF,GAAG,EAAE;IAEL,OAAOV;AACT,EAAE;AAQF,OAAO,MAAMyB,yBAAwC;IACnDC,YAAY;IACZC,eAAe;AACjB,EAAE;AAEF,OAAO,MAAMC,wBAAwB,qBAAqB;AAE1D,OAAO,MAAMC,0BAA0B,uBAAuB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/TimeSeriesTooltip/utils.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/TimeSeriesTooltip/utils.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EACL,iBAAiB,EACjB,UAAU,EAMX,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,EAC9B,SAAS,EAAE,iBAAiB,GAAG,IAAI,EACnC,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,OAAO,GAAG,IAAI,GAChC,MAAM,GAAG,SAAS,CAuDpB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,iBAAiB,GAAG,IAAI,EACnC,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAyBzB;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAO1F;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,sBAAsB,EACrC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,MAAM,CAcR;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM,CAiCnH;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAQjC;AAED,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,eAAe,GACrB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAexC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/TimeSeriesTooltip/utils.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Theme } from '@mui/material';\nimport { ECharts as EChartsInstance } from 'echarts/core';\nimport { BarSeriesOption, LineSeriesOption } from 'echarts/charts';\nimport { TimeChartSeriesMapping } from '../model';\nimport {\n CursorCoordinates,\n CursorData,\n TOOLTIP_MAX_WIDTH,\n TOOLTIP_MAX_HEIGHT,\n TOOLTIP_MIN_WIDTH,\n TOOLTIP_BG_COLOR_FALLBACK,\n TOOLTIP_PADDING,\n} from './tooltip-model';\n\n/**\n * Determine position of tooltip depending on chart dimensions and the number of focused series.\n */\nexport function assembleTransform(\n mousePos: CursorData['coords'],\n pinnedPos: CursorCoordinates | null,\n tooltipHeight: number,\n tooltipWidth: number,\n containerElement?: Element | null\n): string | undefined {\n if (mousePos === null) {\n return undefined;\n }\n\n const cursorPaddingX = 32;\n const cursorPaddingY = 16;\n\n if (pinnedPos !== null) {\n mousePos = pinnedPos;\n }\n\n if (mousePos.plotCanvas.x === undefined) return undefined;\n\n // Fall back to max size before the resize observer reports a real measurement.\n const effectiveHeight = tooltipHeight > 0 ? tooltipHeight : TOOLTIP_MAX_HEIGHT;\n const effectiveWidth = tooltipWidth > 0 ? tooltipWidth : TOOLTIP_MAX_WIDTH;\n\n let x = mousePos.page.x + cursorPaddingX; // Default to right side of the cursor\n let y = mousePos.page.y + cursorPaddingY;\n\n // If containerElement is defined, adjust coordinates relative to the container\n if (containerElement) {\n const containerRect = containerElement.getBoundingClientRect();\n x = x - containerRect.left + containerElement.scrollLeft;\n y = y - containerRect.top + containerElement.scrollTop;\n\n // Ensure tooltip does not go out of the container's bottom\n const containerBottom = containerRect.top + containerElement.scrollHeight;\n if (y + effectiveHeight > containerBottom) {\n y = Math.max(containerBottom - effectiveHeight - cursorPaddingY, TOOLTIP_PADDING / 2);\n }\n } else {\n // Ensure tooltip does not go out of the screen on the bottom\n if (y + effectiveHeight > window.innerHeight + window.scrollY) {\n y = Math.max(window.innerHeight + window.scrollY - effectiveHeight - cursorPaddingY, TOOLTIP_PADDING / 2);\n }\n }\n\n // Ensure tooltip does not go out of the screen on the right\n if (x + effectiveWidth > window.innerWidth) {\n x = mousePos.page.x - effectiveWidth - cursorPaddingX; // Move to the left of the cursor\n }\n\n // Ensure tooltip does not go out of the screen on the left\n if (x < cursorPaddingX) {\n x = cursorPaddingX;\n }\n\n // Ensure tooltip does not go out of the screen on the top\n if (y < TOOLTIP_PADDING / 2) {\n y = TOOLTIP_PADDING / 2;\n }\n\n return `translate3d(${x}px, ${y}px, 0)`;\n}\n\n/**\n * Helper for tooltip positioning styles\n */\nexport function getTooltipStyles(\n theme: Theme,\n pinnedPos: CursorCoordinates | null,\n maxHeight?: number\n): Record<string, unknown> {\n const adjustedMaxHeight = maxHeight ? maxHeight - TOOLTIP_PADDING : undefined;\n return {\n minWidth: TOOLTIP_MIN_WIDTH,\n maxWidth: TOOLTIP_MAX_WIDTH,\n maxHeight: adjustedMaxHeight ?? TOOLTIP_MAX_HEIGHT,\n padding: 0,\n position: 'absolute',\n top: 0,\n left: 0,\n backgroundColor: theme.palette.designSystem?.grey[800] ?? TOOLTIP_BG_COLOR_FALLBACK,\n borderRadius: '6px',\n color: '#fff',\n fontSize: '11px',\n visibility: 'visible',\n opacity: 1,\n // Animating transform causes intermediate positions outside the viewport; animate opacity/visibility instead.\n transition: 'opacity 0.1s ease-out, visibility 0.1s ease-out',\n // Pinned tooltip should not float above the drawer/sticky header.\n zIndex: pinnedPos !== null ? 'auto' : theme.zIndex.tooltip,\n overflow: 'hidden',\n '&:hover': {\n overflowY: 'auto',\n },\n };\n}\n\nexport function getPixelXFromGrid(timestamp: number, chart: EChartsInstance): number | null {\n try {\n const pixelCoords = chart.convertToPixel('grid', [timestamp, 0]);\n return pixelCoords?.[0] ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Returns the cumulative (visual) Y for a series, accumulating stack totals in-place.\n * For non-stacked series, returns the raw yValue unchanged.\n * Mutates `stackTotals` — pass a fresh Map for each cursor evaluation.\n */\nexport function calculateVisualYForSeries(\n seriesIdx: number,\n yValue: number,\n seriesMapping: TimeChartSeriesMapping,\n stackTotals: Map<string, number>\n): number {\n const currentSeries = seriesMapping[seriesIdx];\n if (!currentSeries) return yValue;\n\n const stackId = (currentSeries as LineSeriesOption | BarSeriesOption).stack;\n if (!stackId) {\n return yValue;\n }\n\n const stackIdStr = stackId.toString();\n const currentTotal = stackTotals.get(stackIdStr) ?? 0;\n const newTotal = currentTotal + yValue;\n stackTotals.set(stackIdStr, newTotal);\n return newTotal;\n}\n\nexport function calculateBarBandwidth(timestamp: number, sortedTimestamps: number[], chart: EChartsInstance): number {\n const currentIdx = sortedTimestamps.indexOf(timestamp);\n if (currentIdx === -1) {\n return 20;\n }\n\n const prevTimestamp = currentIdx > 0 ? (sortedTimestamps[currentIdx - 1] ?? null) : null;\n const nextTimestamp = currentIdx < sortedTimestamps.length - 1 ? (sortedTimestamps[currentIdx + 1] ?? null) : null;\n\n const currentPixelX = getPixelXFromGrid(timestamp, chart);\n if (currentPixelX === null) return 20;\n\n let leftBound: number;\n let rightBound: number;\n\n if (prevTimestamp !== null && nextTimestamp !== null) {\n const prevPixelX = getPixelXFromGrid(prevTimestamp, chart) ?? currentPixelX;\n const nextPixelX = getPixelXFromGrid(nextTimestamp, chart) ?? currentPixelX;\n leftBound = (currentPixelX + prevPixelX) / 2;\n rightBound = (currentPixelX + nextPixelX) / 2;\n } else if (prevTimestamp !== null) {\n const prevPixelX = getPixelXFromGrid(prevTimestamp, chart) ?? currentPixelX;\n leftBound = (currentPixelX + prevPixelX) / 2;\n rightBound = currentPixelX + (currentPixelX - leftBound);\n } else if (nextTimestamp !== null) {\n const nextPixelX = getPixelXFromGrid(nextTimestamp, chart) ?? currentPixelX;\n rightBound = (currentPixelX + nextPixelX) / 2;\n leftBound = currentPixelX - (rightBound - currentPixelX);\n } else {\n return 20;\n }\n\n return Math.max(1, rightBound - leftBound);\n}\n\n/**\n * Computes the pixel left/right bounds of one bar segment within a group.\n * @param barRelativeIdx - zero-based index among bar-only series\n * @param bandwidth - total pixel width for the bar group\n * @param centerPixelX - pixel X of the bar group centre\n * @param barCount - total bar series count (lines excluded)\n */\nexport function calculateBarSegmentBounds(\n barRelativeIdx: number,\n bandwidth: number,\n centerPixelX: number,\n barCount: number\n): { left: number; right: number } {\n const count = Math.max(1, barCount);\n const segmentWidth = bandwidth / count;\n const segmentLeft = centerPixelX - bandwidth / 2 + barRelativeIdx * segmentWidth;\n return {\n left: segmentLeft,\n right: segmentLeft + segmentWidth,\n };\n}\n\nexport function calculateBarYBounds(\n visualYBottom: number,\n visualYTop: number,\n chart: EChartsInstance\n): { top: number; bottom: number } | null {\n try {\n const bottomPixel = chart.convertToPixel('grid', [0, visualYBottom]);\n const topPixel = chart.convertToPixel('grid', [0, visualYTop]);\n\n if (!bottomPixel || !topPixel || bottomPixel[1] === undefined || topPixel[1] === undefined) return null;\n\n // Y increases downward in pixels; min/max normalizes the mapping for negative bar values.\n return {\n top: Math.min(topPixel[1], bottomPixel[1]),\n bottom: Math.max(topPixel[1], bottomPixel[1]),\n };\n } catch {\n return null;\n }\n}\n"],"names":["TOOLTIP_MAX_WIDTH","TOOLTIP_MAX_HEIGHT","TOOLTIP_MIN_WIDTH","TOOLTIP_BG_COLOR_FALLBACK","TOOLTIP_PADDING","assembleTransform","mousePos","pinnedPos","tooltipHeight","tooltipWidth","containerElement","undefined","cursorPaddingX","cursorPaddingY","plotCanvas","x","effectiveHeight","effectiveWidth","page","y","containerRect","getBoundingClientRect","left","scrollLeft","top","scrollTop","containerBottom","scrollHeight","Math","max","window","innerHeight","scrollY","innerWidth","getTooltipStyles","theme","maxHeight","adjustedMaxHeight","minWidth","maxWidth","padding","position","backgroundColor","palette","designSystem","grey","borderRadius","color","fontSize","visibility","opacity","transition","zIndex","tooltip","overflow","overflowY","getPixelXFromGrid","timestamp","chart","pixelCoords","convertToPixel","calculateVisualYForSeries","seriesIdx","yValue","seriesMapping","stackTotals","currentSeries","stackId","stack","stackIdStr","toString","currentTotal","get","newTotal","set","calculateBarBandwidth","sortedTimestamps","currentIdx","indexOf","prevTimestamp","nextTimestamp","length","currentPixelX","leftBound","rightBound","prevPixelX","nextPixelX","calculateBarSegmentBounds","barRelativeIdx","bandwidth","centerPixelX","barCount","count","segmentWidth","segmentLeft","right","calculateBarYBounds","visualYBottom","visualYTop","bottomPixel","topPixel","min","bottom"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/TimeSeriesTooltip/utils.ts"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Theme } from '@mui/material';\nimport { BarSeriesOption, LineSeriesOption } from 'echarts/charts';\nimport { ECharts as EChartsInstance } from 'echarts/core';\n\nimport { TimeChartSeriesMapping } from '../model';\nimport {\n CursorCoordinates,\n CursorData,\n TOOLTIP_MAX_WIDTH,\n TOOLTIP_MAX_HEIGHT,\n TOOLTIP_MIN_WIDTH,\n TOOLTIP_BG_COLOR_FALLBACK,\n TOOLTIP_PADDING,\n} from './tooltip-model';\n\n/**\n * Determine position of tooltip depending on chart dimensions and the number of focused series.\n */\nexport function assembleTransform(\n mousePos: CursorData['coords'],\n pinnedPos: CursorCoordinates | null,\n tooltipHeight: number,\n tooltipWidth: number,\n containerElement?: Element | null,\n): string | undefined {\n if (mousePos === null) {\n return undefined;\n }\n\n const cursorPaddingX = 32;\n const cursorPaddingY = 16;\n\n if (pinnedPos !== null) {\n mousePos = pinnedPos;\n }\n\n if (mousePos.plotCanvas.x === undefined) return undefined;\n\n // Fall back to max size before the resize observer reports a real measurement.\n const effectiveHeight = tooltipHeight > 0 ? tooltipHeight : TOOLTIP_MAX_HEIGHT;\n const effectiveWidth = tooltipWidth > 0 ? tooltipWidth : TOOLTIP_MAX_WIDTH;\n\n let x = mousePos.page.x + cursorPaddingX; // Default to right side of the cursor\n let y = mousePos.page.y + cursorPaddingY;\n\n // If containerElement is defined, adjust coordinates relative to the container\n if (containerElement) {\n const containerRect = containerElement.getBoundingClientRect();\n x = x - containerRect.left + containerElement.scrollLeft;\n y = y - containerRect.top + containerElement.scrollTop;\n\n // Ensure tooltip does not go out of the container's bottom\n const containerBottom = containerRect.top + containerElement.scrollHeight;\n if (y + effectiveHeight > containerBottom) {\n y = Math.max(containerBottom - effectiveHeight - cursorPaddingY, TOOLTIP_PADDING / 2);\n }\n } else {\n // Ensure tooltip does not go out of the screen on the bottom\n if (y + effectiveHeight > window.innerHeight + window.scrollY) {\n y = Math.max(window.innerHeight + window.scrollY - effectiveHeight - cursorPaddingY, TOOLTIP_PADDING / 2);\n }\n }\n\n // Ensure tooltip does not go out of the screen on the right\n if (x + effectiveWidth > window.innerWidth) {\n x = mousePos.page.x - effectiveWidth - cursorPaddingX; // Move to the left of the cursor\n }\n\n // Ensure tooltip does not go out of the screen on the left\n if (x < cursorPaddingX) {\n x = cursorPaddingX;\n }\n\n // Ensure tooltip does not go out of the screen on the top\n if (y < TOOLTIP_PADDING / 2) {\n y = TOOLTIP_PADDING / 2;\n }\n\n return `translate3d(${x}px, ${y}px, 0)`;\n}\n\n/**\n * Helper for tooltip positioning styles\n */\nexport function getTooltipStyles(\n theme: Theme,\n pinnedPos: CursorCoordinates | null,\n maxHeight?: number,\n): Record<string, unknown> {\n const adjustedMaxHeight = maxHeight ? maxHeight - TOOLTIP_PADDING : undefined;\n return {\n minWidth: TOOLTIP_MIN_WIDTH,\n maxWidth: TOOLTIP_MAX_WIDTH,\n maxHeight: adjustedMaxHeight ?? TOOLTIP_MAX_HEIGHT,\n padding: 0,\n position: 'absolute',\n top: 0,\n left: 0,\n backgroundColor: theme.palette.designSystem?.grey[800] ?? TOOLTIP_BG_COLOR_FALLBACK,\n borderRadius: '6px',\n color: '#fff',\n fontSize: '11px',\n visibility: 'visible',\n opacity: 1,\n // Animating transform causes intermediate positions outside the viewport; animate opacity/visibility instead.\n transition: 'opacity 0.1s ease-out, visibility 0.1s ease-out',\n // Pinned tooltip should not float above the drawer/sticky header.\n zIndex: pinnedPos !== null ? 'auto' : theme.zIndex.tooltip,\n overflow: 'hidden',\n '&:hover': {\n overflowY: 'auto',\n },\n };\n}\n\nexport function getPixelXFromGrid(timestamp: number, chart: EChartsInstance): number | null {\n try {\n const pixelCoords = chart.convertToPixel('grid', [timestamp, 0]);\n return pixelCoords?.[0] ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Returns the cumulative (visual) Y for a series, accumulating stack totals in-place.\n * For non-stacked series, returns the raw yValue unchanged.\n * Mutates `stackTotals` — pass a fresh Map for each cursor evaluation.\n */\nexport function calculateVisualYForSeries(\n seriesIdx: number,\n yValue: number,\n seriesMapping: TimeChartSeriesMapping,\n stackTotals: Map<string, number>,\n): number {\n const currentSeries = seriesMapping[seriesIdx];\n if (!currentSeries) return yValue;\n\n const stackId = (currentSeries as LineSeriesOption | BarSeriesOption).stack;\n if (!stackId) {\n return yValue;\n }\n\n const stackIdStr = stackId.toString();\n const currentTotal = stackTotals.get(stackIdStr) ?? 0;\n const newTotal = currentTotal + yValue;\n stackTotals.set(stackIdStr, newTotal);\n return newTotal;\n}\n\nexport function calculateBarBandwidth(timestamp: number, sortedTimestamps: number[], chart: EChartsInstance): number {\n const currentIdx = sortedTimestamps.indexOf(timestamp);\n if (currentIdx === -1) {\n return 20;\n }\n\n const prevTimestamp = currentIdx > 0 ? (sortedTimestamps[currentIdx - 1] ?? null) : null;\n const nextTimestamp = currentIdx < sortedTimestamps.length - 1 ? (sortedTimestamps[currentIdx + 1] ?? null) : null;\n\n const currentPixelX = getPixelXFromGrid(timestamp, chart);\n if (currentPixelX === null) return 20;\n\n let leftBound: number;\n let rightBound: number;\n\n if (prevTimestamp !== null && nextTimestamp !== null) {\n const prevPixelX = getPixelXFromGrid(prevTimestamp, chart) ?? currentPixelX;\n const nextPixelX = getPixelXFromGrid(nextTimestamp, chart) ?? currentPixelX;\n leftBound = (currentPixelX + prevPixelX) / 2;\n rightBound = (currentPixelX + nextPixelX) / 2;\n } else if (prevTimestamp !== null) {\n const prevPixelX = getPixelXFromGrid(prevTimestamp, chart) ?? currentPixelX;\n leftBound = (currentPixelX + prevPixelX) / 2;\n rightBound = currentPixelX + (currentPixelX - leftBound);\n } else if (nextTimestamp !== null) {\n const nextPixelX = getPixelXFromGrid(nextTimestamp, chart) ?? currentPixelX;\n rightBound = (currentPixelX + nextPixelX) / 2;\n leftBound = currentPixelX - (rightBound - currentPixelX);\n } else {\n return 20;\n }\n\n return Math.max(1, rightBound - leftBound);\n}\n\n/**\n * Computes the pixel left/right bounds of one bar segment within a group.\n * @param barRelativeIdx - zero-based index among bar-only series\n * @param bandwidth - total pixel width for the bar group\n * @param centerPixelX - pixel X of the bar group centre\n * @param barCount - total bar series count (lines excluded)\n */\nexport function calculateBarSegmentBounds(\n barRelativeIdx: number,\n bandwidth: number,\n centerPixelX: number,\n barCount: number,\n): { left: number; right: number } {\n const count = Math.max(1, barCount);\n const segmentWidth = bandwidth / count;\n const segmentLeft = centerPixelX - bandwidth / 2 + barRelativeIdx * segmentWidth;\n return {\n left: segmentLeft,\n right: segmentLeft + segmentWidth,\n };\n}\n\nexport function calculateBarYBounds(\n visualYBottom: number,\n visualYTop: number,\n chart: EChartsInstance,\n): { top: number; bottom: number } | null {\n try {\n const bottomPixel = chart.convertToPixel('grid', [0, visualYBottom]);\n const topPixel = chart.convertToPixel('grid', [0, visualYTop]);\n\n if (!bottomPixel || !topPixel || bottomPixel[1] === undefined || topPixel[1] === undefined) return null;\n\n // Y increases downward in pixels; min/max normalizes the mapping for negative bar values.\n return {\n top: Math.min(topPixel[1], bottomPixel[1]),\n bottom: Math.max(topPixel[1], bottomPixel[1]),\n };\n } catch {\n return null;\n }\n}\n"],"names":["TOOLTIP_MAX_WIDTH","TOOLTIP_MAX_HEIGHT","TOOLTIP_MIN_WIDTH","TOOLTIP_BG_COLOR_FALLBACK","TOOLTIP_PADDING","assembleTransform","mousePos","pinnedPos","tooltipHeight","tooltipWidth","containerElement","undefined","cursorPaddingX","cursorPaddingY","plotCanvas","x","effectiveHeight","effectiveWidth","page","y","containerRect","getBoundingClientRect","left","scrollLeft","top","scrollTop","containerBottom","scrollHeight","Math","max","window","innerHeight","scrollY","innerWidth","getTooltipStyles","theme","maxHeight","adjustedMaxHeight","minWidth","maxWidth","padding","position","backgroundColor","palette","designSystem","grey","borderRadius","color","fontSize","visibility","opacity","transition","zIndex","tooltip","overflow","overflowY","getPixelXFromGrid","timestamp","chart","pixelCoords","convertToPixel","calculateVisualYForSeries","seriesIdx","yValue","seriesMapping","stackTotals","currentSeries","stackId","stack","stackIdStr","toString","currentTotal","get","newTotal","set","calculateBarBandwidth","sortedTimestamps","currentIdx","indexOf","prevTimestamp","nextTimestamp","length","currentPixelX","leftBound","rightBound","prevPixelX","nextPixelX","calculateBarSegmentBounds","barRelativeIdx","bandwidth","centerPixelX","barCount","count","segmentWidth","segmentLeft","right","calculateBarYBounds","visualYBottom","visualYTop","bottomPixel","topPixel","min","bottom"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ReactElement } from 'react';
|
|
2
1
|
import { SelectProps } from '@mui/material';
|
|
2
|
+
import { ReactElement } from 'react';
|
|
3
3
|
import { TimeZoneOption } from './model/timeZoneOption';
|
|
4
4
|
export interface TimeZoneSelectorProps extends Omit<SelectProps, 'onChange' | 'variant' | 'value'> {
|
|
5
5
|
value: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeZoneSelector.d.ts","sourceRoot":"","sources":["../src/TimeZoneSelector.tsx"],"names":[],"mappings":"AAaA,OAAO,
|
|
1
|
+
{"version":3,"file":"TimeZoneSelector.d.ts","sourceRoot":"","sources":["../src/TimeZoneSelector.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAoB,WAAW,EAAqB,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,YAAY,EAAsB,MAAM,OAAO,CAAC;AAEzD,OAAO,EAAE,cAAc,EAAsB,MAAM,wBAAwB,CAAC;AAE5E,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,WAAW,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;IAChG,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,CAAC,cAAc,EAAE,cAAc,KAAK,IAAI,CAAC;IACpD,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IACnC,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,eAAe,EACf,OAAoB,EACpB,QAAQ,EACR,GAAG,WAAW,EACf,EAAE,qBAAqB,GAAG,YAAY,CAyCtC"}
|
package/dist/TimeZoneSelector.js
CHANGED
|
@@ -11,8 +11,8 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
11
11
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
|
-
import { useMemo } from 'react';
|
|
15
14
|
import { Select, MenuItem } from '@mui/material';
|
|
15
|
+
import { useMemo } from 'react';
|
|
16
16
|
import { getTimeZoneOptions } from './model/timeZoneOption';
|
|
17
17
|
/**
|
|
18
18
|
* Timezone selector component
|
|
@@ -21,7 +21,10 @@ import { getTimeZoneOptions } from './model/timeZoneOption';
|
|
|
21
21
|
const options = useMemo(()=>timeZoneOptions ?? getTimeZoneOptions(), [
|
|
22
22
|
timeZoneOptions
|
|
23
23
|
]);
|
|
24
|
-
|
|
24
|
+
let height;
|
|
25
|
+
if (heightPx) {
|
|
26
|
+
height = typeof heightPx === 'number' ? `${heightPx}px` : heightPx;
|
|
27
|
+
}
|
|
25
28
|
const handleChange = (selectedValue)=>{
|
|
26
29
|
const selectedOption = options.find((opt)=>opt.value === selectedValue);
|
|
27
30
|
if (selectedOption && onChange) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/TimeZoneSelector.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../src/TimeZoneSelector.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Select, MenuItem, SelectProps, SelectChangeEvent } from '@mui/material';\nimport { ReactElement, ReactNode, useMemo } from 'react';\n\nimport { TimeZoneOption, getTimeZoneOptions } from './model/timeZoneOption';\n\nexport interface TimeZoneSelectorProps extends Omit<SelectProps, 'onChange' | 'variant' | 'value'> {\n value: string;\n onChange?: (timeZoneOption: TimeZoneOption) => void;\n timeZoneOptions?: TimeZoneOption[];\n variant?: 'standard' | 'compact';\n heightPx?: string | number;\n}\n\n/**\n * Timezone selector component\n * Allows users to select a timezone from a dropdown list\n */\nexport function TimeZoneSelector({\n value,\n onChange,\n timeZoneOptions,\n variant = 'standard',\n heightPx,\n ...selectProps\n}: TimeZoneSelectorProps): ReactElement {\n const options = useMemo(() => timeZoneOptions ?? getTimeZoneOptions(), [timeZoneOptions]);\n\n let height: string | undefined;\n if (heightPx) {\n height = typeof heightPx === 'number' ? `${heightPx}px` : heightPx;\n }\n\n const handleChange = (selectedValue: string): void => {\n const selectedOption = options.find((opt: TimeZoneOption) => opt.value === selectedValue);\n if (selectedOption && onChange) {\n onChange(selectedOption);\n }\n };\n\n const sxStyles = useMemo(\n () => ({\n minWidth: variant === 'compact' ? '80px' : '150px',\n ...(height && { lineHeight: height, paddingY: 0 }),\n ...selectProps.sx,\n }),\n [variant, height, selectProps.sx],\n );\n\n return (\n <Select\n {...selectProps}\n value={value}\n onChange={(event: SelectChangeEvent<unknown>, _child: ReactNode) => {\n handleChange(event.target.value as string);\n }}\n sx={sxStyles}\n size={variant === 'compact' ? 'small' : 'medium'}\n >\n {options.map((option: TimeZoneOption) => (\n <MenuItem key={option.value} value={option.value}>\n {option.display}\n </MenuItem>\n ))}\n </Select>\n );\n}\n"],"names":["Select","MenuItem","useMemo","getTimeZoneOptions","TimeZoneSelector","value","onChange","timeZoneOptions","variant","heightPx","selectProps","options","height","handleChange","selectedValue","selectedOption","find","opt","sxStyles","minWidth","lineHeight","paddingY","sx","event","_child","target","size","map","option","display"],"mappings":";AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,SAASA,MAAM,EAAEC,QAAQ,QAAwC,gBAAgB;AACjF,SAAkCC,OAAO,QAAQ,QAAQ;AAEzD,SAAyBC,kBAAkB,QAAQ,yBAAyB;AAU5E;;;CAGC,GACD,OAAO,SAASC,iBAAiB,EAC/BC,KAAK,EACLC,QAAQ,EACRC,eAAe,EACfC,UAAU,UAAU,EACpBC,QAAQ,EACR,GAAGC,aACmB;IACtB,MAAMC,UAAUT,QAAQ,IAAMK,mBAAmBJ,sBAAsB;QAACI;KAAgB;IAExF,IAAIK;IACJ,IAAIH,UAAU;QACZG,SAAS,OAAOH,aAAa,WAAW,GAAGA,SAAS,EAAE,CAAC,GAAGA;IAC5D;IAEA,MAAMI,eAAe,CAACC;QACpB,MAAMC,iBAAiBJ,QAAQK,IAAI,CAAC,CAACC,MAAwBA,IAAIZ,KAAK,KAAKS;QAC3E,IAAIC,kBAAkBT,UAAU;YAC9BA,SAASS;QACX;IACF;IAEA,MAAMG,WAAWhB,QACf,IAAO,CAAA;YACLiB,UAAUX,YAAY,YAAY,SAAS;YAC3C,GAAII,UAAU;gBAAEQ,YAAYR;gBAAQS,UAAU;YAAE,CAAC;YACjD,GAAGX,YAAYY,EAAE;QACnB,CAAA,GACA;QAACd;QAASI;QAAQF,YAAYY,EAAE;KAAC;IAGnC,qBACE,KAACtB;QACE,GAAGU,WAAW;QACfL,OAAOA;QACPC,UAAU,CAACiB,OAAmCC;YAC5CX,aAAaU,MAAME,MAAM,CAACpB,KAAK;QACjC;QACAiB,IAAIJ;QACJQ,MAAMlB,YAAY,YAAY,UAAU;kBAEvCG,QAAQgB,GAAG,CAAC,CAACC,uBACZ,KAAC3B;gBAA4BI,OAAOuB,OAAOvB,KAAK;0BAC7CuB,OAAOC,OAAO;eADFD,OAAOvB,KAAK;;AAMnC"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/// <reference types="react" />
|
|
2
1
|
import { ButtonProps } from '@mui/material';
|
|
3
2
|
type ToolbarIconButtonProps = ButtonProps;
|
|
4
3
|
export declare const ToolbarIconButton: import("react").ForwardRefExoticComponent<Omit<ToolbarIconButtonProps, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolbarIconButton.d.ts","sourceRoot":"","sources":["../../src/ToolbarIconButton/ToolbarIconButton.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ToolbarIconButton.d.ts","sourceRoot":"","sources":["../../src/ToolbarIconButton/ToolbarIconButton.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAkB,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5D,KAAK,sBAAsB,GAAG,WAAW,CAAC;AAa1C,eAAO,MAAM,iBAAiB,mIAAyB,CAAC"}
|
|
@@ -11,8 +11,8 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
11
11
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
|
-
import { forwardRef } from 'react';
|
|
15
14
|
import { Button, styled } from '@mui/material';
|
|
15
|
+
import { forwardRef } from 'react';
|
|
16
16
|
function IconButton(props, ref) {
|
|
17
17
|
return /*#__PURE__*/ _jsx(StyledIconButton, {
|
|
18
18
|
ref: ref,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ToolbarIconButton/ToolbarIconButton.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/ToolbarIconButton/ToolbarIconButton.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Button, styled, ButtonProps } from '@mui/material';\nimport { ForwardedRef, forwardRef, ReactElement } from 'react';\n\ntype ToolbarIconButtonProps = ButtonProps;\n\nfunction IconButton(props: ToolbarIconButtonProps, ref: ForwardedRef<HTMLButtonElement>): ReactElement {\n return <StyledIconButton ref={ref} variant=\"outlined\" color=\"secondary\" {...props} />;\n}\n\nconst StyledIconButton = styled(Button)(({ theme }) => ({\n // Using a button with some adjusted styles because it is easier to inherit\n // styling and variants from themes than with an IconButton.\n padding: theme.spacing(0.5),\n minWidth: 'auto',\n}));\n\nexport const ToolbarIconButton = forwardRef(IconButton);\n"],"names":["Button","styled","forwardRef","IconButton","props","ref","StyledIconButton","variant","color","theme","padding","spacing","minWidth","ToolbarIconButton"],"mappings":";AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,SAASA,MAAM,EAAEC,MAAM,QAAqB,gBAAgB;AAC5D,SAAuBC,UAAU,QAAsB,QAAQ;AAI/D,SAASC,WAAWC,KAA6B,EAAEC,GAAoC;IACrF,qBAAO,KAACC;QAAiBD,KAAKA;QAAKE,SAAQ;QAAWC,OAAM;QAAa,GAAGJ,KAAK;;AACnF;AAEA,MAAME,mBAAmBL,OAAOD,QAAQ,CAAC,EAAES,KAAK,EAAE,GAAM,CAAA;QACtD,2EAA2E;QAC3E,4DAA4D;QAC5DC,SAASD,MAAME,OAAO,CAAC;QACvBC,UAAU;IACZ,CAAA;AAEA,OAAO,MAAMC,kCAAoBX,WAAWC,YAAY"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransformEditor.d.ts","sourceRoot":"","sources":["../../src/TransformsEditor/TransformEditor.tsx"],"names":[],"mappings":"AAaA,OAAO,EAKL,UAAU,EAIX,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"TransformEditor.d.ts","sourceRoot":"","sources":["../../src/TransformsEditor/TransformEditor.tsx"],"names":[],"mappings":"AAaA,OAAO,EAKL,UAAU,EAIX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAGrC,OAAO,EAKL,SAAS,EACV,MAAM,UAAU,CAAC;AAiLlB,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,GAAG,UAAU,CAAC;IAC/F,KAAK,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;CAC1C;AAED,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,oBAAoB,GAAG,YAAY,CAwCjG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/TransformsEditor/TransformEditor.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport {\n Autocomplete,\n FormControlLabel,\n MenuItem,\n Stack,\n StackProps,\n Switch,\n Typography,\n TextField as MuiTextField,\n} from '@mui/material';\n\nimport { ReactElement } from 'react';\n\nimport { TextField } from '../controls';\nimport {\n JoinByColumnValueTransform,\n MergeColumnsTransform,\n MergeIndexedColumnsTransform,\n MergeSeriesTransform,\n Transform,\n} from '../model';\n\ninterface TransformSpecEditorProps<Spec> {\n value: Spec;\n onChange: (transform: Spec) => void;\n}\n\nfunction JoinByColumnValueTransformEditor({\n value,\n onChange,\n}: TransformSpecEditorProps<JoinByColumnValueTransform>): ReactElement {\n return (\n <Stack direction=\"row\">\n <Autocomplete\n freeSolo\n multiple\n id=\"join-columns\"\n sx={{ width: '100%' }}\n options={[]} // TODO: autofill columns name when query results is available to panel editors\n value={value.spec.columns ?? []}\n renderInput={(params) => <MuiTextField {...params} variant=\"outlined\" label=\"Columns\" required />}\n onChange={(_, columns) => {\n onChange({\n ...value,\n spec: {\n ...value.spec,\n columns: columns,\n },\n });\n }}\n />\n <FormControlLabel\n label=\"Enabled\"\n labelPlacement=\"start\"\n control={\n <Switch\n value={!value.spec.disabled}\n checked={!value.spec.disabled}\n onChange={(e) =>\n onChange({\n ...value,\n spec: { ...value.spec, disabled: !e.target.checked },\n })\n }\n />\n }\n />\n </Stack>\n );\n}\n\nfunction MergeColumnsTransformEditor({\n value,\n onChange,\n}: TransformSpecEditorProps<MergeColumnsTransform>): ReactElement {\n return (\n <Stack direction=\"row\" gap={1} alignItems=\"center\">\n <Autocomplete\n freeSolo\n multiple\n id=\"merge-columns-columns\"\n sx={{ width: '100%' }}\n options={[]}\n value={value.spec.columns ?? []}\n renderInput={(params) => <MuiTextField {...params} variant=\"outlined\" label=\"Columns\" required />}\n onChange={(_, columns) => {\n onChange({\n ...value,\n spec: {\n ...value.spec,\n columns: columns,\n },\n });\n }}\n />\n\n <TextField\n id=\"merge-columns-name\"\n variant=\"outlined\"\n label=\"Output Name\"\n value={value.spec.name ?? ''}\n sx={{ width: '100%' }}\n onChange={(name) => {\n onChange({\n ...value,\n spec: {\n ...value.spec,\n name: name,\n },\n });\n }}\n required\n />\n <FormControlLabel\n label=\"Enabled\"\n labelPlacement=\"start\"\n control={\n <Switch\n value={!value.spec.disabled}\n checked={!value.spec.disabled}\n onChange={(e) =>\n onChange({\n ...value,\n spec: { ...value.spec, disabled: !e.target.checked },\n })\n }\n />\n }\n />\n </Stack>\n );\n}\n\nfunction MergeIndexedColumnsTransformEditor({\n value,\n onChange,\n}: TransformSpecEditorProps<MergeIndexedColumnsTransform>): ReactElement {\n return (\n <Stack direction=\"row\">\n <TextField\n id=\"merge-indexed-columns\"\n variant=\"outlined\"\n label=\"Column\"\n placeholder=\"Example: 'value' for merging 'value #1', 'value #2' and 'value #...'\"\n value={value.spec.column ?? ''}\n sx={{ width: '100%' }}\n onChange={(column) => {\n onChange({\n ...value,\n spec: { ...value.spec, column: column },\n });\n }}\n required\n />\n <FormControlLabel\n label=\"Enabled\"\n labelPlacement=\"start\"\n control={\n <Switch\n value={!value.spec.disabled}\n checked={!value.spec.disabled}\n onChange={(e) =>\n onChange({\n ...value,\n spec: { ...value.spec, disabled: !e.target.checked },\n })\n }\n />\n }\n />\n </Stack>\n );\n}\n\nfunction MergeSeriesTransformEditor({ value, onChange }: TransformSpecEditorProps<MergeSeriesTransform>): ReactElement {\n return (\n <Stack direction=\"row\">\n <FormControlLabel\n label=\"Enabled\"\n labelPlacement=\"start\"\n control={\n <Switch\n value={!value.spec.disabled}\n checked={!value.spec.disabled}\n onChange={(e) =>\n onChange({\n ...value,\n spec: { ...value.spec, disabled: !e.target.checked },\n })\n }\n />\n }\n />\n </Stack>\n );\n}\n\nexport interface TransformEditorProps extends Omit<StackProps, 'children' | 'value' | 'onChange'> {\n value: Transform;\n onChange: (transform: Transform) => void;\n}\n\nexport function TransformEditor({ value, onChange, ...props }: TransformEditorProps): ReactElement {\n return (\n <Stack gap={2} sx={{ width: '100%' }} mt={1} {...props}>\n <TextField\n select\n label=\"Kind\"\n value={value.kind}\n onChange={(kind) => onChange({ ...value, kind: kind as unknown as Transform['kind'] } as Transform)}\n >\n <MenuItem value=\"JoinByColumnValue\">\n <Stack>\n <Typography>Join by column value</Typography>\n <Typography variant=\"caption\">Regroup rows with equal cell value in a column</Typography>\n </Stack>\n </MenuItem>\n <MenuItem value=\"MergeColumns\">\n <Stack>\n <Typography>Merge columns</Typography>\n <Typography variant=\"caption\">Multiple columns are merged to one column</Typography>\n </Stack>\n </MenuItem>\n <MenuItem value=\"MergeIndexedColumns\">\n <Stack>\n <Typography>Merge indexed columns</Typography>\n <Typography variant=\"caption\">Indexed columns are merged to one column</Typography>\n </Stack>\n </MenuItem>\n <MenuItem value=\"MergeSeries\">\n <Stack>\n <Typography>Merge series</Typography>\n <Typography variant=\"caption\">Series will be merged by their labels</Typography>\n </Stack>\n </MenuItem>\n </TextField>\n {value.kind === 'JoinByColumnValue' && <JoinByColumnValueTransformEditor value={value} onChange={onChange} />}\n {value.kind === 'MergeColumns' && <MergeColumnsTransformEditor value={value} onChange={onChange} />}\n {value.kind === 'MergeIndexedColumns' && <MergeIndexedColumnsTransformEditor value={value} onChange={onChange} />}\n {value.kind === 'MergeSeries' && <MergeSeriesTransformEditor value={value} onChange={onChange} />}\n </Stack>\n );\n}\n"],"names":["Autocomplete","FormControlLabel","MenuItem","Stack","Switch","Typography","TextField","MuiTextField","JoinByColumnValueTransformEditor","value","onChange","direction","freeSolo","multiple","id","sx","width","options","spec","columns","renderInput","params","variant","label","required","_","labelPlacement","control","disabled","checked","e","target","MergeColumnsTransformEditor","gap","alignItems","name","MergeIndexedColumnsTransformEditor","placeholder","column","MergeSeriesTransformEditor","TransformEditor","props","mt","select","kind"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/TransformsEditor/TransformEditor.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport {\n Autocomplete,\n FormControlLabel,\n MenuItem,\n Stack,\n StackProps,\n Switch,\n Typography,\n TextField as MuiTextField,\n} from '@mui/material';\nimport { ReactElement } from 'react';\n\nimport { TextField } from '../controls';\nimport {\n JoinByColumnValueTransform,\n MergeColumnsTransform,\n MergeIndexedColumnsTransform,\n MergeSeriesTransform,\n Transform,\n} from '../model';\n\ninterface TransformSpecEditorProps<Spec> {\n value: Spec;\n onChange: (transform: Spec) => void;\n}\n\nfunction JoinByColumnValueTransformEditor({\n value,\n onChange,\n}: TransformSpecEditorProps<JoinByColumnValueTransform>): ReactElement {\n return (\n <Stack direction=\"row\">\n <Autocomplete\n freeSolo\n multiple\n id=\"join-columns\"\n sx={{ width: '100%' }}\n options={[]} // TODO: autofill columns name when query results is available to panel editors\n value={value.spec.columns ?? []}\n renderInput={(params) => <MuiTextField {...params} variant=\"outlined\" label=\"Columns\" required />}\n onChange={(_, columns) => {\n onChange({\n ...value,\n spec: {\n ...value.spec,\n columns: columns,\n },\n });\n }}\n />\n <FormControlLabel\n label=\"Enabled\"\n labelPlacement=\"start\"\n control={\n <Switch\n value={!value.spec.disabled}\n checked={!value.spec.disabled}\n onChange={(e) =>\n onChange({\n ...value,\n spec: { ...value.spec, disabled: !e.target.checked },\n })\n }\n />\n }\n />\n </Stack>\n );\n}\n\nfunction MergeColumnsTransformEditor({\n value,\n onChange,\n}: TransformSpecEditorProps<MergeColumnsTransform>): ReactElement {\n return (\n <Stack direction=\"row\" gap={1} alignItems=\"center\">\n <Autocomplete\n freeSolo\n multiple\n id=\"merge-columns-columns\"\n sx={{ width: '100%' }}\n options={[]}\n value={value.spec.columns ?? []}\n renderInput={(params) => <MuiTextField {...params} variant=\"outlined\" label=\"Columns\" required />}\n onChange={(_, columns) => {\n onChange({\n ...value,\n spec: {\n ...value.spec,\n columns: columns,\n },\n });\n }}\n />\n\n <TextField\n id=\"merge-columns-name\"\n variant=\"outlined\"\n label=\"Output Name\"\n value={value.spec.name ?? ''}\n sx={{ width: '100%' }}\n onChange={(name) => {\n onChange({\n ...value,\n spec: {\n ...value.spec,\n name: name,\n },\n });\n }}\n required\n />\n <FormControlLabel\n label=\"Enabled\"\n labelPlacement=\"start\"\n control={\n <Switch\n value={!value.spec.disabled}\n checked={!value.spec.disabled}\n onChange={(e) =>\n onChange({\n ...value,\n spec: { ...value.spec, disabled: !e.target.checked },\n })\n }\n />\n }\n />\n </Stack>\n );\n}\n\nfunction MergeIndexedColumnsTransformEditor({\n value,\n onChange,\n}: TransformSpecEditorProps<MergeIndexedColumnsTransform>): ReactElement {\n return (\n <Stack direction=\"row\">\n <TextField\n id=\"merge-indexed-columns\"\n variant=\"outlined\"\n label=\"Column\"\n placeholder=\"Example: 'value' for merging 'value #1', 'value #2' and 'value #...'\"\n value={value.spec.column ?? ''}\n sx={{ width: '100%' }}\n onChange={(column) => {\n onChange({\n ...value,\n spec: { ...value.spec, column: column },\n });\n }}\n required\n />\n <FormControlLabel\n label=\"Enabled\"\n labelPlacement=\"start\"\n control={\n <Switch\n value={!value.spec.disabled}\n checked={!value.spec.disabled}\n onChange={(e) =>\n onChange({\n ...value,\n spec: { ...value.spec, disabled: !e.target.checked },\n })\n }\n />\n }\n />\n </Stack>\n );\n}\n\nfunction MergeSeriesTransformEditor({ value, onChange }: TransformSpecEditorProps<MergeSeriesTransform>): ReactElement {\n return (\n <Stack direction=\"row\">\n <FormControlLabel\n label=\"Enabled\"\n labelPlacement=\"start\"\n control={\n <Switch\n value={!value.spec.disabled}\n checked={!value.spec.disabled}\n onChange={(e) =>\n onChange({\n ...value,\n spec: { ...value.spec, disabled: !e.target.checked },\n })\n }\n />\n }\n />\n </Stack>\n );\n}\n\nexport interface TransformEditorProps extends Omit<StackProps, 'children' | 'value' | 'onChange'> {\n value: Transform;\n onChange: (transform: Transform) => void;\n}\n\nexport function TransformEditor({ value, onChange, ...props }: TransformEditorProps): ReactElement {\n return (\n <Stack gap={2} sx={{ width: '100%' }} mt={1} {...props}>\n <TextField\n select\n label=\"Kind\"\n value={value.kind}\n onChange={(kind) => onChange({ ...value, kind: kind as unknown as Transform['kind'] } as Transform)}\n >\n <MenuItem value=\"JoinByColumnValue\">\n <Stack>\n <Typography>Join by column value</Typography>\n <Typography variant=\"caption\">Regroup rows with equal cell value in a column</Typography>\n </Stack>\n </MenuItem>\n <MenuItem value=\"MergeColumns\">\n <Stack>\n <Typography>Merge columns</Typography>\n <Typography variant=\"caption\">Multiple columns are merged to one column</Typography>\n </Stack>\n </MenuItem>\n <MenuItem value=\"MergeIndexedColumns\">\n <Stack>\n <Typography>Merge indexed columns</Typography>\n <Typography variant=\"caption\">Indexed columns are merged to one column</Typography>\n </Stack>\n </MenuItem>\n <MenuItem value=\"MergeSeries\">\n <Stack>\n <Typography>Merge series</Typography>\n <Typography variant=\"caption\">Series will be merged by their labels</Typography>\n </Stack>\n </MenuItem>\n </TextField>\n {value.kind === 'JoinByColumnValue' && <JoinByColumnValueTransformEditor value={value} onChange={onChange} />}\n {value.kind === 'MergeColumns' && <MergeColumnsTransformEditor value={value} onChange={onChange} />}\n {value.kind === 'MergeIndexedColumns' && <MergeIndexedColumnsTransformEditor value={value} onChange={onChange} />}\n {value.kind === 'MergeSeries' && <MergeSeriesTransformEditor value={value} onChange={onChange} />}\n </Stack>\n );\n}\n"],"names":["Autocomplete","FormControlLabel","MenuItem","Stack","Switch","Typography","TextField","MuiTextField","JoinByColumnValueTransformEditor","value","onChange","direction","freeSolo","multiple","id","sx","width","options","spec","columns","renderInput","params","variant","label","required","_","labelPlacement","control","disabled","checked","e","target","MergeColumnsTransformEditor","gap","alignItems","name","MergeIndexedColumnsTransformEditor","placeholder","column","MergeSeriesTransformEditor","TransformEditor","props","mt","select","kind"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransformEditorContainer.d.ts","sourceRoot":"","sources":["../../src/TransformsEditor/TransformEditorContainer.tsx"],"names":[],"mappings":"AAmBA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"TransformEditorContainer.d.ts","sourceRoot":"","sources":["../../src/TransformsEditor/TransformEditorContainer.tsx"],"names":[],"mappings":"AAmBA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAGrC,OAAO,EAAmB,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE1E,MAAM,WAAW,6BAA8B,SAAQ,oBAAoB;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,wBAAwB,CAAC,EACvC,KAAK,EACL,KAAK,EACL,WAAW,EACX,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,6BAA6B,GAAG,YAAY,CAsD9C"}
|
|
@@ -12,11 +12,11 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
14
|
import { Divider, IconButton, Stack, Tooltip, Typography } from '@mui/material';
|
|
15
|
-
import ChevronRight from 'mdi-material-ui/ChevronRight';
|
|
16
15
|
import ChevronDown from 'mdi-material-ui/ChevronDown';
|
|
16
|
+
import ChevronRight from 'mdi-material-ui/ChevronRight';
|
|
17
|
+
import DeleteIcon from 'mdi-material-ui/DeleteOutline';
|
|
17
18
|
import EyeOffIcon from 'mdi-material-ui/EyeOffOutline';
|
|
18
19
|
import EyeIcon from 'mdi-material-ui/EyeOutline';
|
|
19
|
-
import DeleteIcon from 'mdi-material-ui/DeleteOutline';
|
|
20
20
|
import { TRANSFORM_TEXT } from '../model';
|
|
21
21
|
import { TransformEditor } from './TransformEditor';
|
|
22
22
|
export function TransformEditorContainer({ index, value, isCollapsed, onChange, onCollapse, onDelete, ...props }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/TransformsEditor/TransformEditorContainer.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Divider, IconButton, Stack, Tooltip, Typography } from '@mui/material';\nimport
|
|
1
|
+
{"version":3,"sources":["../../src/TransformsEditor/TransformEditorContainer.tsx"],"sourcesContent":["// Copyright The Perses Authors\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nimport { Divider, IconButton, Stack, Tooltip, Typography } from '@mui/material';\nimport ChevronDown from 'mdi-material-ui/ChevronDown';\nimport ChevronRight from 'mdi-material-ui/ChevronRight';\nimport DeleteIcon from 'mdi-material-ui/DeleteOutline';\nimport EyeOffIcon from 'mdi-material-ui/EyeOffOutline';\nimport EyeIcon from 'mdi-material-ui/EyeOutline';\nimport { ReactElement } from 'react';\n\nimport { Transform, TRANSFORM_TEXT } from '../model';\nimport { TransformEditor, TransformEditorProps } from './TransformEditor';\n\nexport interface TransformEditorContainerProps extends TransformEditorProps {\n index?: number;\n isCollapsed: boolean;\n onCollapse: (collapsed: boolean) => void;\n onDelete: () => void;\n}\n\nexport function TransformEditorContainer({\n index,\n value,\n isCollapsed,\n onChange,\n onCollapse,\n onDelete,\n ...props\n}: TransformEditorContainerProps): ReactElement {\n function handleTransformDisable(): void {\n onChange({ ...value, spec: { ...value.spec, disabled: !value.spec?.disabled } } as Transform);\n }\n\n return (\n <Stack {...props}>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n borderBottom={1}\n borderColor={(theme) => theme.palette.divider}\n justifyContent=\"space-between\"\n gap={4}\n >\n <Stack direction=\"row\" gap={1}>\n <IconButton data-testid={`transform-toggle#${index}`} size=\"small\" onClick={() => onCollapse(!isCollapsed)}>\n {isCollapsed ? <ChevronRight /> : <ChevronDown />}\n </IconButton>\n <Typography variant=\"overline\" component=\"h4\" sx={{ textTransform: 'none' }}>\n {value.kind ? (\n <span>\n <strong>{TRANSFORM_TEXT[value.kind]}</strong>\n </span>\n ) : (\n <strong>Select a transformation kind</strong>\n )}\n </Typography>\n </Stack>\n\n <Stack direction=\"row\" gap={1}>\n {isCollapsed && (\n <>\n <Tooltip\n title={value.spec?.disabled ? 'Enable transformation' : 'Disable transformation'}\n placement=\"top\"\n >\n <IconButton size=\"small\" sx={{ marginLeft: 'auto' }} onClick={handleTransformDisable}>\n {value.spec?.disabled ? <EyeOffIcon /> : <EyeIcon />}\n </IconButton>\n </Tooltip>\n <Divider flexItem orientation=\"vertical\" variant=\"middle\" />\n </>\n )}\n <Tooltip title=\"Remove transformation\" placement=\"top\">\n <IconButton size=\"small\" sx={{ marginLeft: 'auto' }} onClick={onDelete}>\n <DeleteIcon />\n </IconButton>\n </Tooltip>\n </Stack>\n </Stack>\n {!isCollapsed && <TransformEditor value={value} onChange={onChange} />}\n </Stack>\n );\n}\n"],"names":["Divider","IconButton","Stack","Tooltip","Typography","ChevronDown","ChevronRight","DeleteIcon","EyeOffIcon","EyeIcon","TRANSFORM_TEXT","TransformEditor","TransformEditorContainer","index","value","isCollapsed","onChange","onCollapse","onDelete","props","handleTransformDisable","spec","disabled","direction","alignItems","borderBottom","borderColor","theme","palette","divider","justifyContent","gap","data-testid","size","onClick","variant","component","sx","textTransform","kind","span","strong","title","placement","marginLeft","flexItem","orientation"],"mappings":";AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,SAASA,OAAO,EAAEC,UAAU,EAAEC,KAAK,EAAEC,OAAO,EAAEC,UAAU,QAAQ,gBAAgB;AAChF,OAAOC,iBAAiB,8BAA8B;AACtD,OAAOC,kBAAkB,+BAA+B;AACxD,OAAOC,gBAAgB,gCAAgC;AACvD,OAAOC,gBAAgB,gCAAgC;AACvD,OAAOC,aAAa,6BAA6B;AAGjD,SAAoBC,cAAc,QAAQ,WAAW;AACrD,SAASC,eAAe,QAA8B,oBAAoB;AAS1E,OAAO,SAASC,yBAAyB,EACvCC,KAAK,EACLC,KAAK,EACLC,WAAW,EACXC,QAAQ,EACRC,UAAU,EACVC,QAAQ,EACR,GAAGC,OAC2B;IAC9B,SAASC;QACPJ,SAAS;YAAE,GAAGF,KAAK;YAAEO,MAAM;gBAAE,GAAGP,MAAMO,IAAI;gBAAEC,UAAU,CAACR,MAAMO,IAAI,EAAEC;YAAS;QAAE;IAChF;IAEA,qBACE,MAACpB;QAAO,GAAGiB,KAAK;;0BACd,MAACjB;gBACCqB,WAAU;gBACVC,YAAW;gBACXC,cAAc;gBACdC,aAAa,CAACC,QAAUA,MAAMC,OAAO,CAACC,OAAO;gBAC7CC,gBAAe;gBACfC,KAAK;;kCAEL,MAAC7B;wBAAMqB,WAAU;wBAAMQ,KAAK;;0CAC1B,KAAC9B;gCAAW+B,eAAa,CAAC,iBAAiB,EAAEnB,OAAO;gCAAEoB,MAAK;gCAAQC,SAAS,IAAMjB,WAAW,CAACF;0CAC3FA,4BAAc,KAACT,kCAAkB,KAACD;;0CAErC,KAACD;gCAAW+B,SAAQ;gCAAWC,WAAU;gCAAKC,IAAI;oCAAEC,eAAe;gCAAO;0CACvExB,MAAMyB,IAAI,iBACT,KAACC;8CACC,cAAA,KAACC;kDAAQ/B,cAAc,CAACI,MAAMyB,IAAI,CAAC;;mDAGrC,KAACE;8CAAO;;;;;kCAKd,MAACvC;wBAAMqB,WAAU;wBAAMQ,KAAK;;4BACzBhB,6BACC;;kDACE,KAACZ;wCACCuC,OAAO5B,MAAMO,IAAI,EAAEC,WAAW,0BAA0B;wCACxDqB,WAAU;kDAEV,cAAA,KAAC1C;4CAAWgC,MAAK;4CAAQI,IAAI;gDAAEO,YAAY;4CAAO;4CAAGV,SAASd;sDAC3DN,MAAMO,IAAI,EAAEC,yBAAW,KAACd,gCAAgB,KAACC;;;kDAG9C,KAACT;wCAAQ6C,QAAQ;wCAACC,aAAY;wCAAWX,SAAQ;;;;0CAGrD,KAAChC;gCAAQuC,OAAM;gCAAwBC,WAAU;0CAC/C,cAAA,KAAC1C;oCAAWgC,MAAK;oCAAQI,IAAI;wCAAEO,YAAY;oCAAO;oCAAGV,SAAShB;8CAC5D,cAAA,KAACX;;;;;;;YAKR,CAACQ,6BAAe,KAACJ;gBAAgBG,OAAOA;gBAAOE,UAAUA;;;;AAGhE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransformsEditor.d.ts","sourceRoot":"","sources":["../../src/TransformsEditor/TransformsEditor.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAiB,UAAU,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"TransformsEditor.d.ts","sourceRoot":"","sources":["../../src/TransformsEditor/TransformsEditor.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAiB,UAAU,EAAE,MAAM,eAAe,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAY,MAAM,OAAO,CAAC;AAE/C,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGrC,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;IACzE,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,QAAQ,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;CAC7C;AAED,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,qBAAqB,GAAG,YAAY,CAwDnG"}
|
|
@@ -12,8 +12,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
12
12
|
// See the License for the specific language governing permissions and
|
|
13
13
|
// limitations under the License.
|
|
14
14
|
import { Button, Stack } from '@mui/material';
|
|
15
|
-
import { useState } from 'react';
|
|
16
15
|
import AddIcon from 'mdi-material-ui/Plus';
|
|
16
|
+
import { useState } from 'react';
|
|
17
17
|
import { TransformEditorContainer } from './TransformEditorContainer';
|
|
18
18
|
export function TransformsEditor({ value, onChange, ...props }) {
|
|
19
19
|
const [transformsCollapsed, setTransformsCollapsed] = useState(value.map(()=>true));
|