@orbcharts/plugins-basic 3.0.0-alpha.30 → 3.0.0-alpha.32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. package/dist/orbcharts-plugins-basic.es.js +15995 -15706
  2. package/dist/orbcharts-plugins-basic.umd.js +8 -8
  3. package/dist/src/base/BaseBarStack.d.ts +29 -0
  4. package/dist/src/base/BaseBars.d.ts +29 -0
  5. package/dist/src/base/BaseBarsTriangle.d.ts +28 -0
  6. package/dist/src/base/BaseLegend.d.ts +17 -6
  7. package/dist/src/base/BaseLines.d.ts +27 -0
  8. package/dist/src/base/types.d.ts +2 -2
  9. package/dist/src/grid/defaults.d.ts +10 -10
  10. package/dist/src/grid/plugins/BarStack.d.ts +1 -3
  11. package/dist/src/grid/plugins/Bars.d.ts +1 -3
  12. package/dist/src/grid/plugins/BarsTriangle.d.ts +1 -3
  13. package/dist/src/grid/plugins/Lines.d.ts +1 -3
  14. package/dist/src/grid/types.d.ts +10 -2
  15. package/dist/src/index.d.ts +1 -0
  16. package/dist/src/multiGrid/defaults.d.ts +4 -0
  17. package/dist/src/multiGrid/index.d.ts +4 -0
  18. package/dist/src/multiGrid/plugins/BarsAndLines.d.ts +1 -0
  19. package/dist/src/multiGrid/plugins/MultiGridLegend.d.ts +1 -0
  20. package/dist/src/multiGrid/types.d.ts +24 -0
  21. package/dist/src/series/defaults.d.ts +2 -2
  22. package/dist/src/series/types.d.ts +10 -2
  23. package/package.json +2 -2
  24. package/src/base/BaseBarStack.ts +699 -0
  25. package/src/base/BaseBars.ts +639 -0
  26. package/src/base/BaseBarsTriangle.ts +626 -0
  27. package/src/base/BaseLegend.ts +50 -20
  28. package/src/base/BaseLines.ts +566 -0
  29. package/src/base/types.ts +2 -2
  30. package/src/grid/defaults.ts +10 -10
  31. package/src/grid/plugins/BarStack.ts +18 -645
  32. package/src/grid/plugins/Bars.ts +17 -588
  33. package/src/grid/plugins/BarsTriangle.ts +16 -579
  34. package/src/grid/plugins/Dots.ts +2 -2
  35. package/src/grid/plugins/GridLegend.ts +19 -1
  36. package/src/grid/plugins/GroupArea.ts +2 -2
  37. package/src/grid/plugins/GroupAxis.ts +2 -2
  38. package/src/grid/plugins/Lines.ts +15 -509
  39. package/src/grid/plugins/ScalingArea.ts +2 -2
  40. package/src/grid/plugins/ValueAxis.ts +2 -2
  41. package/src/grid/plugins/ValueStackAxis.ts +2 -2
  42. package/src/grid/types.ts +12 -2
  43. package/src/index.ts +1 -0
  44. package/src/multiGrid/defaults.ts +33 -0
  45. package/src/multiGrid/index.ts +4 -0
  46. package/src/multiGrid/plugins/BarsAndLines.ts +110 -0
  47. package/src/multiGrid/plugins/BarsTriangleAndLines.ts +0 -0
  48. package/src/multiGrid/plugins/DivergingValueAxes.ts +0 -0
  49. package/src/multiGrid/plugins/FirstGroupScaleAxis.ts +0 -0
  50. package/src/multiGrid/plugins/MultiGridLegend.ts +89 -0
  51. package/src/multiGrid/plugins/TwoValueScaleAxes.ts +0 -0
  52. package/src/multiGrid/types.ts +27 -0
  53. package/src/series/defaults.ts +2 -2
  54. package/src/series/plugins/Bubbles.ts +2 -2
  55. package/src/series/plugins/Pie.ts +2 -2
  56. package/src/series/plugins/SeriesLegend.ts +19 -1
  57. package/src/series/types.ts +12 -2
  58. /package/dist/src/multiGrid/plugins/{DivergingAxes.d.ts → BarStackAndLines.d.ts} +0 -0
  59. /package/dist/src/multiGrid/plugins/{TwoScaleAxes.d.ts → BarsTriangleAndLines.d.ts} +0 -0
  60. /package/dist/src/multiGrid/plugins/{TwoScales.d.ts → DivergingValueAxes.d.ts} +0 -0
  61. /package/{src/multiGrid/plugins/DivergingAxes.ts → dist/src/multiGrid/plugins/FirstGroupScaleAxis.d.ts} +0 -0
  62. /package/{src/multiGrid/plugins/TwoScaleAxes.ts → dist/src/multiGrid/plugins/TwoValueScaleAxes.d.ts} +0 -0
  63. /package/src/multiGrid/plugins/{TwoScales.ts → BarStackAndLines.ts} +0 -0
@@ -1,594 +1,31 @@
1
- import * as d3 from 'd3'
2
1
  import {
3
- combineLatest,
4
- switchMap,
5
- map,
6
- first,
7
- takeUntil,
8
- distinctUntilChanged,
9
2
  Subject,
10
3
  Observable } from 'rxjs'
11
- // import type { Subject } from 'rxjs'
12
4
  import { defineGridPlugin } from '@orbcharts/core'
13
- import type {
14
- ComputedDatumGrid,
15
- EventSeries,
16
- ChartParams,
17
- DataSeriesDatum,
18
- Layout } from '@orbcharts/core'
19
- import type { BarsTriangleParams } from '../types'
20
- import { DEFAULT_BARS_TRIANGLE_PLUGIN_PARAMS } from '../defaults'
21
- import { getD3TransitionEase } from '../../utils/d3Utils'
22
- import {
23
- getClassName,
24
- getUniID } from '../../utils/orbchartsUtils'
25
-
26
- interface RenderBarParams {
27
- selection: d3.Selection<SVGGElement, unknown, any, any>
28
- barData: BarDatumGrid[][]
29
- zeroY: number
30
- groupLabels: string[]
31
- barScale: d3.ScalePoint<string>
32
- params: BarsTriangleParams
33
- chartParams: ChartParams
34
- barWidth: number
35
- delayGroup: number
36
- transitionItem: number
37
- }
38
-
39
- interface BarDatumGrid extends ComputedDatumGrid {
40
- linearGradientId: string
41
- }
42
-
43
- type ClipPathDatum = {
44
- id: string;
45
- // x: number;
46
- // y: number;
47
- width: number;
48
- height: number;
49
- }
5
+ import { DEFAULT_BARS_TRIANGLE_PARAMS } from '../defaults'
6
+ import { createBaseBarsTriangle } from '../../base/BaseBarsTriangle'
50
7
 
51
8
  const pluginName = 'BarsTriangle'
52
- const gClassName = getClassName(pluginName, 'g')
53
- const gContentClassName = getClassName(pluginName, 'g-content')
54
- // group的delay在動畫中的佔比(剩餘部份的時間為圖形本身的動畫時間,因為delay時間和最後一個group的動畫時間加總為1)
55
- const groupDelayProportionOfDuration = 0.3
56
-
57
- function calcBarWidth ({ axisWidth, groupAmount, barAmountOfGroup, barPadding = 0, barGroupPadding = 0 }: {
58
- axisWidth: number
59
- groupAmount: number
60
- barAmountOfGroup: number
61
- barPadding: number
62
- barGroupPadding: number
63
- }) {
64
- const width = (axisWidth / groupAmount - barGroupPadding) / barAmountOfGroup - barPadding
65
- return width > 1 ? width : 1
66
- }
67
-
68
- function makeBarScale (barWidth: number, seriesLabels: string[], params: BarsTriangleParams) {
69
- const barHalfWidth = barWidth! / 2
70
- const barGroupWidth = barWidth * seriesLabels.length + params.barPadding! * seriesLabels.length
71
- return d3.scalePoint()
72
- .domain(seriesLabels)
73
- .range([-barGroupWidth / 2 + barHalfWidth, barGroupWidth / 2 - barHalfWidth])
74
- }
75
-
76
- function calcDelayGroup (barGroupAmount: number, totalDuration: number) {
77
- if (barGroupAmount <= 1) {
78
- // 一筆內計算會出錯所以不算
79
- return 0
80
- }
81
- return totalDuration / (barGroupAmount - 1) * groupDelayProportionOfDuration // 依group數量計算
82
- }
83
-
84
- function calctransitionItem (barGroupAmount: number, totalDuration: number) {
85
- if (barGroupAmount <= 1) {
86
- // 一筆內不會有delay
87
- return totalDuration
88
- }
89
- return totalDuration * (1 - groupDelayProportionOfDuration) // delay後剩餘的時間
90
- }
91
-
92
- function renderTriangleBars ({ selection, barData, zeroY, groupLabels, barScale, params, chartParams, barWidth, delayGroup, transitionItem }: RenderBarParams) {
93
- // console.log({ selection, data, zeroY, seriesLabels, barScale, params, chartParams, barWidth, delayGroup })
94
- // if (barWidth <= 0) {
95
- // return
96
- // }
97
- const update = selection!
98
- .selectAll<SVGGElement, ComputedDatumGrid[]>(`g.${gClassName}`)
99
- .data(barData, (d, i) => groupLabels[i])
100
- const enter = update.enter()
101
- .append('g')
102
- .classed(gClassName, true)
103
- .attr('cursor', 'pointer')
104
- update.exit().remove()
105
- const graphicGroupSelection = update.merge(enter)
106
- enter
107
- .attr('transform', (d, i) => `translate(${d[0] ? d[0].axisX : 0}, ${0})`)
108
- update
109
- // .transition()
110
- // .duration(200)
111
- .attr('transform', (d, i) => `translate(${d[0] ? d[0].axisX : 0}, ${0})`)
112
-
113
- const barHalfWidth = barWidth! / 2
114
-
115
- graphicGroupSelection
116
- .each((d, i, g) => {
117
- const pathUpdate = d3.select(g[i])
118
- .selectAll<SVGGElement, ComputedDatumGrid>('g')
119
- .data(d, _d => _d.id)
120
- const pathEnter = pathUpdate
121
- .enter()
122
- .append('g')
123
- .classed(gContentClassName, true)
124
- pathEnter
125
- .append('path')
126
- // .attr('transform', `translate(${-barHalfWidth}, 0)`)
127
- // .attr('x', d => itemScale(d.itemLabel)!)
128
- // .attr('y', d => 0)
129
- .style('vector-effect', 'non-scaling-stroke')
130
- .attr('height', d => 0)
131
- .attr('d', (d) => {
132
- const x = barScale(d.seriesLabel)!
133
- const y1 = zeroY
134
- const y2 = y1
135
- return `M${x - (barWidth! / 2)},${y1} L${x},${y2} ${x + (barWidth! / 2)},${y1}`
136
- })
137
- pathUpdate.merge(pathEnter)
138
- .select('path')
139
- .style('fill', d => `url(#${d.linearGradientId})`)
140
- .attr('stroke', d => d.color)
141
- .attr('transform', `translate(${-barHalfWidth}, 0)`)
142
- .transition()
143
- .duration(transitionItem)
144
- .ease(getD3TransitionEase(chartParams.transitionEase))
145
- .delay((d, i) => d.groupIndex * delayGroup)
146
- .attr('transform', `translate(${-barHalfWidth}, 0)`)
147
- // .attr('x', d => itemScale(d.itemLabel)!)
148
- // .attr('y', d => -d.y)
149
- .attr('height', d => Math.abs(d.axisYFromZero))
150
- .attr('d', (d) => {
151
- const x = barScale(d.seriesLabel)!
152
- const y1 = zeroY
153
- const y2 = d.axisY
154
- return `M${x},${y1} L${x + (barWidth! / 2)},${y2} ${x + barWidth!},${y1}`
155
- })
156
- // .on('end', () => initHighlight())
157
- pathUpdate.exit().remove()
158
- })
159
-
160
- const graphicBarSelection: d3.Selection<SVGPathElement, ComputedDatumGrid, any, any> = graphicGroupSelection.selectAll(`g.${gContentClassName}`)
161
-
162
- return graphicBarSelection
163
- }
164
9
 
165
- function renderLinearGradient ({ defsSelection, barData, params }: {
166
- defsSelection: d3.Selection<SVGDefsElement, ComputedDatumGrid, any, any>
167
- barData: BarDatumGrid[][]
168
- params: BarsTriangleParams
169
- }) {
170
- const linearGradientUpdate = defsSelection!
171
- .selectAll<SVGLinearGradientElement, ComputedDatumGrid>('linearGradient')
172
- .data(barData[0] ?? [], d => d.seriesLabel)
173
- const linearGradientEnter = linearGradientUpdate
174
- .enter()
175
- .append('linearGradient')
176
- .attr('x1', '0%')
177
- .attr('x2', '0%')
178
- .attr('y1', '100%')
179
- .attr('y2', '0%')
180
- .attr('spreadMethod', 'pad')
181
- linearGradientUpdate.merge(linearGradientEnter)
182
- .attr('id', (d, i) => d.linearGradientId)
183
- .html((d, i) => `
184
- <stop offset="0%" stop-color="${d.color}" stop-opacity="${params.linearGradientOpacity[0]}"/>
185
- <stop offset="100%" stop-color="${d.color}" stop-opacity="${params.linearGradientOpacity[1]}"/>
186
- `)
187
- linearGradientUpdate.exit().remove()
188
- }
189
-
190
-
191
- function renderClipPath ({ defsSelection, clipPathData }: {
192
- defsSelection: d3.Selection<SVGDefsElement, any, any, any>
193
- clipPathData: ClipPathDatum[]
194
- }) {
195
- const update = defsSelection
196
- .selectAll<SVGClipPathElement, Layout>('clipPath')
197
- .data(clipPathData)
198
- const enter = update.enter()
199
- .append('clipPath')
200
- const cutRect = update.merge(enter)
201
- .attr('id', d => d.id)
202
- update.exit().remove()
203
-
204
- update.merge(enter).each((d, i, g) => {
205
- const updateRect = d3.select(g[i])
206
- .selectAll<SVGRectElement, typeof d>('rect')
207
- .data([d])
208
- const enterRect = updateRect.enter().append('rect')
209
- updateRect.merge(enterRect)
210
- .attr('x', 0)
211
- .attr('y', 0)
212
- .attr('width', _d => _d.width)
213
- .attr('height', _d => _d.height)
214
- updateRect.exit().remove()
215
- })
216
- }
217
-
218
- function highlight ({ selection, ids, fullChartParams }: {
219
- selection: d3.Selection<SVGPathElement, ComputedDatumGrid, any, any>
220
- ids: string[]
221
- fullChartParams: ChartParams
222
- }) {
223
- selection.interrupt('highlight')
224
-
225
- const removeHighlight = () => {
226
- selection
227
- .transition('highlight')
228
- .duration(200)
229
- .style('opacity', 1)
230
- }
231
-
232
- if (!ids.length) {
233
- removeHighlight()
234
- return
235
- }
236
-
237
- selection
238
- .each((d, i, n) => {
239
- if (ids.includes(d.id)) {
240
- d3.select(n[i])
241
- .style('opacity', 1)
242
- } else {
243
- d3.select(n[i])
244
- .style('opacity', fullChartParams.styles.unhighlightedOpacity)
245
- }
246
- })
247
- }
248
-
249
- export const BarsTriangle = defineGridPlugin(pluginName, DEFAULT_BARS_TRIANGLE_PLUGIN_PARAMS)(({ selection, name, subject, observer }) => {
10
+ export const BarsTriangle = defineGridPlugin(pluginName, DEFAULT_BARS_TRIANGLE_PARAMS)(({ selection, name, subject, observer }) => {
250
11
  const destroy$ = new Subject()
251
12
 
252
- const clipPathID = getUniID(pluginName, 'clipPath-box')
253
-
254
- const axisSelection: d3.Selection<SVGGElement, any, any, any> = selection
255
- .append('g')
256
- .attr('clip-path', `url(#${clipPathID})`)
257
- const defsSelection: d3.Selection<SVGDefsElement, ComputedDatumGrid, any, any> = axisSelection.append('defs')
258
- const graphicGSelection: d3.Selection<SVGGElement, any, any, any> = axisSelection.append('g')
259
- let graphicSelection: d3.Selection<SVGGElement, any, any, any> | undefined
260
- const pathSelection$: Subject<d3.Selection<SVGPathElement, ComputedDatumGrid, any, any>> = new Subject()
261
- // .style('transform', 'translate(0px, 0px) scale(1)')
262
-
263
- observer.gridAxesTransform$
264
- .pipe(
265
- takeUntil(destroy$),
266
- map(d => d.value),
267
- distinctUntilChanged()
268
- ).subscribe(d => {
269
- axisSelection
270
- .style('transform', d)
271
- })
272
-
273
- observer.gridGraphicTransform$
274
- .pipe(
275
- takeUntil(destroy$),
276
- switchMap(async d => d.value),
277
- distinctUntilChanged()
278
- ).subscribe(d => {
279
- graphicGSelection
280
- .transition()
281
- .duration(50)
282
- .style('transform', d)
283
- })
284
-
285
- // const axisSize$ = gridAxisSizeObservable({
286
- // dataFormatter$,
287
- // observer.layout$
288
- // })
289
-
290
- const zeroY$ = observer.computedData$.pipe(
291
- map(d => d[0] && d[0][0]
292
- ? d[0][0].axisY - d[0][0].axisYFromZero
293
- : 0),
294
- distinctUntilChanged()
295
- )
296
-
297
- const barWidth$ = new Observable<number>(subscriber => {
298
- combineLatest({
299
- computedData: observer.computedData$,
300
- params: observer.fullParams$,
301
- axisSize: observer.gridAxesSize$
302
- }).pipe(
303
- switchMap(async d => d)
304
- ).subscribe(data => {
305
- const barWidth = calcBarWidth({
306
- axisWidth: data.axisSize.width,
307
- groupAmount: data.computedData[0] ? data.computedData[0].length : 0,
308
- barAmountOfGroup: data.computedData.length,
309
- barPadding: data.params.barPadding,
310
- barGroupPadding: data.params.barGroupPadding
311
- })
312
- subscriber.next(barWidth)
313
- })
314
- }).pipe(
315
- takeUntil(destroy$),
316
- distinctUntilChanged()
317
- )
318
-
319
- const seriesLabels$ = observer.computedData$.pipe(
320
- takeUntil(destroy$),
321
- map(data => data.map((d, i) => d[0] ? d[0].seriesLabel : String(i)))
322
- )
323
-
324
- const groupLabels$ = observer.computedData$.pipe(
325
- takeUntil(destroy$),
326
- map(data => {
327
- return data[0] ? data[0].map(d => d.groupLabel) : []
328
- })
329
- )
330
-
331
- const barScale$: Observable<d3.ScalePoint<string>> = new Observable(subscriber => {
332
- combineLatest({
333
- seriesLabels: seriesLabels$,
334
- barWidth: barWidth$,
335
- params: observer.fullParams$,
336
- }).pipe(
337
- takeUntil(destroy$),
338
- switchMap(async d => d)
339
- ).subscribe(data => {
340
- const barScale = makeBarScale(data.barWidth, data.seriesLabels, data.params)
341
- subscriber.next(barScale)
342
- })
343
- })
344
-
345
- const transitionDuration$ = observer.fullChartParams$.pipe(
346
- takeUntil(destroy$),
347
- map(d => d.transitionDuration),
348
- distinctUntilChanged()
349
- )
350
-
351
- const delayGroup$ = new Observable<number>(subscriber => {
352
- combineLatest({
353
- groupLabels: groupLabels$,
354
- transitionDuration: transitionDuration$,
355
- }).pipe(
356
- switchMap(async d => d)
357
- ).subscribe(data => {
358
- const delay = calcDelayGroup(data.groupLabels.length, data.transitionDuration)
359
- subscriber.next(delay)
360
- })
361
- }).pipe(
362
- takeUntil(destroy$),
363
- distinctUntilChanged()
364
- )
365
-
366
- const transitionItem$ = new Observable<number>(subscriber => {
367
- combineLatest({
368
- groupLabels: groupLabels$,
369
- transitionDuration: transitionDuration$
370
- }).pipe(
371
- switchMap(async d => d)
372
- ).subscribe(data => {
373
- const transition = calctransitionItem(data.groupLabels.length, data.transitionDuration)
374
- subscriber.next(transition)
375
- })
376
- }).pipe(
377
- takeUntil(destroy$),
378
- distinctUntilChanged()
379
- )
380
-
381
- const transposedData$ = observer.computedData$.pipe(
382
- takeUntil(destroy$),
383
- map(data => {
384
- // 取得原始陣列的維度
385
- const rows = data.length;
386
- const cols = data.reduce((prev, current) => {
387
- return Math.max(prev, current.length)
388
- }, 0)
389
-
390
- // 初始化轉換後的陣列
391
- const transposedArray: typeof data = new Array(cols).fill(null).map(() => new Array(rows).fill(null))
392
-
393
- // 遍歷原始陣列,進行轉換
394
- for (let i = 0; i < rows; i++) {
395
- for (let j = 0; j < cols; j++) {
396
- transposedArray[j][i] = data[i][j]
397
- }
398
- }
399
-
400
- return transposedArray
401
- })
402
- )
403
-
404
- const barData$ = transposedData$.pipe(
405
- takeUntil(destroy$),
406
- map(data => {
407
- const linearGradientIds = data.length
408
- ? data[0].map(d => getUniID(name, `lineargradient-${d.seriesLabel}`))
409
- : []
410
- return data.map(d => {
411
- return d.map((_d, _i) => {
412
- return <BarDatumGrid>{
413
- linearGradientId: linearGradientIds[_i],
414
- ..._d
415
- }
416
- })
417
- })
418
- })
419
- )
420
-
421
- observer.gridAxesSize$.pipe(
422
- takeUntil(destroy$)
423
- ).subscribe(data => {
424
- const clipPathData = [{
425
- id: clipPathID,
426
- width: data.width,
427
- height: data.height
428
- }]
429
- renderClipPath({
430
- defsSelection,
431
- clipPathData
432
- })
13
+ const unsubscribeBaseBars = createBaseBarsTriangle(pluginName, {
14
+ selection,
15
+ computedData$: observer.computedData$,
16
+ SeriesDataMap$: observer.SeriesDataMap$,
17
+ GroupDataMap$: observer.GroupDataMap$,
18
+ fullParams$: observer.fullParams$,
19
+ fullChartParams$: observer.fullChartParams$,
20
+ gridAxesTransform$: observer.gridAxesTransform$,
21
+ gridGraphicTransform$: observer.gridGraphicTransform$,
22
+ gridAxesSize$: observer.gridAxesSize$,
23
+ gridHighlight$: observer.gridHighlight$,
24
+ event$: subject.event$,
433
25
  })
434
26
 
435
- // const SeriesDataMap$ = observer.computedData$.pipe(
436
- // map(d => makeGridSeriesDataMap(d))
437
- // )
438
-
439
- // const GroupDataMap$ = observer.computedData$.pipe(
440
- // map(d => makeGridGroupDataMap(d))
441
- // )
442
-
443
- const highlightTarget$ = observer.fullChartParams$.pipe(
444
- takeUntil(destroy$),
445
- map(d => d.highlightTarget),
446
- distinctUntilChanged()
447
- )
448
-
449
- combineLatest({
450
- barData: barData$,
451
- computedData: observer.computedData$,
452
- zeroY: zeroY$,
453
- groupLabels: groupLabels$,
454
- barScale: barScale$,
455
- params: observer.fullParams$,
456
- chartParams: observer.fullChartParams$,
457
- highlightTarget: highlightTarget$,
458
- barWidth: barWidth$,
459
- delayGroup: delayGroup$,
460
- transitionItem: transitionItem$,
461
- SeriesDataMap: observer.SeriesDataMap$,
462
- GroupDataMap: observer.GroupDataMap$
463
- }).pipe(
464
- takeUntil(destroy$),
465
- // 轉換後會退訂前一個未完成的訂閱事件,因此可以取到「同時間」最後一次的訂閱事件
466
- switchMap(async (d) => d),
467
- ).subscribe(data => {
468
- const pathSelection = renderTriangleBars({
469
- selection: graphicGSelection,
470
- barData: data.barData,
471
- zeroY: data.zeroY,
472
- groupLabels: data.groupLabels,
473
- barScale: data.barScale,
474
- params: data.params,
475
- chartParams: data.chartParams,
476
- barWidth: data.barWidth,
477
- delayGroup: data.delayGroup,
478
- transitionItem: data.transitionItem
479
- })
480
- renderLinearGradient({
481
- defsSelection,
482
- barData: data.barData,
483
- params: data.params
484
- })
485
-
486
- pathSelection!
487
- .on('mouseover', (event, datum) => {
488
- event.stopPropagation()
489
-
490
- subject.event$.next({
491
- type: 'grid',
492
- eventName: 'mouseover',
493
- pluginName: name,
494
- highlightTarget: data.highlightTarget,
495
- datum,
496
- series: data.SeriesDataMap.get(datum.seriesLabel)!,
497
- seriesIndex: datum.seriesIndex,
498
- seriesLabel: datum.seriesLabel,
499
- groups: data.GroupDataMap.get(datum.groupLabel)!,
500
- groupIndex: datum.groupIndex,
501
- groupLabel: datum.groupLabel,
502
- event,
503
- data: data.computedData
504
- })
505
- })
506
- .on('mousemove', (event, datum) => {
507
- event.stopPropagation()
508
-
509
- subject.event$.next({
510
- type: 'grid',
511
- eventName: 'mousemove',
512
- pluginName: name,
513
- highlightTarget: data.highlightTarget,
514
- datum,
515
- series: data.SeriesDataMap.get(datum.seriesLabel)!,
516
- seriesIndex: datum.seriesIndex,
517
- seriesLabel: datum.seriesLabel,
518
- groups: data.GroupDataMap.get(datum.groupLabel)!,
519
- groupIndex: datum.groupIndex,
520
- groupLabel: datum.groupLabel,
521
- event,
522
- data: data.computedData
523
- })
524
- })
525
- .on('mouseout', (event, datum) => {
526
- event.stopPropagation()
527
-
528
- subject.event$.next({
529
- type: 'grid',
530
- eventName: 'mouseout',
531
- pluginName: name,
532
- highlightTarget: data.highlightTarget,
533
- datum,
534
- series: data.SeriesDataMap.get(datum.seriesLabel)!,
535
- seriesIndex: datum.seriesIndex,
536
- seriesLabel: datum.seriesLabel,
537
- groups: data.GroupDataMap.get(datum.groupLabel)!,
538
- groupIndex: datum.groupIndex,
539
- groupLabel: datum.groupLabel,
540
- event,
541
- data: data.computedData
542
- })
543
- })
544
- .on('click', (event, datum) => {
545
- event.stopPropagation()
546
-
547
- subject.event$.next({
548
- type: 'grid',
549
- eventName: 'click',
550
- pluginName: name,
551
- highlightTarget: data.highlightTarget,
552
- datum,
553
- series: data.SeriesDataMap.get(datum.seriesLabel)!,
554
- seriesIndex: datum.seriesIndex,
555
- seriesLabel: datum.seriesLabel,
556
- groups: data.GroupDataMap.get(datum.groupLabel)!,
557
- groupIndex: datum.groupIndex,
558
- groupLabel: datum.groupLabel,
559
- event,
560
- data: data.computedData
561
- })
562
- })
563
-
564
- pathSelection$.next(pathSelection)
565
- })
566
-
567
- // const datumList$ = observer.computedData$.pipe(
568
- // takeUntil(destroy$),
569
- // map(d => d.flat())
570
- // )
571
- // const highlight$ = highlightObservable({ datumList$, observer.fullChartParams$, event$: subject.event$ })
572
- const highlightSubscription = observer.gridHighlight$.subscribe()
573
-
574
- combineLatest({
575
- pathSelection: pathSelection$,
576
- highlight: observer.gridHighlight$,
577
- fullChartParams: observer.fullChartParams$
578
- }).pipe(
579
- takeUntil(destroy$),
580
- switchMap(async d => d)
581
- ).subscribe(data => {
582
- highlight({
583
- selection: data.pathSelection,
584
- ids: data.highlight,
585
- fullChartParams: data.fullChartParams
586
- })
587
- })
588
-
589
-
590
27
  return () => {
591
28
  destroy$.next(undefined)
592
- highlightSubscription.unsubscribe()
29
+ unsubscribeBaseBars()
593
30
  }
594
31
  })
@@ -16,7 +16,7 @@ import type {
16
16
  ComputedDatumGrid,
17
17
  Layout } from '@orbcharts/core'
18
18
  import type { DotsParams } from '../types'
19
- import { DEFAULT_DOTS_PLUGIN_PARAMS } from '../defaults'
19
+ import { DEFAULT_DOTS_PARAMS } from '../defaults'
20
20
  import { getDatumColor, getClassName, getUniID } from '../../utils/orbchartsUtils'
21
21
 
22
22
  type ClipPathDatum = {
@@ -162,7 +162,7 @@ function renderClipPath ({ defsSelection, clipPathData }: {
162
162
 
163
163
  }
164
164
 
165
- export const Dots = defineGridPlugin(pluginName, DEFAULT_DOTS_PLUGIN_PARAMS)(({ selection, name, subject, observer }) => {
165
+ export const Dots = defineGridPlugin(pluginName, DEFAULT_DOTS_PARAMS)(({ selection, name, subject, observer }) => {
166
166
  // const axisGUpdate = selection
167
167
  // .selectAll('g')
168
168
  // .data()
@@ -24,10 +24,28 @@ export const GridLegend = defineGridPlugin(pluginName, DEFAULT_GRID_LEGEND_PARAM
24
24
  })
25
25
  )
26
26
 
27
+ // 全部列點矩型使用相同樣式參數
28
+ const fullParams$ = observer.fullParams$.pipe(
29
+ takeUntil(destroy$),
30
+ map(d => {
31
+ const seriesList = [
32
+ {
33
+ listRectWidth: d.listRectWidth,
34
+ listRectHeight: d.listRectHeight,
35
+ listRectRadius: d.listRectRadius,
36
+ }
37
+ ]
38
+ return {
39
+ ...d,
40
+ seriesList
41
+ }
42
+ })
43
+ )
44
+
27
45
  const unsubscribeBaseLegend = createBaseLegend(pluginName, {
28
46
  rootSelection,
29
47
  seriesLabels$,
30
- fullParams$: observer.fullParams$,
48
+ fullParams$,
31
49
  layout$: observer.layout$,
32
50
  fullChartParams$: observer.fullChartParams$
33
51
  })
@@ -17,7 +17,7 @@ import {
17
17
  import type {
18
18
  TransformData,
19
19
  ChartParams } from '@orbcharts/core'
20
- import { DEFAULT_GROUP_AREA_PLUGIN_PARAMS } from '../defaults'
20
+ import { DEFAULT_GROUP_AREA_PARAMS } from '../defaults'
21
21
  import { parseTickFormatValue } from '../../utils/d3Utils'
22
22
  import { measureTextWidth } from '../../utils/commonUtils'
23
23
  import { getColor, getClassName, getUniID } from '../../utils/orbchartsUtils'
@@ -208,7 +208,7 @@ function removeLabel (selection: d3.Selection<any, unknown, any, unknown>) {
208
208
  gUpdate.exit().remove()
209
209
  }
210
210
 
211
- export const GroupArea = defineGridPlugin(pluginName, DEFAULT_GROUP_AREA_PLUGIN_PARAMS)(({ selection, rootSelection, name, subject, observer }) => {
211
+ export const GroupArea = defineGridPlugin(pluginName, DEFAULT_GROUP_AREA_PARAMS)(({ selection, rootSelection, name, subject, observer }) => {
212
212
  const destroy$ = new Subject()
213
213
 
214
214
  const rootRectSelection: d3.Selection<SVGRectElement, any, any, any> = rootSelection
@@ -16,7 +16,7 @@ import type {
16
16
  ChartParams,
17
17
  TransformData } from '@orbcharts/core'
18
18
  import type { GroupAxisParams } from '../types'
19
- import { DEFAULT_GROUPING_AXIS_PLUGIN_PARAMS } from '../defaults'
19
+ import { DEFAULT_GROUPING_AXIS_PARAMS } from '../defaults'
20
20
  import { parseTickFormatValue } from '../../utils/d3Utils'
21
21
  import { getColor, getClassName } from '../../utils/orbchartsUtils'
22
22
 
@@ -126,7 +126,7 @@ function renderPointAxis ({ selection, params, tickTextAlign, axisLabelAlign, gr
126
126
  }
127
127
 
128
128
 
129
- export const GroupAxis = defineGridPlugin(pluginName, DEFAULT_GROUPING_AXIS_PLUGIN_PARAMS)(({ selection, name, observer, subject }) => {
129
+ export const GroupAxis = defineGridPlugin(pluginName, DEFAULT_GROUPING_AXIS_PARAMS)(({ selection, name, observer, subject }) => {
130
130
 
131
131
  const destroy$ = new Subject()
132
132