@perses-dev/pie-chart-plugin 0.8.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/__mf/js/PieChart.4c358ac5.js +5 -0
  2. package/__mf/js/async/109.9a84a1ac.js +73 -0
  3. package/__mf/js/async/{845.1b2e72ed.js.LICENSE.txt → 109.9a84a1ac.js.LICENSE.txt} +16 -0
  4. package/__mf/js/async/173.c694e6f7.js +2 -0
  5. package/__mf/js/async/214.a7648318.js +1 -0
  6. package/__mf/js/async/224.43460380.js +1 -0
  7. package/__mf/js/async/238.3e689a99.js +1 -0
  8. package/__mf/js/async/292.67519c5b.js +1 -0
  9. package/__mf/js/async/298.707087d2.js +1 -0
  10. package/__mf/js/async/358.76279409.js +7 -0
  11. package/__mf/js/async/409.9c48d616.js +1 -0
  12. package/__mf/js/async/470.1e913aa7.js +2 -0
  13. package/__mf/js/async/488.a0bde6cf.js +1 -0
  14. package/__mf/js/async/618.544e0c46.js +38 -0
  15. package/__mf/js/async/651.9c74cbf3.js +1 -0
  16. package/__mf/js/async/656.13055e59.js +1 -0
  17. package/__mf/js/async/680.f1da299d.js +110 -0
  18. package/__mf/js/async/{331.067ac3da.js.LICENSE.txt → 680.f1da299d.js.LICENSE.txt} +28 -0
  19. package/__mf/js/async/694.011b21e8.js +1 -0
  20. package/__mf/js/async/707.c77cb775.js +1 -0
  21. package/__mf/js/async/708.77a1c1f6.js +1 -0
  22. package/__mf/js/async/738.5a36e399.js +1 -0
  23. package/__mf/js/async/740.254a5697.js +1 -0
  24. package/__mf/js/async/75.a825d10b.js +1 -0
  25. package/__mf/js/async/770.73dda090.js +1 -0
  26. package/__mf/js/async/863.2d634113.js +2 -0
  27. package/__mf/js/async/960.021d7634.js +2 -0
  28. package/__mf/js/async/964.7fdfdfd5.js +2 -0
  29. package/__mf/js/async/981.e6f0d188.js +2 -0
  30. package/__mf/js/async/__federation_expose_PieChart.f4937330.js +1 -0
  31. package/__mf/js/async/lib-router.5205dc27.js +2 -0
  32. package/__mf/js/main.3cf23d49.js +5 -0
  33. package/lib/PieChartBase.d.ts +1 -0
  34. package/lib/PieChartBase.d.ts.map +1 -1
  35. package/lib/PieChartBase.js.map +1 -1
  36. package/lib/PieChartOptionsEditorSettings.js +1 -0
  37. package/lib/PieChartOptionsEditorSettings.js.map +1 -1
  38. package/lib/PieChartPanel.d.ts.map +1 -1
  39. package/lib/PieChartPanel.js +50 -15
  40. package/lib/PieChartPanel.js.map +1 -1
  41. package/lib/cjs/PieChartOptionsEditorSettings.js +1 -0
  42. package/lib/cjs/PieChartPanel.js +49 -14
  43. package/lib/utils.d.ts +1 -0
  44. package/lib/utils.d.ts.map +1 -1
  45. package/lib/utils.js.map +1 -1
  46. package/mf-manifest.json +40 -88
  47. package/mf-stats.json +40 -88
  48. package/package.json +4 -4
  49. package/__mf/js/693.bc1093ac.js +0 -5
  50. package/__mf/js/PieChart.a1d90662.js +0 -5
  51. package/__mf/js/async/105.7a85ee04.js +0 -1
  52. package/__mf/js/async/173.ee70b493.js +0 -2
  53. package/__mf/js/async/214.df2e7807.js +0 -1
  54. package/__mf/js/async/224.dbeed4db.js +0 -1
  55. package/__mf/js/async/238.5287310b.js +0 -1
  56. package/__mf/js/async/292.f278784e.js +0 -1
  57. package/__mf/js/async/331.067ac3da.js +0 -2
  58. package/__mf/js/async/470.be19e17e.js +0 -2
  59. package/__mf/js/async/488.0fc5dcbb.js +0 -1
  60. package/__mf/js/async/503.28e7e4f1.js +0 -1
  61. package/__mf/js/async/530.f071fc6b.js +0 -7
  62. package/__mf/js/async/620.9a73a66b.js +0 -2
  63. package/__mf/js/async/651.a1042e18.js +0 -1
  64. package/__mf/js/async/656.5efccb26.js +0 -1
  65. package/__mf/js/async/694.b227b636.js +0 -1
  66. package/__mf/js/async/707.55fda5d1.js +0 -1
  67. package/__mf/js/async/738.4ac98841.js +0 -1
  68. package/__mf/js/async/740.b86dfa00.js +0 -1
  69. package/__mf/js/async/75.905151a5.js +0 -1
  70. package/__mf/js/async/770.93415255.js +0 -1
  71. package/__mf/js/async/845.1b2e72ed.js +0 -73
  72. package/__mf/js/async/925.92a059f1.js +0 -38
  73. package/__mf/js/async/960.208437e1.js +0 -2
  74. package/__mf/js/async/964.6df60c3e.js +0 -2
  75. package/__mf/js/async/973.74031340.js +0 -110
  76. package/__mf/js/async/973.74031340.js.LICENSE.txt +0 -27
  77. package/__mf/js/async/981.3ecbf5ea.js +0 -2
  78. package/__mf/js/async/__federation_expose_PieChart.869001bb.js +0 -1
  79. package/__mf/js/async/lib-router.d29f3ef0.js +0 -2
  80. package/__mf/js/main.d6c64ff1.js +0 -1
  81. /package/__mf/js/async/{173.ee70b493.js.LICENSE.txt → 173.c694e6f7.js.LICENSE.txt} +0 -0
  82. /package/__mf/js/async/{530.f071fc6b.js.LICENSE.txt → 358.76279409.js.LICENSE.txt} +0 -0
  83. /package/__mf/js/async/{470.be19e17e.js.LICENSE.txt → 470.1e913aa7.js.LICENSE.txt} +0 -0
  84. /package/__mf/js/async/{620.9a73a66b.js.LICENSE.txt → 863.2d634113.js.LICENSE.txt} +0 -0
  85. /package/__mf/js/async/{960.208437e1.js.LICENSE.txt → 960.021d7634.js.LICENSE.txt} +0 -0
  86. /package/__mf/js/async/{964.6df60c3e.js.LICENSE.txt → 964.7fdfdfd5.js.LICENSE.txt} +0 -0
  87. /package/__mf/js/async/{981.3ecbf5ea.js.LICENSE.txt → 981.e6f0d188.js.LICENSE.txt} +0 -0
  88. /package/__mf/js/async/{lib-router.d29f3ef0.js.LICENSE.txt → lib-router.5205dc27.js.LICENSE.txt} +0 -0
@@ -14,23 +14,24 @@ import { jsx as _jsx } from "react/jsx-runtime";
14
14
  import { Box, useTheme } from '@mui/material';
15
15
  import { ContentWithLegend, useChartsTheme, useId } from '@perses-dev/components';
16
16
  import { CalculationsMap, DEFAULT_LEGEND } from '@perses-dev/core';
17
- import { validateLegendSpec } from '@perses-dev/plugin-system';
17
+ import { comparisonLegends, validateLegendSpec } from '@perses-dev/plugin-system';
18
18
  import merge from 'lodash/merge';
19
19
  import { useMemo, useRef, useState } from 'react';
20
20
  import { getSeriesColor } from './palette-gen';
21
21
  import { calculatePercentages, sortSeriesData } from './utils';
22
22
  import { PieChartBase } from './PieChartBase';
23
23
  export function PieChartPanel(props) {
24
- const { spec: { calculation, sort, mode }, contentDimensions, queryResults } = props;
24
+ const { spec: { calculation, sort, mode, legend: pieChartLegend }, contentDimensions, queryResults } = props;
25
25
  const chartsTheme = useChartsTheme();
26
26
  const muiTheme = useTheme();
27
27
  const PADDING = chartsTheme.container.padding.default;
28
28
  const chartId = useId('time-series-panel');
29
29
  const categoricalPalette = chartsTheme.echartsTheme.color;
30
- const { pieChartData, legendItems } = useMemo(()=>{
30
+ const { pieChartData, legendItems, legendColumns } = useMemo(()=>{
31
31
  const calculate = CalculationsMap[calculation];
32
32
  const pieChartData = [];
33
33
  const legendItems = [];
34
+ const legendColumns = [];
34
35
  for(let queryIndex = 0; queryIndex < queryResults.length; queryIndex++){
35
36
  const result = queryResults[queryIndex];
36
37
  let seriesIndex = 0;
@@ -40,7 +41,9 @@ export function PieChartPanel(props) {
40
41
  muiPrimaryColor: muiTheme.palette.primary.main,
41
42
  seriesName: seriesData.name
42
43
  });
44
+ const seriesId = `${chartId}${seriesData.name}${seriesIndex}`;
43
45
  const series = {
46
+ id: seriesId,
44
47
  value: calculate(seriesData.values) ?? null,
45
48
  name: seriesData.formattedName ?? '',
46
49
  itemStyle: {
@@ -48,25 +51,56 @@ export function PieChartPanel(props) {
48
51
  }
49
52
  };
50
53
  pieChartData.push(series);
51
- const seriesId = chartId + seriesData.name + seriesIndex;
52
54
  legendItems.push({
53
55
  id: seriesId,
54
56
  label: series.name,
55
- color: seriesColor
57
+ color: seriesColor,
58
+ data: {}
56
59
  });
57
60
  seriesIndex++;
58
61
  }
59
62
  }
60
63
  const sortedPieChartData = sortSeriesData(pieChartData, sort);
61
- if (mode === 'percentage') {
62
- return {
63
- pieChartData: calculatePercentages(sortedPieChartData),
64
- legendItems
65
- };
64
+ if (pieChartLegend?.values?.length && pieChartLegend?.mode === 'table') {
65
+ const { values } = pieChartLegend;
66
+ [
67
+ ...values
68
+ ].sort().forEach((v)=>{
69
+ /* First, create a column for the current legend value */ legendColumns.push({
70
+ accessorKey: `data.${v}`,
71
+ header: comparisonLegends[v]?.label || v,
72
+ headerDescription: comparisonLegends[v]?.description,
73
+ width: 90,
74
+ align: 'right',
75
+ cellDescription: true,
76
+ enableSorting: true
77
+ });
78
+ /* Then, settle the legend items related to this legend value */ switch(v){
79
+ case 'abs':
80
+ legendItems.forEach((li)=>{
81
+ const { value: itemAbsoluteValue } = pieChartData.find((pd)=>li.id === pd.id) || {};
82
+ if (typeof itemAbsoluteValue === 'number' && li.data) {
83
+ li.data['abs'] = itemAbsoluteValue;
84
+ }
85
+ });
86
+ break;
87
+ case 'relative':
88
+ legendItems.forEach((li)=>{
89
+ const { value: itemPercentageValue } = calculatePercentages(sortedPieChartData).find((ppd)=>li.id === ppd.id) || {};
90
+ if (typeof itemPercentageValue === 'number' && li.data) {
91
+ li.data['relative'] = `${itemPercentageValue.toFixed(2)}%`;
92
+ }
93
+ });
94
+ break;
95
+ default:
96
+ break;
97
+ }
98
+ });
66
99
  }
67
100
  return {
68
- pieChartData: sortedPieChartData,
69
- legendItems
101
+ pieChartData: mode === 'percentage' ? calculatePercentages(sortedPieChartData) : sortedPieChartData,
102
+ legendItems,
103
+ legendColumns
70
104
  };
71
105
  }, [
72
106
  calculation,
@@ -75,7 +109,8 @@ export function PieChartPanel(props) {
75
109
  queryResults,
76
110
  categoricalPalette,
77
111
  muiTheme.palette.primary.main,
78
- chartId
112
+ chartId,
113
+ pieChartLegend
79
114
  ]);
80
115
  const contentPadding = chartsTheme.container.padding.default;
81
116
  const adjustedContentDimensions = contentDimensions ? {
@@ -92,7 +127,7 @@ export function PieChartPanel(props) {
92
127
  const chartRef = useRef(null);
93
128
  // ensures there are fallbacks for unset properties since most
94
129
  // users should not need to customize visual display
95
- if (contentDimensions === undefined) return null;
130
+ if (!contentDimensions) return null;
96
131
  return /*#__PURE__*/ _jsx(Box, {
97
132
  sx: {
98
133
  padding: `${PADDING}px`
@@ -110,7 +145,7 @@ export function PieChartPanel(props) {
110
145
  selectedItems: selectedLegendItems,
111
146
  onSelectedItemsChange: setSelectedLegendItems,
112
147
  tableProps: {
113
- columns: [],
148
+ columns: legendColumns,
114
149
  sorting: legendSorting,
115
150
  onSortingChange: setLegendSorting
116
151
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/PieChartPanel.tsx"],"sourcesContent":["//Copyright 2024 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 { Box, useTheme } from '@mui/material';\nimport {\n ChartInstance,\n ContentWithLegend,\n LegendItem,\n LegendProps,\n SelectedLegendItemState,\n useChartsTheme,\n useId,\n} from '@perses-dev/components';\nimport { CalculationType, CalculationsMap, DEFAULT_LEGEND, TimeSeriesData } from '@perses-dev/core';\nimport { PanelProps, validateLegendSpec } from '@perses-dev/plugin-system';\nimport merge from 'lodash/merge';\nimport { ReactElement, useMemo, useRef, useState } from 'react';\nimport { getSeriesColor } from './palette-gen';\nimport { PieChartOptions } from './pie-chart-model';\nimport { calculatePercentages, sortSeriesData } from './utils';\nimport { PieChartBase, PieChartData } from './PieChartBase';\n\nexport type PieChartPanelProps = PanelProps<PieChartOptions, TimeSeriesData>;\n\nexport function PieChartPanel(props: PieChartPanelProps): ReactElement | null {\n const {\n spec: { calculation, sort, mode },\n contentDimensions,\n queryResults,\n } = props;\n const chartsTheme = useChartsTheme();\n const muiTheme = useTheme();\n const PADDING = chartsTheme.container.padding.default;\n const chartId = useId('time-series-panel');\n const categoricalPalette = chartsTheme.echartsTheme.color;\n\n const { pieChartData, legendItems } = useMemo(() => {\n const calculate = CalculationsMap[calculation as CalculationType];\n const pieChartData: PieChartData[] = [];\n const legendItems: LegendItem[] = [];\n\n for (let queryIndex = 0; queryIndex < queryResults.length; queryIndex++) {\n const result = queryResults[queryIndex];\n\n let seriesIndex = 0;\n for (const seriesData of result?.data.series ?? []) {\n const seriesColor = getSeriesColor({\n categoricalPalette: categoricalPalette as string[],\n muiPrimaryColor: muiTheme.palette.primary.main,\n seriesName: seriesData.name,\n });\n const series = {\n value: calculate(seriesData.values) ?? null,\n name: seriesData.formattedName ?? '',\n itemStyle: {\n color: seriesColor,\n },\n };\n pieChartData.push(series);\n\n const seriesId = chartId + seriesData.name + seriesIndex;\n legendItems.push({\n id: seriesId,\n label: series.name,\n color: seriesColor,\n });\n seriesIndex++;\n }\n }\n\n const sortedPieChartData = sortSeriesData(pieChartData, sort);\n if (mode === 'percentage') {\n return {\n pieChartData: calculatePercentages(sortedPieChartData),\n legendItems,\n };\n }\n return {\n pieChartData: sortedPieChartData,\n legendItems,\n };\n }, [calculation, sort, mode, queryResults, categoricalPalette, muiTheme.palette.primary.main, chartId]);\n\n const contentPadding = chartsTheme.container.padding.default;\n const adjustedContentDimensions: typeof contentDimensions = contentDimensions\n ? {\n width: contentDimensions.width - contentPadding * 2,\n height: contentDimensions.height - contentPadding * 2,\n }\n : undefined;\n\n const legend = useMemo(() => {\n return props.spec.legend && validateLegendSpec(props.spec.legend)\n ? merge({}, DEFAULT_LEGEND, props.spec.legend)\n : undefined;\n }, [props.spec.legend]);\n\n const [selectedLegendItems, setSelectedLegendItems] = useState<SelectedLegendItemState>('ALL');\n\n const [legendSorting, setLegendSorting] = useState<NonNullable<LegendProps['tableProps']>['sorting']>();\n\n const chartRef = useRef<ChartInstance>(null);\n\n // ensures there are fallbacks for unset properties since most\n // users should not need to customize visual display\n\n if (contentDimensions === undefined) return null;\n\n return (\n <Box sx={{ padding: `${PADDING}px` }}>\n <ContentWithLegend\n width={adjustedContentDimensions?.width ?? 400}\n height={adjustedContentDimensions?.height ?? 1000}\n // Making this small enough that the medium size doesn't get\n // responsive-handling-ed away when in the panel options editor.\n minChildrenHeight={50}\n legendSize={legend?.size}\n legendProps={\n legend && {\n options: legend,\n data: legendItems,\n selectedItems: selectedLegendItems,\n onSelectedItemsChange: setSelectedLegendItems,\n tableProps: {\n columns: [],\n sorting: legendSorting,\n onSortingChange: setLegendSorting,\n },\n onItemMouseOver: (e, { id }): void => {\n chartRef.current?.highlightSeries({ name: id });\n },\n onItemMouseOut: (): void => {\n chartRef.current?.clearHighlightedSeries();\n },\n }\n }\n >\n {({ height, width }) => {\n return (\n <Box style={{ height, width }}>\n <PieChartBase\n data={pieChartData}\n width={contentDimensions.width - PADDING * 2}\n height={contentDimensions.height - PADDING * 2}\n />\n </Box>\n );\n }}\n </ContentWithLegend>\n </Box>\n );\n}\n"],"names":["Box","useTheme","ContentWithLegend","useChartsTheme","useId","CalculationsMap","DEFAULT_LEGEND","validateLegendSpec","merge","useMemo","useRef","useState","getSeriesColor","calculatePercentages","sortSeriesData","PieChartBase","PieChartPanel","props","spec","calculation","sort","mode","contentDimensions","queryResults","chartsTheme","muiTheme","PADDING","container","padding","default","chartId","categoricalPalette","echartsTheme","color","pieChartData","legendItems","calculate","queryIndex","length","result","seriesIndex","seriesData","data","series","seriesColor","muiPrimaryColor","palette","primary","main","seriesName","name","value","values","formattedName","itemStyle","push","seriesId","id","label","sortedPieChartData","contentPadding","adjustedContentDimensions","width","height","undefined","legend","selectedLegendItems","setSelectedLegendItems","legendSorting","setLegendSorting","chartRef","sx","minChildrenHeight","legendSize","size","legendProps","options","selectedItems","onSelectedItemsChange","tableProps","columns","sorting","onSortingChange","onItemMouseOver","e","current","highlightSeries","onItemMouseOut","clearHighlightedSeries","style"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/PieChartPanel.tsx"],"sourcesContent":["//Copyright 2024 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 { Box, useTheme } from '@mui/material';\nimport {\n ChartInstance,\n ContentWithLegend,\n LegendItem,\n LegendProps,\n SelectedLegendItemState,\n TableColumnConfig,\n useChartsTheme,\n useId,\n} from '@perses-dev/components';\nimport { CalculationType, CalculationsMap, DEFAULT_LEGEND, TimeSeriesData } from '@perses-dev/core';\nimport { comparisonLegends, ComparisonValues, PanelProps, validateLegendSpec } from '@perses-dev/plugin-system';\nimport merge from 'lodash/merge';\nimport { ReactElement, useMemo, useRef, useState } from 'react';\nimport { getSeriesColor } from './palette-gen';\nimport { PieChartOptions } from './pie-chart-model';\nimport { calculatePercentages, sortSeriesData } from './utils';\nimport { PieChartBase, PieChartData } from './PieChartBase';\n\nexport type PieChartPanelProps = PanelProps<PieChartOptions, TimeSeriesData>;\n\nexport function PieChartPanel(props: PieChartPanelProps): ReactElement | null {\n const {\n spec: { calculation, sort, mode, legend: pieChartLegend },\n contentDimensions,\n queryResults,\n } = props;\n const chartsTheme = useChartsTheme();\n const muiTheme = useTheme();\n const PADDING = chartsTheme.container.padding.default;\n const chartId = useId('time-series-panel');\n const categoricalPalette = chartsTheme.echartsTheme.color;\n\n const { pieChartData, legendItems, legendColumns } = useMemo(() => {\n const calculate = CalculationsMap[calculation as CalculationType];\n const pieChartData: PieChartData[] = [];\n const legendItems: LegendItem[] = [];\n const legendColumns: Array<TableColumnConfig<LegendItem>> = [];\n\n for (let queryIndex = 0; queryIndex < queryResults.length; queryIndex++) {\n const result = queryResults[queryIndex];\n\n let seriesIndex = 0;\n for (const seriesData of result?.data.series ?? []) {\n const seriesColor = getSeriesColor({\n categoricalPalette: categoricalPalette as string[],\n muiPrimaryColor: muiTheme.palette.primary.main,\n seriesName: seriesData.name,\n });\n\n const seriesId = `${chartId}${seriesData.name}${seriesIndex}`;\n\n const series = {\n id: seriesId,\n value: calculate(seriesData.values) ?? null,\n name: seriesData.formattedName ?? '',\n itemStyle: {\n color: seriesColor,\n },\n };\n pieChartData.push(series);\n\n legendItems.push({\n id: seriesId,\n label: series.name,\n color: seriesColor,\n data: {},\n });\n seriesIndex++;\n }\n }\n\n const sortedPieChartData = sortSeriesData(pieChartData, sort);\n\n if (pieChartLegend?.values?.length && pieChartLegend?.mode === 'table') {\n const { values } = pieChartLegend;\n [...values].sort().forEach((v) => {\n /* First, create a column for the current legend value */\n legendColumns.push({\n accessorKey: `data.${v}`,\n header: comparisonLegends[v as ComparisonValues]?.label || v,\n headerDescription: comparisonLegends[v as ComparisonValues]?.description,\n width: 90,\n align: 'right',\n cellDescription: true,\n enableSorting: true,\n });\n /* Then, settle the legend items related to this legend value */\n switch (v) {\n case 'abs':\n legendItems.forEach((li) => {\n const { value: itemAbsoluteValue } = pieChartData.find((pd) => li.id === pd.id) || {};\n if (typeof itemAbsoluteValue === 'number' && li.data) {\n li.data['abs'] = itemAbsoluteValue;\n }\n });\n break;\n case 'relative':\n legendItems.forEach((li) => {\n const { value: itemPercentageValue } =\n calculatePercentages(sortedPieChartData).find((ppd) => li.id === ppd.id) || {};\n if (typeof itemPercentageValue === 'number' && li.data) {\n li.data['relative'] = `${itemPercentageValue.toFixed(2)}%`;\n }\n });\n break;\n default:\n break;\n }\n });\n }\n\n return {\n pieChartData: mode === 'percentage' ? calculatePercentages(sortedPieChartData) : sortedPieChartData,\n legendItems,\n legendColumns,\n };\n }, [\n calculation,\n sort,\n mode,\n queryResults,\n categoricalPalette,\n muiTheme.palette.primary.main,\n chartId,\n pieChartLegend,\n ]);\n\n const contentPadding = chartsTheme.container.padding.default;\n const adjustedContentDimensions: typeof contentDimensions = contentDimensions\n ? {\n width: contentDimensions.width - contentPadding * 2,\n height: contentDimensions.height - contentPadding * 2,\n }\n : undefined;\n\n const legend = useMemo(() => {\n return props.spec.legend && validateLegendSpec(props.spec.legend)\n ? merge({}, DEFAULT_LEGEND, props.spec.legend)\n : undefined;\n }, [props.spec.legend]);\n\n const [selectedLegendItems, setSelectedLegendItems] = useState<SelectedLegendItemState>('ALL');\n\n const [legendSorting, setLegendSorting] = useState<NonNullable<LegendProps['tableProps']>['sorting']>();\n\n const chartRef = useRef<ChartInstance>(null);\n\n // ensures there are fallbacks for unset properties since most\n // users should not need to customize visual display\n\n if (!contentDimensions) return null;\n\n return (\n <Box sx={{ padding: `${PADDING}px` }}>\n <ContentWithLegend\n width={adjustedContentDimensions?.width ?? 400}\n height={adjustedContentDimensions?.height ?? 1000}\n // Making this small enough that the medium size doesn't get\n // responsive-handling-ed away when in the panel options editor.\n minChildrenHeight={50}\n legendSize={legend?.size}\n legendProps={\n legend && {\n options: legend,\n data: legendItems,\n selectedItems: selectedLegendItems,\n onSelectedItemsChange: setSelectedLegendItems,\n tableProps: {\n columns: legendColumns,\n sorting: legendSorting,\n onSortingChange: setLegendSorting,\n },\n onItemMouseOver: (e, { id }): void => {\n chartRef.current?.highlightSeries({ name: id });\n },\n onItemMouseOut: (): void => {\n chartRef.current?.clearHighlightedSeries();\n },\n }\n }\n >\n {({ height, width }) => {\n return (\n <Box style={{ height, width }}>\n <PieChartBase\n data={pieChartData}\n width={contentDimensions.width - PADDING * 2}\n height={contentDimensions.height - PADDING * 2}\n />\n </Box>\n );\n }}\n </ContentWithLegend>\n </Box>\n );\n}\n"],"names":["Box","useTheme","ContentWithLegend","useChartsTheme","useId","CalculationsMap","DEFAULT_LEGEND","comparisonLegends","validateLegendSpec","merge","useMemo","useRef","useState","getSeriesColor","calculatePercentages","sortSeriesData","PieChartBase","PieChartPanel","props","spec","calculation","sort","mode","legend","pieChartLegend","contentDimensions","queryResults","chartsTheme","muiTheme","PADDING","container","padding","default","chartId","categoricalPalette","echartsTheme","color","pieChartData","legendItems","legendColumns","calculate","queryIndex","length","result","seriesIndex","seriesData","data","series","seriesColor","muiPrimaryColor","palette","primary","main","seriesName","name","seriesId","id","value","values","formattedName","itemStyle","push","label","sortedPieChartData","forEach","v","accessorKey","header","headerDescription","description","width","align","cellDescription","enableSorting","li","itemAbsoluteValue","find","pd","itemPercentageValue","ppd","toFixed","contentPadding","adjustedContentDimensions","height","undefined","selectedLegendItems","setSelectedLegendItems","legendSorting","setLegendSorting","chartRef","sx","minChildrenHeight","legendSize","size","legendProps","options","selectedItems","onSelectedItemsChange","tableProps","columns","sorting","onSortingChange","onItemMouseOver","e","current","highlightSeries","onItemMouseOut","clearHighlightedSeries","style"],"mappings":"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"}
@@ -68,6 +68,7 @@ function PieChartOptionsEditorSettings(props) {
68
68
  /*#__PURE__*/ (0, _jsxruntime.jsxs)(_components.OptionsEditorColumn, {
69
69
  children: [
70
70
  /*#__PURE__*/ (0, _jsxruntime.jsx)(_pluginsystem.LegendOptionsEditor, {
71
+ calculation: "comparison",
71
72
  value: value.legend,
72
73
  onChange: handleLegendChange
73
74
  }),
@@ -36,16 +36,17 @@ function _interop_require_default(obj) {
36
36
  };
37
37
  }
38
38
  function PieChartPanel(props) {
39
- const { spec: { calculation, sort, mode }, contentDimensions, queryResults } = props;
39
+ const { spec: { calculation, sort, mode, legend: pieChartLegend }, contentDimensions, queryResults } = props;
40
40
  const chartsTheme = (0, _components.useChartsTheme)();
41
41
  const muiTheme = (0, _material.useTheme)();
42
42
  const PADDING = chartsTheme.container.padding.default;
43
43
  const chartId = (0, _components.useId)('time-series-panel');
44
44
  const categoricalPalette = chartsTheme.echartsTheme.color;
45
- const { pieChartData, legendItems } = (0, _react.useMemo)(()=>{
45
+ const { pieChartData, legendItems, legendColumns } = (0, _react.useMemo)(()=>{
46
46
  const calculate = _core.CalculationsMap[calculation];
47
47
  const pieChartData = [];
48
48
  const legendItems = [];
49
+ const legendColumns = [];
49
50
  for(let queryIndex = 0; queryIndex < queryResults.length; queryIndex++){
50
51
  const result = queryResults[queryIndex];
51
52
  let seriesIndex = 0;
@@ -55,7 +56,9 @@ function PieChartPanel(props) {
55
56
  muiPrimaryColor: muiTheme.palette.primary.main,
56
57
  seriesName: seriesData.name
57
58
  });
59
+ const seriesId = `${chartId}${seriesData.name}${seriesIndex}`;
58
60
  const series = {
61
+ id: seriesId,
59
62
  value: calculate(seriesData.values) ?? null,
60
63
  name: seriesData.formattedName ?? '',
61
64
  itemStyle: {
@@ -63,25 +66,56 @@ function PieChartPanel(props) {
63
66
  }
64
67
  };
65
68
  pieChartData.push(series);
66
- const seriesId = chartId + seriesData.name + seriesIndex;
67
69
  legendItems.push({
68
70
  id: seriesId,
69
71
  label: series.name,
70
- color: seriesColor
72
+ color: seriesColor,
73
+ data: {}
71
74
  });
72
75
  seriesIndex++;
73
76
  }
74
77
  }
75
78
  const sortedPieChartData = (0, _utils.sortSeriesData)(pieChartData, sort);
76
- if (mode === 'percentage') {
77
- return {
78
- pieChartData: (0, _utils.calculatePercentages)(sortedPieChartData),
79
- legendItems
80
- };
79
+ if (pieChartLegend?.values?.length && pieChartLegend?.mode === 'table') {
80
+ const { values } = pieChartLegend;
81
+ [
82
+ ...values
83
+ ].sort().forEach((v)=>{
84
+ /* First, create a column for the current legend value */ legendColumns.push({
85
+ accessorKey: `data.${v}`,
86
+ header: _pluginsystem.comparisonLegends[v]?.label || v,
87
+ headerDescription: _pluginsystem.comparisonLegends[v]?.description,
88
+ width: 90,
89
+ align: 'right',
90
+ cellDescription: true,
91
+ enableSorting: true
92
+ });
93
+ /* Then, settle the legend items related to this legend value */ switch(v){
94
+ case 'abs':
95
+ legendItems.forEach((li)=>{
96
+ const { value: itemAbsoluteValue } = pieChartData.find((pd)=>li.id === pd.id) || {};
97
+ if (typeof itemAbsoluteValue === 'number' && li.data) {
98
+ li.data['abs'] = itemAbsoluteValue;
99
+ }
100
+ });
101
+ break;
102
+ case 'relative':
103
+ legendItems.forEach((li)=>{
104
+ const { value: itemPercentageValue } = (0, _utils.calculatePercentages)(sortedPieChartData).find((ppd)=>li.id === ppd.id) || {};
105
+ if (typeof itemPercentageValue === 'number' && li.data) {
106
+ li.data['relative'] = `${itemPercentageValue.toFixed(2)}%`;
107
+ }
108
+ });
109
+ break;
110
+ default:
111
+ break;
112
+ }
113
+ });
81
114
  }
82
115
  return {
83
- pieChartData: sortedPieChartData,
84
- legendItems
116
+ pieChartData: mode === 'percentage' ? (0, _utils.calculatePercentages)(sortedPieChartData) : sortedPieChartData,
117
+ legendItems,
118
+ legendColumns
85
119
  };
86
120
  }, [
87
121
  calculation,
@@ -90,7 +124,8 @@ function PieChartPanel(props) {
90
124
  queryResults,
91
125
  categoricalPalette,
92
126
  muiTheme.palette.primary.main,
93
- chartId
127
+ chartId,
128
+ pieChartLegend
94
129
  ]);
95
130
  const contentPadding = chartsTheme.container.padding.default;
96
131
  const adjustedContentDimensions = contentDimensions ? {
@@ -107,7 +142,7 @@ function PieChartPanel(props) {
107
142
  const chartRef = (0, _react.useRef)(null);
108
143
  // ensures there are fallbacks for unset properties since most
109
144
  // users should not need to customize visual display
110
- if (contentDimensions === undefined) return null;
145
+ if (!contentDimensions) return null;
111
146
  return /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.Box, {
112
147
  sx: {
113
148
  padding: `${PADDING}px`
@@ -125,7 +160,7 @@ function PieChartPanel(props) {
125
160
  selectedItems: selectedLegendItems,
126
161
  onSelectedItemsChange: setSelectedLegendItems,
127
162
  tableProps: {
128
- columns: [],
163
+ columns: legendColumns,
129
164
  sorting: legendSorting,
130
165
  onSortingChange: setLegendSorting
131
166
  },
package/lib/utils.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { SortOption } from '@perses-dev/components';
2
2
  import { PieChartData } from './PieChartBase';
3
3
  export declare function calculatePercentages(data: PieChartData[]): Array<{
4
+ id?: string;
4
5
  name: string;
5
6
  value: number;
6
7
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CASjG;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,SAAS,GAAE,UAAyB,GAAG,YAAY,EAAE,CA8BzG"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAS9G;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,SAAS,GAAE,UAAyB,GAAG,YAAY,EAAE,CA8BzG"}
package/lib/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils.ts"],"sourcesContent":["// Copyright 2024 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 { SortOption } from '@perses-dev/components';\nimport { DEFAULT_SORT } from './pie-chart-model';\nimport { PieChartData } from './PieChartBase';\n\nexport function calculatePercentages(data: PieChartData[]): Array<{ name: string; value: number }> {\n const sum = data.reduce((accumulator, { value }) => accumulator + (value ?? 0), 0);\n return data.map((seriesData) => {\n const percentage = ((seriesData.value ?? 0) / sum) * 100;\n return {\n ...seriesData,\n value: percentage,\n };\n });\n}\n\nexport function sortSeriesData(data: PieChartData[], sortOrder: SortOption = DEFAULT_SORT): PieChartData[] {\n if (sortOrder === 'asc') {\n // sort in ascending order by value\n return data.sort((a, b) => {\n if (a.value === null) {\n return 1;\n }\n if (b.value === null) {\n return -1;\n }\n if (a.value === b.value) {\n return 0;\n }\n return a.value < b.value ? 1 : -1;\n });\n } else {\n // sort in descending order by value\n return data.sort((a, b) => {\n if (a.value === null) {\n return -1;\n }\n if (b.value === null) {\n return 1;\n }\n if (a.value === b.value) {\n return 0;\n }\n return a.value < b.value ? -1 : 1;\n });\n }\n}\n"],"names":["DEFAULT_SORT","calculatePercentages","data","sum","reduce","accumulator","value","map","seriesData","percentage","sortSeriesData","sortOrder","sort","a","b"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAGjC,SAASA,YAAY,QAAQ,oBAAoB;AAGjD,OAAO,SAASC,qBAAqBC,IAAoB;IACvD,MAAMC,MAAMD,KAAKE,MAAM,CAAC,CAACC,aAAa,EAAEC,KAAK,EAAE,GAAKD,cAAeC,CAAAA,SAAS,CAAA,GAAI;IAChF,OAAOJ,KAAKK,GAAG,CAAC,CAACC;QACf,MAAMC,aAAa,AAAED,CAAAA,WAAWF,KAAK,IAAI,CAAA,IAAKH,MAAO;QACrD,OAAO;YACL,GAAGK,UAAU;YACbF,OAAOG;QACT;IACF;AACF;AAEA,OAAO,SAASC,eAAeR,IAAoB,EAAES,YAAwBX,YAAY;IACvF,IAAIW,cAAc,OAAO;QACvB,mCAAmC;QACnC,OAAOT,KAAKU,IAAI,CAAC,CAACC,GAAGC;YACnB,IAAID,EAAEP,KAAK,KAAK,MAAM;gBACpB,OAAO;YACT;YACA,IAAIQ,EAAER,KAAK,KAAK,MAAM;gBACpB,OAAO,CAAC;YACV;YACA,IAAIO,EAAEP,KAAK,KAAKQ,EAAER,KAAK,EAAE;gBACvB,OAAO;YACT;YACA,OAAOO,EAAEP,KAAK,GAAGQ,EAAER,KAAK,GAAG,IAAI,CAAC;QAClC;IACF,OAAO;QACL,oCAAoC;QACpC,OAAOJ,KAAKU,IAAI,CAAC,CAACC,GAAGC;YACnB,IAAID,EAAEP,KAAK,KAAK,MAAM;gBACpB,OAAO,CAAC;YACV;YACA,IAAIQ,EAAER,KAAK,KAAK,MAAM;gBACpB,OAAO;YACT;YACA,IAAIO,EAAEP,KAAK,KAAKQ,EAAER,KAAK,EAAE;gBACvB,OAAO;YACT;YACA,OAAOO,EAAEP,KAAK,GAAGQ,EAAER,KAAK,GAAG,CAAC,IAAI;QAClC;IACF;AACF"}
1
+ {"version":3,"sources":["../../src/utils.ts"],"sourcesContent":["// Copyright 2024 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 { SortOption } from '@perses-dev/components';\nimport { DEFAULT_SORT } from './pie-chart-model';\nimport { PieChartData } from './PieChartBase';\n\nexport function calculatePercentages(data: PieChartData[]): Array<{ id?: string; name: string; value: number }> {\n const sum = data.reduce((accumulator, { value }) => accumulator + (value ?? 0), 0);\n return data.map((seriesData) => {\n const percentage = ((seriesData.value ?? 0) / sum) * 100;\n return {\n ...seriesData,\n value: percentage,\n };\n });\n}\n\nexport function sortSeriesData(data: PieChartData[], sortOrder: SortOption = DEFAULT_SORT): PieChartData[] {\n if (sortOrder === 'asc') {\n // sort in ascending order by value\n return data.sort((a, b) => {\n if (a.value === null) {\n return 1;\n }\n if (b.value === null) {\n return -1;\n }\n if (a.value === b.value) {\n return 0;\n }\n return a.value < b.value ? 1 : -1;\n });\n } else {\n // sort in descending order by value\n return data.sort((a, b) => {\n if (a.value === null) {\n return -1;\n }\n if (b.value === null) {\n return 1;\n }\n if (a.value === b.value) {\n return 0;\n }\n return a.value < b.value ? -1 : 1;\n });\n }\n}\n"],"names":["DEFAULT_SORT","calculatePercentages","data","sum","reduce","accumulator","value","map","seriesData","percentage","sortSeriesData","sortOrder","sort","a","b"],"mappings":"AAAA,oCAAoC;AACpC,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAGjC,SAASA,YAAY,QAAQ,oBAAoB;AAGjD,OAAO,SAASC,qBAAqBC,IAAoB;IACvD,MAAMC,MAAMD,KAAKE,MAAM,CAAC,CAACC,aAAa,EAAEC,KAAK,EAAE,GAAKD,cAAeC,CAAAA,SAAS,CAAA,GAAI;IAChF,OAAOJ,KAAKK,GAAG,CAAC,CAACC;QACf,MAAMC,aAAa,AAAED,CAAAA,WAAWF,KAAK,IAAI,CAAA,IAAKH,MAAO;QACrD,OAAO;YACL,GAAGK,UAAU;YACbF,OAAOG;QACT;IACF;AACF;AAEA,OAAO,SAASC,eAAeR,IAAoB,EAAES,YAAwBX,YAAY;IACvF,IAAIW,cAAc,OAAO;QACvB,mCAAmC;QACnC,OAAOT,KAAKU,IAAI,CAAC,CAACC,GAAGC;YACnB,IAAID,EAAEP,KAAK,KAAK,MAAM;gBACpB,OAAO;YACT;YACA,IAAIQ,EAAER,KAAK,KAAK,MAAM;gBACpB,OAAO,CAAC;YACV;YACA,IAAIO,EAAEP,KAAK,KAAKQ,EAAER,KAAK,EAAE;gBACvB,OAAO;YACT;YACA,OAAOO,EAAEP,KAAK,GAAGQ,EAAER,KAAK,GAAG,IAAI,CAAC;QAClC;IACF,OAAO;QACL,oCAAoC;QACpC,OAAOJ,KAAKU,IAAI,CAAC,CAACC,GAAGC;YACnB,IAAID,EAAEP,KAAK,KAAK,MAAM;gBACpB,OAAO,CAAC;YACV;YACA,IAAIQ,EAAER,KAAK,KAAK,MAAM;gBACpB,OAAO;YACT;YACA,IAAIO,EAAEP,KAAK,KAAKQ,EAAER,KAAK,EAAE;gBACvB,OAAO;YACT;YACA,OAAOO,EAAEP,KAAK,GAAGQ,EAAER,KAAK,GAAG,CAAC,IAAI;QAClC;IACF;AACF"}
package/mf-manifest.json CHANGED
@@ -5,11 +5,11 @@
5
5
  "name": "PieChart",
6
6
  "type": "app",
7
7
  "buildInfo": {
8
- "buildVersion": "0.8.1",
8
+ "buildVersion": "0.9.0",
9
9
  "buildName": "@perses-dev/pie-chart-plugin"
10
10
  },
11
11
  "remoteEntry": {
12
- "name": "__mf/js/PieChart.a1d90662.js",
12
+ "name": "__mf/js/PieChart.4c358ac5.js",
13
13
  "path": "",
14
14
  "type": "global"
15
15
  },
@@ -20,7 +20,7 @@
20
20
  "api": ""
21
21
  },
22
22
  "globalName": "PieChart",
23
- "pluginVersion": "0.11.2",
23
+ "pluginVersion": "0.18.1",
24
24
  "prefetchInterface": false,
25
25
  "publicPath": "/plugins/PieChart/"
26
26
  },
@@ -33,11 +33,9 @@
33
33
  "requiredVersion": "^11.11.3",
34
34
  "assets": {
35
35
  "js": {
36
- "async": [
37
- "__mf/js/async/964.6df60c3e.js"
38
- ],
36
+ "async": [],
39
37
  "sync": [
40
- "__mf/js/async/960.208437e1.js"
38
+ "__mf/js/async/960.021d7634.js"
41
39
  ]
42
40
  },
43
41
  "css": {
@@ -54,13 +52,10 @@
54
52
  "requiredVersion": "^11.14.0",
55
53
  "assets": {
56
54
  "js": {
57
- "async": [
58
- "__mf/js/async/964.6df60c3e.js",
59
- "__mf/js/async/960.208437e1.js"
60
- ],
55
+ "async": [],
61
56
  "sync": [
62
- "__mf/js/async/694.b227b636.js",
63
- "__mf/js/async/770.93415255.js"
57
+ "__mf/js/async/694.011b21e8.js",
58
+ "__mf/js/async/770.73dda090.js"
64
59
  ]
65
60
  },
66
61
  "css": {
@@ -77,12 +72,10 @@
77
72
  "requiredVersion": "^3.10.0",
78
73
  "assets": {
79
74
  "js": {
80
- "async": [
81
- "__mf/js/async/964.6df60c3e.js"
82
- ],
75
+ "async": [],
83
76
  "sync": [
84
- "__mf/js/async/214.df2e7807.js",
85
- "__mf/js/async/738.4ac98841.js"
77
+ "__mf/js/async/214.a7648318.js",
78
+ "__mf/js/async/738.5a36e399.js"
86
79
  ]
87
80
  },
88
81
  "css": {
@@ -94,21 +87,14 @@
94
87
  {
95
88
  "id": "PieChart:@perses-dev/components",
96
89
  "name": "@perses-dev/components",
97
- "version": "0.51.0-rc.1",
90
+ "version": "0.52.0-beta.5",
98
91
  "singleton": true,
99
- "requiredVersion": "^0.51.0-rc.1",
92
+ "requiredVersion": "^0.52.0-beta.5",
100
93
  "assets": {
101
94
  "js": {
102
- "async": [
103
- "__mf/js/async/964.6df60c3e.js",
104
- "__mf/js/async/173.ee70b493.js",
105
- "__mf/js/async/960.208437e1.js",
106
- "__mf/js/async/770.93415255.js",
107
- "__mf/js/async/75.905151a5.js",
108
- "__mf/js/async/740.b86dfa00.js"
109
- ],
95
+ "async": [],
110
96
  "sync": [
111
- "__mf/js/async/530.f071fc6b.js"
97
+ "__mf/js/async/358.76279409.js"
112
98
  ]
113
99
  },
114
100
  "css": {
@@ -120,36 +106,18 @@
120
106
  {
121
107
  "id": "PieChart:@perses-dev/plugin-system",
122
108
  "name": "@perses-dev/plugin-system",
123
- "version": "0.51.0-rc.1",
109
+ "version": "0.52.0-beta.5",
124
110
  "singleton": true,
125
- "requiredVersion": "^0.51.0-rc.1",
111
+ "requiredVersion": "^0.52.0-beta.5",
126
112
  "assets": {
127
113
  "js": {
128
- "async": [
129
- "__mf/js/async/964.6df60c3e.js",
130
- "__mf/js/async/173.ee70b493.js",
131
- "__mf/js/async/960.208437e1.js",
132
- "__mf/js/async/770.93415255.js",
133
- "__mf/js/async/238.5287310b.js",
134
- "__mf/js/async/224.dbeed4db.js",
135
- "__mf/js/async/75.905151a5.js",
136
- "__mf/js/async/740.b86dfa00.js",
137
- "__mf/js/async/470.be19e17e.js",
138
- "__mf/js/async/105.7a85ee04.js",
139
- "__mf/js/async/530.f071fc6b.js",
140
- "__mf/js/async/331.067ac3da.js",
141
- "__mf/js/async/738.4ac98841.js",
142
- "__mf/js/async/503.28e7e4f1.js",
143
- "__mf/js/async/981.3ecbf5ea.js"
144
- ],
114
+ "async": [],
145
115
  "sync": [
146
- "__mf/js/async/845.1b2e72ed.js"
116
+ "__mf/js/async/109.9a84a1ac.js"
147
117
  ]
148
118
  },
149
119
  "css": {
150
- "async": [
151
- "__mf/css/async/263.80005a4a.css"
152
- ],
120
+ "async": [],
153
121
  "sync": []
154
122
  }
155
123
  }
@@ -164,7 +132,7 @@
164
132
  "js": {
165
133
  "async": [],
166
134
  "sync": [
167
- "__mf/js/async/75.905151a5.js"
135
+ "__mf/js/async/75.a825d10b.js"
168
136
  ]
169
137
  },
170
138
  "css": {
@@ -183,7 +151,7 @@
183
151
  "js": {
184
152
  "async": [],
185
153
  "sync": [
186
- "__mf/js/async/503.28e7e4f1.js"
154
+ "__mf/js/async/409.9c48d616.js"
187
155
  ]
188
156
  },
189
157
  "css": {
@@ -202,7 +170,7 @@
202
170
  "js": {
203
171
  "async": [],
204
172
  "sync": [
205
- "__mf/js/async/981.3ecbf5ea.js"
173
+ "__mf/js/async/981.e6f0d188.js"
206
174
  ]
207
175
  },
208
176
  "css": {
@@ -219,11 +187,9 @@
219
187
  "requiredVersion": "18.2.0",
220
188
  "assets": {
221
189
  "js": {
222
- "async": [
223
- "__mf/js/async/964.6df60c3e.js"
224
- ],
190
+ "async": [],
225
191
  "sync": [
226
- "__mf/js/async/173.ee70b493.js"
192
+ "__mf/js/async/173.c694e6f7.js"
227
193
  ]
228
194
  },
229
195
  "css": {
@@ -242,7 +208,7 @@
242
208
  "js": {
243
209
  "async": [],
244
210
  "sync": [
245
- "__mf/js/async/964.6df60c3e.js"
211
+ "__mf/js/async/964.7fdfdfd5.js"
246
212
  ]
247
213
  },
248
214
  "css": {
@@ -259,12 +225,9 @@
259
225
  "requiredVersion": "^3.2.0",
260
226
  "assets": {
261
227
  "js": {
262
- "async": [
263
- "__mf/js/async/238.5287310b.js",
264
- "__mf/js/async/75.905151a5.js"
265
- ],
228
+ "async": [],
266
229
  "sync": [
267
- "__mf/js/async/740.b86dfa00.js"
230
+ "__mf/js/async/740.254a5697.js"
268
231
  ]
269
232
  },
270
233
  "css": {
@@ -282,31 +245,20 @@
282
245
  "assets": {
283
246
  "js": {
284
247
  "sync": [
285
- "__mf/js/async/470.be19e17e.js",
286
- "__mf/js/async/973.74031340.js",
287
- "__mf/js/async/331.067ac3da.js",
288
- "__mf/js/async/707.55fda5d1.js",
289
- "__mf/js/async/__federation_expose_PieChart.869001bb.js"
248
+ "__mf/js/async/470.1e913aa7.js",
249
+ "__mf/js/async/680.f1da299d.js",
250
+ "__mf/js/async/298.707087d2.js",
251
+ "__mf/js/async/707.c77cb775.js",
252
+ "__mf/js/async/__federation_expose_PieChart.f4937330.js"
290
253
  ],
291
254
  "async": [
292
- "__mf/js/async/964.6df60c3e.js",
293
- "__mf/js/async/960.208437e1.js",
294
- "__mf/js/async/770.93415255.js",
295
- "__mf/js/async/lib-router.d29f3ef0.js",
296
- "__mf/js/async/292.f278784e.js",
297
- "__mf/js/async/925.92a059f1.js",
298
- "__mf/js/async/845.1b2e72ed.js",
299
- "__mf/js/async/488.0fc5dcbb.js",
300
- "__mf/js/async/238.5287310b.js",
301
- "__mf/js/async/224.dbeed4db.js",
302
- "__mf/js/async/105.7a85ee04.js",
303
- "__mf/js/async/530.f071fc6b.js",
304
- "__mf/js/async/738.4ac98841.js",
305
- "__mf/js/async/173.ee70b493.js",
306
- "__mf/js/async/75.905151a5.js",
307
- "__mf/js/async/503.28e7e4f1.js",
308
- "__mf/js/async/740.b86dfa00.js",
309
- "__mf/js/async/981.3ecbf5ea.js"
255
+ "__mf/js/async/lib-router.5205dc27.js",
256
+ "__mf/js/async/292.67519c5b.js",
257
+ "__mf/js/async/618.544e0c46.js",
258
+ "__mf/js/async/488.a0bde6cf.js",
259
+ "__mf/js/async/238.3e689a99.js",
260
+ "__mf/js/async/224.43460380.js",
261
+ "__mf/js/async/708.77a1c1f6.js"
310
262
  ]
311
263
  },
312
264
  "css": {