@orbcharts/plugins-basic 3.0.0-beta.17 → 3.0.0-beta.19

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 (113) hide show
  1. package/LICENSE +200 -200
  2. package/dist/orbcharts-plugins-basic.es.js +2609 -2595
  3. package/dist/orbcharts-plugins-basic.umd.js +36 -34
  4. package/dist/src/grid/defaults.d.ts +2 -2
  5. package/dist/src/multiGrid/defaults.d.ts +1 -1
  6. package/dist/src/multiValue/defaults.d.ts +1 -1
  7. package/lib/core-types.ts +7 -7
  8. package/lib/core.ts +6 -6
  9. package/lib/plugins-basic-types.ts +6 -6
  10. package/package.json +44 -44
  11. package/src/base/BaseBars.ts +765 -765
  12. package/src/base/BaseBarsTriangle.ts +676 -676
  13. package/src/base/BaseDots.ts +464 -464
  14. package/src/base/BaseGroupAxis.ts +691 -691
  15. package/src/base/BaseLegend.ts +684 -684
  16. package/src/base/BaseLineAreas.ts +629 -629
  17. package/src/base/BaseLines.ts +706 -706
  18. package/src/base/BaseRacingBars.ts +551 -551
  19. package/src/base/BaseRacingLabels.ts +396 -396
  20. package/src/base/BaseRacingValueLabels.ts +403 -403
  21. package/src/base/BaseStackedBars.ts +782 -782
  22. package/src/base/BaseTooltip.ts +386 -386
  23. package/src/base/BaseValueAxis.ts +600 -600
  24. package/src/base/BaseXAxis.ts +427 -427
  25. package/src/base/BaseYAxis.ts +389 -389
  26. package/src/base/types.ts +2 -2
  27. package/src/const.ts +30 -30
  28. package/src/grid/defaults.ts +213 -213
  29. package/src/grid/gridObservables.ts +612 -612
  30. package/src/grid/index.ts +16 -16
  31. package/src/grid/plugins/Bars.ts +69 -69
  32. package/src/grid/plugins/BarsPN.ts +66 -66
  33. package/src/grid/plugins/BarsTriangle.ts +73 -73
  34. package/src/grid/plugins/Dots.ts +68 -68
  35. package/src/grid/plugins/GridLegend.ts +107 -107
  36. package/src/grid/plugins/GridTooltip.ts +66 -66
  37. package/src/grid/plugins/GroupAux.ts +1120 -1120
  38. package/src/grid/plugins/GroupAxis.ts +73 -73
  39. package/src/grid/plugins/GroupZoom.ts +218 -218
  40. package/src/grid/plugins/LineAreas.ts +65 -65
  41. package/src/grid/plugins/Lines.ts +59 -59
  42. package/src/grid/plugins/StackedBars.ts +64 -64
  43. package/src/grid/plugins/StackedValueAxis.ts +96 -96
  44. package/src/grid/plugins/ValueAxis.ts +94 -94
  45. package/src/index.ts +6 -6
  46. package/src/multiGrid/defaults.ts +244 -244
  47. package/src/multiGrid/index.ts +14 -14
  48. package/src/multiGrid/multiGridObservables.ts +50 -50
  49. package/src/multiGrid/plugins/MultiBars.ts +108 -108
  50. package/src/multiGrid/plugins/MultiBarsTriangle.ts +114 -114
  51. package/src/multiGrid/plugins/MultiDots.ts +102 -102
  52. package/src/multiGrid/plugins/MultiGridLegend.ts +169 -169
  53. package/src/multiGrid/plugins/MultiGridTooltip.ts +66 -66
  54. package/src/multiGrid/plugins/MultiGroupAxis.ts +137 -137
  55. package/src/multiGrid/plugins/MultiLineAreas.ts +107 -107
  56. package/src/multiGrid/plugins/MultiLines.ts +101 -101
  57. package/src/multiGrid/plugins/MultiStackedBars.ts +106 -106
  58. package/src/multiGrid/plugins/MultiStackedValueAxis.ts +134 -134
  59. package/src/multiGrid/plugins/MultiValueAxis.ts +134 -134
  60. package/src/multiGrid/plugins/OverlappingStackedValueAxes.ts +300 -300
  61. package/src/multiGrid/plugins/OverlappingValueAxes.ts +300 -300
  62. package/src/multiValue/defaults.ts +391 -388
  63. package/src/multiValue/index.ts +12 -12
  64. package/src/multiValue/multiValueObservables.ts +666 -666
  65. package/src/multiValue/plugins/MultiValueLegend.ts +107 -107
  66. package/src/multiValue/plugins/MultiValueTooltip.ts +66 -66
  67. package/src/multiValue/plugins/RacingBars.ts +373 -373
  68. package/src/multiValue/plugins/RacingCounterTexts.ts +300 -300
  69. package/src/multiValue/plugins/RacingValueAxis.ts +114 -114
  70. package/src/multiValue/plugins/RankingAxis_legacy.ts +109 -109
  71. package/src/multiValue/plugins/Scatter.ts +426 -426
  72. package/src/multiValue/plugins/ScatterBubbles.ts +554 -554
  73. package/src/multiValue/plugins/XAxis.ts +107 -107
  74. package/src/multiValue/plugins/XYAux.ts +682 -682
  75. package/src/multiValue/plugins/XYAxes.ts +194 -194
  76. package/src/multiValue/plugins/XYAxes_legacy.ts +683 -683
  77. package/src/multiValue/plugins/XZoom.ts +299 -299
  78. package/src/noneData/defaults.ts +102 -102
  79. package/src/noneData/index.ts +3 -3
  80. package/src/noneData/plugins/Container.ts +27 -27
  81. package/src/noneData/plugins/Tooltip.ts +373 -373
  82. package/src/relationship/defaults.ts +221 -220
  83. package/src/relationship/index.ts +5 -5
  84. package/src/relationship/plugins/ForceDirected.ts +1173 -1168
  85. package/src/relationship/plugins/ForceDirectedBubbles.ts +1411 -1403
  86. package/src/relationship/plugins/RelationshipLegend.ts +100 -100
  87. package/src/relationship/plugins/RelationshipTooltip.ts +66 -66
  88. package/src/relationship/relationshipObservables.ts +49 -49
  89. package/src/series/defaults.ts +221 -221
  90. package/src/series/index.ts +9 -9
  91. package/src/series/plugins/Bubbles.ts +636 -636
  92. package/src/series/plugins/Pie.ts +623 -623
  93. package/src/series/plugins/PieEventTexts.ts +284 -284
  94. package/src/series/plugins/PieLabels.ts +640 -640
  95. package/src/series/plugins/Rose.ts +516 -516
  96. package/src/series/plugins/RoseLabels.ts +600 -600
  97. package/src/series/plugins/SeriesLegend.ts +107 -107
  98. package/src/series/plugins/SeriesTooltip.ts +66 -66
  99. package/src/series/seriesObservables.ts +145 -145
  100. package/src/series/seriesUtils.ts +51 -51
  101. package/src/tree/defaults.ts +102 -102
  102. package/src/tree/index.ts +4 -4
  103. package/src/tree/plugins/TreeLegend.ts +100 -100
  104. package/src/tree/plugins/TreeMap.ts +341 -341
  105. package/src/tree/plugins/TreeTooltip.ts +66 -66
  106. package/src/utils/commonUtils.ts +31 -31
  107. package/src/utils/d3Graphics.ts +176 -176
  108. package/src/utils/d3Utils.ts +92 -92
  109. package/src/utils/observables.ts +14 -14
  110. package/src/utils/orbchartsUtils.ts +129 -129
  111. package/tsconfig.base.json +13 -13
  112. package/tsconfig.json +2 -2
  113. package/vite.config.js +22 -22
@@ -1,374 +1,374 @@
1
- // import * as d3 from 'd3'
2
- // import {
3
- // combineLatest,
4
- // map,
5
- // merge,
6
- // filter,
7
- // switchMap,
8
- // first,
9
- // iif,
10
- // takeUntil,
11
- // Subject,
12
- // Observable,
13
- // distinctUntilChanged } from 'rxjs'
14
- // import type { DefinePluginConfig } from '../../../lib/core-types'
15
- // import type {
16
- // EventTypeMap, PluginConstructor, ChartType } from '../../../lib/core-types'
17
- // import { defineNoneDataPlugin, textSizePxObservable } from '../../../lib/core'
18
- // import { getSvgGElementSize, appendSvg } from '../../utils/d3Utils'
19
- // import { getColor, getClassName } from '../../utils/orbchartsUtils'
20
- // import { TOOLTIP_PARAMS } from '../defaults'
21
- // import { LAYER_INDEX_OF_TOOLTIP } from '../../const'
22
-
23
- // interface TooltipStyle {
24
- // backgroundColor: string
25
- // backgroundOpacity: number
26
- // strokeColor: string
27
- // offset: [number, number]
28
- // padding: number
29
- // textColor: string
30
- // textSize: number | string // chartParams上的設定
31
- // textSizePx: number
32
- // }
33
-
34
- // const pluginName = 'Tooltip'
35
- // const gClassName = getClassName(pluginName, 'g')
36
- // const boxClassName = getClassName(pluginName, 'box')
37
-
38
- // const pluginConfig: DefinePluginConfig<typeof pluginName, typeof TOOLTIP_PARAMS> = {
39
- // name: pluginName,
40
- // defaultParams: TOOLTIP_PARAMS,
41
- // layerIndex: LAYER_INDEX_OF_TOOLTIP,
42
- // validator: (params, { validateColumns }) => {
43
- // const result = validateColumns(params, {
44
- // backgroundColorType: {
45
- // toBeOption: 'ColorType',
46
- // },
47
- // backgroundOpacity: {
48
- // toBeTypes: ['number']
49
- // },
50
- // strokeColorType: {
51
- // toBeOption: 'ColorType',
52
- // },
53
- // offset: {
54
- // toBe: '[number, number]',
55
- // test: (value: any) => {
56
- // return Array.isArray(value)
57
- // && value.length === 2
58
- // && typeof value[0] === 'number'
59
- // && typeof value[1] === 'number'
60
- // }
61
- // },
62
- // padding: {
63
- // toBeTypes: ['number']
64
- // },
65
- // textColorType: {
66
- // toBeOption: 'ColorType',
67
- // },
68
- // textRenderFn: {
69
- // toBeTypes: ['Function', 'null']
70
- // },
71
- // svgRenderFn: {
72
- // toBeTypes: ['Function', 'null']
73
- // }
74
- // })
75
- // return result
76
- // }
77
- // }
78
-
79
-
80
- // function textToSvg (_textArr: string[] | string | null | undefined, textStyle: TooltipStyle) {
81
- // const lineHeight = textStyle.textSizePx * 1.5
82
-
83
- // const textArr = _textArr == null
84
- // ? []
85
- // : Array.isArray(_textArr)
86
- // ? _textArr
87
- // : typeof _textArr === 'string'
88
- // ? _textArr.split('\n')
89
- // : [_textArr]
90
-
91
- // const tspan = textArr
92
- // .filter(d => d != '')
93
- // .map((text, i) => {
94
- // const top = i * lineHeight
95
- // return `<tspan x="0" y="${top}">${text}</tspan>`
96
- // })
97
- // .join('')
98
-
99
- // if (tspan) {
100
- // return `<text font-size="${textStyle.textSize}" fill="${textStyle.textColor}" x="0" y="0" style="dominant-baseline:text-before-edge">
101
- // ${tspan}
102
- // </text>`
103
- // } else {
104
- // return ''
105
- // }
106
- // }
107
-
108
- // function renderTooltip ({ rootSelection, pluginName, rootWidth, rootHeight, svgString, tooltipStyle, event }: {
109
- // rootSelection: d3.Selection<any, unknown, any, unknown>
110
- // pluginName: string
111
- // rootWidth: number
112
- // rootHeight: number
113
- // svgString: string
114
- // tooltipStyle: TooltipStyle
115
- // event: MouseEvent
116
- // }) {
117
- // // if (!svgString) {
118
- // // return
119
- // // }
120
- // // const rootSelection = d3.select('svg.bpcharts__root')
121
- // // console.log('tooltip', { selection, rootWidth, rootHeight, svgString, event })
122
- // rootSelection.interrupt('fadeout')
123
- // const radius = 5
124
-
125
- // // data(svg string無值則為空陣列)
126
- // const contentData = svgString ? [svgString] : []
127
- // const styleData = svgString ? [tooltipStyle] : []
128
- // // tooltipG <g>
129
- // const tooltipG = rootSelection
130
- // .selectAll<SVGGElement, string>(`g.${gClassName}`)
131
- // .data(contentData)
132
- // .join(
133
- // enter => {
134
- // return enter
135
- // .append('g')
136
- // .classed(gClassName, true)
137
- // .attr('pointer-events', 'none')
138
- // },
139
- // update => {
140
- // return update
141
- // },
142
- // exit => {
143
- // return exit
144
- // // .transition('fadeout')
145
- // // .duration(0)
146
- // // .delay(500)
147
- // .style('opacity', 0)
148
- // .remove()
149
- // }
150
- // )
151
- // .attr('transform', () => `translate(${event.offsetX}, ${event.offsetY})`)
152
-
153
- // // tooltipBox <g><g>
154
- // const tooltipBox = tooltipG
155
- // .selectAll<SVGGElement, string>(`g.${boxClassName}`)
156
- // .data(styleData)
157
- // .join(
158
- // enter => {
159
- // return enter
160
- // .append('g')
161
- // .classed(getClassName(pluginName, 'box'), true)
162
- // },
163
- // )
164
-
165
- // // rect <g><g><rect>
166
- // const rect = tooltipBox
167
- // .selectAll<SVGRectElement, string>('rect')
168
- // .data(styleData)
169
- // .join(
170
- // enter => {
171
- // return enter
172
- // .append('rect')
173
- // .attr('rx', radius)
174
- // .attr('ry', radius)
175
- // }
176
- // )
177
- // .attr('fill', d => d.backgroundColor)
178
- // .attr('stroke', d => d.strokeColor)
179
- // .attr('opacity', d => d.backgroundOpacity)
180
-
181
- // // text <g><g><g>
182
- // const contentG = tooltipBox
183
- // .selectAll<SVGGElement, string>('g')
184
- // .data(contentData)
185
- // .join(
186
- // enter => {
187
- // return enter
188
- // .append('g')
189
- // .classed(getClassName(pluginName, 'content'), true)
190
- // .attr('transform', () => `translate(${tooltipStyle.padding}, ${tooltipStyle.padding})`)
191
- // }
192
- // )
193
- // // 使用字串加入svg
194
- // if (contentData.length) {
195
- // appendSvg(contentG, contentData[0])
196
- // }
197
- // const contentSize = (contentG?.node()) ? getSvgGElementSize(contentG!) : { width: 0, height: 0 }
198
-
199
- // // rect size
200
- // rect
201
- // .attr('width', contentSize.width + tooltipStyle.padding * 2)
202
- // .attr('height', contentSize.height + tooltipStyle.padding * 2)
203
-
204
- // // -- tooltipG --
205
- // // 取得tooltip <g>的尺寸
206
- // const tooltipSize = (tooltipBox?.node()) ? getSvgGElementSize(tooltipBox!) : { width: 0, height: 0 }
207
- // // const minX = 0
208
- // const maxX = rootWidth - tooltipSize.width
209
- // // const minY = 0
210
- // const maxY = rootHeight - tooltipSize.height
211
-
212
- // // -- 相對游標位置的offset --
213
- // const offsetX = (event.offsetX + tooltipStyle.offset[0]) > maxX ? maxX - event.offsetX : tooltipStyle.offset[0]
214
- // const offsetY = (event.offsetY + tooltipStyle.offset[1]) > maxY ? maxY - event.offsetY : tooltipStyle.offset[1]
215
- // tooltipBox.attr('transform', d => `translate(${offsetX}, ${offsetY})`)
216
- // tooltipBox.attr('transform', d => `translate(${offsetX}, ${offsetY})`)
217
-
218
-
219
-
220
- // // const minX = containerSize.x
221
- // // const maxX = containerSize.x + containerSize.width - tooltipSize.width
222
- // // const minY = containerSize.y
223
- // // const maxY = containerSize.y + containerSize.height - tooltipSize.height
224
-
225
-
226
- // // .style('position', 'absolute')
227
- // // .style('z-index', 10000)
228
- // // .style('left', (d) => {
229
- // // const x = d.x + this.fullParams.offsetX! - containerSize.x
230
- // // if (x < minX) {
231
- // // return `${minX}px`
232
- // // } else if (x > maxX) {
233
- // // return `${maxX}px`
234
- // // }
235
- // // return `${x}px`
236
- // // })
237
- // // .style('top', (d) => {
238
- // // const y = d.y + this.fullParams.offsetY! - containerSize.y
239
- // // if (y < minY) {
240
- // // return `${minY}px`
241
- // // } else if (y > maxY) {
242
- // // return `${maxY}px`
243
- // // }
244
- // // return `${y}px`
245
- // // })
246
- // // .html((d) => d.contentHtml)
247
-
248
-
249
- // }
250
-
251
-
252
- // export const Tooltip = defineNoneDataPlugin(pluginConfig)(({ selection, rootSelection, name, chartType, observer, subject }) => {
253
- // const destroy$ = new Subject()
254
-
255
- // // 事件觸發
256
- // const eventMouseover$: Observable<EventTypeMap<any>> = subject.event$.pipe(
257
- // takeUntil(destroy$),
258
- // filter(d => d.eventName === 'mouseover' || d.eventName === 'mousemove'),
259
- // // distinctUntilChanged((prev, current) => prev.eventName === current.eventName)
260
- // // map(d => d as EventTypeMap<typeof chartType>)
261
- // )
262
- // const eventMouseout$: Observable<EventTypeMap<any>> = subject.event$.pipe(
263
- // takeUntil(destroy$),
264
- // filter(d => d.eventName === 'mouseout'),
265
- // // distinctUntilChanged((prev, current) => prev.eventName === current.eventName)
266
- // // map(d => d as EventTypeMap<typeof chartType>)
267
- // )
268
-
269
- // const textSizePx$ = textSizePxObservable(observer.fullChartParams$)
270
-
271
- // const tooltipStyle$: Observable<TooltipStyle> = combineLatest({
272
- // fullChartParams: observer.fullChartParams$,
273
- // fullParams: observer.fullParams$,
274
- // textSizePx: textSizePx$
275
- // }).pipe(
276
- // takeUntil(destroy$),
277
- // switchMap(async d => d),
278
- // map(data => {
279
- // return {
280
- // backgroundColor: getColor(data.fullParams.backgroundColorType, data.fullChartParams),
281
- // backgroundOpacity: data.fullParams.backgroundOpacity,
282
- // strokeColor: getColor(data.fullParams.strokeColorType, data.fullChartParams),
283
- // offset: data.fullParams.offset,
284
- // padding: data.fullParams.padding,
285
- // textSize: data.fullChartParams.styles.textSize,
286
- // textSizePx: data.textSizePx,
287
- // textColor: getColor(data.fullParams.textColorType, data.fullChartParams),
288
- // }
289
- // })
290
- // )
291
-
292
- // const contentRenderFn$: Observable<((eventData: EventTypeMap<any>) => string)> = combineLatest({
293
- // fullParams: observer.fullParams$,
294
- // tooltipStyle: tooltipStyle$
295
- // }).pipe(
296
- // takeUntil(destroy$),
297
- // switchMap(async d => d),
298
- // map(data => {
299
- // if (data.fullParams.svgRenderFn) {
300
- // return data.fullParams.svgRenderFn
301
- // }
302
- // // 將textRenderFn回傳的資料使用<text>包裝起來
303
- // return (eventData: EventTypeMap<any>) => {
304
- // const textArr: string | string[] | null = data.fullParams.textRenderFn
305
- // ? data.fullParams.textRenderFn(eventData as any)
306
- // : null
307
- // return textToSvg(textArr, data.tooltipStyle)
308
- // }
309
- // })
310
- // )
311
-
312
- // const mouseoverTooltipSvg$ = combineLatest({
313
- // event: eventMouseover$,
314
- // contentRenderFn: contentRenderFn$
315
- // }).pipe(
316
- // takeUntil(destroy$),
317
- // switchMap(async d => d),
318
- // map(d => d.contentRenderFn(d.event))
319
- // )
320
-
321
- // const mouseoutTooltipSvg$ = eventMouseout$.pipe(
322
- // takeUntil(destroy$),
323
- // map(d => '')
324
- // )
325
-
326
- // const event$ = merge(eventMouseover$, eventMouseout$)
327
- // .pipe(
328
- // takeUntil(destroy$),
329
- // // filter(d => {
330
- // // return (d.eventName === 'mouseover' || d.eventName === 'mousemove' || d.eventName === 'mouseout')
331
- // // && d.event != undefined
332
- // // }),
333
- // map(d => d.event!),
334
- // )
335
-
336
- // combineLatest({
337
- // svgString: merge(mouseoverTooltipSvg$, mouseoutTooltipSvg$),
338
- // event: event$,
339
- // layout: observer.layout$,
340
- // tooltipStyle: tooltipStyle$,
341
- // }).pipe(
342
- // takeUntil(destroy$),
343
- // switchMap(async d => d),
344
- // ).subscribe(data => {
345
- // // console.log('svgString', data.svgString)
346
- // renderTooltip({
347
- // rootSelection,
348
- // pluginName: name,
349
- // rootWidth: data.layout.rootWidth,
350
- // rootHeight: data.layout.rootHeight,
351
- // svgString: data.svgString,
352
- // tooltipStyle: data.tooltipStyle,
353
- // event: data.event
354
- // })
355
- // })
356
-
357
-
358
-
359
- // // const chartType$ = eventMouseover$.pipe(
360
- // // takeUntil(destroy$),
361
- // // map(d => d.type),
362
- // // distinctUntilChanged()
363
- // // )
364
-
365
-
366
- // // eventMouseover$.subscribe(event => {
367
-
368
- // // })
369
-
370
-
371
- // return function unsubscribe () {
372
- // destroy$.next(undefined)
373
- // }
1
+ // import * as d3 from 'd3'
2
+ // import {
3
+ // combineLatest,
4
+ // map,
5
+ // merge,
6
+ // filter,
7
+ // switchMap,
8
+ // first,
9
+ // iif,
10
+ // takeUntil,
11
+ // Subject,
12
+ // Observable,
13
+ // distinctUntilChanged } from 'rxjs'
14
+ // import type { DefinePluginConfig } from '../../../lib/core-types'
15
+ // import type {
16
+ // EventTypeMap, PluginConstructor, ChartType } from '../../../lib/core-types'
17
+ // import { defineNoneDataPlugin, textSizePxObservable } from '../../../lib/core'
18
+ // import { getSvgGElementSize, appendSvg } from '../../utils/d3Utils'
19
+ // import { getColor, getClassName } from '../../utils/orbchartsUtils'
20
+ // import { TOOLTIP_PARAMS } from '../defaults'
21
+ // import { LAYER_INDEX_OF_TOOLTIP } from '../../const'
22
+
23
+ // interface TooltipStyle {
24
+ // backgroundColor: string
25
+ // backgroundOpacity: number
26
+ // strokeColor: string
27
+ // offset: [number, number]
28
+ // padding: number
29
+ // textColor: string
30
+ // textSize: number | string // chartParams上的設定
31
+ // textSizePx: number
32
+ // }
33
+
34
+ // const pluginName = 'Tooltip'
35
+ // const gClassName = getClassName(pluginName, 'g')
36
+ // const boxClassName = getClassName(pluginName, 'box')
37
+
38
+ // const pluginConfig: DefinePluginConfig<typeof pluginName, typeof TOOLTIP_PARAMS> = {
39
+ // name: pluginName,
40
+ // defaultParams: TOOLTIP_PARAMS,
41
+ // layerIndex: LAYER_INDEX_OF_TOOLTIP,
42
+ // validator: (params, { validateColumns }) => {
43
+ // const result = validateColumns(params, {
44
+ // backgroundColorType: {
45
+ // toBeOption: 'ColorType',
46
+ // },
47
+ // backgroundOpacity: {
48
+ // toBeTypes: ['number']
49
+ // },
50
+ // strokeColorType: {
51
+ // toBeOption: 'ColorType',
52
+ // },
53
+ // offset: {
54
+ // toBe: '[number, number]',
55
+ // test: (value: any) => {
56
+ // return Array.isArray(value)
57
+ // && value.length === 2
58
+ // && typeof value[0] === 'number'
59
+ // && typeof value[1] === 'number'
60
+ // }
61
+ // },
62
+ // padding: {
63
+ // toBeTypes: ['number']
64
+ // },
65
+ // textColorType: {
66
+ // toBeOption: 'ColorType',
67
+ // },
68
+ // textRenderFn: {
69
+ // toBeTypes: ['Function', 'null']
70
+ // },
71
+ // svgRenderFn: {
72
+ // toBeTypes: ['Function', 'null']
73
+ // }
74
+ // })
75
+ // return result
76
+ // }
77
+ // }
78
+
79
+
80
+ // function textToSvg (_textArr: string[] | string | null | undefined, textStyle: TooltipStyle) {
81
+ // const lineHeight = textStyle.textSizePx * 1.5
82
+
83
+ // const textArr = _textArr == null
84
+ // ? []
85
+ // : Array.isArray(_textArr)
86
+ // ? _textArr
87
+ // : typeof _textArr === 'string'
88
+ // ? _textArr.split('\n')
89
+ // : [_textArr]
90
+
91
+ // const tspan = textArr
92
+ // .filter(d => d != '')
93
+ // .map((text, i) => {
94
+ // const top = i * lineHeight
95
+ // return `<tspan x="0" y="${top}">${text}</tspan>`
96
+ // })
97
+ // .join('')
98
+
99
+ // if (tspan) {
100
+ // return `<text font-size="${textStyle.textSize}" fill="${textStyle.textColor}" x="0" y="0" style="dominant-baseline:text-before-edge">
101
+ // ${tspan}
102
+ // </text>`
103
+ // } else {
104
+ // return ''
105
+ // }
106
+ // }
107
+
108
+ // function renderTooltip ({ rootSelection, pluginName, rootWidth, rootHeight, svgString, tooltipStyle, event }: {
109
+ // rootSelection: d3.Selection<any, unknown, any, unknown>
110
+ // pluginName: string
111
+ // rootWidth: number
112
+ // rootHeight: number
113
+ // svgString: string
114
+ // tooltipStyle: TooltipStyle
115
+ // event: MouseEvent
116
+ // }) {
117
+ // // if (!svgString) {
118
+ // // return
119
+ // // }
120
+ // // const rootSelection = d3.select('svg.bpcharts__root')
121
+ // // console.log('tooltip', { selection, rootWidth, rootHeight, svgString, event })
122
+ // rootSelection.interrupt('fadeout')
123
+ // const radius = 5
124
+
125
+ // // data(svg string無值則為空陣列)
126
+ // const contentData = svgString ? [svgString] : []
127
+ // const styleData = svgString ? [tooltipStyle] : []
128
+ // // tooltipG <g>
129
+ // const tooltipG = rootSelection
130
+ // .selectAll<SVGGElement, string>(`g.${gClassName}`)
131
+ // .data(contentData)
132
+ // .join(
133
+ // enter => {
134
+ // return enter
135
+ // .append('g')
136
+ // .classed(gClassName, true)
137
+ // .attr('pointer-events', 'none')
138
+ // },
139
+ // update => {
140
+ // return update
141
+ // },
142
+ // exit => {
143
+ // return exit
144
+ // // .transition('fadeout')
145
+ // // .duration(0)
146
+ // // .delay(500)
147
+ // .style('opacity', 0)
148
+ // .remove()
149
+ // }
150
+ // )
151
+ // .attr('transform', () => `translate(${event.offsetX}, ${event.offsetY})`)
152
+
153
+ // // tooltipBox <g><g>
154
+ // const tooltipBox = tooltipG
155
+ // .selectAll<SVGGElement, string>(`g.${boxClassName}`)
156
+ // .data(styleData)
157
+ // .join(
158
+ // enter => {
159
+ // return enter
160
+ // .append('g')
161
+ // .classed(getClassName(pluginName, 'box'), true)
162
+ // },
163
+ // )
164
+
165
+ // // rect <g><g><rect>
166
+ // const rect = tooltipBox
167
+ // .selectAll<SVGRectElement, string>('rect')
168
+ // .data(styleData)
169
+ // .join(
170
+ // enter => {
171
+ // return enter
172
+ // .append('rect')
173
+ // .attr('rx', radius)
174
+ // .attr('ry', radius)
175
+ // }
176
+ // )
177
+ // .attr('fill', d => d.backgroundColor)
178
+ // .attr('stroke', d => d.strokeColor)
179
+ // .attr('opacity', d => d.backgroundOpacity)
180
+
181
+ // // text <g><g><g>
182
+ // const contentG = tooltipBox
183
+ // .selectAll<SVGGElement, string>('g')
184
+ // .data(contentData)
185
+ // .join(
186
+ // enter => {
187
+ // return enter
188
+ // .append('g')
189
+ // .classed(getClassName(pluginName, 'content'), true)
190
+ // .attr('transform', () => `translate(${tooltipStyle.padding}, ${tooltipStyle.padding})`)
191
+ // }
192
+ // )
193
+ // // 使用字串加入svg
194
+ // if (contentData.length) {
195
+ // appendSvg(contentG, contentData[0])
196
+ // }
197
+ // const contentSize = (contentG?.node()) ? getSvgGElementSize(contentG!) : { width: 0, height: 0 }
198
+
199
+ // // rect size
200
+ // rect
201
+ // .attr('width', contentSize.width + tooltipStyle.padding * 2)
202
+ // .attr('height', contentSize.height + tooltipStyle.padding * 2)
203
+
204
+ // // -- tooltipG --
205
+ // // 取得tooltip <g>的尺寸
206
+ // const tooltipSize = (tooltipBox?.node()) ? getSvgGElementSize(tooltipBox!) : { width: 0, height: 0 }
207
+ // // const minX = 0
208
+ // const maxX = rootWidth - tooltipSize.width
209
+ // // const minY = 0
210
+ // const maxY = rootHeight - tooltipSize.height
211
+
212
+ // // -- 相對游標位置的offset --
213
+ // const offsetX = (event.offsetX + tooltipStyle.offset[0]) > maxX ? maxX - event.offsetX : tooltipStyle.offset[0]
214
+ // const offsetY = (event.offsetY + tooltipStyle.offset[1]) > maxY ? maxY - event.offsetY : tooltipStyle.offset[1]
215
+ // tooltipBox.attr('transform', d => `translate(${offsetX}, ${offsetY})`)
216
+ // tooltipBox.attr('transform', d => `translate(${offsetX}, ${offsetY})`)
217
+
218
+
219
+
220
+ // // const minX = containerSize.x
221
+ // // const maxX = containerSize.x + containerSize.width - tooltipSize.width
222
+ // // const minY = containerSize.y
223
+ // // const maxY = containerSize.y + containerSize.height - tooltipSize.height
224
+
225
+
226
+ // // .style('position', 'absolute')
227
+ // // .style('z-index', 10000)
228
+ // // .style('left', (d) => {
229
+ // // const x = d.x + this.fullParams.offsetX! - containerSize.x
230
+ // // if (x < minX) {
231
+ // // return `${minX}px`
232
+ // // } else if (x > maxX) {
233
+ // // return `${maxX}px`
234
+ // // }
235
+ // // return `${x}px`
236
+ // // })
237
+ // // .style('top', (d) => {
238
+ // // const y = d.y + this.fullParams.offsetY! - containerSize.y
239
+ // // if (y < minY) {
240
+ // // return `${minY}px`
241
+ // // } else if (y > maxY) {
242
+ // // return `${maxY}px`
243
+ // // }
244
+ // // return `${y}px`
245
+ // // })
246
+ // // .html((d) => d.contentHtml)
247
+
248
+
249
+ // }
250
+
251
+
252
+ // export const Tooltip = defineNoneDataPlugin(pluginConfig)(({ selection, rootSelection, name, chartType, observer, subject }) => {
253
+ // const destroy$ = new Subject()
254
+
255
+ // // 事件觸發
256
+ // const eventMouseover$: Observable<EventTypeMap<any>> = subject.event$.pipe(
257
+ // takeUntil(destroy$),
258
+ // filter(d => d.eventName === 'mouseover' || d.eventName === 'mousemove'),
259
+ // // distinctUntilChanged((prev, current) => prev.eventName === current.eventName)
260
+ // // map(d => d as EventTypeMap<typeof chartType>)
261
+ // )
262
+ // const eventMouseout$: Observable<EventTypeMap<any>> = subject.event$.pipe(
263
+ // takeUntil(destroy$),
264
+ // filter(d => d.eventName === 'mouseout'),
265
+ // // distinctUntilChanged((prev, current) => prev.eventName === current.eventName)
266
+ // // map(d => d as EventTypeMap<typeof chartType>)
267
+ // )
268
+
269
+ // const textSizePx$ = textSizePxObservable(observer.fullChartParams$)
270
+
271
+ // const tooltipStyle$: Observable<TooltipStyle> = combineLatest({
272
+ // fullChartParams: observer.fullChartParams$,
273
+ // fullParams: observer.fullParams$,
274
+ // textSizePx: textSizePx$
275
+ // }).pipe(
276
+ // takeUntil(destroy$),
277
+ // switchMap(async d => d),
278
+ // map(data => {
279
+ // return {
280
+ // backgroundColor: getColor(data.fullParams.backgroundColorType, data.fullChartParams),
281
+ // backgroundOpacity: data.fullParams.backgroundOpacity,
282
+ // strokeColor: getColor(data.fullParams.strokeColorType, data.fullChartParams),
283
+ // offset: data.fullParams.offset,
284
+ // padding: data.fullParams.padding,
285
+ // textSize: data.fullChartParams.styles.textSize,
286
+ // textSizePx: data.textSizePx,
287
+ // textColor: getColor(data.fullParams.textColorType, data.fullChartParams),
288
+ // }
289
+ // })
290
+ // )
291
+
292
+ // const contentRenderFn$: Observable<((eventData: EventTypeMap<any>) => string)> = combineLatest({
293
+ // fullParams: observer.fullParams$,
294
+ // tooltipStyle: tooltipStyle$
295
+ // }).pipe(
296
+ // takeUntil(destroy$),
297
+ // switchMap(async d => d),
298
+ // map(data => {
299
+ // if (data.fullParams.svgRenderFn) {
300
+ // return data.fullParams.svgRenderFn
301
+ // }
302
+ // // 將textRenderFn回傳的資料使用<text>包裝起來
303
+ // return (eventData: EventTypeMap<any>) => {
304
+ // const textArr: string | string[] | null = data.fullParams.textRenderFn
305
+ // ? data.fullParams.textRenderFn(eventData as any)
306
+ // : null
307
+ // return textToSvg(textArr, data.tooltipStyle)
308
+ // }
309
+ // })
310
+ // )
311
+
312
+ // const mouseoverTooltipSvg$ = combineLatest({
313
+ // event: eventMouseover$,
314
+ // contentRenderFn: contentRenderFn$
315
+ // }).pipe(
316
+ // takeUntil(destroy$),
317
+ // switchMap(async d => d),
318
+ // map(d => d.contentRenderFn(d.event))
319
+ // )
320
+
321
+ // const mouseoutTooltipSvg$ = eventMouseout$.pipe(
322
+ // takeUntil(destroy$),
323
+ // map(d => '')
324
+ // )
325
+
326
+ // const event$ = merge(eventMouseover$, eventMouseout$)
327
+ // .pipe(
328
+ // takeUntil(destroy$),
329
+ // // filter(d => {
330
+ // // return (d.eventName === 'mouseover' || d.eventName === 'mousemove' || d.eventName === 'mouseout')
331
+ // // && d.event != undefined
332
+ // // }),
333
+ // map(d => d.event!),
334
+ // )
335
+
336
+ // combineLatest({
337
+ // svgString: merge(mouseoverTooltipSvg$, mouseoutTooltipSvg$),
338
+ // event: event$,
339
+ // layout: observer.layout$,
340
+ // tooltipStyle: tooltipStyle$,
341
+ // }).pipe(
342
+ // takeUntil(destroy$),
343
+ // switchMap(async d => d),
344
+ // ).subscribe(data => {
345
+ // // console.log('svgString', data.svgString)
346
+ // renderTooltip({
347
+ // rootSelection,
348
+ // pluginName: name,
349
+ // rootWidth: data.layout.rootWidth,
350
+ // rootHeight: data.layout.rootHeight,
351
+ // svgString: data.svgString,
352
+ // tooltipStyle: data.tooltipStyle,
353
+ // event: data.event
354
+ // })
355
+ // })
356
+
357
+
358
+
359
+ // // const chartType$ = eventMouseover$.pipe(
360
+ // // takeUntil(destroy$),
361
+ // // map(d => d.type),
362
+ // // distinctUntilChanged()
363
+ // // )
364
+
365
+
366
+ // // eventMouseover$.subscribe(event => {
367
+
368
+ // // })
369
+
370
+
371
+ // return function unsubscribe () {
372
+ // destroy$.next(undefined)
373
+ // }
374
374
  // })