@orbcharts/plugins-basic 3.0.0-alpha.70 → 3.0.0-alpha.72
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/lib/core-types.d.ts +1 -0
- package/dist/lib/core.d.ts +1 -0
- package/dist/orbcharts-plugins-basic.es.js +8863 -7397
- package/dist/orbcharts-plugins-basic.umd.js +19 -15
- package/dist/src/base/BaseBarStack.d.ts +1 -1
- package/dist/src/base/BaseBars.d.ts +1 -1
- package/dist/src/base/BaseBarsTriangle.d.ts +1 -1
- package/dist/src/base/BaseDots.d.ts +1 -1
- package/dist/src/base/BaseGroupAxis.d.ts +1 -1
- package/dist/src/base/BaseLegend.d.ts +1 -1
- package/dist/src/base/BaseLineAreas.d.ts +1 -1
- package/dist/src/base/BaseLines.d.ts +1 -1
- package/dist/src/base/BaseValueAxis.d.ts +1 -1
- package/dist/src/const.d.ts +10 -0
- package/dist/src/grid/gridObservables.d.ts +1 -1
- package/dist/src/grid/plugins/BarStack.d.ts +1 -1
- package/dist/src/grid/plugins/Bars.d.ts +1 -1
- package/dist/src/grid/plugins/BarsPN.d.ts +1 -1
- package/dist/src/grid/plugins/BarsTriangle.d.ts +1 -1
- package/dist/src/grid/plugins/Dots.d.ts +1 -1
- package/dist/src/grid/plugins/GridLegend.d.ts +1 -1
- package/dist/src/grid/plugins/GroupAux.d.ts +1 -1
- package/dist/src/grid/plugins/GroupAxis.d.ts +1 -1
- package/dist/src/grid/plugins/LineAreas.d.ts +1 -1
- package/dist/src/grid/plugins/Lines.d.ts +1 -1
- package/dist/src/grid/plugins/ScalingArea.d.ts +1 -1
- package/dist/src/grid/plugins/ValueAxis.d.ts +1 -1
- package/dist/src/grid/plugins/ValueStackAxis.d.ts +1 -1
- package/dist/src/grid/types.d.ts +1 -1
- package/dist/src/multiGrid/multiGridObservables.d.ts +1 -1
- package/dist/src/multiGrid/plugins/MultiBarStack.d.ts +1 -1
- package/dist/src/multiGrid/plugins/MultiBars.d.ts +1 -1
- package/dist/src/multiGrid/plugins/MultiBarsTriangle.d.ts +1 -1
- package/dist/src/multiGrid/plugins/MultiDots.d.ts +1 -1
- package/dist/src/multiGrid/plugins/MultiGridLegend.d.ts +1 -1
- package/dist/src/multiGrid/plugins/MultiGroupAxis.d.ts +1 -1
- package/dist/src/multiGrid/plugins/MultiLineAreas.d.ts +1 -1
- package/dist/src/multiGrid/plugins/MultiLines.d.ts +1 -1
- package/dist/src/multiGrid/plugins/MultiValueAxis.d.ts +1 -1
- package/dist/src/multiGrid/plugins/MultiValueStackAxis.d.ts +1 -1
- package/dist/src/multiGrid/plugins/OverlappingValueAxes.d.ts +1 -1
- package/dist/src/multiGrid/plugins/OverlappingValueStackAxes.d.ts +1 -1
- package/dist/src/multiGrid/types.d.ts +1 -1
- package/dist/src/noneData/plugins/Container.d.ts +1 -1
- package/dist/src/noneData/plugins/Tooltip.d.ts +2 -2
- package/dist/src/noneData/types.d.ts +1 -1
- package/dist/src/series/plugins/Bubbles.d.ts +1 -1
- package/dist/src/series/plugins/Pie.d.ts +1 -1
- package/dist/src/series/plugins/PieEventTexts.d.ts +1 -1
- package/dist/src/series/plugins/PieLabels.d.ts +1 -1
- package/dist/src/series/plugins/Rose.d.ts +2 -2
- package/dist/src/series/plugins/RoseLabels.d.ts +1 -1
- package/dist/src/series/plugins/SeriesLegend.d.ts +1 -1
- package/dist/src/series/seriesObservables.d.ts +1 -1
- package/dist/src/series/seriesUtils.d.ts +1 -1
- package/dist/src/series/types.d.ts +1 -1
- package/dist/src/tree/plugins/TreeLegend.d.ts +1 -1
- package/dist/src/tree/plugins/TreeMap.d.ts +1 -1
- package/dist/src/tree/types.d.ts +1 -1
- package/dist/src/utils/orbchartsUtils.d.ts +1 -1
- package/lib/core-types.ts +7 -0
- package/lib/core.ts +6 -0
- package/package.json +3 -2
- package/src/base/BaseBarStack.ts +1 -1
- package/src/base/BaseBars.ts +1 -1
- package/src/base/BaseBarsTriangle.ts +1 -1
- package/src/base/BaseDots.ts +1 -1
- package/src/base/BaseGroupAxis.ts +7 -4
- package/src/base/BaseLegend.ts +1 -1
- package/src/base/BaseLineAreas.ts +1 -2
- package/src/base/BaseLines.ts +1 -1
- package/src/base/BaseValueAxis.ts +2 -2
- package/src/const.ts +30 -0
- package/src/grid/gridObservables.ts +5 -3
- package/src/grid/plugins/BarStack.ts +23 -2
- package/src/grid/plugins/Bars.ts +27 -2
- package/src/grid/plugins/BarsPN.ts +27 -2
- package/src/grid/plugins/BarsTriangle.ts +33 -2
- package/src/grid/plugins/Dots.ts +33 -2
- package/src/grid/plugins/GridLegend.ts +39 -2
- package/src/grid/plugins/GroupAux.ts +115 -31
- package/src/grid/plugins/GroupAxis.ts +63 -2
- package/src/grid/plugins/LineAreas.ts +27 -2
- package/src/grid/plugins/Lines.ts +21 -2
- package/src/grid/plugins/ScalingArea.ts +103 -61
- package/src/grid/plugins/ValueAxis.ts +60 -3
- package/src/grid/plugins/ValueStackAxis.ts +60 -3
- package/src/grid/types.ts +1 -1
- package/src/multiGrid/multiGridObservables.ts +1 -1
- package/src/multiGrid/plugins/MultiBarStack.ts +30 -2
- package/src/multiGrid/plugins/MultiBars.ts +33 -2
- package/src/multiGrid/plugins/MultiBarsTriangle.ts +39 -2
- package/src/multiGrid/plugins/MultiDots.ts +39 -2
- package/src/multiGrid/plugins/MultiGridLegend.ts +61 -2
- package/src/multiGrid/plugins/MultiGroupAxis.ts +69 -2
- package/src/multiGrid/plugins/MultiLineAreas.ts +33 -3
- package/src/multiGrid/plugins/MultiLines.ts +27 -3
- package/src/multiGrid/plugins/MultiValueAxis.ts +66 -2
- package/src/multiGrid/plugins/MultiValueStackAxis.ts +66 -2
- package/src/multiGrid/plugins/OverlappingValueAxes.ts +133 -4
- package/src/multiGrid/plugins/OverlappingValueStackAxes.ts +133 -4
- package/src/multiGrid/types.ts +1 -1
- package/src/noneData/defaults.ts +8 -8
- package/src/noneData/plugins/Container.ts +19 -2
- package/src/noneData/plugins/Tooltip.ts +46 -4
- package/src/noneData/types.ts +1 -1
- package/src/series/defaults.ts +1 -1
- package/src/series/plugins/Bubbles.ts +61 -3
- package/src/series/plugins/Pie.ts +43 -4
- package/src/series/plugins/PieEventTexts.ts +25 -4
- package/src/series/plugins/PieLabels.ts +39 -3
- package/src/series/plugins/Rose.ts +38 -3
- package/src/series/plugins/RoseLabels.ts +32 -3
- package/src/series/plugins/SeriesLegend.ts +39 -2
- package/src/series/seriesObservables.ts +1 -1
- package/src/series/seriesUtils.ts +1 -1
- package/src/series/types.ts +1 -1
- package/src/tree/plugins/TreeLegend.ts +39 -2
- package/src/tree/plugins/TreeMap.ts +31 -3
- package/src/tree/types.ts +1 -1
- package/src/utils/orbchartsUtils.ts +1 -1
@@ -9,27 +9,38 @@ import {
|
|
9
9
|
takeUntil,
|
10
10
|
debounceTime,
|
11
11
|
Subject } from 'rxjs'
|
12
|
-
import type {
|
12
|
+
import type { DefinePluginConfig } from '../../../lib/core-types'
|
13
|
+
import type { DataFormatterGrid } from '../../../lib/core-types'
|
13
14
|
import {
|
14
|
-
defineGridPlugin } from '
|
15
|
+
defineGridPlugin, createAxisLinearScale } from '../../../lib/core'
|
15
16
|
import { DEFAULT_SCALING_AREA_PARAMS } from '../defaults'
|
16
17
|
import { getClassName, getUniID } from '../../utils/orbchartsUtils'
|
17
|
-
import {
|
18
|
+
import { LAYER_INDEX_OF_ROOT } from '../../const'
|
18
19
|
|
19
20
|
const pluginName = 'ScalingArea'
|
20
21
|
const rectClassName = getClassName(pluginName, 'rect')
|
21
22
|
|
22
|
-
|
23
|
+
const pluginConfig: DefinePluginConfig<typeof pluginName, typeof DEFAULT_SCALING_AREA_PARAMS> = {
|
24
|
+
name: pluginName,
|
25
|
+
defaultParams: DEFAULT_SCALING_AREA_PARAMS,
|
26
|
+
layerIndex: LAYER_INDEX_OF_ROOT,
|
27
|
+
validator: (params, { validateColumns }) => {
|
28
|
+
return {
|
29
|
+
status: 'success',
|
30
|
+
columnName: '',
|
31
|
+
expectToBe: ''
|
32
|
+
}
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
36
|
+
export const ScalingArea = defineGridPlugin(pluginConfig)(({ selection, rootSelection, name, observer, subject }) => {
|
23
37
|
|
24
38
|
const destroy$ = new Subject()
|
25
39
|
|
26
|
-
const rootRectSelection: d3.Selection<SVGRectElement, any, any, any> = rootSelection
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
// .attr('pointer-events', 'none')
|
31
|
-
// .attr('clip-path', 'url(#bpcharts__clipPath-box)')
|
32
|
-
// const dataAreaSelection: d3.Selection<SVGGElement, any, any, any> = axisSelection.append('g')
|
40
|
+
// const rootRectSelection: d3.Selection<SVGRectElement, any, any, any> = rootSelection
|
41
|
+
// .append('rect')
|
42
|
+
// .classed(rectClassName, true)
|
43
|
+
// .attr('opacity', 0)
|
33
44
|
|
34
45
|
// 紀錄zoom最後一次的transform
|
35
46
|
let lastTransform = {
|
@@ -37,18 +48,19 @@ export const ScalingArea = defineGridPlugin(pluginName, DEFAULT_SCALING_AREA_PAR
|
|
37
48
|
x: 0,
|
38
49
|
y: 0
|
39
50
|
}
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
)
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
51
|
+
// let lastDomain: [number, number] = [0, 0]
|
52
|
+
|
53
|
+
// observer.layout$.pipe(
|
54
|
+
// takeUntil(destroy$),
|
55
|
+
// ).subscribe(d => {
|
56
|
+
// rootRectSelection
|
57
|
+
// .attr('width', d.width)
|
58
|
+
// .attr('height', d.height)
|
59
|
+
// .attr('x', d.left)
|
60
|
+
// .attr('y', d.top)
|
61
|
+
// })
|
62
|
+
|
63
|
+
const groupMax$ = observer.computedData$.pipe(
|
52
64
|
map(d => d[0] ? d[0].length - 1 : 0),
|
53
65
|
distinctUntilChanged()
|
54
66
|
)
|
@@ -63,45 +75,56 @@ export const ScalingArea = defineGridPlugin(pluginName, DEFAULT_SCALING_AREA_PAR
|
|
63
75
|
// store.fullDataFormatter$.next(fullDataFormatter)
|
64
76
|
// })
|
65
77
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
78
|
+
const initGroupAxis$ = observer.fullDataFormatter$.pipe(
|
79
|
+
map(d => d.grid.groupAxis),
|
80
|
+
// 只用第一次資料來計算scale才不會造成每次變動都受到影響
|
81
|
+
first()
|
82
|
+
)
|
83
|
+
|
84
|
+
|
85
|
+
const groupScale$ = combineLatest({
|
86
|
+
initGroupAxis: initGroupAxis$,
|
73
87
|
fullDataFormatter: observer.fullDataFormatter$,
|
74
|
-
|
88
|
+
groupMax: groupMax$,
|
75
89
|
layout: observer.layout$,
|
76
90
|
axisSize: observer.gridAxesSize$
|
91
|
+
}).pipe(
|
92
|
+
takeUntil(destroy$),
|
93
|
+
switchMap(async (d) => d),
|
94
|
+
map(data => {
|
95
|
+
// const groupMin = 0
|
96
|
+
const groupScaleDomainMin = data.initGroupAxis.scaleDomain[0] - data.initGroupAxis.scalePadding
|
97
|
+
const groupScaleDomainMax = data.initGroupAxis.scaleDomain[1] === 'max'
|
98
|
+
? data.groupMax + data.initGroupAxis.scalePadding
|
99
|
+
: data.initGroupAxis.scaleDomain[1] as number + data.initGroupAxis.scalePadding
|
100
|
+
|
101
|
+
const groupScale: d3.ScaleLinear<number, number> = createAxisLinearScale({
|
102
|
+
maxValue: data.groupMax,
|
103
|
+
minValue: 0,
|
104
|
+
axisWidth: data.axisSize.width,
|
105
|
+
scaleDomain: [groupScaleDomainMin, groupScaleDomainMax],
|
106
|
+
scaleRange: [0, 1]
|
107
|
+
})
|
108
|
+
|
109
|
+
return groupScale
|
110
|
+
})
|
111
|
+
)
|
112
|
+
|
113
|
+
combineLatest({
|
114
|
+
groupScale: groupScale$,
|
115
|
+
// initGroupAxis: initGroupAxis$,
|
116
|
+
// fullDataFormatter: fullDataFormatter$.pipe(first()), // 只用第一次資料來計算scale才不會造成每次變動都受到影響
|
117
|
+
fullDataFormatter: observer.fullDataFormatter$,
|
118
|
+
groupMax: groupMax$,
|
119
|
+
// layout: observer.layout$,
|
120
|
+
// axisSize: observer.gridAxesSize$
|
77
121
|
}).pipe(
|
78
122
|
takeUntil(destroy$),
|
79
123
|
switchMap(async (d) => d),
|
80
124
|
).subscribe(data => {
|
81
125
|
const groupMin = 0
|
82
|
-
const groupMax = data.groupMaxIndex
|
83
|
-
// const groupScaleDomainMin = data.initGroupAxis.scaleDomain[0] === 'min'
|
84
|
-
// ? groupMin - data.initGroupAxis.scalePadding
|
85
|
-
// : data.initGroupAxis.scaleDomain[0] as number - data.initGroupAxis.scalePadding
|
86
|
-
const groupScaleDomainMin = data.initGroupAxis.scaleDomain[0] - data.initGroupAxis.scalePadding
|
87
|
-
const groupScaleDomainMax = data.initGroupAxis.scaleDomain[1] === 'max'
|
88
|
-
? groupMax + data.initGroupAxis.scalePadding
|
89
|
-
: data.initGroupAxis.scaleDomain[1] as number + data.initGroupAxis.scalePadding
|
90
|
-
|
91
|
-
// const scaleRange: [number, number] = data.fullDataFormatter.grid.valueAxis.position === 'left' || data.fullDataFormatter.grid.valueAxis.position === 'top'
|
92
|
-
// ? [0, 1]
|
93
|
-
// : [1, 0]
|
94
|
-
|
95
|
-
const groupScale: d3.ScaleLinear<number, number> = createAxisLinearScale({
|
96
|
-
maxValue: data.groupMaxIndex,
|
97
|
-
minValue: 0,
|
98
|
-
axisWidth: data.axisSize.width,
|
99
|
-
scaleDomain: [groupScaleDomainMin, groupScaleDomainMax],
|
100
|
-
// scaleDomain: [groupMin, groupMax],
|
101
|
-
scaleRange: [0, 1]
|
102
|
-
})
|
103
126
|
|
104
|
-
const shadowScale = groupScale.copy()
|
127
|
+
const shadowScale = data.groupScale.copy()
|
105
128
|
|
106
129
|
const zoom = d3.zoom()
|
107
130
|
// .scaleExtent([1, data.groupMaxIndex])
|
@@ -110,11 +133,29 @@ export const ScalingArea = defineGridPlugin(pluginName, DEFAULT_SCALING_AREA_PAR
|
|
110
133
|
// debugger
|
111
134
|
// console.log('event', event)
|
112
135
|
const t = event.transform;
|
113
|
-
|
136
|
+
|
137
|
+
// if (event.sourceEvent.type === 'mousemove') {
|
138
|
+
// // 當進行平移時,反向計算 x 軸
|
139
|
+
// const dx = event.transform.x - currentTransform.x; // 本次平移增量
|
140
|
+
// const reversedX = currentTransform.x - dx; // 反向累積平移
|
141
|
+
// // 更新變換狀態
|
142
|
+
// currentTransform = d3.zoomIdentity
|
143
|
+
// .translate(reversedX, event.transform.y)
|
144
|
+
// .scale(event.transform.k);
|
145
|
+
// } else {
|
146
|
+
// // 縮放操作:只更新縮放比例
|
147
|
+
// currentTransform = d3.zoomIdentity
|
148
|
+
// .translate(currentTransform.x, currentTransform.y)
|
149
|
+
// .scale(event.transform.k);
|
150
|
+
// }
|
151
|
+
// console.log('currentTransform', currentTransform)
|
152
|
+
|
153
|
+
// console.log('t.x', t.x)
|
114
154
|
const mapGroupindex = (d: number) => {
|
115
155
|
const n = Math.round(d)
|
116
|
-
return Math.min(groupMax, Math.max(groupMin, n));
|
156
|
+
return Math.min(data.groupMax, Math.max(groupMin, n));
|
117
157
|
}
|
158
|
+
|
118
159
|
const zoomedDomain = data.fullDataFormatter.grid.groupAxis.position === 'bottom' || data.fullDataFormatter.grid.groupAxis.position === 'top'
|
119
160
|
? t.rescaleX(shadowScale)
|
120
161
|
.domain()
|
@@ -123,8 +164,9 @@ export const ScalingArea = defineGridPlugin(pluginName, DEFAULT_SCALING_AREA_PAR
|
|
123
164
|
.domain()
|
124
165
|
.map(mapGroupindex)
|
125
166
|
|
167
|
+
|
126
168
|
// domain超過極限值
|
127
|
-
if (zoomedDomain[0] <= groupMin && zoomedDomain[1] >= groupMax) {
|
169
|
+
if (zoomedDomain[0] <= groupMin && zoomedDomain[1] >= data.groupMax) {
|
128
170
|
// 繼續縮小
|
129
171
|
if (t.k < lastTransform.k) {
|
130
172
|
// 維持前一次的transform
|
@@ -142,12 +184,12 @@ export const ScalingArea = defineGridPlugin(pluginName, DEFAULT_SCALING_AREA_PAR
|
|
142
184
|
t.y = lastTransform.y
|
143
185
|
}
|
144
186
|
}
|
187
|
+
|
145
188
|
// 紀錄transform
|
146
189
|
lastTransform.k = t.k
|
147
190
|
lastTransform.x = t.x
|
148
191
|
lastTransform.y = t.y
|
149
|
-
|
150
|
-
// console.log('zoomedDomain', zoomedDomain)
|
192
|
+
|
151
193
|
|
152
194
|
const newDataFormatter: DataFormatterGrid = {
|
153
195
|
...data.fullDataFormatter,
|
@@ -157,20 +199,20 @@ export const ScalingArea = defineGridPlugin(pluginName, DEFAULT_SCALING_AREA_PAR
|
|
157
199
|
...data.fullDataFormatter.grid.groupAxis,
|
158
200
|
scaleDomain: zoomedDomain
|
159
201
|
}
|
160
|
-
}
|
202
|
+
}
|
161
203
|
}
|
162
204
|
subject.dataFormatter$.next(newDataFormatter)
|
163
205
|
})
|
164
206
|
|
165
207
|
// 傳入外層selection
|
166
208
|
// subject.selection.call(zoom as any)
|
167
|
-
rootSelection.call(zoom
|
209
|
+
rootSelection.call(zoom)
|
168
210
|
|
169
211
|
})
|
170
212
|
|
171
213
|
return () => {
|
172
214
|
destroy$.next(undefined)
|
173
|
-
rootRectSelection.remove()
|
215
|
+
// rootRectSelection.remove()
|
174
216
|
|
175
217
|
rootSelection.call(d3.zoom().on('zoom', null))
|
176
218
|
}
|
@@ -5,15 +5,72 @@ import {
|
|
5
5
|
distinctUntilChanged,
|
6
6
|
shareReplay
|
7
7
|
} from 'rxjs'
|
8
|
+
import type { DefinePluginConfig } from '../../../lib/core-types'
|
8
9
|
import {
|
9
|
-
defineGridPlugin } from '
|
10
|
+
defineGridPlugin } from '../../../lib/core'
|
10
11
|
import { DEFAULT_VALUE_AXIS_PARAMS } from '../defaults'
|
11
|
-
|
12
|
+
import { LAYER_INDEX_OF_AXIS } from '../../const'
|
12
13
|
import { createBaseValueAxis } from '../../base/BaseValueAxis'
|
13
14
|
|
14
15
|
const pluginName = 'ValueAxis'
|
15
16
|
|
16
|
-
|
17
|
+
const pluginConfig: DefinePluginConfig<typeof pluginName, typeof DEFAULT_VALUE_AXIS_PARAMS> = {
|
18
|
+
name: pluginName,
|
19
|
+
defaultParams: DEFAULT_VALUE_AXIS_PARAMS,
|
20
|
+
layerIndex: LAYER_INDEX_OF_AXIS,
|
21
|
+
validator: (params, { validateColumns }) => {
|
22
|
+
const result = validateColumns(params, {
|
23
|
+
labelOffset: {
|
24
|
+
toBe: '[number, number]',
|
25
|
+
test: (value: any) => {
|
26
|
+
return Array.isArray(value)
|
27
|
+
&& value.length === 2
|
28
|
+
&& typeof value[0] === 'number'
|
29
|
+
&& typeof value[1] === 'number'
|
30
|
+
}
|
31
|
+
},
|
32
|
+
labelColorType: {
|
33
|
+
toBeOption: 'ColorType',
|
34
|
+
},
|
35
|
+
axisLineVisible: {
|
36
|
+
toBeTypes: ['boolean']
|
37
|
+
},
|
38
|
+
axisLineColorType: {
|
39
|
+
toBeOption: 'ColorType',
|
40
|
+
},
|
41
|
+
ticks: {
|
42
|
+
toBeTypes: ['number', 'null']
|
43
|
+
},
|
44
|
+
tickFormat: {
|
45
|
+
toBeTypes: ['string', 'Function']
|
46
|
+
},
|
47
|
+
tickLineVisible: {
|
48
|
+
toBeTypes: ['boolean']
|
49
|
+
},
|
50
|
+
tickPadding: {
|
51
|
+
toBeTypes: ['number']
|
52
|
+
},
|
53
|
+
tickFullLine: {
|
54
|
+
toBeTypes: ['boolean']
|
55
|
+
},
|
56
|
+
tickFullLineDasharray: {
|
57
|
+
toBeTypes: ['string']
|
58
|
+
},
|
59
|
+
tickColorType: {
|
60
|
+
toBeOption: 'ColorType',
|
61
|
+
},
|
62
|
+
tickTextRotate: {
|
63
|
+
toBeTypes: ['number']
|
64
|
+
},
|
65
|
+
tickTextColorType: {
|
66
|
+
toBeOption: 'ColorType',
|
67
|
+
}
|
68
|
+
})
|
69
|
+
return result
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
export const ValueAxis = defineGridPlugin(pluginConfig)(({ selection, name, observer, subject }) => {
|
17
74
|
|
18
75
|
const destroy$ = new Subject()
|
19
76
|
|
@@ -7,15 +7,72 @@ import {
|
|
7
7
|
iif,
|
8
8
|
Observable,
|
9
9
|
Subject } from 'rxjs'
|
10
|
-
import type {
|
10
|
+
import type { DefinePluginConfig } from '../../../lib/core-types'
|
11
11
|
import {
|
12
|
-
defineGridPlugin } from '
|
12
|
+
defineGridPlugin } from '../../../lib/core'
|
13
13
|
import { DEFAULT_VALUE_STACK_AXIS_PARAMS } from '../defaults'
|
14
|
+
import { LAYER_INDEX_OF_AXIS } from '../../const'
|
14
15
|
import { createBaseValueAxis } from '../../base/BaseValueAxis'
|
15
16
|
|
16
17
|
const pluginName = 'ValueStackAxis'
|
17
18
|
|
18
|
-
|
19
|
+
const pluginConfig: DefinePluginConfig<typeof pluginName, typeof DEFAULT_VALUE_STACK_AXIS_PARAMS> = {
|
20
|
+
name: pluginName,
|
21
|
+
defaultParams: DEFAULT_VALUE_STACK_AXIS_PARAMS,
|
22
|
+
layerIndex: LAYER_INDEX_OF_AXIS,
|
23
|
+
validator: (params, { validateColumns }) => {
|
24
|
+
const result = validateColumns(params, {
|
25
|
+
labelOffset: {
|
26
|
+
toBe: '[number, number]',
|
27
|
+
test: (value: any) => {
|
28
|
+
return Array.isArray(value)
|
29
|
+
&& value.length === 2
|
30
|
+
&& typeof value[0] === 'number'
|
31
|
+
&& typeof value[1] === 'number'
|
32
|
+
}
|
33
|
+
},
|
34
|
+
labelColorType: {
|
35
|
+
toBeOption: 'ColorType',
|
36
|
+
},
|
37
|
+
axisLineVisible: {
|
38
|
+
toBeTypes: ['boolean']
|
39
|
+
},
|
40
|
+
axisLineColorType: {
|
41
|
+
toBeOption: 'ColorType',
|
42
|
+
},
|
43
|
+
ticks: {
|
44
|
+
toBeTypes: ['number', 'null']
|
45
|
+
},
|
46
|
+
tickFormat: {
|
47
|
+
toBeTypes: ['string', 'Function']
|
48
|
+
},
|
49
|
+
tickLineVisible: {
|
50
|
+
toBeTypes: ['boolean']
|
51
|
+
},
|
52
|
+
tickPadding: {
|
53
|
+
toBeTypes: ['number']
|
54
|
+
},
|
55
|
+
tickFullLine: {
|
56
|
+
toBeTypes: ['boolean']
|
57
|
+
},
|
58
|
+
tickFullLineDasharray: {
|
59
|
+
toBeTypes: ['string']
|
60
|
+
},
|
61
|
+
tickColorType: {
|
62
|
+
toBeOption: 'ColorType',
|
63
|
+
},
|
64
|
+
tickTextRotate: {
|
65
|
+
toBeTypes: ['number']
|
66
|
+
},
|
67
|
+
tickTextColorType: {
|
68
|
+
toBeOption: 'ColorType',
|
69
|
+
}
|
70
|
+
})
|
71
|
+
return result
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
export const ValueStackAxis = defineGridPlugin(pluginConfig)(({ selection, name, observer, subject }) => {
|
19
76
|
|
20
77
|
const destroy$ = new Subject()
|
21
78
|
|
package/src/grid/types.ts
CHANGED
@@ -15,7 +15,7 @@ import type {
|
|
15
15
|
ComputedDataGrid,
|
16
16
|
DataFormatterGrid,
|
17
17
|
ContextObserverGridDetail,
|
18
|
-
ContextObserverMultiGridDetail } from '
|
18
|
+
ContextObserverMultiGridDetail } from '../../lib/core-types'
|
19
19
|
|
20
20
|
// 可設定多個gridIndex的params
|
21
21
|
interface MultiGridPluginParams {
|
@@ -6,18 +6,46 @@ import {
|
|
6
6
|
shareReplay,
|
7
7
|
takeUntil
|
8
8
|
} from 'rxjs'
|
9
|
+
import type { DefinePluginConfig } from '../../../lib/core-types'
|
9
10
|
import {
|
10
|
-
defineMultiGridPlugin } from '
|
11
|
+
defineMultiGridPlugin } from '../../../lib/core'
|
11
12
|
import { DEFAULT_MULTI_BAR_STACK_PARAMS } from '../defaults'
|
12
13
|
import { createBaseBarStack } from '../../base/BaseBarStack'
|
13
14
|
import { multiGridPluginDetailObservables } from '../multiGridObservables'
|
14
15
|
import { getClassName, getUniID } from '../../utils/orbchartsUtils'
|
16
|
+
import { LAYER_INDEX_OF_GRAPHIC } from '../../const'
|
15
17
|
|
16
18
|
const pluginName = 'MultiBarStack'
|
17
19
|
|
18
20
|
const gridClassName = getClassName(pluginName, 'grid')
|
19
21
|
|
20
|
-
|
22
|
+
const pluginConfig: DefinePluginConfig<typeof pluginName, typeof DEFAULT_MULTI_BAR_STACK_PARAMS> = {
|
23
|
+
name: pluginName,
|
24
|
+
defaultParams: DEFAULT_MULTI_BAR_STACK_PARAMS,
|
25
|
+
layerIndex: LAYER_INDEX_OF_GRAPHIC,
|
26
|
+
validator: (params, { validateColumns }) => {
|
27
|
+
const result = validateColumns(params, {
|
28
|
+
gridIndexes: {
|
29
|
+
toBe: 'number[] | "all"',
|
30
|
+
test: (value: any) => {
|
31
|
+
return value === 'all' || (Array.isArray(value) && value.every((v: any) => typeof v === 'number'))
|
32
|
+
}
|
33
|
+
},
|
34
|
+
barWidth: {
|
35
|
+
toBeTypes: ['number']
|
36
|
+
},
|
37
|
+
barGroupPadding: {
|
38
|
+
toBeTypes: ['number']
|
39
|
+
},
|
40
|
+
barRadius: {
|
41
|
+
toBeTypes: ['number', 'boolean']
|
42
|
+
}
|
43
|
+
})
|
44
|
+
return result
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
export const MultiBarStack = defineMultiGridPlugin(pluginConfig)(({ selection, name, subject, observer }) => {
|
21
49
|
const destroy$ = new Subject()
|
22
50
|
|
23
51
|
const unsubscribeFnArr: (() => void)[] = []
|
@@ -6,18 +6,49 @@ import {
|
|
6
6
|
shareReplay,
|
7
7
|
takeUntil
|
8
8
|
} from 'rxjs'
|
9
|
+
import type { DefinePluginConfig } from '../../../lib/core-types'
|
9
10
|
import {
|
10
|
-
defineMultiGridPlugin } from '
|
11
|
+
defineMultiGridPlugin } from '../../../lib/core'
|
11
12
|
import { DEFAULT_MULTI_BARS_PARAMS } from '../defaults'
|
12
13
|
import { createBaseBars } from '../../base/BaseBars'
|
13
14
|
import { multiGridPluginDetailObservables } from '../multiGridObservables'
|
14
15
|
import { getClassName, getUniID } from '../../utils/orbchartsUtils'
|
16
|
+
import { LAYER_INDEX_OF_GRAPHIC } from '../../const'
|
15
17
|
|
16
18
|
const pluginName = 'MultiBars'
|
17
19
|
|
18
20
|
const gridClassName = getClassName(pluginName, 'grid')
|
19
21
|
|
20
|
-
|
22
|
+
const pluginConfig: DefinePluginConfig<typeof pluginName, typeof DEFAULT_MULTI_BARS_PARAMS> = {
|
23
|
+
name: pluginName,
|
24
|
+
defaultParams: DEFAULT_MULTI_BARS_PARAMS,
|
25
|
+
layerIndex: LAYER_INDEX_OF_GRAPHIC,
|
26
|
+
validator: (params, { validateColumns }) => {
|
27
|
+
const result = validateColumns(params, {
|
28
|
+
gridIndexes: {
|
29
|
+
toBe: 'number[] | "all"',
|
30
|
+
test: (value: any) => {
|
31
|
+
return value === 'all' || (Array.isArray(value) && value.every((v: any) => typeof v === 'number'))
|
32
|
+
}
|
33
|
+
},
|
34
|
+
barWidth: {
|
35
|
+
toBeTypes: ['number']
|
36
|
+
},
|
37
|
+
barPadding: {
|
38
|
+
toBeTypes: ['number']
|
39
|
+
},
|
40
|
+
barGroupPadding: {
|
41
|
+
toBeTypes: ['number']
|
42
|
+
},
|
43
|
+
barRadius: {
|
44
|
+
toBeTypes: ['number', 'boolean']
|
45
|
+
}
|
46
|
+
})
|
47
|
+
return result
|
48
|
+
}
|
49
|
+
}
|
50
|
+
|
51
|
+
export const MultiBars = defineMultiGridPlugin(pluginConfig)(({ selection, name, subject, observer }) => {
|
21
52
|
const destroy$ = new Subject()
|
22
53
|
|
23
54
|
const unsubscribeFnArr: (() => void)[] = []
|
@@ -6,18 +6,55 @@ import {
|
|
6
6
|
shareReplay,
|
7
7
|
takeUntil
|
8
8
|
} from 'rxjs'
|
9
|
+
import type { DefinePluginConfig } from '../../../lib/core-types'
|
9
10
|
import {
|
10
|
-
defineMultiGridPlugin } from '
|
11
|
+
defineMultiGridPlugin } from '../../../lib/core'
|
11
12
|
import { DEFAULT_MULTI_BARS_TRIANGLE_PARAMS } from '../defaults'
|
12
13
|
import { createBaseBarsTriangle } from '../../base/BaseBarsTriangle'
|
13
14
|
import { multiGridPluginDetailObservables } from '../multiGridObservables'
|
14
15
|
import { getClassName, getUniID } from '../../utils/orbchartsUtils'
|
16
|
+
import { LAYER_INDEX_OF_GRAPHIC } from '../../const'
|
15
17
|
|
16
18
|
const pluginName = 'MultiBarsTriangle'
|
17
19
|
|
18
20
|
const gridClassName = getClassName(pluginName, 'grid')
|
19
21
|
|
20
|
-
|
22
|
+
const pluginConfig: DefinePluginConfig<typeof pluginName, typeof DEFAULT_MULTI_BARS_TRIANGLE_PARAMS> = {
|
23
|
+
name: pluginName,
|
24
|
+
defaultParams: DEFAULT_MULTI_BARS_TRIANGLE_PARAMS,
|
25
|
+
layerIndex: LAYER_INDEX_OF_GRAPHIC,
|
26
|
+
validator: (params, { validateColumns }) => {
|
27
|
+
const result = validateColumns(params, {
|
28
|
+
gridIndexes: {
|
29
|
+
toBe: 'number[] | "all"',
|
30
|
+
test: (value: any) => {
|
31
|
+
return value === 'all' || (Array.isArray(value) && value.every((v: any) => typeof v === 'number'))
|
32
|
+
}
|
33
|
+
},
|
34
|
+
barWidth: {
|
35
|
+
toBeTypes: ['number']
|
36
|
+
},
|
37
|
+
barPadding: {
|
38
|
+
toBeTypes: ['number']
|
39
|
+
},
|
40
|
+
barGroupPadding: {
|
41
|
+
toBeTypes: ['number']
|
42
|
+
},
|
43
|
+
linearGradientOpacity: {
|
44
|
+
toBe: '[number, number]',
|
45
|
+
test: (value: any) => {
|
46
|
+
return Array.isArray(value)
|
47
|
+
&& value.length === 2
|
48
|
+
&& typeof value[0] === 'number'
|
49
|
+
&& typeof value[1] === 'number'
|
50
|
+
}
|
51
|
+
}
|
52
|
+
})
|
53
|
+
return result
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
export const MultiBarsTriangle = defineMultiGridPlugin(pluginConfig)(({ selection, name, subject, observer }) => {
|
21
58
|
const destroy$ = new Subject()
|
22
59
|
|
23
60
|
const unsubscribeFnArr: (() => void)[] = []
|
@@ -2,18 +2,55 @@ import * as d3 from 'd3'
|
|
2
2
|
import {
|
3
3
|
takeUntil,
|
4
4
|
Subject } from 'rxjs'
|
5
|
+
import type { DefinePluginConfig } from '../../../lib/core-types'
|
5
6
|
import {
|
6
|
-
defineMultiGridPlugin } from '
|
7
|
+
defineMultiGridPlugin } from '../../../lib/core'
|
7
8
|
import { DEFAULT_MULTI_DOTS_PARAMS } from '../defaults'
|
8
9
|
import { createBaseDots } from '../../base/BaseDots'
|
9
10
|
import { multiGridPluginDetailObservables } from '../multiGridObservables'
|
10
11
|
import { getClassName, getUniID } from '../../utils/orbchartsUtils'
|
12
|
+
import { LAYER_INDEX_OF_GRAPHIC_COVER } from '../../const'
|
11
13
|
|
12
14
|
const pluginName = 'MultiDots'
|
13
15
|
|
14
16
|
const gridClassName = getClassName(pluginName, 'grid')
|
15
17
|
|
16
|
-
|
18
|
+
const pluginConfig: DefinePluginConfig<typeof pluginName, typeof DEFAULT_MULTI_DOTS_PARAMS> = {
|
19
|
+
name: pluginName,
|
20
|
+
defaultParams: DEFAULT_MULTI_DOTS_PARAMS,
|
21
|
+
layerIndex: LAYER_INDEX_OF_GRAPHIC_COVER,
|
22
|
+
validator: (params, { validateColumns }) => {
|
23
|
+
const result = validateColumns(params, {
|
24
|
+
gridIndexes: {
|
25
|
+
toBe: 'number[] | "all"',
|
26
|
+
test: (value: any) => {
|
27
|
+
return value === 'all' || (Array.isArray(value) && value.every((v: any) => typeof v === 'number'))
|
28
|
+
}
|
29
|
+
},
|
30
|
+
radius: {
|
31
|
+
toBeTypes: ['number']
|
32
|
+
},
|
33
|
+
fillColorType: {
|
34
|
+
toBeOption: 'ColorType',
|
35
|
+
},
|
36
|
+
strokeColorType: {
|
37
|
+
toBeOption: 'ColorType',
|
38
|
+
},
|
39
|
+
strokeWidth: {
|
40
|
+
toBeTypes: ['number']
|
41
|
+
},
|
42
|
+
// strokeWidthWhileHighlight: {
|
43
|
+
// toBeTypes: ['number']
|
44
|
+
// },
|
45
|
+
onlyShowHighlighted: {
|
46
|
+
toBeTypes: ['boolean']
|
47
|
+
}
|
48
|
+
})
|
49
|
+
return result
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
export const MultiDots = defineMultiGridPlugin(pluginConfig)(({ selection, name, subject, observer }) => {
|
17
54
|
const destroy$ = new Subject()
|
18
55
|
|
19
56
|
const unsubscribeFnArr: (() => void)[] = []
|