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

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 (228) hide show
  1. package/LICENSE +200 -200
  2. package/dist/orbcharts-plugins-basic.es.js +11839 -10485
  3. package/dist/orbcharts-plugins-basic.umd.js +231 -171
  4. package/dist/{orbcharts-plugins-basic/src → src}/base/BaseBars.d.ts +3 -3
  5. package/dist/{orbcharts-plugins-basic/src → src}/base/BaseBarsTriangle.d.ts +3 -3
  6. package/dist/{orbcharts-plugins-basic/src → src}/base/BaseDots.d.ts +3 -3
  7. package/dist/{orbcharts-plugins-basic/src → src}/base/BaseLineAreas.d.ts +3 -3
  8. package/dist/{orbcharts-plugins-basic/src → src}/base/BaseLines.d.ts +3 -3
  9. package/dist/src/base/BaseRacingBars.d.ts +23 -0
  10. package/dist/src/base/BaseRacingLabels.d.ts +20 -0
  11. package/dist/src/base/BaseRacingValueLabels.d.ts +20 -0
  12. package/dist/{orbcharts-plugins-basic/src/base/BaseStackedBar.d.ts → src/base/BaseStackedBars.d.ts} +7 -7
  13. package/dist/{orbcharts-plugins-basic/src → src}/base/BaseValueAxis.d.ts +4 -7
  14. package/dist/src/base/BaseXAxis.d.ts +20 -0
  15. package/dist/src/base/BaseYAxis.d.ts +18 -0
  16. package/dist/{orbcharts-plugins-basic/src → src}/grid/defaults.d.ts +3 -3
  17. package/dist/{orbcharts-plugins-basic/src → src}/grid/gridObservables.d.ts +8 -1
  18. package/dist/{orbcharts-plugins-basic/src → src}/grid/index.d.ts +2 -2
  19. package/dist/src/grid/plugins/GroupZoom.d.ts +1 -0
  20. package/dist/src/grid/plugins/StackedBars.d.ts +1 -0
  21. package/dist/src/index.d.ts +7 -1
  22. package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/defaults.d.ts +2 -2
  23. package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/index.d.ts +1 -1
  24. package/dist/src/multiGrid/plugins/MultiStackedBars.d.ts +1 -0
  25. package/dist/src/multiValue/defaults.d.ts +13 -0
  26. package/dist/{orbcharts-plugins-basic/src → src}/multiValue/index.d.ts +5 -1
  27. package/dist/src/multiValue/multiValueObservables.d.ts +56 -0
  28. package/dist/src/multiValue/plugins/RacingBars.d.ts +1 -0
  29. package/dist/src/multiValue/plugins/RacingCounterTexts.d.ts +3 -0
  30. package/dist/src/multiValue/plugins/RacingValueAxis.d.ts +1 -0
  31. package/dist/src/multiValue/plugins/XAxis.d.ts +1 -0
  32. package/dist/src/multiValue/plugins/XYAxes.d.ts +1 -0
  33. package/dist/src/multiValue/plugins/XZoom.d.ts +1 -0
  34. package/dist/{orbcharts-plugins-basic/src → src}/utils/commonUtils.d.ts +1 -0
  35. package/dist/{orbcharts-plugins-basic/src → src}/utils/d3Graphics.d.ts +2 -1
  36. package/lib/core-types.ts +7 -7
  37. package/lib/core.ts +6 -6
  38. package/lib/plugins-basic-types.ts +6 -6
  39. package/package.json +44 -44
  40. package/src/base/BaseBars.ts +765 -765
  41. package/src/base/BaseBarsTriangle.ts +676 -676
  42. package/src/base/BaseDots.ts +464 -464
  43. package/src/base/BaseGroupAxis.ts +691 -679
  44. package/src/base/BaseLegend.ts +684 -684
  45. package/src/base/BaseLineAreas.ts +629 -629
  46. package/src/base/BaseLines.ts +706 -706
  47. package/src/base/BaseRacingBars.ts +552 -0
  48. package/src/base/BaseRacingLabels.ts +396 -0
  49. package/src/base/BaseRacingValueLabels.ts +403 -0
  50. package/src/base/{BaseStackedBar.ts → BaseStackedBars.ts} +782 -782
  51. package/src/base/BaseTooltip.ts +386 -385
  52. package/src/base/BaseValueAxis.ts +600 -583
  53. package/src/base/BaseXAxis.ts +427 -0
  54. package/src/base/BaseYAxis.ts +389 -0
  55. package/src/base/types.ts +2 -2
  56. package/src/const.ts +30 -30
  57. package/src/grid/defaults.ts +213 -250
  58. package/src/grid/gridObservables.ts +612 -554
  59. package/src/grid/index.ts +16 -16
  60. package/src/grid/plugins/Bars.ts +69 -69
  61. package/src/grid/plugins/BarsPN.ts +66 -66
  62. package/src/grid/plugins/BarsTriangle.ts +73 -73
  63. package/src/grid/plugins/Dots.ts +68 -68
  64. package/src/grid/plugins/GridLegend.ts +107 -107
  65. package/src/grid/plugins/GridTooltip.ts +66 -66
  66. package/src/grid/plugins/GroupAux.ts +1120 -1103
  67. package/src/grid/plugins/GroupAxis.ts +73 -97
  68. package/src/grid/plugins/{GridZoom.ts → GroupZoom.ts} +218 -218
  69. package/src/grid/plugins/LineAreas.ts +65 -65
  70. package/src/grid/plugins/Lines.ts +59 -59
  71. package/src/grid/plugins/{StackedBar.ts → StackedBars.ts} +64 -64
  72. package/src/grid/plugins/StackedValueAxis.ts +96 -96
  73. package/src/grid/plugins/ValueAxis.ts +94 -94
  74. package/src/index.ts +6 -6
  75. package/src/multiGrid/defaults.ts +244 -228
  76. package/src/multiGrid/index.ts +14 -14
  77. package/src/multiGrid/multiGridObservables.ts +50 -49
  78. package/src/multiGrid/plugins/MultiBars.ts +108 -108
  79. package/src/multiGrid/plugins/MultiBarsTriangle.ts +114 -114
  80. package/src/multiGrid/plugins/MultiDots.ts +102 -102
  81. package/src/multiGrid/plugins/MultiGridLegend.ts +169 -159
  82. package/src/multiGrid/plugins/MultiGridTooltip.ts +66 -66
  83. package/src/multiGrid/plugins/MultiGroupAxis.ts +137 -137
  84. package/src/multiGrid/plugins/MultiLineAreas.ts +107 -107
  85. package/src/multiGrid/plugins/MultiLines.ts +101 -101
  86. package/src/multiGrid/plugins/{MultiStackedBar.ts → MultiStackedBars.ts} +106 -106
  87. package/src/multiGrid/plugins/MultiStackedValueAxis.ts +134 -134
  88. package/src/multiGrid/plugins/MultiValueAxis.ts +134 -134
  89. package/src/multiGrid/plugins/OverlappingStackedValueAxes.ts +300 -299
  90. package/src/multiGrid/plugins/OverlappingValueAxes.ts +300 -300
  91. package/src/multiValue/defaults.ts +388 -166
  92. package/src/multiValue/index.ts +13 -9
  93. package/src/multiValue/multiValueObservables.ts +667 -297
  94. package/src/multiValue/plugins/MultiValueLegend.ts +107 -107
  95. package/src/multiValue/plugins/MultiValueTooltip.ts +66 -66
  96. package/src/multiValue/plugins/OrdinalBubbles.ts +0 -0
  97. package/src/multiValue/plugins/OrdinalXAxis.ts +0 -0
  98. package/src/multiValue/plugins/RacingBars.ts +373 -0
  99. package/src/multiValue/plugins/RacingCounterAxis.ts +0 -0
  100. package/src/multiValue/plugins/RacingCounterTexts.ts +300 -0
  101. package/src/multiValue/plugins/RacingValueAxis.ts +115 -0
  102. package/src/multiValue/plugins/RankingAxis_legacy.ts +109 -0
  103. package/src/multiValue/plugins/Scatter.ts +426 -426
  104. package/src/multiValue/plugins/ScatterBubbles.ts +554 -554
  105. package/src/multiValue/plugins/XAxis.ts +108 -0
  106. package/src/multiValue/plugins/XYAux.ts +682 -681
  107. package/src/multiValue/plugins/XYAxes.ts +194 -684
  108. package/src/multiValue/plugins/XYAxes_legacy.ts +684 -0
  109. package/src/multiValue/plugins/{XYZoom.ts → XZoom.ts} +299 -299
  110. package/src/noneData/defaults.ts +102 -102
  111. package/src/noneData/index.ts +3 -3
  112. package/src/noneData/plugins/Container.ts +27 -27
  113. package/src/noneData/plugins/Tooltip.ts +373 -373
  114. package/src/relationship/defaults.ts +220 -218
  115. package/src/relationship/index.ts +5 -5
  116. package/src/relationship/plugins/ForceDirected.ts +1168 -1168
  117. package/src/relationship/plugins/ForceDirectedBubbles.ts +1403 -1403
  118. package/src/relationship/plugins/RelationshipLegend.ts +100 -100
  119. package/src/relationship/plugins/RelationshipTooltip.ts +66 -66
  120. package/src/relationship/relationshipObservables.ts +49 -49
  121. package/src/series/defaults.ts +221 -230
  122. package/src/series/index.ts +9 -9
  123. package/src/series/plugins/Bubbles.ts +636 -620
  124. package/src/series/plugins/Pie.ts +623 -623
  125. package/src/series/plugins/PieEventTexts.ts +284 -284
  126. package/src/series/plugins/PieLabels.ts +640 -640
  127. package/src/series/plugins/Rose.ts +516 -516
  128. package/src/series/plugins/RoseLabels.ts +600 -600
  129. package/src/series/plugins/SeriesLegend.ts +107 -107
  130. package/src/series/plugins/SeriesTooltip.ts +66 -66
  131. package/src/series/seriesObservables.ts +145 -145
  132. package/src/series/seriesUtils.ts +51 -51
  133. package/src/tree/defaults.ts +102 -100
  134. package/src/tree/index.ts +4 -4
  135. package/src/tree/plugins/TreeLegend.ts +100 -100
  136. package/src/tree/plugins/TreeMap.ts +341 -341
  137. package/src/tree/plugins/TreeTooltip.ts +66 -66
  138. package/src/utils/commonUtils.ts +31 -22
  139. package/src/utils/d3Graphics.ts +176 -174
  140. package/src/utils/d3Utils.ts +92 -92
  141. package/src/utils/observables.ts +14 -14
  142. package/src/utils/orbchartsUtils.ts +129 -129
  143. package/tsconfig.base.json +13 -13
  144. package/tsconfig.json +2 -2
  145. package/vite.config.js +22 -22
  146. package/dist/orbcharts-plugins-basic/src/grid/plugins/GridZoom.d.ts +0 -1
  147. package/dist/orbcharts-plugins-basic/src/grid/plugins/StackedBar.d.ts +0 -1
  148. package/dist/orbcharts-plugins-basic/src/index.d.ts +0 -7
  149. package/dist/orbcharts-plugins-basic/src/multiGrid/plugins/MultiStackedBar.d.ts +0 -1
  150. package/dist/orbcharts-plugins-basic/src/multiValue/defaults.d.ts +0 -9
  151. package/dist/orbcharts-plugins-basic/src/multiValue/multiValueObservables.d.ts +0 -33
  152. package/dist/orbcharts-plugins-basic/src/multiValue/plugins/XYZoom.d.ts +0 -1
  153. /package/dist/{orbcharts-plugins-basic/lib → lib}/core-types.d.ts +0 -0
  154. /package/dist/{orbcharts-plugins-basic/lib → lib}/core.d.ts +0 -0
  155. /package/dist/{orbcharts-plugins-basic/lib → lib}/plugins-basic-types.d.ts +0 -0
  156. /package/dist/{orbcharts-plugins-basic/src → src}/base/BaseGroupAxis.d.ts +0 -0
  157. /package/dist/{orbcharts-plugins-basic/src → src}/base/BaseLegend.d.ts +0 -0
  158. /package/dist/{orbcharts-plugins-basic/src → src}/base/BaseTooltip.d.ts +0 -0
  159. /package/dist/{orbcharts-plugins-basic/src → src}/base/types.d.ts +0 -0
  160. /package/dist/{orbcharts-plugins-basic/src → src}/const.d.ts +0 -0
  161. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/Bars.d.ts +0 -0
  162. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/BarsPN.d.ts +0 -0
  163. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/BarsTriangle.d.ts +0 -0
  164. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/Dots.d.ts +0 -0
  165. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/GridLegend.d.ts +0 -0
  166. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/GridTooltip.d.ts +0 -0
  167. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/GroupAux.d.ts +0 -0
  168. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/GroupAxis.d.ts +0 -0
  169. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/LineAreas.d.ts +0 -0
  170. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/Lines.d.ts +0 -0
  171. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/StackedValueAxis.d.ts +0 -0
  172. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/ValueAxis.d.ts +0 -0
  173. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/multiGridObservables.d.ts +0 -0
  174. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/MultiBars.d.ts +0 -0
  175. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/MultiBarsTriangle.d.ts +0 -0
  176. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/MultiDots.d.ts +0 -0
  177. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/MultiGridLegend.d.ts +0 -0
  178. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/MultiGridTooltip.d.ts +0 -0
  179. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/MultiGroupAxis.d.ts +0 -0
  180. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/MultiLineAreas.d.ts +0 -0
  181. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/MultiLines.d.ts +0 -0
  182. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/MultiStackedValueAxis.d.ts +0 -0
  183. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/MultiValueAxis.d.ts +0 -0
  184. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/OverlappingStackedValueAxes.d.ts +0 -0
  185. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/OverlappingValueAxes.d.ts +0 -0
  186. /package/dist/{orbcharts-plugins-basic/src → src}/multiValue/plugins/MultiValueLegend.d.ts +0 -0
  187. /package/dist/{orbcharts-plugins-basic/src → src}/multiValue/plugins/MultiValueTooltip.d.ts +0 -0
  188. /package/dist/{orbcharts-plugins-basic/src/multiValue/plugins/Ranking.d.ts → src/multiValue/plugins/OrdinalBubbles.d.ts} +0 -0
  189. /package/dist/{orbcharts-plugins-basic/src/multiValue/plugins/RankingAxis.d.ts → src/multiValue/plugins/OrdinalXAxis.d.ts} +0 -0
  190. /package/dist/{orbcharts-plugins-basic/src/noneData/plugins/Container.d.ts → src/multiValue/plugins/RacingCounterAxis.d.ts} +0 -0
  191. /package/dist/{orbcharts-plugins-basic/src/noneData/plugins/Tooltip.d.ts → src/multiValue/plugins/RankingAxis_legacy.d.ts} +0 -0
  192. /package/dist/{orbcharts-plugins-basic/src → src}/multiValue/plugins/Scatter.d.ts +0 -0
  193. /package/dist/{orbcharts-plugins-basic/src → src}/multiValue/plugins/ScatterBubbles.d.ts +0 -0
  194. /package/dist/{orbcharts-plugins-basic/src → src}/multiValue/plugins/XYAux.d.ts +0 -0
  195. /package/dist/{orbcharts-plugins-basic/src/multiValue/plugins/XYAxes.d.ts → src/multiValue/plugins/XYAxes_legacy.d.ts} +0 -0
  196. /package/dist/{orbcharts-plugins-basic/src → src}/noneData/defaults.d.ts +0 -0
  197. /package/dist/{orbcharts-plugins-basic/src → src}/noneData/index.d.ts +0 -0
  198. /package/dist/{orbcharts-plugins-basic/src/series/plugins/Waffle.d.ts → src/noneData/plugins/Container.d.ts} +0 -0
  199. /package/{src/multiValue/plugins/Ranking.ts → dist/src/noneData/plugins/Tooltip.d.ts} +0 -0
  200. /package/dist/{orbcharts-plugins-basic/src → src}/relationship/defaults.d.ts +0 -0
  201. /package/dist/{orbcharts-plugins-basic/src → src}/relationship/index.d.ts +0 -0
  202. /package/dist/{orbcharts-plugins-basic/src → src}/relationship/plugins/ForceDirected.d.ts +0 -0
  203. /package/dist/{orbcharts-plugins-basic/src → src}/relationship/plugins/ForceDirectedBubbles.d.ts +0 -0
  204. /package/dist/{orbcharts-plugins-basic/src → src}/relationship/plugins/RelationshipLegend.d.ts +0 -0
  205. /package/dist/{orbcharts-plugins-basic/src → src}/relationship/plugins/RelationshipTooltip.d.ts +0 -0
  206. /package/dist/{orbcharts-plugins-basic/src → src}/relationship/relationshipObservables.d.ts +0 -0
  207. /package/dist/{orbcharts-plugins-basic/src → src}/series/defaults.d.ts +0 -0
  208. /package/dist/{orbcharts-plugins-basic/src → src}/series/index.d.ts +0 -0
  209. /package/dist/{orbcharts-plugins-basic/src → src}/series/plugins/Bubbles.d.ts +0 -0
  210. /package/dist/{orbcharts-plugins-basic/src → src}/series/plugins/Pie.d.ts +0 -0
  211. /package/dist/{orbcharts-plugins-basic/src → src}/series/plugins/PieEventTexts.d.ts +0 -0
  212. /package/dist/{orbcharts-plugins-basic/src → src}/series/plugins/PieLabels.d.ts +0 -0
  213. /package/dist/{orbcharts-plugins-basic/src → src}/series/plugins/Rose.d.ts +0 -0
  214. /package/dist/{orbcharts-plugins-basic/src → src}/series/plugins/RoseLabels.d.ts +0 -0
  215. /package/dist/{orbcharts-plugins-basic/src → src}/series/plugins/SeriesLegend.d.ts +0 -0
  216. /package/dist/{orbcharts-plugins-basic/src → src}/series/plugins/SeriesTooltip.d.ts +0 -0
  217. /package/{src/multiValue/plugins/RankingAxis.ts → dist/src/series/plugins/Waffle.d.ts} +0 -0
  218. /package/dist/{orbcharts-plugins-basic/src → src}/series/seriesObservables.d.ts +0 -0
  219. /package/dist/{orbcharts-plugins-basic/src → src}/series/seriesUtils.d.ts +0 -0
  220. /package/dist/{orbcharts-plugins-basic/src → src}/tree/defaults.d.ts +0 -0
  221. /package/dist/{orbcharts-plugins-basic/src → src}/tree/index.d.ts +0 -0
  222. /package/dist/{orbcharts-plugins-basic/src → src}/tree/plugins/TreeLegend.d.ts +0 -0
  223. /package/dist/{orbcharts-plugins-basic/src → src}/tree/plugins/TreeMap.d.ts +0 -0
  224. /package/dist/{orbcharts-plugins-basic/src → src}/tree/plugins/TreeTooltip.d.ts +0 -0
  225. /package/dist/{orbcharts-plugins-basic/src → src}/utils/d3Utils.d.ts +0 -0
  226. /package/dist/{orbcharts-plugins-basic/src → src}/utils/observables.d.ts +0 -0
  227. /package/dist/{orbcharts-plugins-basic/src → src}/utils/orbchartsUtils.d.ts +0 -0
  228. /package/dist/{orbcharts-plugins-basic/vite.config.d.ts → vite.config.d.ts} +0 -0
@@ -0,0 +1,396 @@
1
+ import * as d3 from 'd3'
2
+ import {
3
+ Observable,
4
+ Subject,
5
+ combineLatest,
6
+ takeUntil,
7
+ map,
8
+ distinctUntilChanged,
9
+ of,
10
+ iif,
11
+ switchMap,
12
+ shareReplay
13
+ } from 'rxjs'
14
+ import type {
15
+ ChartParams,
16
+ ComputedDatumMultiValue,
17
+ ComputedDataMultiValue,
18
+ ComputedXYDatumMultiValue,
19
+ ContainerSize,
20
+ ContainerPositionScaled,
21
+ DataFormatterMultiValue,
22
+ Layout
23
+ } from '../../lib/core-types'
24
+ import type { BaseRacingLabelsParams } from '../../lib/plugins-basic-types'
25
+ import type { BasePluginFn } from './types'
26
+ import { getColor, getDatumColor, getClassName, getUniID } from '../utils/orbchartsUtils'
27
+ import { multiValueContainerSelectionsObservable } from '../multiValue/multiValueObservables'
28
+
29
+ interface BaseRacingAxisContext {
30
+ selection: d3.Selection<any, unknown, any, unknown>
31
+ computedData$: Observable<ComputedDataMultiValue>
32
+ visibleComputedRankingData$: Observable<ComputedDatumMultiValue[][]>
33
+ rankingScaleList$: Observable<Array<d3.ScalePoint<string>>>
34
+ xScale$: Observable<(n: number) => number>
35
+ fullParams$: Observable<BaseRacingLabelsParams>
36
+ fullDataFormatter$: Observable<DataFormatterMultiValue>
37
+ fullChartParams$: Observable<ChartParams>
38
+ // layout$: Observable<Layout>
39
+ containerPosition$: Observable<ContainerPositionScaled[]>
40
+ containerSize$: Observable<ContainerSize>
41
+ isCategorySeprate$: Observable<boolean>
42
+ // xyValueIndex$: Observable<[number, number]>
43
+ }
44
+
45
+ type ClipPathDatum = {
46
+ id: string;
47
+ // x: number;
48
+ // y: number;
49
+ width: number;
50
+ height: number;
51
+ }
52
+
53
+ // const pluginName = 'RacingAxis'
54
+
55
+ const yTickTextAnchor = 'end'
56
+ const yTickDominantBaseline = 'middle'
57
+ const yAxisLabelAnchor = 'end'
58
+ const yAxisLabelDominantBaseline = 'auto'
59
+ // const textClassName = getClassName(pluginName, 'yLabel')
60
+
61
+ function renderRacingAxisLabel ({ selection, textClassName, fullParams, containerSize, fullDataFormatter, fullChartParams, textReverseTransform }: {
62
+ selection: d3.Selection<SVGGElement, any, any, any>,
63
+ textClassName: string
64
+ fullParams: BaseRacingLabelsParams
65
+ // axisLabelAlign: TextAlign
66
+ containerSize: ContainerSize
67
+ fullDataFormatter: DataFormatterMultiValue,
68
+ fullChartParams: ChartParams
69
+ textReverseTransform: string,
70
+ }) {
71
+ const offsetX = fullParams.barLabel.padding - fullParams.axisLabel.offset[0]
72
+ const offsetY = - fullParams.barLabel.padding - fullParams.axisLabel.offset[1]
73
+ let labelX = - offsetX
74
+ let labelY = - offsetY
75
+
76
+ selection
77
+ .attr('transform', d => `translate(0, ${containerSize.height})`)
78
+ .selectAll<SVGTextElement, BaseRacingLabelsParams>(`text`)
79
+ .data([fullParams])
80
+ .join(
81
+ enter => {
82
+ return enter
83
+ .append('text')
84
+ .style('font-weight', 'bold')
85
+ },
86
+ update => update,
87
+ exit => exit.remove()
88
+ )
89
+ .attr('text-anchor', yAxisLabelAnchor)
90
+ .attr('dominant-baseline', yAxisLabelDominantBaseline)
91
+ .attr('font-size', fullChartParams.styles.textSize)
92
+ .style('fill', getColor(fullParams.axisLabel.colorType, fullChartParams))
93
+ // .style('transform', textReverseTransform)
94
+ // 偏移使用 x, y 而非 transform 才不會受到外層 scale 變形影響
95
+ .attr('x', labelX)
96
+ .attr('y', labelY)
97
+ .text(d => fullDataFormatter.yAxis.label)
98
+ }
99
+
100
+ function renderRacingLabels ({ selection, fullParams, fullChartParams, rankingScale, valueScale, categoryData }: {
101
+ selection: d3.Selection<SVGGElement, any, any, any>,
102
+ fullParams: BaseRacingLabelsParams
103
+ fullChartParams: ChartParams
104
+ rankingScale: d3.ScalePoint<string>
105
+ valueScale: ((n: number) => number)
106
+ categoryData: ComputedDatumMultiValue[]
107
+ // textReverseTransformWithRotate: string,
108
+ // xyValueIndex: [number, number]
109
+ }) {
110
+ const labelData = fullParams.barLabel.position === 'none' ? [] : categoryData
111
+
112
+ const labelSelection = selection
113
+ .selectAll<SVGGElement, string>(`text`)
114
+ .data(labelData, (d: ComputedDatumMultiValue) => d.id)
115
+ // .join('g')
116
+ // .classed(boxClassName, true)
117
+ .join(
118
+ enter => {
119
+ return enter
120
+ .append('text')
121
+ .style('font-weight', 'bold')
122
+ .attr('x', d => valueScale(d.value[d.xValueIndex] ?? 0) - fullParams.barLabel.padding)
123
+ .attr('y', d => rankingScale(d.label)!)
124
+ },
125
+ update => {
126
+ return update
127
+ .transition()
128
+ .duration(fullChartParams.transitionDuration)
129
+ .ease(d3.easeLinear)
130
+ // 偏移使用 x, y 而非 transform 才不會受到外層 scale 變形影響
131
+ .attr('x', d => valueScale(d.value[d.xValueIndex] ?? 0) - fullParams.barLabel.padding)
132
+ .attr('y', d => rankingScale(d.label)!)
133
+ },
134
+ exit => exit.remove()
135
+ )
136
+ .attr('text-anchor', yTickTextAnchor)
137
+ .attr('dominant-baseline', yTickDominantBaseline)
138
+ .attr('font-size', fullChartParams.styles.textSize)
139
+ .style('fill', d => getDatumColor({
140
+ colorType: fullParams.barLabel.colorType,
141
+ fullChartParams: fullChartParams,
142
+ datum: d
143
+ }))
144
+ // .style('transform', textReverseTransformWithRotate)
145
+ .text(d => d.label)
146
+
147
+ return labelSelection
148
+ }
149
+
150
+
151
+ function renderClipPath ({ defsSelection, clipPathData }: {
152
+ defsSelection: d3.Selection<SVGDefsElement, any, any, any>
153
+ clipPathData: ClipPathDatum[]
154
+ // textReverseTransform: string
155
+ }) {
156
+ const clipPath = defsSelection
157
+ .selectAll<SVGClipPathElement, Layout>('clipPath')
158
+ .data(clipPathData)
159
+ .join(
160
+ enter => {
161
+ return enter
162
+ .append('clipPath')
163
+ },
164
+ update => update,
165
+ exit => exit.remove()
166
+ )
167
+ .attr('id', d => d.id)
168
+ // .attr('transform', textReverseTransform)
169
+ .each((d, i, g) => {
170
+ const rect = d3.select(g[i])
171
+ .selectAll<SVGRectElement, typeof d>('rect')
172
+ .data([d])
173
+ .join(
174
+ enter => {
175
+ return enter
176
+ .append('rect')
177
+ },
178
+ update => update,
179
+ exit => exit.remove()
180
+ )
181
+ .attr('x', _d => - _d.width)
182
+ .attr('y', 0)
183
+ .attr('width', _d => _d.width * 2)
184
+ .attr('height', _d => _d.height)
185
+ })
186
+ }
187
+
188
+ export const createBaseRacingLabels: BasePluginFn<BaseRacingAxisContext> = (pluginName: string, {
189
+ selection,
190
+ computedData$,
191
+ visibleComputedRankingData$,
192
+ rankingScaleList$,
193
+ xScale$,
194
+ fullParams$,
195
+ fullDataFormatter$,
196
+ fullChartParams$,
197
+ // layout$,
198
+ containerPosition$,
199
+ containerSize$,
200
+ isCategorySeprate$,
201
+ // xyValueIndex$
202
+ }) => {
203
+
204
+ const destroy$ = new Subject()
205
+
206
+ // const containerClassName = getClassName(pluginName, 'container')
207
+ const boxClassName = getClassName(pluginName, 'box')
208
+ const textClassName = getClassName(pluginName, 'text')
209
+ const clipPathID = getUniID(pluginName, 'clipPath-box')
210
+
211
+ const containerSelection$ = multiValueContainerSelectionsObservable({
212
+ selection,
213
+ pluginName,
214
+ clipPathID: null,
215
+ computedData$,
216
+ containerPosition$,
217
+ isCategorySeprate$,
218
+ }).pipe(
219
+ takeUntil(destroy$),
220
+ )
221
+
222
+ // const containerSelection$ = combineLatest({
223
+ // computedData: computedData$.pipe(
224
+ // distinctUntilChanged((a, b) => {
225
+ // // 只有當series的數量改變時,才重新計算
226
+ // return a.length === b.length
227
+ // }),
228
+ // ),
229
+ // isCategorySeprate: isCategorySeprate$
230
+ // }).pipe(
231
+ // takeUntil(destroy$),
232
+ // switchMap(async (d) => d),
233
+ // map(data => {
234
+ // return data.isCategorySeprate
235
+ // // category分開的時候顯示各別axis
236
+ // ? data.computedData
237
+ // // category合併的時候只顯示第一個axis
238
+ // : [data.computedData[0]]
239
+ // }),
240
+ // map((computedData, i) => {
241
+ // return selection
242
+ // .selectAll<SVGGElement, ComputedDatumMultiValue[]>(`g.${containerClassName}`)
243
+ // .data(computedData, d => d[0] ? d[0].categoryIndex : i)
244
+ // .join('g')
245
+ // .classed(containerClassName, true)
246
+ // })
247
+ // )
248
+
249
+ // combineLatest({
250
+ // containerSelection: containerSelection$,
251
+ // containerPosition: containerPosition$
252
+ // }).pipe(
253
+ // takeUntil(destroy$),
254
+ // switchMap(async d => d)
255
+ // ).subscribe(data => {
256
+ // data.containerSelection
257
+ // .attr('transform', (d, i) => {
258
+ // const containerPosition = data.containerPosition[i] ?? data.containerPosition[0]
259
+ // const translate = containerPosition.translate
260
+ // const scale = containerPosition.scale
261
+ // // return `translate(${translate[0]}, ${translate[1]}) scale(${scale[0]}, ${scale[1]})`
262
+ // return `translate(${translate[0]}, ${translate[1]})`
263
+ // })
264
+ // // .attr('opacity', 0)
265
+ // // .transition()
266
+ // // .attr('opacity', 1)
267
+ // })
268
+
269
+ const textReverseTransform$ = containerPosition$.pipe(
270
+ takeUntil(destroy$),
271
+ switchMap(async (d) => d),
272
+ map(containerPosition => {
273
+ // const axesRotateXYReverseValue = `rotateX(${data.gridAxesReverseTransform.rotateX}deg) rotateY(${data.gridAxesReverseTransform.rotateY}deg)`
274
+ // const axesRotateReverseValue = `rotate(${data.gridAxesReverseTransform.rotate}deg)`
275
+ const containerScaleReverseValue = `scale(${1 / containerPosition[0].scale[0]}, ${1 / containerPosition[0].scale[1]})`
276
+ // 抵消最外層scale
277
+ return `${containerScaleReverseValue}`
278
+ }),
279
+ distinctUntilChanged()
280
+ )
281
+
282
+ // const textReverseTransformWithRotate$ = combineLatest({
283
+ // textReverseTransform: textReverseTransform$,
284
+ // fullParams: fullParams$,
285
+ // }).pipe(
286
+ // takeUntil(destroy$),
287
+ // switchMap(async (d) => d),
288
+ // map(data => {
289
+ // // 必須按照順序(先抵消外層rotate,再抵消最外層scale,最後再做本身的rotate)
290
+ // return `${data.textReverseTransform} rotate(${data.fullParams.barLabel.rotate}deg)`
291
+ // })
292
+ // )
293
+
294
+ // const rankingLabelList$ = visibleComputedRankingData$.pipe(
295
+ // takeUntil(destroy$),
296
+ // map(data => {
297
+ // return data.map(categoryData => categoryData.map(d => d.label))
298
+ // })
299
+ // )
300
+
301
+ const valueScale$: Observable<((n: number) => number)> = fullParams$.pipe(
302
+ map(fullParams => fullParams.barLabel.position),
303
+ distinctUntilChanged(),
304
+ switchMap(position => {
305
+ return iif(
306
+ () => position === 'inside',
307
+ xScale$,
308
+ of(() => 0)
309
+ )
310
+ })
311
+ )
312
+
313
+ containerSize$.subscribe(data => {
314
+ const defsSelection = selection.selectAll<SVGDefsElement, any>('defs')
315
+ .data([clipPathID])
316
+ .join('defs')
317
+ const clipPathData = [{
318
+ id: clipPathID,
319
+ width: data.width,
320
+ height: data.height
321
+ }]
322
+ renderClipPath({
323
+ defsSelection: defsSelection,
324
+ clipPathData,
325
+ // textReverseTransform: data.textReverseTransform
326
+ })
327
+ })
328
+
329
+ combineLatest({
330
+ containerSelection: containerSelection$,
331
+ fullParams: fullParams$,
332
+ // layout: layout$,
333
+ containerSize: containerSize$,
334
+ fullDataFormatter: fullDataFormatter$,
335
+ fullChartParams: fullChartParams$,
336
+ visibleComputedRankingData: visibleComputedRankingData$,
337
+ // rankingLabelList: rankingLabelList$,
338
+ rankingScaleList: rankingScaleList$,
339
+ valueScale: valueScale$,
340
+ textReverseTransform: textReverseTransform$,
341
+ // textReverseTransformWithRotate: textReverseTransformWithRotate$,
342
+ // xyValueIndex: xyValueIndex$
343
+ }).pipe(
344
+ takeUntil(destroy$),
345
+ switchMap(async (d) => d),
346
+ ).subscribe(data => {
347
+
348
+ data.containerSelection.each((d, i, g) => {
349
+ const _containerSelection = d3.select(g[i])
350
+ // const rankingLabels = data.rankingLabelList[i]
351
+ const rankingScale = data.rankingScaleList[i]
352
+ if (!rankingScale) {
353
+ return
354
+ }
355
+
356
+ // const containerClipPathID = `${clipPathID}-${i}`
357
+ const axisSelection = _containerSelection
358
+ .selectAll<SVGGElement, any>(`g.${boxClassName}`)
359
+ .data([i])
360
+ .join('g')
361
+ .attr('class', boxClassName)
362
+ .attr('clip-path', `url(#${clipPathID})`)
363
+ const axisLabelSelection = _containerSelection
364
+ .selectAll<SVGGElement, BaseRacingLabelsParams>(`g.${textClassName}`)
365
+ .data([data.fullParams])
366
+ .join('g')
367
+ .classed(textClassName, true)
368
+
369
+ renderRacingLabels({
370
+ selection: axisSelection,
371
+ fullParams: data.fullParams,
372
+ fullChartParams: data.fullChartParams,
373
+ rankingScale: rankingScale,
374
+ categoryData: data.visibleComputedRankingData[i],
375
+ // textReverseTransformWithRotate: data.textReverseTransformWithRotate,
376
+ valueScale: data.valueScale,
377
+ // xyValueIndex: data.xyValueIndex,
378
+ })
379
+
380
+ renderRacingAxisLabel({
381
+ selection: axisLabelSelection,
382
+ textClassName,
383
+ fullParams: data.fullParams,
384
+ containerSize: data.containerSize,
385
+ fullDataFormatter: data.fullDataFormatter,
386
+ fullChartParams: data.fullChartParams,
387
+ textReverseTransform: data.textReverseTransform,
388
+ })
389
+ })
390
+
391
+ })
392
+
393
+ return () => {
394
+ destroy$.next(undefined)
395
+ }
396
+ }