@orbcharts/plugins-basic 3.0.4 → 3.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +200 -200
- package/dist/orbcharts-plugins-basic.es.js +4738 -4700
- package/dist/orbcharts-plugins-basic.umd.js +48 -48
- package/dist/src/series/seriesObservables.d.ts +5 -7
- package/lib/core-types.ts +7 -7
- package/lib/core.ts +6 -6
- package/lib/gridObservables.ts +6 -6
- package/lib/plugins-basic-types.ts +6 -6
- package/package.json +48 -48
- package/src/base/BaseBars.ts +765 -765
- package/src/base/BaseBarsTriangle.ts +676 -676
- package/src/base/BaseDots.ts +464 -464
- package/src/base/BaseGroupAxis.ts +691 -691
- package/src/base/BaseLegend.ts +684 -684
- package/src/base/BaseLineAreas.ts +629 -629
- package/src/base/BaseLines.ts +706 -706
- package/src/base/BaseOrdinalBubbles.ts +729 -729
- package/src/base/BaseRacingBars.ts +582 -582
- package/src/base/BaseRacingLabels.ts +404 -404
- package/src/base/BaseRacingValueLabels.ts +403 -403
- package/src/base/BaseStackedBars.ts +782 -782
- package/src/base/BaseTooltip.ts +386 -386
- package/src/base/BaseValueAxis.ts +600 -600
- package/src/base/BaseXAxis.ts +427 -427
- package/src/base/BaseXZoom.ts +241 -241
- package/src/base/BaseYAxis.ts +389 -389
- package/src/base/types.ts +2 -2
- package/src/const.ts +30 -30
- package/src/grid/defaults.ts +213 -213
- package/src/grid/gridObservables.ts +635 -635
- package/src/grid/index.ts +16 -16
- package/src/grid/plugins/Bars.ts +69 -69
- package/src/grid/plugins/BarsPN.ts +66 -66
- package/src/grid/plugins/BarsTriangle.ts +73 -73
- package/src/grid/plugins/Dots.ts +68 -68
- package/src/grid/plugins/GridLegend.ts +107 -107
- package/src/grid/plugins/GridTooltip.ts +66 -66
- package/src/grid/plugins/GroupAux.ts +1095 -1095
- package/src/grid/plugins/GroupAxis.ts +73 -73
- package/src/grid/plugins/GroupZoom.ts +218 -218
- package/src/grid/plugins/LineAreas.ts +65 -65
- package/src/grid/plugins/Lines.ts +59 -59
- package/src/grid/plugins/StackedBars.ts +64 -64
- package/src/grid/plugins/StackedValueAxis.ts +96 -96
- package/src/grid/plugins/ValueAxis.ts +94 -94
- package/src/index.ts +6 -6
- package/src/multiGrid/defaults.ts +244 -244
- package/src/multiGrid/index.ts +14 -14
- package/src/multiGrid/multiGridObservables.ts +50 -50
- package/src/multiGrid/plugins/MultiBars.ts +108 -108
- package/src/multiGrid/plugins/MultiBarsTriangle.ts +114 -114
- package/src/multiGrid/plugins/MultiDots.ts +102 -102
- package/src/multiGrid/plugins/MultiGridLegend.ts +169 -169
- package/src/multiGrid/plugins/MultiGridTooltip.ts +66 -66
- package/src/multiGrid/plugins/MultiGroupAxis.ts +137 -137
- package/src/multiGrid/plugins/MultiLineAreas.ts +107 -107
- package/src/multiGrid/plugins/MultiLines.ts +101 -101
- package/src/multiGrid/plugins/MultiStackedBars.ts +106 -106
- package/src/multiGrid/plugins/MultiStackedValueAxis.ts +134 -134
- package/src/multiGrid/plugins/MultiValueAxis.ts +134 -134
- package/src/multiGrid/plugins/OverlappingStackedValueAxes.ts +300 -300
- package/src/multiGrid/plugins/OverlappingValueAxes.ts +300 -300
- package/src/multiValue/defaults.ts +523 -523
- package/src/multiValue/index.ts +16 -16
- package/src/multiValue/multiValueObservables.ts +781 -781
- package/src/multiValue/plugins/MultiValueLegend.ts +107 -107
- package/src/multiValue/plugins/MultiValueTooltip.ts +66 -66
- package/src/multiValue/plugins/OrdinalAux.ts +660 -660
- package/src/multiValue/plugins/OrdinalAxis.ts +524 -524
- package/src/multiValue/plugins/OrdinalBubbles.ts +226 -226
- package/src/multiValue/plugins/OrdinalZoom.ts +57 -57
- package/src/multiValue/plugins/RacingBars.ts +375 -375
- package/src/multiValue/plugins/RacingCounterTexts.ts +300 -300
- package/src/multiValue/plugins/RacingValueAxis.ts +114 -114
- package/src/multiValue/plugins/Scatter.ts +486 -486
- package/src/multiValue/plugins/ScatterBubbles.ts +635 -635
- package/src/multiValue/plugins/XAxis.ts +107 -107
- package/src/multiValue/plugins/XYAux.ts +683 -683
- package/src/multiValue/plugins/XYAxes.ts +194 -194
- package/src/multiValue/plugins/XYAxes_legacy.ts +683 -683
- package/src/multiValue/plugins/XZoom.ts +40 -40
- package/src/noneData/defaults.ts +102 -102
- package/src/noneData/index.ts +3 -3
- package/src/noneData/plugins/Container.ts +27 -27
- package/src/noneData/plugins/Tooltip.ts +373 -373
- package/src/relationship/defaults.ts +221 -221
- package/src/relationship/index.ts +5 -5
- package/src/relationship/plugins/ForceDirected.ts +1056 -1173
- package/src/relationship/plugins/ForceDirectedBubbles.ts +1294 -1411
- package/src/relationship/plugins/RelationshipLegend.ts +100 -100
- package/src/relationship/plugins/RelationshipTooltip.ts +66 -66
- package/src/relationship/relationshipObservables.ts +49 -49
- package/src/series/defaults.ts +223 -221
- package/src/series/index.ts +9 -9
- package/src/series/plugins/Bubbles.ts +781 -636
- package/src/series/plugins/Pie.ts +622 -623
- package/src/series/plugins/PieEventTexts.ts +283 -284
- package/src/series/plugins/PieLabels.ts +639 -640
- package/src/series/plugins/Rose.ts +515 -516
- package/src/series/plugins/RoseLabels.ts +599 -600
- package/src/series/plugins/SeriesLegend.ts +107 -107
- package/src/series/plugins/SeriesTooltip.ts +66 -66
- package/src/series/seriesObservables.ts +168 -145
- package/src/series/seriesUtils.ts +51 -51
- package/src/tree/defaults.ts +102 -102
- package/src/tree/index.ts +4 -4
- package/src/tree/plugins/TreeLegend.ts +100 -100
- package/src/tree/plugins/TreeMap.ts +341 -341
- package/src/tree/plugins/TreeTooltip.ts +66 -66
- package/src/utils/commonUtils.ts +31 -31
- package/src/utils/d3Graphics.ts +176 -176
- package/src/utils/d3Utils.ts +92 -92
- package/src/utils/observables.ts +14 -14
- package/src/utils/orbchartsUtils.ts +129 -129
- package/tsconfig.base.json +13 -13
- package/tsconfig.json +2 -2
- 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
|
}
|
package/src/tree/defaults.ts
CHANGED
@@ -1,103 +1,103 @@
|
|
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 valueText = utils.toCurrency(eventData.datum.value)
|
37
|
-
const bulletWidth = styles.textSizePx * 0.7
|
38
|
-
const offset = (styles.textSizePx / 2) - (bulletWidth / 2)
|
39
|
-
const categorySvg = hasCategoryLabel
|
40
|
-
? `<rect width="${bulletWidth}" height="${bulletWidth}" x="${offset}" y="${offset - 1}" rx="${bulletWidth / 2}" fill="${eventData.datum.color}"></rect>
|
41
|
-
<text x="${styles.textSizePx * 1.5}" font-size="${styles.textSizePx}" dominant-baseline="hanging" fill="${styles.textColor}">
|
42
|
-
<tspan>${eventData.categoryLabel}</tspan>
|
43
|
-
</text>`
|
44
|
-
: ''
|
45
|
-
const datumLabelSvg = hasDatumLabel
|
46
|
-
? `<tspan>${eventData.datum.label}</tspan> `
|
47
|
-
: ''
|
48
|
-
const categoryLabelTextWidth = hasCategoryLabel
|
49
|
-
? utils.measureTextWidth(`${eventData.categoryLabel}${valueText}`, styles.textSizePx) + styles.textSizePx * 1.5
|
50
|
-
: 0
|
51
|
-
const datumLabelTextWidth = hasDatumLabel
|
52
|
-
? utils.measureTextWidth(`${eventData.datum.label}${valueText}`, styles.textSizePx)
|
53
|
-
: 0
|
54
|
-
const maxTextWidth = Math.max(categoryLabelTextWidth, datumLabelTextWidth)
|
55
|
-
const lineEndX = hasDatumLabel
|
56
|
-
? maxTextWidth + styles.textSizePx * 0.5
|
57
|
-
: 0
|
58
|
-
const valueTextAnchor = hasDatumLabel ? 'end' : 'start'
|
59
|
-
const datumSvg = `<text font-size="${styles.textSizePx}" dominant-baseline="hanging" fill="${styles.textColor}">
|
60
|
-
${datumLabelSvg}<tspan font-weight="bold" text-anchor="${valueTextAnchor}" x="${lineEndX}">${valueText}</tspan>
|
61
|
-
</text>`
|
62
|
-
|
63
|
-
return `${categorySvg}
|
64
|
-
<g ${hasCategoryLabel ? `transform="translate(0, ${styles.textSizePx * 2})"` : ''}>
|
65
|
-
${datumSvg}
|
66
|
-
</g>`
|
67
|
-
},
|
68
|
-
}
|
69
|
-
DEFAULT_TREE_TOOLTIP_PARAMS.renderFn.toString = () => `(eventData, { styles, utils }) => {
|
70
|
-
const hasCategoryLabel = eventData.categoryLabel ? true : false
|
71
|
-
const hasDatumLabel = eventData.datum.label ? true : false
|
72
|
-
const valueText = utils.toCurrency(eventData.datum.value)
|
73
|
-
const bulletWidth = styles.textSizePx * 0.7
|
74
|
-
const offset = (styles.textSizePx / 2) - (bulletWidth / 2)
|
75
|
-
const categorySvg = hasCategoryLabel
|
76
|
-
? \`<rect width="\${bulletWidth}" height="\${bulletWidth}" x="\${offset}" y="\${offset - 1}" rx="\${bulletWidth / 2}" fill="\${eventData.datum.color}"></rect>
|
77
|
-
<text x="\${styles.textSizePx * 1.5}" font-size="\${styles.textSizePx}" dominant-baseline="hanging" fill="\${styles.textColor}">
|
78
|
-
<tspan>\${eventData.categoryLabel}</tspan>
|
79
|
-
</text>\`
|
80
|
-
: ''
|
81
|
-
const datumLabelSvg = hasDatumLabel
|
82
|
-
? \`<tspan>\${eventData.datum.label}</tspan> \`
|
83
|
-
: ''
|
84
|
-
const categoryLabelTextWidth = hasCategoryLabel
|
85
|
-
? utils.measureTextWidth(\`\${eventData.categoryLabel}\${valueText}\`, styles.textSizePx) + styles.textSizePx * 1.5
|
86
|
-
: 0
|
87
|
-
const datumLabelTextWidth = hasDatumLabel
|
88
|
-
? utils.measureTextWidth(\`\${eventData.datum.label}\${valueText}\`, styles.textSizePx)
|
89
|
-
: 0
|
90
|
-
const maxTextWidth = Math.max(categoryLabelTextWidth, datumLabelTextWidth)
|
91
|
-
const lineEndX = hasDatumLabel
|
92
|
-
? maxTextWidth + styles.textSizePx * 0.5
|
93
|
-
: 0
|
94
|
-
const valueTextAnchor = hasDatumLabel ? 'end' : 'start'
|
95
|
-
const datumSvg = \`<text font-size="\${styles.textSizePx}" dominant-baseline="hanging" fill="\${styles.textColor}">
|
96
|
-
\${datumLabelSvg}<tspan font-weight="bold" text-anchor="\${valueTextAnchor}" x="\${lineEndX}">\${valueText}</tspan>
|
97
|
-
</text>\`
|
98
|
-
|
99
|
-
return \`\${categorySvg}
|
100
|
-
<g \${hasCategoryLabel ? \`transform="translate(0, \${styles.textSizePx * 2})"\` : ''}>
|
101
|
-
\${datumSvg}
|
102
|
-
</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 valueText = utils.toCurrency(eventData.datum.value)
|
37
|
+
const bulletWidth = styles.textSizePx * 0.7
|
38
|
+
const offset = (styles.textSizePx / 2) - (bulletWidth / 2)
|
39
|
+
const categorySvg = hasCategoryLabel
|
40
|
+
? `<rect width="${bulletWidth}" height="${bulletWidth}" x="${offset}" y="${offset - 1}" rx="${bulletWidth / 2}" fill="${eventData.datum.color}"></rect>
|
41
|
+
<text x="${styles.textSizePx * 1.5}" font-size="${styles.textSizePx}" dominant-baseline="hanging" fill="${styles.textColor}">
|
42
|
+
<tspan>${eventData.categoryLabel}</tspan>
|
43
|
+
</text>`
|
44
|
+
: ''
|
45
|
+
const datumLabelSvg = hasDatumLabel
|
46
|
+
? `<tspan>${eventData.datum.label}</tspan> `
|
47
|
+
: ''
|
48
|
+
const categoryLabelTextWidth = hasCategoryLabel
|
49
|
+
? utils.measureTextWidth(`${eventData.categoryLabel}${valueText}`, styles.textSizePx) + styles.textSizePx * 1.5
|
50
|
+
: 0
|
51
|
+
const datumLabelTextWidth = hasDatumLabel
|
52
|
+
? utils.measureTextWidth(`${eventData.datum.label}${valueText}`, styles.textSizePx)
|
53
|
+
: 0
|
54
|
+
const maxTextWidth = Math.max(categoryLabelTextWidth, datumLabelTextWidth)
|
55
|
+
const lineEndX = hasDatumLabel
|
56
|
+
? maxTextWidth + styles.textSizePx * 0.5
|
57
|
+
: 0
|
58
|
+
const valueTextAnchor = hasDatumLabel ? 'end' : 'start'
|
59
|
+
const datumSvg = `<text font-size="${styles.textSizePx}" dominant-baseline="hanging" fill="${styles.textColor}">
|
60
|
+
${datumLabelSvg}<tspan font-weight="bold" text-anchor="${valueTextAnchor}" x="${lineEndX}">${valueText}</tspan>
|
61
|
+
</text>`
|
62
|
+
|
63
|
+
return `${categorySvg}
|
64
|
+
<g ${hasCategoryLabel ? `transform="translate(0, ${styles.textSizePx * 2})"` : ''}>
|
65
|
+
${datumSvg}
|
66
|
+
</g>`
|
67
|
+
},
|
68
|
+
}
|
69
|
+
DEFAULT_TREE_TOOLTIP_PARAMS.renderFn.toString = () => `(eventData, { styles, utils }) => {
|
70
|
+
const hasCategoryLabel = eventData.categoryLabel ? true : false
|
71
|
+
const hasDatumLabel = eventData.datum.label ? true : false
|
72
|
+
const valueText = utils.toCurrency(eventData.datum.value)
|
73
|
+
const bulletWidth = styles.textSizePx * 0.7
|
74
|
+
const offset = (styles.textSizePx / 2) - (bulletWidth / 2)
|
75
|
+
const categorySvg = hasCategoryLabel
|
76
|
+
? \`<rect width="\${bulletWidth}" height="\${bulletWidth}" x="\${offset}" y="\${offset - 1}" rx="\${bulletWidth / 2}" fill="\${eventData.datum.color}"></rect>
|
77
|
+
<text x="\${styles.textSizePx * 1.5}" font-size="\${styles.textSizePx}" dominant-baseline="hanging" fill="\${styles.textColor}">
|
78
|
+
<tspan>\${eventData.categoryLabel}</tspan>
|
79
|
+
</text>\`
|
80
|
+
: ''
|
81
|
+
const datumLabelSvg = hasDatumLabel
|
82
|
+
? \`<tspan>\${eventData.datum.label}</tspan> \`
|
83
|
+
: ''
|
84
|
+
const categoryLabelTextWidth = hasCategoryLabel
|
85
|
+
? utils.measureTextWidth(\`\${eventData.categoryLabel}\${valueText}\`, styles.textSizePx) + styles.textSizePx * 1.5
|
86
|
+
: 0
|
87
|
+
const datumLabelTextWidth = hasDatumLabel
|
88
|
+
? utils.measureTextWidth(\`\${eventData.datum.label}\${valueText}\`, styles.textSizePx)
|
89
|
+
: 0
|
90
|
+
const maxTextWidth = Math.max(categoryLabelTextWidth, datumLabelTextWidth)
|
91
|
+
const lineEndX = hasDatumLabel
|
92
|
+
? maxTextWidth + styles.textSizePx * 0.5
|
93
|
+
: 0
|
94
|
+
const valueTextAnchor = hasDatumLabel ? 'end' : 'start'
|
95
|
+
const datumSvg = \`<text font-size="\${styles.textSizePx}" dominant-baseline="hanging" fill="\${styles.textColor}">
|
96
|
+
\${datumLabelSvg}<tspan font-weight="bold" text-anchor="\${valueTextAnchor}" x="\${lineEndX}">\${valueText}</tspan>
|
97
|
+
</text>\`
|
98
|
+
|
99
|
+
return \`\${categorySvg}
|
100
|
+
<g \${hasCategoryLabel ? \`transform="translate(0, \${styles.textSizePx * 2})"\` : ''}>
|
101
|
+
\${datumSvg}
|
102
|
+
</g>\`
|
103
103
|
}`
|
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
|
+
|