@perses-dev/pie-chart-plugin 0.9.1 → 0.12.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 (83) hide show
  1. package/__mf/css/async/263.d3010b86.css +1 -0
  2. package/__mf/css/async/341.d3010b86.css +1 -0
  3. package/__mf/css/async/759.d3010b86.css +1 -0
  4. package/__mf/js/{PieChart.684c09d1.js → PieChart.1d58bffe.js} +3 -3
  5. package/__mf/js/async/156.1cf9ec35.js +1 -0
  6. package/__mf/js/async/264.6e9f3f27.js +110 -0
  7. package/__mf/js/async/298.e575048a.js +1 -0
  8. package/__mf/js/async/398.9b0b9c83.js +1 -0
  9. package/__mf/js/async/567.672f2dce.js +2 -0
  10. package/__mf/js/async/706.3e6ace36.js +38 -0
  11. package/__mf/js/async/711.2e914849.js +22 -0
  12. package/__mf/js/async/{75.a825d10b.js → 75.b6a33f75.js} +1 -1
  13. package/__mf/js/async/922.560b8115.js +7 -0
  14. package/__mf/js/async/__federation_expose_PieChart.6ae68990.js +1 -0
  15. package/__mf/js/{main.b15063c5.js → main.efe2355f.js} +3 -3
  16. package/lib/PieChartBase.d.ts +1 -2
  17. package/lib/PieChartBase.d.ts.map +1 -1
  18. package/lib/PieChartBase.js +26 -25
  19. package/lib/PieChartBase.js.map +1 -1
  20. package/lib/PieChartOptionsEditorSettings.d.ts.map +1 -1
  21. package/lib/PieChartOptionsEditorSettings.js +144 -17
  22. package/lib/PieChartOptionsEditorSettings.js.map +1 -1
  23. package/lib/PieChartPanel.d.ts.map +1 -1
  24. package/lib/PieChartPanel.js +36 -27
  25. package/lib/PieChartPanel.js.map +1 -1
  26. package/lib/cjs/PieChartBase.js +24 -23
  27. package/lib/cjs/PieChartOptionsEditorSettings.js +142 -15
  28. package/lib/cjs/PieChartPanel.js +35 -26
  29. package/lib/cjs/colors.js +207 -0
  30. package/lib/cjs/index.js +2 -4
  31. package/lib/cjs/pie-chart-model.js +3 -2
  32. package/lib/cjs/utils.js +10 -30
  33. package/lib/colors.d.ts +38 -0
  34. package/lib/colors.d.ts.map +1 -0
  35. package/lib/colors.js +192 -0
  36. package/lib/colors.js.map +1 -0
  37. package/lib/index.d.ts +2 -4
  38. package/lib/index.d.ts.map +1 -1
  39. package/lib/index.js +2 -4
  40. package/lib/index.js.map +1 -1
  41. package/lib/pie-chart-model.d.ts +5 -3
  42. package/lib/pie-chart-model.d.ts.map +1 -1
  43. package/lib/pie-chart-model.js +3 -2
  44. package/lib/pie-chart-model.js.map +1 -1
  45. package/lib/utils.d.ts.map +1 -1
  46. package/lib/utils.js +10 -30
  47. package/lib/utils.js.map +1 -1
  48. package/mf-manifest.json +22 -42
  49. package/mf-stats.json +22 -45
  50. package/package.json +5 -5
  51. package/__mf/css/async/263.80005a4a.css +0 -1
  52. package/__mf/css/async/341.80005a4a.css +0 -1
  53. package/__mf/css/async/759.80005a4a.css +0 -1
  54. package/__mf/js/async/109.77dcc7d9.js +0 -73
  55. package/__mf/js/async/224.43460380.js +0 -1
  56. package/__mf/js/async/238.3e689a99.js +0 -1
  57. package/__mf/js/async/288.4cad0403.js +0 -7
  58. package/__mf/js/async/289.c295f73f.js +0 -38
  59. package/__mf/js/async/298.707087d2.js +0 -1
  60. package/__mf/js/async/470.1e913aa7.js +0 -2
  61. package/__mf/js/async/680.f1da299d.js +0 -110
  62. package/__mf/js/async/708.77a1c1f6.js +0 -1
  63. package/__mf/js/async/740.254a5697.js +0 -1
  64. package/__mf/js/async/__federation_expose_PieChart.3d887a98.js +0 -1
  65. package/lib/cjs/model.js +0 -16
  66. package/lib/cjs/palette-gen.js +0 -63
  67. package/lib/cjs/palette.js +0 -83
  68. package/lib/model.d.ts +0 -20
  69. package/lib/model.d.ts.map +0 -1
  70. package/lib/model.js +0 -15
  71. package/lib/model.js.map +0 -1
  72. package/lib/palette-gen.d.ts +0 -20
  73. package/lib/palette-gen.d.ts.map +0 -1
  74. package/lib/palette-gen.js +0 -50
  75. package/lib/palette-gen.js.map +0 -1
  76. package/lib/palette.d.ts +0 -6
  77. package/lib/palette.d.ts.map +0 -1
  78. package/lib/palette.js +0 -64
  79. package/lib/palette.js.map +0 -1
  80. /package/__mf/js/async/{680.f1da299d.js.LICENSE.txt → 264.6e9f3f27.js.LICENSE.txt} +0 -0
  81. /package/__mf/js/async/{470.1e913aa7.js.LICENSE.txt → 567.672f2dce.js.LICENSE.txt} +0 -0
  82. /package/__mf/js/async/{109.77dcc7d9.js.LICENSE.txt → 711.2e914849.js.LICENSE.txt} +0 -0
  83. /package/__mf/js/async/{288.4cad0403.js.LICENSE.txt → 922.560b8115.js.LICENSE.txt} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/PieChartBase.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 { use } from 'echarts/core';\nimport { PieChart as EChartsPieChart } from 'echarts/charts';\nimport {\n GridComponent,\n DatasetComponent,\n TitleComponent,\n TooltipComponent,\n LegendComponentOption,\n} from 'echarts/components';\nimport { CanvasRenderer } from 'echarts/renderers';\nimport { Box } from '@mui/material';\nimport { ReactElement } from 'react';\nimport { EChart, useChartsTheme } from '@perses-dev/components';\n\nuse([EChartsPieChart, GridComponent, DatasetComponent, TitleComponent, TooltipComponent, CanvasRenderer]);\n\nconst PIE_WIN_WIDTH = 12;\nconst PIE_GAP = 4;\nexport interface PieChartData {\n id?: string;\n name: string;\n value: number | null;\n}\n\nexport interface PieChartBaseProps {\n width: number;\n height: number;\n data: PieChartData[] | null;\n legend?: LegendComponentOption;\n}\n\nexport function PieChartBase(props: PieChartBaseProps): ReactElement {\n const { width, height, data } = props;\n const chartsTheme = useChartsTheme();\n\n const option = {\n title: {\n text: 'Referer of a Website',\n subtext: 'Fake Data',\n left: 'center',\n },\n tooltip: {\n trigger: 'item',\n formatter: '{b} : {c} ({d}%)',\n },\n axisLabel: {\n overflow: 'truncate',\n width: width / 3,\n },\n series: [\n {\n type: 'pie',\n radius: '55%',\n label: false,\n center: ['40%', '50%'],\n data: data,\n emphasis: {\n itemStyle: {\n shadowBlur: 10,\n shadowOffsetX: 0,\n shadowColor: 'rgba(0, 0, 0, 0.5)',\n },\n },\n },\n ],\n itemStyle: {\n borderRadius: 2,\n color: chartsTheme.echartsTheme[0],\n },\n };\n\n return (\n <Box\n style={{\n width: width,\n height: height,\n }}\n sx={{ overflow: 'auto' }}\n >\n <EChart\n sx={{\n minHeight: height,\n height: data ? data.length * (PIE_WIN_WIDTH + PIE_GAP) : '100%',\n }}\n option={option}\n theme={chartsTheme.echartsTheme}\n />\n </Box>\n );\n}\n"],"names":["use","PieChart","EChartsPieChart","GridComponent","DatasetComponent","TitleComponent","TooltipComponent","CanvasRenderer","Box","EChart","useChartsTheme","PIE_WIN_WIDTH","PIE_GAP","PieChartBase","props","width","height","data","chartsTheme","option","title","text","subtext","left","tooltip","trigger","formatter","axisLabel","overflow","series","type","radius","label","center","emphasis","itemStyle","shadowBlur","shadowOffsetX","shadowColor","borderRadius","color","echartsTheme","style","sx","minHeight","length","theme"],"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;;AAEjC,SAASA,GAAG,QAAQ,eAAe;AACnC,SAASC,YAAYC,eAAe,QAAQ,iBAAiB;AAC7D,SACEC,aAAa,EACbC,gBAAgB,EAChBC,cAAc,EACdC,gBAAgB,QAEX,qBAAqB;AAC5B,SAASC,cAAc,QAAQ,oBAAoB;AACnD,SAASC,GAAG,QAAQ,gBAAgB;AAEpC,SAASC,MAAM,EAAEC,cAAc,QAAQ,yBAAyB;AAEhEV,IAAI;IAACE;IAAiBC;IAAeC;IAAkBC;IAAgBC;IAAkBC;CAAe;AAExG,MAAMI,gBAAgB;AACtB,MAAMC,UAAU;AAchB,OAAO,SAASC,aAAaC,KAAwB;IACnD,MAAM,EAAEC,KAAK,EAAEC,MAAM,EAAEC,IAAI,EAAE,GAAGH;IAChC,MAAMI,cAAcR;IAEpB,MAAMS,SAAS;QACbC,OAAO;YACLC,MAAM;YACNC,SAAS;YACTC,MAAM;QACR;QACAC,SAAS;YACPC,SAAS;YACTC,WAAW;QACb;QACAC,WAAW;YACTC,UAAU;YACVb,OAAOA,QAAQ;QACjB;QACAc,QAAQ;YACN;gBACEC,MAAM;gBACNC,QAAQ;gBACRC,OAAO;gBACPC,QAAQ;oBAAC;oBAAO;iBAAM;gBACtBhB,MAAMA;gBACNiB,UAAU;oBACRC,WAAW;wBACTC,YAAY;wBACZC,eAAe;wBACfC,aAAa;oBACf;gBACF;YACF;SACD;QACDH,WAAW;YACTI,cAAc;YACdC,OAAOtB,YAAYuB,YAAY,CAAC,EAAE;QACpC;IACF;IAEA,qBACE,KAACjC;QACCkC,OAAO;YACL3B,OAAOA;YACPC,QAAQA;QACV;QACA2B,IAAI;YAAEf,UAAU;QAAO;kBAEvB,cAAA,KAACnB;YACCkC,IAAI;gBACFC,WAAW5B;gBACXA,QAAQC,OAAOA,KAAK4B,MAAM,GAAIlC,CAAAA,gBAAgBC,OAAM,IAAK;YAC3D;YACAO,QAAQA;YACR2B,OAAO5B,YAAYuB,YAAY;;;AAIvC"}
1
+ {"version":3,"sources":["../../src/PieChartBase.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 { use } from 'echarts/core';\nimport { PieChart as EChartsPieChart } from 'echarts/charts';\nimport { GridComponent, DatasetComponent, TitleComponent, TooltipComponent, LegendComponent } from 'echarts/components';\nimport { CanvasRenderer } from 'echarts/renderers';\nimport { Box, useTheme } from '@mui/material';\nimport { ReactElement } from 'react';\nimport { EChart, useChartsTheme } from '@perses-dev/components';\n\nuse([\n EChartsPieChart,\n GridComponent,\n DatasetComponent,\n TitleComponent,\n TooltipComponent,\n LegendComponent,\n CanvasRenderer,\n]);\nexport interface PieChartData {\n id?: string;\n name: string;\n value: number | null;\n}\n\nexport interface PieChartBaseProps {\n width: number;\n height: number;\n data: PieChartData[] | null;\n showLabels?: boolean;\n}\n\nexport function PieChartBase(props: PieChartBaseProps): ReactElement {\n const { width, height, data, showLabels } = props;\n const chartsTheme = useChartsTheme();\n const muiTheme = useTheme();\n\n const option = {\n tooltip: {\n trigger: 'item',\n formatter: '{b}: {c} ({d}%)',\n appendTo: document.body,\n confine: false,\n },\n series: [\n {\n type: 'pie',\n radius: '90%',\n label: {\n show: Boolean(showLabels),\n position: 'inner',\n fontSize: 14,\n formatter: '{b}\\n{c}',\n overflow: 'truncate',\n fontWeight: 'bold',\n },\n center: ['50%', '50%'],\n data: data,\n emphasis: {\n itemStyle: {\n shadowBlur: 10,\n shadowOffsetX: 0,\n shadowColor: 'rgba(0, 0, 0, 0.5)',\n },\n },\n itemStyle: {\n borderRadius: 5,\n borderColor: muiTheme.palette.background.default,\n borderWidth: 2,\n },\n },\n ],\n };\n\n return (\n <Box\n style={{\n width: width,\n height: height,\n }}\n sx={{ overflow: 'auto' }}\n >\n <EChart\n sx={{\n width: '100%',\n height: '100%',\n }}\n option={option}\n theme={chartsTheme.echartsTheme}\n />\n </Box>\n );\n}\n"],"names":["use","PieChart","EChartsPieChart","GridComponent","DatasetComponent","TitleComponent","TooltipComponent","LegendComponent","CanvasRenderer","Box","useTheme","EChart","useChartsTheme","PieChartBase","props","width","height","data","showLabels","chartsTheme","muiTheme","option","tooltip","trigger","formatter","appendTo","document","body","confine","series","type","radius","label","show","Boolean","position","fontSize","overflow","fontWeight","center","emphasis","itemStyle","shadowBlur","shadowOffsetX","shadowColor","borderRadius","borderColor","palette","background","default","borderWidth","style","sx","theme","echartsTheme"],"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;;AAEjC,SAASA,GAAG,QAAQ,eAAe;AACnC,SAASC,YAAYC,eAAe,QAAQ,iBAAiB;AAC7D,SAASC,aAAa,EAAEC,gBAAgB,EAAEC,cAAc,EAAEC,gBAAgB,EAAEC,eAAe,QAAQ,qBAAqB;AACxH,SAASC,cAAc,QAAQ,oBAAoB;AACnD,SAASC,GAAG,EAAEC,QAAQ,QAAQ,gBAAgB;AAE9C,SAASC,MAAM,EAAEC,cAAc,QAAQ,yBAAyB;AAEhEZ,IAAI;IACFE;IACAC;IACAC;IACAC;IACAC;IACAC;IACAC;CACD;AAcD,OAAO,SAASK,aAAaC,KAAwB;IACnD,MAAM,EAAEC,KAAK,EAAEC,MAAM,EAAEC,IAAI,EAAEC,UAAU,EAAE,GAAGJ;IAC5C,MAAMK,cAAcP;IACpB,MAAMQ,WAAWV;IAEjB,MAAMW,SAAS;QACbC,SAAS;YACPC,SAAS;YACTC,WAAW;YACXC,UAAUC,SAASC,IAAI;YACvBC,SAAS;QACX;QACAC,QAAQ;YACN;gBACEC,MAAM;gBACNC,QAAQ;gBACRC,OAAO;oBACLC,MAAMC,QAAQhB;oBACdiB,UAAU;oBACVC,UAAU;oBACVZ,WAAW;oBACXa,UAAU;oBACVC,YAAY;gBACd;gBACAC,QAAQ;oBAAC;oBAAO;iBAAM;gBACtBtB,MAAMA;gBACNuB,UAAU;oBACRC,WAAW;wBACTC,YAAY;wBACZC,eAAe;wBACfC,aAAa;oBACf;gBACF;gBACAH,WAAW;oBACTI,cAAc;oBACdC,aAAa1B,SAAS2B,OAAO,CAACC,UAAU,CAACC,OAAO;oBAChDC,aAAa;gBACf;YACF;SACD;IACH;IAEA,qBACE,KAACzC;QACC0C,OAAO;YACLpC,OAAOA;YACPC,QAAQA;QACV;QACAoC,IAAI;YAAEf,UAAU;QAAO;kBAEvB,cAAA,KAAC1B;YACCyC,IAAI;gBACFrC,OAAO;gBACPC,QAAQ;YACV;YACAK,QAAQA;YACRgC,OAAOlC,YAAYmC,YAAY;;;AAIvC"}
@@ -1 +1 @@
1
- {"version":3,"file":"PieChartOptionsEditorSettings.d.ts","sourceRoot":"","sources":["../../src/PieChartOptionsEditorSettings.tsx"],"names":[],"mappings":"AAoCA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAmB,0BAA0B,EAAkB,MAAM,mBAAmB,CAAC;AAEhG,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,0BAA0B,GAAG,YAAY,CA8E7F"}
1
+ {"version":3,"file":"PieChartOptionsEditorSettings.d.ts","sourceRoot":"","sources":["../../src/PieChartOptionsEditorSettings.tsx"],"names":[],"mappings":"AAiDA,OAAO,EAAE,YAAY,EAAW,MAAM,OAAO,CAAC;AAC9C,OAAO,EAAmB,0BAA0B,EAAkB,MAAM,mBAAmB,CAAC;AAEhG,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,0BAA0B,GAAG,YAAY,CA+K7F"}
@@ -14,9 +14,10 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
14
14
  import merge from 'lodash/merge';
15
15
  import { CalculationSelector, LegendOptionsEditor } from '@perses-dev/plugin-system';
16
16
  import { produce } from 'immer';
17
- import { FormatControls, OptionsEditorGroup, OptionsEditorGrid, OptionsEditorColumn, SortSelector, ModeSelector } from '@perses-dev/components';
17
+ import { FormatControls, OptionsColorPicker, OptionsEditorGroup, OptionsEditorGrid, OptionsEditorColumn, SortSelector, ModeSelector, OptionsEditorControl, useChartsTheme } from '@perses-dev/components';
18
18
  import { isPercentUnit } from '@perses-dev/core';
19
- import { Button } from '@mui/material';
19
+ import { Button, FormControl, InputLabel, MenuItem, Select, Stack, Switch, Typography } from '@mui/material';
20
+ import { useMemo } from 'react';
20
21
  import { DEFAULT_FORMAT } from './pie-chart-model';
21
22
  export function PieChartOptionsEditorSettings(props) {
22
23
  const { onChange, value } = props;
@@ -26,7 +27,6 @@ export function PieChartOptionsEditorSettings(props) {
26
27
  }));
27
28
  };
28
29
  const handleLegendChange = (newLegend)=>{
29
- // TODO (sjcobb): fix type, add position, fix glitch
30
30
  onChange(produce(value, (draft)=>{
31
31
  draft.legend = newLegend;
32
32
  }));
@@ -46,8 +46,68 @@ export function PieChartOptionsEditorSettings(props) {
46
46
  draft.mode = newMode;
47
47
  }));
48
48
  };
49
+ const handleShowLabelsChange = (_, checked)=>{
50
+ onChange(produce(value, (draft)=>{
51
+ draft.showLabels = checked;
52
+ }));
53
+ };
54
+ const chartsTheme = useChartsTheme();
55
+ const themePalette = chartsTheme.echartsTheme.color;
56
+ const colorPalette = useMemo(()=>{
57
+ return value.colorPalette || undefined;
58
+ }, [
59
+ value.colorPalette
60
+ ]);
61
+ const handleColorChange = (color)=>{
62
+ onChange(produce(value, (draft)=>{
63
+ if (Array.isArray(color)) {
64
+ draft.colorPalette = color;
65
+ } else if (typeof color === 'string') {
66
+ draft.colorPalette = [
67
+ color
68
+ ];
69
+ } else {
70
+ draft.colorPalette = undefined;
71
+ }
72
+ }));
73
+ };
49
74
  // ensures decimalPlaces defaults to correct value
50
75
  const format = merge({}, DEFAULT_FORMAT, value.format);
76
+ const colorScheme = useMemo(()=>{
77
+ return Array.isArray(colorPalette) ? colorPalette.length === 1 ? 'gradient' : 'theme' : 'default';
78
+ }, [
79
+ colorPalette
80
+ ]);
81
+ const handleColorSchemeChange = (scheme)=>{
82
+ if (scheme === 'theme') {
83
+ handleColorChange(themePalette);
84
+ } else if (scheme === 'default') {
85
+ handleColorChange();
86
+ } else {
87
+ // gradient: keep existing single color if present (user-chosen via OptionsColorPicker)
88
+ if (Array.isArray(colorPalette) && colorPalette.length === 1) {
89
+ return;
90
+ }
91
+ // initialize with a sensible default so the color picker shows a color
92
+ handleColorChange([
93
+ '#ff0000'
94
+ ]);
95
+ }
96
+ };
97
+ const colorHelpText = useMemo(()=>{
98
+ if (colorPalette === undefined) {
99
+ return 'Colors will be automatically assigned using metrics name hash.';
100
+ }
101
+ if (Array.isArray(colorPalette) && colorPalette.length > 1) {
102
+ return 'Colors will be automatically assigned using the current theme color palette.';
103
+ }
104
+ if (Array.isArray(colorPalette) && colorPalette.length === 1) {
105
+ return 'All series will use a gradient based on the selected color.';
106
+ }
107
+ return undefined;
108
+ }, [
109
+ colorPalette
110
+ ]);
51
111
  return /*#__PURE__*/ _jsxs(OptionsEditorGrid, {
52
112
  children: [
53
113
  /*#__PURE__*/ _jsxs(OptionsEditorColumn, {
@@ -60,6 +120,13 @@ export function PieChartOptionsEditorSettings(props) {
60
120
  /*#__PURE__*/ _jsxs(OptionsEditorGroup, {
61
121
  title: "Misc",
62
122
  children: [
123
+ /*#__PURE__*/ _jsx(OptionsEditorControl, {
124
+ label: "Show Labels",
125
+ control: /*#__PURE__*/ _jsx(Switch, {
126
+ checked: Boolean(value.showLabels),
127
+ onChange: handleShowLabelsChange
128
+ })
129
+ }),
63
130
  /*#__PURE__*/ _jsx(FormatControls, {
64
131
  value: format,
65
132
  onChange: handleUnitChange,
@@ -82,21 +149,81 @@ export function PieChartOptionsEditorSettings(props) {
82
149
  })
83
150
  ]
84
151
  }),
85
- /*#__PURE__*/ _jsx(OptionsEditorColumn, {
86
- children: /*#__PURE__*/ _jsx(OptionsEditorGroup, {
87
- title: "Reset Settings",
88
- children: /*#__PURE__*/ _jsx(Button, {
89
- variant: "outlined",
90
- color: "secondary",
91
- onClick: ()=>{
92
- onChange(produce(value, (draft)=>{
93
- // reset button removes all optional panel options
94
- draft.legend = undefined;
95
- }));
96
- },
97
- children: "Reset To Defaults"
152
+ /*#__PURE__*/ _jsxs(OptionsEditorColumn, {
153
+ children: [
154
+ /*#__PURE__*/ _jsx(OptionsEditorGroup, {
155
+ title: "Colors",
156
+ children: /*#__PURE__*/ _jsxs(Stack, {
157
+ spacing: 2,
158
+ children: [
159
+ /*#__PURE__*/ _jsxs(Stack, {
160
+ direction: "row",
161
+ spacing: 2,
162
+ alignItems: "center",
163
+ children: [
164
+ /*#__PURE__*/ _jsxs(FormControl, {
165
+ size: "small",
166
+ sx: {
167
+ minWidth: 150
168
+ },
169
+ children: [
170
+ /*#__PURE__*/ _jsx(InputLabel, {
171
+ children: "Color Scheme"
172
+ }),
173
+ /*#__PURE__*/ _jsxs(Select, {
174
+ value: colorScheme,
175
+ label: "Color Scheme",
176
+ onChange: (e)=>handleColorSchemeChange(e.target.value),
177
+ children: [
178
+ /*#__PURE__*/ _jsx(MenuItem, {
179
+ value: "default",
180
+ children: "Default"
181
+ }),
182
+ /*#__PURE__*/ _jsx(MenuItem, {
183
+ value: "theme",
184
+ children: "Theme"
185
+ }),
186
+ /*#__PURE__*/ _jsx(MenuItem, {
187
+ value: "gradient",
188
+ children: "Gradient"
189
+ })
190
+ ]
191
+ })
192
+ ]
193
+ }),
194
+ Array.isArray(colorPalette) && colorPalette.length === 1 && /*#__PURE__*/ _jsx(OptionsColorPicker, {
195
+ label: "Color",
196
+ color: colorPalette?.[0] ?? themePalette[0] ?? '#ff0000',
197
+ onColorChange: (c)=>handleColorChange([
198
+ c
199
+ ])
200
+ })
201
+ ]
202
+ }),
203
+ colorHelpText && /*#__PURE__*/ _jsx(Typography, {
204
+ variant: "body2",
205
+ color: "text.secondary",
206
+ children: colorHelpText
207
+ })
208
+ ]
209
+ })
210
+ }),
211
+ /*#__PURE__*/ _jsx(OptionsEditorGroup, {
212
+ title: "Reset Settings",
213
+ children: /*#__PURE__*/ _jsx(Button, {
214
+ variant: "outlined",
215
+ color: "secondary",
216
+ onClick: ()=>{
217
+ onChange(produce(value, (draft)=>{
218
+ // reset button removes all optional panel options
219
+ draft.legend = undefined;
220
+ draft.colorPalette = undefined;
221
+ }));
222
+ },
223
+ children: "Reset To Defaults"
224
+ })
98
225
  })
99
- })
226
+ ]
100
227
  })
101
228
  ]
102
229
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/PieChartOptionsEditorSettings.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 merge from 'lodash/merge';\nimport {\n CalculationSelector,\n CalculationSelectorProps,\n LegendOptionsEditor,\n LegendOptionsEditorProps,\n} from '@perses-dev/plugin-system';\nimport { produce } from 'immer';\nimport {\n FormatControls,\n FormatControlsProps,\n OptionsEditorGroup,\n OptionsEditorGrid,\n OptionsEditorColumn,\n SortSelector,\n SortSelectorProps,\n ModeSelector,\n ModeSelectorProps,\n ModeOption,\n SortOption,\n} from '@perses-dev/components';\nimport { CalculationType, isPercentUnit, FormatOptions } from '@perses-dev/core';\nimport { Button } from '@mui/material';\nimport { ReactElement } from 'react';\nimport { PieChartOptions, PieChartOptionsEditorProps, DEFAULT_FORMAT } from './pie-chart-model';\n\nexport function PieChartOptionsEditorSettings(props: PieChartOptionsEditorProps): ReactElement {\n const { onChange, value } = props;\n\n const handleCalculationChange: CalculationSelectorProps['onChange'] = (newCalculation: CalculationType) => {\n onChange(\n produce(value, (draft: PieChartOptions) => {\n draft.calculation = newCalculation;\n })\n );\n };\n\n const handleLegendChange: LegendOptionsEditorProps['onChange'] = (newLegend) => {\n // TODO (sjcobb): fix type, add position, fix glitch\n onChange(\n produce(value, (draft: PieChartOptions) => {\n draft.legend = newLegend;\n })\n );\n };\n\n const handleUnitChange: FormatControlsProps['onChange'] = (newFormat: FormatOptions) => {\n onChange(\n produce(value, (draft: PieChartOptions) => {\n draft.format = newFormat;\n })\n );\n };\n\n const handleSortChange: SortSelectorProps['onChange'] = (newSort: SortOption) => {\n onChange(\n produce(value, (draft: PieChartOptions) => {\n draft.sort = newSort;\n })\n );\n };\n\n const handleModeChange: ModeSelectorProps['onChange'] = (newMode: ModeOption) => {\n onChange(\n produce(value, (draft: PieChartOptions) => {\n draft.mode = newMode;\n })\n );\n };\n\n // ensures decimalPlaces defaults to correct value\n const format = merge({}, DEFAULT_FORMAT, value.format);\n\n return (\n <OptionsEditorGrid>\n <OptionsEditorColumn>\n <LegendOptionsEditor calculation=\"comparison\" value={value.legend} onChange={handleLegendChange} />\n <OptionsEditorGroup title=\"Misc\">\n <FormatControls value={format} onChange={handleUnitChange} disabled={value.mode === 'percentage'} />\n <CalculationSelector value={value.calculation} onChange={handleCalculationChange} />\n <SortSelector value={value.sort} onChange={handleSortChange} />\n <ModeSelector value={value.mode} onChange={handleModeChange} disablePercentageMode={isPercentUnit(format)} />\n </OptionsEditorGroup>\n </OptionsEditorColumn>\n <OptionsEditorColumn>\n <OptionsEditorGroup title=\"Reset Settings\">\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n onClick={() => {\n onChange(\n produce(value, (draft: PieChartOptions) => {\n // reset button removes all optional panel options\n draft.legend = undefined;\n })\n );\n }}\n >\n Reset To Defaults\n </Button>\n </OptionsEditorGroup>\n </OptionsEditorColumn>\n </OptionsEditorGrid>\n );\n}\n"],"names":["merge","CalculationSelector","LegendOptionsEditor","produce","FormatControls","OptionsEditorGroup","OptionsEditorGrid","OptionsEditorColumn","SortSelector","ModeSelector","isPercentUnit","Button","DEFAULT_FORMAT","PieChartOptionsEditorSettings","props","onChange","value","handleCalculationChange","newCalculation","draft","calculation","handleLegendChange","newLegend","legend","handleUnitChange","newFormat","format","handleSortChange","newSort","sort","handleModeChange","newMode","mode","title","disabled","disablePercentageMode","variant","color","onClick","undefined"],"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;;AAEjC,OAAOA,WAAW,eAAe;AACjC,SACEC,mBAAmB,EAEnBC,mBAAmB,QAEd,4BAA4B;AACnC,SAASC,OAAO,QAAQ,QAAQ;AAChC,SACEC,cAAc,EAEdC,kBAAkB,EAClBC,iBAAiB,EACjBC,mBAAmB,EACnBC,YAAY,EAEZC,YAAY,QAIP,yBAAyB;AAChC,SAA0BC,aAAa,QAAuB,mBAAmB;AACjF,SAASC,MAAM,QAAQ,gBAAgB;AAEvC,SAAsDC,cAAc,QAAQ,oBAAoB;AAEhG,OAAO,SAASC,8BAA8BC,KAAiC;IAC7E,MAAM,EAAEC,QAAQ,EAAEC,KAAK,EAAE,GAAGF;IAE5B,MAAMG,0BAAgE,CAACC;QACrEH,SACEZ,QAAQa,OAAO,CAACG;YACdA,MAAMC,WAAW,GAAGF;QACtB;IAEJ;IAEA,MAAMG,qBAA2D,CAACC;QAChE,oDAAoD;QACpDP,SACEZ,QAAQa,OAAO,CAACG;YACdA,MAAMI,MAAM,GAAGD;QACjB;IAEJ;IAEA,MAAME,mBAAoD,CAACC;QACzDV,SACEZ,QAAQa,OAAO,CAACG;YACdA,MAAMO,MAAM,GAAGD;QACjB;IAEJ;IAEA,MAAME,mBAAkD,CAACC;QACvDb,SACEZ,QAAQa,OAAO,CAACG;YACdA,MAAMU,IAAI,GAAGD;QACf;IAEJ;IAEA,MAAME,mBAAkD,CAACC;QACvDhB,SACEZ,QAAQa,OAAO,CAACG;YACdA,MAAMa,IAAI,GAAGD;QACf;IAEJ;IAEA,kDAAkD;IAClD,MAAML,SAAS1B,MAAM,CAAC,GAAGY,gBAAgBI,MAAMU,MAAM;IAErD,qBACE,MAACpB;;0BACC,MAACC;;kCACC,KAACL;wBAAoBkB,aAAY;wBAAaJ,OAAOA,MAAMO,MAAM;wBAAER,UAAUM;;kCAC7E,MAAChB;wBAAmB4B,OAAM;;0CACxB,KAAC7B;gCAAeY,OAAOU;gCAAQX,UAAUS;gCAAkBU,UAAUlB,MAAMgB,IAAI,KAAK;;0CACpF,KAAC/B;gCAAoBe,OAAOA,MAAMI,WAAW;gCAAEL,UAAUE;;0CACzD,KAACT;gCAAaQ,OAAOA,MAAMa,IAAI;gCAAEd,UAAUY;;0CAC3C,KAAClB;gCAAaO,OAAOA,MAAMgB,IAAI;gCAAEjB,UAAUe;gCAAkBK,uBAAuBzB,cAAcgB;;;;;;0BAGtG,KAACnB;0BACC,cAAA,KAACF;oBAAmB4B,OAAM;8BACxB,cAAA,KAACtB;wBACCyB,SAAQ;wBACRC,OAAM;wBACNC,SAAS;4BACPvB,SACEZ,QAAQa,OAAO,CAACG;gCACd,kDAAkD;gCAClDA,MAAMI,MAAM,GAAGgB;4BACjB;wBAEJ;kCACD;;;;;;AAOX"}
1
+ {"version":3,"sources":["../../src/PieChartOptionsEditorSettings.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 merge from 'lodash/merge';\nimport {\n CalculationSelector,\n CalculationSelectorProps,\n LegendOptionsEditor,\n LegendOptionsEditorProps,\n} from '@perses-dev/plugin-system';\nimport { produce } from 'immer';\nimport {\n FormatControls,\n FormatControlsProps,\n OptionsColorPicker,\n OptionsEditorGroup,\n OptionsEditorGrid,\n OptionsEditorColumn,\n SortSelector,\n SortSelectorProps,\n ModeSelector,\n ModeSelectorProps,\n ModeOption,\n SortOption,\n OptionsEditorControl,\n useChartsTheme,\n} from '@perses-dev/components';\nimport { CalculationType, isPercentUnit, FormatOptions } from '@perses-dev/core';\nimport {\n Button,\n FormControl,\n InputLabel,\n MenuItem,\n Select,\n Stack,\n Switch,\n SwitchProps,\n Typography,\n} from '@mui/material';\nimport { ReactElement, useMemo } from 'react';\nimport { PieChartOptions, PieChartOptionsEditorProps, DEFAULT_FORMAT } from './pie-chart-model';\n\nexport function PieChartOptionsEditorSettings(props: PieChartOptionsEditorProps): ReactElement {\n const { onChange, value } = props;\n\n const handleCalculationChange: CalculationSelectorProps['onChange'] = (newCalculation: CalculationType) => {\n onChange(\n produce(value, (draft: PieChartOptions) => {\n draft.calculation = newCalculation;\n })\n );\n };\n\n const handleLegendChange: LegendOptionsEditorProps['onChange'] = (newLegend) => {\n onChange(\n produce(value, (draft: PieChartOptions) => {\n draft.legend = newLegend;\n })\n );\n };\n\n const handleUnitChange: FormatControlsProps['onChange'] = (newFormat: FormatOptions) => {\n onChange(\n produce(value, (draft: PieChartOptions) => {\n draft.format = newFormat;\n })\n );\n };\n\n const handleSortChange: SortSelectorProps['onChange'] = (newSort: SortOption) => {\n onChange(\n produce(value, (draft: PieChartOptions) => {\n draft.sort = newSort;\n })\n );\n };\n\n const handleModeChange: ModeSelectorProps['onChange'] = (newMode: ModeOption) => {\n onChange(\n produce(value, (draft: PieChartOptions) => {\n draft.mode = newMode;\n })\n );\n };\n\n const handleShowLabelsChange: SwitchProps['onChange'] = (_: unknown, checked: boolean) => {\n onChange(\n produce(value, (draft: PieChartOptions) => {\n draft.showLabels = checked;\n })\n );\n };\n\n const chartsTheme = useChartsTheme();\n const themePalette = chartsTheme.echartsTheme.color;\n\n const colorPalette: string[] | undefined = useMemo(() => {\n return value.colorPalette || undefined;\n }, [value.colorPalette]);\n\n const handleColorChange = (color?: string[]) => {\n onChange(\n produce(value, (draft: PieChartOptions) => {\n if (Array.isArray(color)) {\n draft.colorPalette = color;\n } else if (typeof color === 'string') {\n draft.colorPalette = [color];\n } else {\n draft.colorPalette = undefined;\n }\n })\n );\n };\n\n // ensures decimalPlaces defaults to correct value\n const format = merge({}, DEFAULT_FORMAT, value.format);\n\n type ColorScheme = 'default' | 'theme' | 'gradient';\n\n const colorScheme: ColorScheme = useMemo(() => {\n return Array.isArray(colorPalette) ? (colorPalette.length === 1 ? 'gradient' : 'theme') : 'default';\n }, [colorPalette]);\n\n const handleColorSchemeChange = (scheme: ColorScheme) => {\n if (scheme === 'theme') {\n handleColorChange(themePalette as string[]);\n } else if (scheme === 'default') {\n handleColorChange();\n } else {\n // gradient: keep existing single color if present (user-chosen via OptionsColorPicker)\n if (Array.isArray(colorPalette) && colorPalette.length === 1) {\n return;\n }\n // initialize with a sensible default so the color picker shows a color\n handleColorChange(['#ff0000']);\n }\n };\n\n const colorHelpText = useMemo(() => {\n if (colorPalette === undefined) {\n return 'Colors will be automatically assigned using metrics name hash.';\n }\n if (Array.isArray(colorPalette) && colorPalette.length > 1) {\n return 'Colors will be automatically assigned using the current theme color palette.';\n }\n if (Array.isArray(colorPalette) && colorPalette.length === 1) {\n return 'All series will use a gradient based on the selected color.';\n }\n return undefined;\n }, [colorPalette]);\n\n return (\n <OptionsEditorGrid>\n <OptionsEditorColumn>\n <LegendOptionsEditor calculation=\"comparison\" value={value.legend} onChange={handleLegendChange} />\n <OptionsEditorGroup title=\"Misc\">\n <OptionsEditorControl\n label=\"Show Labels\"\n control={<Switch checked={Boolean(value.showLabels)} onChange={handleShowLabelsChange} />}\n />\n <FormatControls value={format} onChange={handleUnitChange} disabled={value.mode === 'percentage'} />\n <CalculationSelector value={value.calculation} onChange={handleCalculationChange} />\n <SortSelector value={value.sort} onChange={handleSortChange} />\n <ModeSelector value={value.mode} onChange={handleModeChange} disablePercentageMode={isPercentUnit(format)} />\n </OptionsEditorGroup>\n </OptionsEditorColumn>\n <OptionsEditorColumn>\n <OptionsEditorGroup title=\"Colors\">\n <Stack spacing={2}>\n <Stack direction=\"row\" spacing={2} alignItems=\"center\">\n <FormControl size=\"small\" sx={{ minWidth: 150 }}>\n <InputLabel>Color Scheme</InputLabel>\n <Select\n value={colorScheme}\n label=\"Color Scheme\"\n onChange={(e) => handleColorSchemeChange(e.target.value as ColorScheme)}\n >\n <MenuItem value=\"default\">Default</MenuItem>\n <MenuItem value=\"theme\">Theme</MenuItem>\n <MenuItem value=\"gradient\">Gradient</MenuItem>\n </Select>\n </FormControl>\n {Array.isArray(colorPalette) && colorPalette.length === 1 && (\n <OptionsColorPicker\n label=\"Color\"\n color={colorPalette?.[0] ?? (themePalette as string[])[0] ?? '#ff0000'}\n onColorChange={(c: string) => handleColorChange([c])}\n />\n )}\n </Stack>\n {colorHelpText && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {colorHelpText}\n </Typography>\n )}\n </Stack>\n </OptionsEditorGroup>\n <OptionsEditorGroup title=\"Reset Settings\">\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n onClick={() => {\n onChange(\n produce(value, (draft: PieChartOptions) => {\n // reset button removes all optional panel options\n draft.legend = undefined;\n draft.colorPalette = undefined;\n })\n );\n }}\n >\n Reset To Defaults\n </Button>\n </OptionsEditorGroup>\n </OptionsEditorColumn>\n </OptionsEditorGrid>\n );\n}\n"],"names":["merge","CalculationSelector","LegendOptionsEditor","produce","FormatControls","OptionsColorPicker","OptionsEditorGroup","OptionsEditorGrid","OptionsEditorColumn","SortSelector","ModeSelector","OptionsEditorControl","useChartsTheme","isPercentUnit","Button","FormControl","InputLabel","MenuItem","Select","Stack","Switch","Typography","useMemo","DEFAULT_FORMAT","PieChartOptionsEditorSettings","props","onChange","value","handleCalculationChange","newCalculation","draft","calculation","handleLegendChange","newLegend","legend","handleUnitChange","newFormat","format","handleSortChange","newSort","sort","handleModeChange","newMode","mode","handleShowLabelsChange","_","checked","showLabels","chartsTheme","themePalette","echartsTheme","color","colorPalette","undefined","handleColorChange","Array","isArray","colorScheme","length","handleColorSchemeChange","scheme","colorHelpText","title","label","control","Boolean","disabled","disablePercentageMode","spacing","direction","alignItems","size","sx","minWidth","e","target","onColorChange","c","variant","onClick"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PieChartPanel.d.ts","sourceRoot":"","sources":["../../src/PieChartPanel.tsx"],"names":[],"mappings":"AAwBA,OAAO,EAAoD,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAuC,UAAU,EAAsB,MAAM,2BAA2B,CAAC;AAEhH,OAAO,EAAE,YAAY,EAA6B,MAAM,OAAO,CAAC;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIpD,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;AAE7E,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,YAAY,GAAG,IAAI,CA+K5E"}
1
+ {"version":3,"file":"PieChartPanel.d.ts","sourceRoot":"","sources":["../../src/PieChartPanel.tsx"],"names":[],"mappings":"AAwBA,OAAO,EAAoD,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAuC,UAAU,EAAsB,MAAM,2BAA2B,CAAC;AAEhH,OAAO,EAAE,YAAY,EAA6B,MAAM,OAAO,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAKpD,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;AAE7E,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,YAAY,GAAG,IAAI,CA2K5E"}
@@ -11,38 +11,38 @@
11
11
  // See the License for the specific language governing permissions and
12
12
  // limitations under the License.
13
13
  import { jsx as _jsx } from "react/jsx-runtime";
14
- import { Box, useTheme } from '@mui/material';
14
+ import { Box } from '@mui/material';
15
15
  import { ContentWithLegend, useChartsTheme, useId } from '@perses-dev/components';
16
16
  import { CalculationsMap, DEFAULT_LEGEND } from '@perses-dev/core';
17
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
- import { getSeriesColor } from './palette-gen';
21
20
  import { calculatePercentages, sortSeriesData } from './utils';
21
+ import { getSeriesColor } from './colors';
22
22
  import { PieChartBase } from './PieChartBase';
23
23
  export function PieChartPanel(props) {
24
- const { spec: { calculation, sort, mode, legend: pieChartLegend }, contentDimensions, queryResults } = props;
24
+ const { spec: { calculation, sort, mode, legend: pieChartLegend, colorPalette: colorPalette }, contentDimensions, queryResults } = props;
25
25
  const chartsTheme = useChartsTheme();
26
- const muiTheme = useTheme();
27
- const PADDING = chartsTheme.container.padding.default;
28
26
  const chartId = useId('time-series-panel');
29
- const categoricalPalette = chartsTheme.echartsTheme.color;
27
+ const seriesNames = queryResults.flatMap((result)=>result?.data.series?.map((series)=>series.name) || []);
28
+ // Memoize the color list so it only regenerates when color/palette/series count changes
29
+ const colorList = useMemo(()=>{
30
+ return getSeriesColor(seriesNames, colorPalette);
31
+ }, [
32
+ colorPalette,
33
+ seriesNames
34
+ ]);
30
35
  const { pieChartData, legendItems, legendColumns } = useMemo(()=>{
31
36
  const calculate = CalculationsMap[calculation];
32
37
  const pieChartData = [];
33
38
  const legendItems = [];
34
39
  const legendColumns = [];
35
- for(let queryIndex = 0; queryIndex < queryResults.length; queryIndex++){
36
- const result = queryResults[queryIndex];
37
- let seriesIndex = 0;
38
- for (const seriesData of result?.data.series ?? []){
39
- const seriesColor = getSeriesColor({
40
- categoricalPalette: categoricalPalette,
41
- muiPrimaryColor: muiTheme.palette.primary.main,
42
- seriesName: seriesData.name
43
- });
44
- const seriesId = `${chartId}${seriesData.name}${seriesIndex}`;
45
- const series = {
40
+ queryResults.forEach((result, queryIndex)=>{
41
+ const series = result?.data.series ?? [];
42
+ series.forEach((seriesData, seriesIndex)=>{
43
+ const seriesId = `${chartId}${seriesData.name}${seriesIndex}${queryIndex}`;
44
+ const seriesColor = colorList[queryIndex * series.length + seriesIndex] ?? '#ff0000';
45
+ const seriesItem = {
46
46
  id: seriesId,
47
47
  value: calculate(seriesData.values) ?? null,
48
48
  name: seriesData.formattedName ?? '',
@@ -50,17 +50,26 @@ export function PieChartPanel(props) {
50
50
  color: seriesColor
51
51
  }
52
52
  };
53
- pieChartData.push(series);
53
+ pieChartData.push(seriesItem);
54
54
  legendItems.push({
55
55
  id: seriesId,
56
- label: series.name,
56
+ label: seriesData.formattedName ?? '',
57
57
  color: seriesColor,
58
58
  data: {}
59
59
  });
60
- seriesIndex++;
61
- }
62
- }
60
+ });
61
+ });
63
62
  const sortedPieChartData = sortSeriesData(pieChartData, sort);
63
+ // Reorder legend items to reflect the current sorting order of series
64
+ const valueById = new Map(sortedPieChartData.map((pd)=>[
65
+ pd.id ?? pd.name,
66
+ pd.value ?? 0
67
+ ]));
68
+ legendItems.sort((a, b)=>{
69
+ const av = valueById.get(a.id) ?? 0;
70
+ const bv = valueById.get(b.id) ?? 0;
71
+ return sort === 'asc' ? av - bv : bv - av;
72
+ });
64
73
  if (pieChartLegend?.values?.length && pieChartLegend?.mode === 'table') {
65
74
  const { values } = pieChartLegend;
66
75
  [
@@ -107,8 +116,7 @@ export function PieChartPanel(props) {
107
116
  sort,
108
117
  mode,
109
118
  queryResults,
110
- categoricalPalette,
111
- muiTheme.palette.primary.main,
119
+ colorList,
112
120
  chartId,
113
121
  pieChartLegend
114
122
  ]);
@@ -130,7 +138,7 @@ export function PieChartPanel(props) {
130
138
  if (!contentDimensions) return null;
131
139
  return /*#__PURE__*/ _jsx(Box, {
132
140
  sx: {
133
- padding: `${PADDING}px`
141
+ padding: `${contentPadding}px`
134
142
  },
135
143
  children: /*#__PURE__*/ _jsx(ContentWithLegend, {
136
144
  width: adjustedContentDimensions?.width ?? 400,
@@ -166,8 +174,9 @@ export function PieChartPanel(props) {
166
174
  },
167
175
  children: /*#__PURE__*/ _jsx(PieChartBase, {
168
176
  data: pieChartData,
169
- width: contentDimensions.width - PADDING * 2,
170
- height: contentDimensions.height - PADDING * 2
177
+ width: width,
178
+ height: height,
179
+ showLabels: Boolean(props.spec.showLabels)
171
180
  })
172
181
  });
173
182
  }
@@ -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 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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"}
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 } 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 { PieChartOptions } from './pie-chart-model';\nimport { calculatePercentages, sortSeriesData } from './utils';\nimport { getSeriesColor } from './colors';\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, colorPalette: colorPalette },\n contentDimensions,\n queryResults,\n } = props;\n const chartsTheme = useChartsTheme();\n const chartId = useId('time-series-panel');\n const seriesNames = queryResults.flatMap((result) => result?.data.series?.map((series) => series.name) || []);\n\n // Memoize the color list so it only regenerates when color/palette/series count changes\n const colorList = useMemo(() => {\n return getSeriesColor(seriesNames, colorPalette);\n }, [colorPalette, seriesNames]);\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 queryResults.forEach((result, queryIndex) => {\n const series = result?.data.series ?? [];\n\n series.forEach((seriesData, seriesIndex) => {\n const seriesId = `${chartId}${seriesData.name}${seriesIndex}${queryIndex}`;\n const seriesColor = colorList[queryIndex * series.length + seriesIndex] ?? '#ff0000';\n\n const seriesItem = {\n id: seriesId,\n value: calculate(seriesData.values) ?? null,\n name: seriesData.formattedName ?? '',\n itemStyle: {\n color: seriesColor,\n },\n };\n\n pieChartData.push(seriesItem);\n legendItems.push({\n id: seriesId,\n label: seriesData.formattedName ?? '',\n color: seriesColor,\n data: {},\n });\n });\n });\n\n const sortedPieChartData = sortSeriesData(pieChartData, sort);\n\n // Reorder legend items to reflect the current sorting order of series\n const valueById = new Map(sortedPieChartData.map((pd) => [pd.id ?? pd.name, pd.value ?? 0]));\n legendItems.sort((a, b) => {\n const av = valueById.get(a.id) ?? 0;\n const bv = valueById.get(b.id) ?? 0;\n return sort === 'asc' ? av - bv : bv - av;\n });\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 }, [calculation, sort, mode, queryResults, colorList, chartId, pieChartLegend]);\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: `${contentPadding}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={width}\n height={height}\n showLabels={Boolean(props.spec.showLabels)}\n />\n </Box>\n );\n }}\n </ContentWithLegend>\n </Box>\n );\n}\n"],"names":["Box","ContentWithLegend","useChartsTheme","useId","CalculationsMap","DEFAULT_LEGEND","comparisonLegends","validateLegendSpec","merge","useMemo","useRef","useState","calculatePercentages","sortSeriesData","getSeriesColor","PieChartBase","PieChartPanel","props","spec","calculation","sort","mode","legend","pieChartLegend","colorPalette","contentDimensions","queryResults","chartsTheme","chartId","seriesNames","flatMap","result","data","series","map","name","colorList","pieChartData","legendItems","legendColumns","calculate","forEach","queryIndex","seriesData","seriesIndex","seriesId","seriesColor","length","seriesItem","id","value","values","formattedName","itemStyle","color","push","label","sortedPieChartData","valueById","Map","pd","a","b","av","get","bv","v","accessorKey","header","headerDescription","description","width","align","cellDescription","enableSorting","li","itemAbsoluteValue","find","itemPercentageValue","ppd","toFixed","contentPadding","container","padding","default","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","showLabels","Boolean"],"mappings":"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"}
@@ -33,34 +33,34 @@ const _components1 = require("@perses-dev/components");
33
33
  _components.DatasetComponent,
34
34
  _components.TitleComponent,
35
35
  _components.TooltipComponent,
36
+ _components.LegendComponent,
36
37
  _renderers.CanvasRenderer
37
38
  ]);
38
- const PIE_WIN_WIDTH = 12;
39
- const PIE_GAP = 4;
40
39
  function PieChartBase(props) {
41
- const { width, height, data } = props;
40
+ const { width, height, data, showLabels } = props;
42
41
  const chartsTheme = (0, _components1.useChartsTheme)();
42
+ const muiTheme = (0, _material.useTheme)();
43
43
  const option = {
44
- title: {
45
- text: 'Referer of a Website',
46
- subtext: 'Fake Data',
47
- left: 'center'
48
- },
49
44
  tooltip: {
50
45
  trigger: 'item',
51
- formatter: '{b} : {c} ({d}%)'
52
- },
53
- axisLabel: {
54
- overflow: 'truncate',
55
- width: width / 3
46
+ formatter: '{b}: {c} ({d}%)',
47
+ appendTo: document.body,
48
+ confine: false
56
49
  },
57
50
  series: [
58
51
  {
59
52
  type: 'pie',
60
- radius: '55%',
61
- label: false,
53
+ radius: '90%',
54
+ label: {
55
+ show: Boolean(showLabels),
56
+ position: 'inner',
57
+ fontSize: 14,
58
+ formatter: '{b}\n{c}',
59
+ overflow: 'truncate',
60
+ fontWeight: 'bold'
61
+ },
62
62
  center: [
63
- '40%',
63
+ '50%',
64
64
  '50%'
65
65
  ],
66
66
  data: data,
@@ -70,13 +70,14 @@ function PieChartBase(props) {
70
70
  shadowOffsetX: 0,
71
71
  shadowColor: 'rgba(0, 0, 0, 0.5)'
72
72
  }
73
+ },
74
+ itemStyle: {
75
+ borderRadius: 5,
76
+ borderColor: muiTheme.palette.background.default,
77
+ borderWidth: 2
73
78
  }
74
79
  }
75
- ],
76
- itemStyle: {
77
- borderRadius: 2,
78
- color: chartsTheme.echartsTheme[0]
79
- }
80
+ ]
80
81
  };
81
82
  return /*#__PURE__*/ (0, _jsxruntime.jsx)(_material.Box, {
82
83
  style: {
@@ -88,8 +89,8 @@ function PieChartBase(props) {
88
89
  },
89
90
  children: /*#__PURE__*/ (0, _jsxruntime.jsx)(_components1.EChart, {
90
91
  sx: {
91
- minHeight: height,
92
- height: data ? data.length * (PIE_WIN_WIDTH + PIE_GAP) : '100%'
92
+ width: '100%',
93
+ height: '100%'
93
94
  },
94
95
  option: option,
95
96
  theme: chartsTheme.echartsTheme