@orbcharts/plugins-basic 3.0.0-beta.13 → 3.0.0-beta.14

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 (100) hide show
  1. package/LICENSE +200 -200
  2. package/dist/orbcharts-plugins-basic/src/utils/d3Utils.d.ts +1 -0
  3. package/dist/orbcharts-plugins-basic.es.js +5558 -5443
  4. package/dist/orbcharts-plugins-basic.umd.js +159 -78
  5. package/lib/core-types.ts +7 -7
  6. package/lib/core.ts +6 -6
  7. package/lib/plugins-basic-types.ts +6 -6
  8. package/package.json +44 -44
  9. package/src/base/BaseBars.ts +765 -765
  10. package/src/base/BaseBarsTriangle.ts +676 -676
  11. package/src/base/BaseDots.ts +464 -464
  12. package/src/base/BaseGroupAxis.ts +679 -679
  13. package/src/base/BaseLegend.ts +684 -684
  14. package/src/base/BaseLineAreas.ts +629 -629
  15. package/src/base/BaseLines.ts +706 -706
  16. package/src/base/BaseStackedBar.ts +782 -782
  17. package/src/base/BaseTooltip.ts +385 -385
  18. package/src/base/BaseValueAxis.ts +583 -583
  19. package/src/base/types.ts +2 -2
  20. package/src/const.ts +30 -30
  21. package/src/grid/defaults.ts +250 -246
  22. package/src/grid/gridObservables.ts +554 -554
  23. package/src/grid/index.ts +16 -16
  24. package/src/grid/plugins/Bars.ts +69 -69
  25. package/src/grid/plugins/BarsPN.ts +66 -66
  26. package/src/grid/plugins/BarsTriangle.ts +73 -73
  27. package/src/grid/plugins/Dots.ts +68 -68
  28. package/src/grid/plugins/GridLegend.ts +107 -107
  29. package/src/grid/plugins/GridTooltip.ts +66 -66
  30. package/src/grid/plugins/GridZoom.ts +218 -218
  31. package/src/grid/plugins/GroupAux.ts +1103 -1103
  32. package/src/grid/plugins/GroupAxis.ts +97 -97
  33. package/src/grid/plugins/LineAreas.ts +65 -65
  34. package/src/grid/plugins/Lines.ts +59 -59
  35. package/src/grid/plugins/StackedBar.ts +64 -64
  36. package/src/grid/plugins/StackedValueAxis.ts +96 -96
  37. package/src/grid/plugins/ValueAxis.ts +94 -94
  38. package/src/index.ts +6 -6
  39. package/src/multiGrid/defaults.ts +228 -224
  40. package/src/multiGrid/index.ts +14 -14
  41. package/src/multiGrid/multiGridObservables.ts +49 -49
  42. package/src/multiGrid/plugins/MultiBars.ts +108 -108
  43. package/src/multiGrid/plugins/MultiBarsTriangle.ts +114 -114
  44. package/src/multiGrid/plugins/MultiDots.ts +102 -102
  45. package/src/multiGrid/plugins/MultiGridLegend.ts +159 -159
  46. package/src/multiGrid/plugins/MultiGridTooltip.ts +66 -66
  47. package/src/multiGrid/plugins/MultiGroupAxis.ts +137 -137
  48. package/src/multiGrid/plugins/MultiLineAreas.ts +107 -107
  49. package/src/multiGrid/plugins/MultiLines.ts +101 -101
  50. package/src/multiGrid/plugins/MultiStackedBar.ts +106 -106
  51. package/src/multiGrid/plugins/MultiStackedValueAxis.ts +134 -134
  52. package/src/multiGrid/plugins/MultiValueAxis.ts +134 -134
  53. package/src/multiGrid/plugins/OverlappingStackedValueAxes.ts +299 -299
  54. package/src/multiGrid/plugins/OverlappingValueAxes.ts +300 -300
  55. package/src/multiValue/defaults.ts +166 -166
  56. package/src/multiValue/index.ts +8 -8
  57. package/src/multiValue/multiValueObservables.ts +297 -297
  58. package/src/multiValue/plugins/MultiValueLegend.ts +107 -107
  59. package/src/multiValue/plugins/MultiValueTooltip.ts +66 -66
  60. package/src/multiValue/plugins/Scatter.ts +426 -426
  61. package/src/multiValue/plugins/ScatterBubbles.ts +554 -554
  62. package/src/multiValue/plugins/XYAux.ts +681 -681
  63. package/src/multiValue/plugins/XYAxes.ts +684 -684
  64. package/src/multiValue/plugins/XYZoom.ts +299 -299
  65. package/src/noneData/defaults.ts +102 -102
  66. package/src/noneData/index.ts +3 -3
  67. package/src/noneData/plugins/Container.ts +27 -27
  68. package/src/noneData/plugins/Tooltip.ts +373 -373
  69. package/src/relationship/defaults.ts +218 -196
  70. package/src/relationship/index.ts +5 -5
  71. package/src/relationship/plugins/ForceDirected.ts +1168 -1168
  72. package/src/relationship/plugins/ForceDirectedBubbles.ts +1403 -1395
  73. package/src/relationship/plugins/RelationshipLegend.ts +100 -100
  74. package/src/relationship/plugins/RelationshipTooltip.ts +66 -66
  75. package/src/relationship/relationshipObservables.ts +49 -49
  76. package/src/series/defaults.ts +230 -207
  77. package/src/series/index.ts +9 -9
  78. package/src/series/plugins/Bubbles.ts +620 -606
  79. package/src/series/plugins/Pie.ts +623 -623
  80. package/src/series/plugins/PieEventTexts.ts +284 -284
  81. package/src/series/plugins/PieLabels.ts +640 -640
  82. package/src/series/plugins/Rose.ts +516 -516
  83. package/src/series/plugins/RoseLabels.ts +600 -600
  84. package/src/series/plugins/SeriesLegend.ts +107 -107
  85. package/src/series/plugins/SeriesTooltip.ts +66 -66
  86. package/src/series/seriesObservables.ts +145 -145
  87. package/src/series/seriesUtils.ts +51 -51
  88. package/src/tree/defaults.ts +100 -78
  89. package/src/tree/index.ts +4 -4
  90. package/src/tree/plugins/TreeLegend.ts +100 -100
  91. package/src/tree/plugins/TreeMap.ts +341 -333
  92. package/src/tree/plugins/TreeTooltip.ts +66 -66
  93. package/src/utils/commonUtils.ts +21 -21
  94. package/src/utils/d3Graphics.ts +174 -174
  95. package/src/utils/d3Utils.ts +92 -74
  96. package/src/utils/observables.ts +14 -14
  97. package/src/utils/orbchartsUtils.ts +129 -115
  98. package/tsconfig.base.json +13 -13
  99. package/tsconfig.json +2 -2
  100. package/vite.config.js +22 -22
@@ -1,52 +1,52 @@
1
- import * as d3 from 'd3'
2
- import type { ComputedDataSeries, ComputedDatumSeries, EventName, EventSeries, HighlightTarget } from '../../lib/core-types'
3
- // import type { D3PieDatum, PieDatum } from '../types'
4
-
5
- // 由d3.pie()建出來的資料格式
6
- export interface D3PieDatum {
7
- data: any
8
- index: number,
9
- value: number,
10
- startAngle: number,
11
- endAngle: number,
12
- padAngle: number,
13
- }
14
-
15
- export interface PieDatum extends D3PieDatum {
16
- data: ComputedDatumSeries
17
- id: string
18
- }
19
-
20
- export function makePieData ({ data, startAngle, endAngle }: {
21
- data: ComputedDatumSeries[]
22
- startAngle: number
23
- endAngle: number
24
- // itemLabels: string[]
25
- // arcLabels: string[]
26
- }): PieDatum[] {
27
- let pie = d3.pie<any, any>()
28
- .startAngle(startAngle)
29
- // .endAngle(startAngle + (endAngle - startAngle) * t)
30
- .endAngle(endAngle)
31
- .value(d => d.value)
32
- // .value((d) => d.visible == false ? 0 : d.value)
33
- // .sort(null) // 不要排序
34
- .sort((a, b) => a.seq - b.seq)
35
- // .sort((a: any, b: any) => {
36
- // return b.value - a.value
37
- // })
38
- // .sort(d3.ascending)
39
- const pieData = pie(data)
40
- return pieData.map((d: D3PieDatum, i: number) => {
41
- // const itemLabel = d.data.itemLabel
42
- let _d: any = d
43
- _d.id = d.data.id
44
- return _d
45
- // return {
46
- // ...d,
47
- // itemIndex: itemLabels.indexOf(itemLabel),
48
- // itemLabel,
49
- // id: d.data.id,
50
- // }
51
- })
1
+ import * as d3 from 'd3'
2
+ import type { ComputedDataSeries, ComputedDatumSeries, EventName, EventSeries, HighlightTarget } from '../../lib/core-types'
3
+ // import type { D3PieDatum, PieDatum } from '../types'
4
+
5
+ // 由d3.pie()建出來的資料格式
6
+ export interface D3PieDatum {
7
+ data: any
8
+ index: number,
9
+ value: number,
10
+ startAngle: number,
11
+ endAngle: number,
12
+ padAngle: number,
13
+ }
14
+
15
+ export interface PieDatum extends D3PieDatum {
16
+ data: ComputedDatumSeries
17
+ id: string
18
+ }
19
+
20
+ export function makePieData ({ data, startAngle, endAngle }: {
21
+ data: ComputedDatumSeries[]
22
+ startAngle: number
23
+ endAngle: number
24
+ // itemLabels: string[]
25
+ // arcLabels: string[]
26
+ }): PieDatum[] {
27
+ let pie = d3.pie<any, any>()
28
+ .startAngle(startAngle)
29
+ // .endAngle(startAngle + (endAngle - startAngle) * t)
30
+ .endAngle(endAngle)
31
+ .value(d => d.value)
32
+ // .value((d) => d.visible == false ? 0 : d.value)
33
+ // .sort(null) // 不要排序
34
+ .sort((a, b) => a.seq - b.seq)
35
+ // .sort((a: any, b: any) => {
36
+ // return b.value - a.value
37
+ // })
38
+ // .sort(d3.ascending)
39
+ const pieData = pie(data)
40
+ return pieData.map((d: D3PieDatum, i: number) => {
41
+ // const itemLabel = d.data.itemLabel
42
+ let _d: any = d
43
+ _d.id = d.data.id
44
+ return _d
45
+ // return {
46
+ // ...d,
47
+ // itemIndex: itemLabels.indexOf(itemLabel),
48
+ // itemLabel,
49
+ // id: d.data.id,
50
+ // }
51
+ })
52
52
  }
@@ -1,79 +1,101 @@
1
- import type { TreeMapParams, TreeLegendParams, TreeTooltipParams } from '../../lib/plugins-basic-types'
2
-
3
- export const DEFAULT_TREE_MAP_PARAMS: TreeMapParams = {
4
- paddingInner: 2,
5
- paddingOuter: 2,
6
- labelColorType: 'primary',
7
- squarifyRatio: 1.618034, // 黃金比例
8
- sort: (a, b) => b.value - a.value
9
- }
10
- DEFAULT_TREE_MAP_PARAMS.sort.toString = () => `(a, b) => b.value - a.value`
11
-
12
- export const DEFAULT_TREE_LEGEND_PARAMS: TreeLegendParams = {
13
- // position: 'right',
14
- // justify: 'end',
15
- placement: 'right-end',
16
- padding: 28,
17
- backgroundFill: 'none',
18
- backgroundStroke: 'none',
19
- gap: 10,
20
- listRectWidth: 14,
21
- listRectHeight: 14,
22
- listRectRadius: 0,
23
- textColorType: 'primary'
24
- }
25
-
26
- export const DEFAULT_TREE_TOOLTIP_PARAMS: TreeTooltipParams = {
27
- backgroundColorType: 'background',
28
- strokeColorType: 'primary',
29
- backgroundOpacity: 0.8,
30
- textColorType: 'primary',
31
- offset: [20, 5],
32
- padding: 10,
33
- renderFn: (eventData, { styles, utils }) => {
34
- const hasCategoryLabel = eventData.categoryLabel ? true : false
35
- const hasDatumLabel = eventData.datum.label ? true : false
36
- const bulletWidth = styles.textSizePx * 0.7
37
- const offset = (styles.textSizePx / 2) - (bulletWidth / 2)
38
- const categorySvg = hasCategoryLabel
39
- ? `<rect width="${bulletWidth}" height="${bulletWidth}" x="${offset}" y="${offset - 1}" rx="${bulletWidth / 2}" fill="${eventData.datum.color}"></rect>
40
- <text x="${styles.textSizePx * 1.5}" font-size="${styles.textSizePx}" dominant-baseline="hanging" fill="${styles.textColor}">
41
- <tspan>${eventData.categoryLabel}</tspan>
42
- </text>`
43
- : ''
44
- const datumLabelSvg = hasDatumLabel
45
- ? `<tspan>${eventData.datum.label}</tspan> `
46
- : ''
47
- const datumSvg = `<text font-size="${styles.textSizePx}" dominant-baseline="hanging" fill="${styles.textColor}">
48
- ${datumLabelSvg}<tspan font-weight="bold">${eventData.datum.value}</tspan>
49
- </text>`
50
-
51
- return `${categorySvg}
52
- <g ${hasCategoryLabel ? `transform="translate(0, ${styles.textSizePx * 2})"` : ''}>
53
- ${datumSvg}
54
- </g>`
55
- },
56
- }
57
- DEFAULT_TREE_TOOLTIP_PARAMS.renderFn.toString = () => `(eventData, { styles, utils }) => {
58
- const hasCategoryLabel = eventData.categoryLabel ? true : false
59
- const hasDatumLabel = eventData.datum.label ? true : false
60
- const bulletWidth = styles.textSizePx * 0.7
61
- const offset = (styles.textSizePx / 2) - (bulletWidth / 2)
62
- const categorySvg = hasCategoryLabel
63
- ? \`<rect width="\${bulletWidth}" height="\${bulletWidth}" x="\${offset}" y="\${offset - 1}" rx="\${bulletWidth / 2}" fill="\${eventData.datum.color}"></rect>
64
- <text x="\${styles.textSizePx * 1.5}" font-size="\${styles.textSizePx}" dominant-baseline="hanging" fill="\${styles.textColor}">
65
- <tspan>\${eventData.categoryLabel}</tspan>
66
- </text>\`
67
- : ''
68
- const datumLabelSvg = hasDatumLabel
69
- ? \`<tspan>\${eventData.datum.label}</tspan> \`
70
- : ''
71
- const datumSvg = \`<text font-size="\${styles.textSizePx}" dominant-baseline="hanging" fill="\${styles.textColor}">
72
- \${datumLabelSvg}<tspan font-weight="bold">\${eventData.datum.value}</tspan>
73
- </text>\`
74
-
75
- return \`\${categorySvg}
76
- <g \${hasCategoryLabel ? \`transform="translate(0, \${styles.textSizePx * 2})"\` : ''}>
77
- \${datumSvg}
78
- </g>\`
1
+ import type { TreeMapParams, TreeLegendParams, TreeTooltipParams } from '../../lib/plugins-basic-types'
2
+
3
+ export const DEFAULT_TREE_MAP_PARAMS: TreeMapParams = {
4
+ paddingInner: 2,
5
+ paddingOuter: 2,
6
+ labelColorType: 'labelContrast',
7
+ squarifyRatio: 1.618034, // 黃金比例
8
+ sort: (a, b) => b.value - a.value
9
+ }
10
+ DEFAULT_TREE_MAP_PARAMS.sort.toString = () => `(a, b) => b.value - a.value`
11
+
12
+ export const DEFAULT_TREE_LEGEND_PARAMS: TreeLegendParams = {
13
+ // position: 'right',
14
+ // justify: 'end',
15
+ placement: 'right-end',
16
+ padding: 28,
17
+ backgroundFill: 'none',
18
+ backgroundStroke: 'none',
19
+ gap: 10,
20
+ listRectWidth: 14,
21
+ listRectHeight: 14,
22
+ listRectRadius: 0,
23
+ textColorType: 'primary'
24
+ }
25
+
26
+ export const DEFAULT_TREE_TOOLTIP_PARAMS: TreeTooltipParams = {
27
+ backgroundColorType: 'background',
28
+ strokeColorType: 'primary',
29
+ backgroundOpacity: 0.8,
30
+ textColorType: 'primary',
31
+ offset: [20, 5],
32
+ padding: 10,
33
+ renderFn: (eventData, { styles, utils }) => {
34
+ const hasCategoryLabel = eventData.categoryLabel ? true : false
35
+ const hasDatumLabel = eventData.datum.label ? true : false
36
+ const bulletWidth = styles.textSizePx * 0.7
37
+ const offset = (styles.textSizePx / 2) - (bulletWidth / 2)
38
+ const categorySvg = hasCategoryLabel
39
+ ? `<rect width="${bulletWidth}" height="${bulletWidth}" x="${offset}" y="${offset - 1}" rx="${bulletWidth / 2}" fill="${eventData.datum.color}"></rect>
40
+ <text x="${styles.textSizePx * 1.5}" font-size="${styles.textSizePx}" dominant-baseline="hanging" fill="${styles.textColor}">
41
+ <tspan>${eventData.categoryLabel}</tspan>
42
+ </text>`
43
+ : ''
44
+ const datumLabelSvg = hasDatumLabel
45
+ ? `<tspan>${eventData.datum.label}</tspan> `
46
+ : ''
47
+ const categoryLabelTextWidth = hasCategoryLabel
48
+ ? utils.measureTextWidth(`${eventData.categoryLabel}${eventData.datum.value}`, styles.textSizePx) + styles.textSizePx * 1.5
49
+ : 0
50
+ const datumLabelTextWidth = hasDatumLabel
51
+ ? utils.measureTextWidth(`${eventData.datum.label}${eventData.datum.value}`, styles.textSizePx)
52
+ : 0
53
+ const maxTextWidth = Math.max(categoryLabelTextWidth, datumLabelTextWidth)
54
+ const lineEndX = hasDatumLabel
55
+ ? maxTextWidth + styles.textSizePx * 0.5
56
+ : 0
57
+ const valueTextAnchor = hasDatumLabel ? 'end' : 'start'
58
+ const datumSvg = `<text font-size="${styles.textSizePx}" dominant-baseline="hanging" fill="${styles.textColor}">
59
+ ${datumLabelSvg}<tspan font-weight="bold" text-anchor="${valueTextAnchor}" x="${lineEndX}">${eventData.datum.value}</tspan>
60
+ </text>`
61
+
62
+ return `${categorySvg}
63
+ <g ${hasCategoryLabel ? `transform="translate(0, ${styles.textSizePx * 2})"` : ''}>
64
+ ${datumSvg}
65
+ </g>`
66
+ },
67
+ }
68
+ DEFAULT_TREE_TOOLTIP_PARAMS.renderFn.toString = () => `(eventData, { styles, utils }) => {
69
+ const hasCategoryLabel = eventData.categoryLabel ? true : false
70
+ const hasDatumLabel = eventData.datum.label ? true : false
71
+ const bulletWidth = styles.textSizePx * 0.7
72
+ const offset = (styles.textSizePx / 2) - (bulletWidth / 2)
73
+ const categorySvg = hasCategoryLabel
74
+ ? \`<rect width="\${bulletWidth}" height="\${bulletWidth}" x="\${offset}" y="\${offset - 1}" rx="\${bulletWidth / 2}" fill="\${eventData.datum.color}"></rect>
75
+ <text x="\${styles.textSizePx * 1.5}" font-size="\${styles.textSizePx}" dominant-baseline="hanging" fill="\${styles.textColor}">
76
+ <tspan>\${eventData.categoryLabel}</tspan>
77
+ </text>\`
78
+ : ''
79
+ const datumLabelSvg = hasDatumLabel
80
+ ? \`<tspan>\${eventData.datum.label}</tspan> \`
81
+ : ''
82
+ const categoryLabelTextWidth = hasCategoryLabel
83
+ ? utils.measureTextWidth(\`\${eventData.categoryLabel}\${eventData.datum.value}\`, styles.textSizePx) + styles.textSizePx * 1.5
84
+ : 0
85
+ const datumLabelTextWidth = hasDatumLabel
86
+ ? utils.measureTextWidth(\`\${eventData.datum.label}\${eventData.datum.value}\`, styles.textSizePx)
87
+ : 0
88
+ const maxTextWidth = Math.max(categoryLabelTextWidth, datumLabelTextWidth)
89
+ const lineEndX = hasDatumLabel
90
+ ? maxTextWidth + styles.textSizePx * 0.5
91
+ : 0
92
+ const valueTextAnchor = hasDatumLabel ? 'end' : 'start'
93
+ const datumSvg = \`<text font-size="\${styles.textSizePx}" dominant-baseline="hanging" fill="\${styles.textColor}">
94
+ \${datumLabelSvg}<tspan font-weight="bold" text-anchor="\${valueTextAnchor}" x="\${lineEndX}">\${eventData.datum.value}</tspan>
95
+ </text>\`
96
+
97
+ return \`\${categorySvg}
98
+ <g \${hasCategoryLabel ? \`transform="translate(0, \${styles.textSizePx * 2})"\` : ''}>
99
+ \${datumSvg}
100
+ </g>\`
79
101
  }`
package/src/tree/index.ts CHANGED
@@ -1,5 +1,5 @@
1
- export * from './defaults'
2
- // export * from './types'
3
- export { TreeLegend } from './plugins/TreeLegend'
4
- export { TreeMap } from './plugins/TreeMap'
1
+ export * from './defaults'
2
+ // export * from './types'
3
+ export { TreeLegend } from './plugins/TreeLegend'
4
+ export { TreeMap } from './plugins/TreeMap'
5
5
  export { TreeTooltip } from './plugins/TreeTooltip'
@@ -1,100 +1,100 @@
1
- import * as d3 from 'd3'
2
- import {
3
- combineLatest,
4
- map,
5
- switchMap,
6
- takeUntil,
7
- Observable,
8
- Subject } from 'rxjs'
9
- import type { DefinePluginConfig } from '../../../lib/core-types'
10
- import {
11
- defineTreePlugin } from '../../../lib/core'
12
- import { DEFAULT_TREE_LEGEND_PARAMS } from '../defaults'
13
- import { createBaseLegend } from '../../base/BaseLegend'
14
- import { LAYER_INDEX_OF_INFO } from '../../const'
15
-
16
- const pluginName = 'TreeLegend'
17
-
18
- const pluginConfig: DefinePluginConfig<typeof pluginName, typeof DEFAULT_TREE_LEGEND_PARAMS> = {
19
- name: pluginName,
20
- defaultParams: DEFAULT_TREE_LEGEND_PARAMS,
21
- layerIndex: LAYER_INDEX_OF_INFO,
22
- validator: (params, { validateColumns }) => {
23
- const result = validateColumns(params, {
24
- placement: {
25
- toBe: '"top" | "top-start" | "top-end" | "bottom" | "bottom-start" | "bottom-end" | "left" | "left-start" | "left-end" | "right" | "right-start" | "right-end"',
26
- test: (value) => {
27
- return [
28
- 'top', 'top-start', 'top-end',
29
- 'bottom', 'bottom-start', 'bottom-end',
30
- 'left', 'left-start', 'left-end',
31
- 'right', 'right-start', 'right-end'
32
- ].includes(value)
33
- }
34
- },
35
- padding: {
36
- toBeTypes: ['number']
37
- },
38
- backgroundFill: {
39
- toBeOption: 'ColorType',
40
- },
41
- backgroundStroke: {
42
- toBeOption: 'ColorType',
43
- },
44
- gap: {
45
- toBeTypes: ['number']
46
- },
47
- listRectWidth: {
48
- toBeTypes: ['number']
49
- },
50
- listRectHeight: {
51
- toBeTypes: ['number']
52
- },
53
- listRectRadius: {
54
- toBeTypes: ['number']
55
- },
56
- textColorType: {
57
- toBeOption: 'ColorType',
58
- }
59
- })
60
- return result
61
- }
62
- }
63
-
64
- export const TreeLegend = defineTreePlugin(pluginConfig)(({ selection, rootSelection, observer, subject }) => {
65
-
66
- const destroy$ = new Subject()
67
-
68
- // 全部列點矩型使用相同樣式參數
69
- const fullParams$ = observer.fullParams$.pipe(
70
- takeUntil(destroy$),
71
- map(d => {
72
- const labelList = [
73
- {
74
- listRectWidth: d.listRectWidth,
75
- listRectHeight: d.listRectHeight,
76
- listRectRadius: d.listRectRadius,
77
- }
78
- ]
79
- return {
80
- ...d,
81
- labelList
82
- }
83
- })
84
- )
85
-
86
- const unsubscribeBaseLegend = createBaseLegend(pluginName, {
87
- rootSelection,
88
- legendLabels$: observer.categoryLabels$,
89
- fullParams$,
90
- layout$: observer.layout$,
91
- fullChartParams$: observer.fullChartParams$,
92
- textSizePx$: observer.textSizePx$
93
- })
94
-
95
- return () => {
96
- destroy$.next(undefined)
97
- unsubscribeBaseLegend()
98
- }
99
- })
100
-
1
+ import * as d3 from 'd3'
2
+ import {
3
+ combineLatest,
4
+ map,
5
+ switchMap,
6
+ takeUntil,
7
+ Observable,
8
+ Subject } from 'rxjs'
9
+ import type { DefinePluginConfig } from '../../../lib/core-types'
10
+ import {
11
+ defineTreePlugin } from '../../../lib/core'
12
+ import { DEFAULT_TREE_LEGEND_PARAMS } from '../defaults'
13
+ import { createBaseLegend } from '../../base/BaseLegend'
14
+ import { LAYER_INDEX_OF_INFO } from '../../const'
15
+
16
+ const pluginName = 'TreeLegend'
17
+
18
+ const pluginConfig: DefinePluginConfig<typeof pluginName, typeof DEFAULT_TREE_LEGEND_PARAMS> = {
19
+ name: pluginName,
20
+ defaultParams: DEFAULT_TREE_LEGEND_PARAMS,
21
+ layerIndex: LAYER_INDEX_OF_INFO,
22
+ validator: (params, { validateColumns }) => {
23
+ const result = validateColumns(params, {
24
+ placement: {
25
+ toBe: '"top" | "top-start" | "top-end" | "bottom" | "bottom-start" | "bottom-end" | "left" | "left-start" | "left-end" | "right" | "right-start" | "right-end"',
26
+ test: (value) => {
27
+ return [
28
+ 'top', 'top-start', 'top-end',
29
+ 'bottom', 'bottom-start', 'bottom-end',
30
+ 'left', 'left-start', 'left-end',
31
+ 'right', 'right-start', 'right-end'
32
+ ].includes(value)
33
+ }
34
+ },
35
+ padding: {
36
+ toBeTypes: ['number']
37
+ },
38
+ backgroundFill: {
39
+ toBeOption: 'ColorType',
40
+ },
41
+ backgroundStroke: {
42
+ toBeOption: 'ColorType',
43
+ },
44
+ gap: {
45
+ toBeTypes: ['number']
46
+ },
47
+ listRectWidth: {
48
+ toBeTypes: ['number']
49
+ },
50
+ listRectHeight: {
51
+ toBeTypes: ['number']
52
+ },
53
+ listRectRadius: {
54
+ toBeTypes: ['number']
55
+ },
56
+ textColorType: {
57
+ toBeOption: 'ColorType',
58
+ }
59
+ })
60
+ return result
61
+ }
62
+ }
63
+
64
+ export const TreeLegend = defineTreePlugin(pluginConfig)(({ selection, rootSelection, observer, subject }) => {
65
+
66
+ const destroy$ = new Subject()
67
+
68
+ // 全部列點矩型使用相同樣式參數
69
+ const fullParams$ = observer.fullParams$.pipe(
70
+ takeUntil(destroy$),
71
+ map(d => {
72
+ const labelList = [
73
+ {
74
+ listRectWidth: d.listRectWidth,
75
+ listRectHeight: d.listRectHeight,
76
+ listRectRadius: d.listRectRadius,
77
+ }
78
+ ]
79
+ return {
80
+ ...d,
81
+ labelList
82
+ }
83
+ })
84
+ )
85
+
86
+ const unsubscribeBaseLegend = createBaseLegend(pluginName, {
87
+ rootSelection,
88
+ legendLabels$: observer.categoryLabels$,
89
+ fullParams$,
90
+ layout$: observer.layout$,
91
+ fullChartParams$: observer.fullChartParams$,
92
+ textSizePx$: observer.textSizePx$
93
+ })
94
+
95
+ return () => {
96
+ destroy$.next(undefined)
97
+ unsubscribeBaseLegend()
98
+ }
99
+ })
100
+