@orbcharts/core 3.0.0-alpha.42 → 3.0.0-alpha.43

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 (100) hide show
  1. package/LICENSE +200 -200
  2. package/dist/orbcharts-core.es.js +1905 -1896
  3. package/dist/orbcharts-core.umd.js +2 -2
  4. package/dist/src/defaults.d.ts +4 -3
  5. package/dist/src/grid/computeGridData.d.ts +4 -11
  6. package/dist/src/grid/gridObservables.d.ts +15 -18
  7. package/dist/src/multiGrid/multiGridObservables.d.ts +4 -11
  8. package/dist/src/series/seriesObservables.d.ts +26 -1
  9. package/dist/src/types/ComputedData.d.ts +1 -0
  10. package/dist/src/types/ComputedDataGrid.d.ts +0 -3
  11. package/dist/src/types/ComputedDataSeries.d.ts +1 -2
  12. package/dist/src/types/ContextObserverGrid.d.ts +11 -4
  13. package/dist/src/types/ContextObserverMultiGrid.d.ts +8 -3
  14. package/dist/src/types/ContextObserverSeries.d.ts +18 -0
  15. package/dist/src/types/DataFormatter.d.ts +8 -5
  16. package/dist/src/types/DataFormatterGrid.d.ts +13 -16
  17. package/dist/src/types/DataFormatterMultiGrid.d.ts +6 -3
  18. package/dist/src/types/DataFormatterMultiValue.d.ts +3 -0
  19. package/dist/src/types/DataFormatterRelationship.d.ts +3 -0
  20. package/dist/src/types/DataFormatterSeries.d.ts +10 -3
  21. package/dist/src/utils/orbchartsUtils.d.ts +14 -13
  22. package/package.json +41 -41
  23. package/src/AbstractChart.ts +48 -48
  24. package/src/GridChart.ts +20 -20
  25. package/src/MultiGridChart.ts +20 -20
  26. package/src/MultiValueChart.ts +20 -20
  27. package/src/RelationshipChart.ts +20 -20
  28. package/src/SeriesChart.ts +20 -20
  29. package/src/TreeChart.ts +20 -20
  30. package/src/base/createBaseChart.ts +367 -367
  31. package/src/base/createBasePlugin.ts +89 -89
  32. package/src/defaults.ts +220 -248
  33. package/src/defineGridPlugin.ts +3 -3
  34. package/src/defineMultiGridPlugin.ts +3 -3
  35. package/src/defineMultiValuePlugin.ts +3 -3
  36. package/src/defineNoneDataPlugin.ts +4 -4
  37. package/src/defineRelationshipPlugin.ts +3 -3
  38. package/src/defineSeriesPlugin.ts +3 -3
  39. package/src/defineTreePlugin.ts +3 -3
  40. package/src/grid/computeGridData.ts +134 -205
  41. package/src/grid/createGridContextObserver.ts +147 -130
  42. package/src/grid/gridObservables.ts +573 -486
  43. package/src/index.ts +21 -21
  44. package/src/multiGrid/computeMultiGridData.ts +130 -173
  45. package/src/multiGrid/createMultiGridContextObserver.ts +40 -40
  46. package/src/multiGrid/multiGridObservables.ts +350 -285
  47. package/src/multiValue/computeMultiValueData.ts +143 -136
  48. package/src/multiValue/createMultiValueContextObserver.ts +12 -12
  49. package/src/relationship/computeRelationshipData.ts +118 -106
  50. package/src/relationship/createRelationshipContextObserver.ts +12 -12
  51. package/src/series/computeSeriesData.ts +90 -153
  52. package/src/series/createSeriesContextObserver.ts +93 -38
  53. package/src/series/seriesObservables.ts +176 -24
  54. package/src/tree/computeTreeData.ts +131 -128
  55. package/src/tree/createTreeContextObserver.ts +61 -61
  56. package/src/tree/treeObservables.ts +94 -94
  57. package/src/types/Chart.ts +48 -48
  58. package/src/types/ChartParams.ts +51 -51
  59. package/src/types/ComputedData.ts +83 -82
  60. package/src/types/ComputedDataGrid.ts +13 -13
  61. package/src/types/ComputedDataMultiGrid.ts +2 -2
  62. package/src/types/ComputedDataMultiValue.ts +9 -9
  63. package/src/types/ComputedDataRelationship.ts +19 -19
  64. package/src/types/ComputedDataSeries.ts +8 -8
  65. package/src/types/ComputedDataTree.ts +19 -19
  66. package/src/types/ContextObserver.ts +38 -38
  67. package/src/types/ContextObserverGrid.ts +41 -33
  68. package/src/types/ContextObserverMultiGrid.ts +16 -28
  69. package/src/types/ContextObserverMultiValue.ts +4 -4
  70. package/src/types/ContextObserverRelationship.ts +4 -4
  71. package/src/types/ContextObserverSeries.ts +29 -9
  72. package/src/types/ContextObserverTree.ts +11 -11
  73. package/src/types/ContextSubject.ts +18 -18
  74. package/src/types/Data.ts +45 -45
  75. package/src/types/DataFormatter.ts +74 -95
  76. package/src/types/DataFormatterGrid.ts +67 -55
  77. package/src/types/DataFormatterMultiGrid.ts +44 -42
  78. package/src/types/DataFormatterMultiValue.ts +23 -20
  79. package/src/types/DataFormatterRelationship.ts +25 -22
  80. package/src/types/DataFormatterSeries.ts +20 -30
  81. package/src/types/DataFormatterTree.ts +12 -12
  82. package/src/types/DataGrid.ts +11 -11
  83. package/src/types/DataMultiGrid.ts +6 -6
  84. package/src/types/DataMultiValue.ts +12 -12
  85. package/src/types/DataRelationship.ts +27 -27
  86. package/src/types/DataSeries.ts +11 -11
  87. package/src/types/DataTree.ts +20 -20
  88. package/src/types/Event.ts +153 -153
  89. package/src/types/Layout.ts +11 -11
  90. package/src/types/Padding.ts +5 -5
  91. package/src/types/Plugin.ts +60 -60
  92. package/src/types/TransformData.ts +7 -7
  93. package/src/types/index.ts +37 -37
  94. package/src/utils/commonUtils.ts +50 -50
  95. package/src/utils/d3Utils.ts +89 -89
  96. package/src/utils/index.ts +4 -4
  97. package/src/utils/observables.ts +201 -201
  98. package/src/utils/orbchartsUtils.ts +349 -253
  99. package/tsconfig.json +13 -13
  100. package/vite.config.js +44 -44
@@ -1,202 +1,202 @@
1
- import {
2
- combineLatest,
3
- distinctUntilChanged,
4
- filter,
5
- map,
6
- merge,
7
- takeUntil,
8
- shareReplay,
9
- switchMap,
10
- Subject,
11
- Observable } from 'rxjs'
12
- import type {
13
- ChartType,
14
- ChartParams,
15
- ComputedDataTypeMap,
16
- ComputedDatumTypeMap,
17
- DataFormatterTypeMap,
18
- EventTypeMap,
19
- HighlightTarget,
20
- Layout,
21
- TransformData } from '../types'
22
-
23
- // interface DatumUnknown {
24
- // value: number | null
25
- // id: string
26
- // // label: string
27
- // seriesLabel?: string // 要符合每一種computedData所以不一定會有seriesLabel
28
- // groupLabel?: string // 要符合每一種computedData所以不一定會有groupLabel
29
- // }
30
-
31
- // 通用 highlight Observable
32
- export const highlightObservable = <T extends ChartType, D>({ datumList$, fullChartParams$, event$ }: {
33
- datumList$: Observable<D[]>
34
- fullChartParams$: Observable<ChartParams>
35
- event$: Subject<EventTypeMap<T>>
36
- }): Observable<D[]> => {
37
- const destroy$ = new Subject()
38
-
39
- // 預設的highlight
40
- const highlightDefault$ = fullChartParams$.pipe(
41
- takeUntil(destroy$),
42
- map(d => {
43
- return {
44
- id: null,
45
- seriesLabel: null,
46
- groupLabel: null,
47
- categoryLabel: null,
48
- highlightDefault: d.highlightDefault
49
- }
50
- }),
51
- distinctUntilChanged()
52
- )
53
-
54
- // 事件觸發的highlight
55
- const highlightMouseover$ = event$.pipe(
56
- takeUntil(destroy$),
57
- filter(d => d.eventName === 'mouseover' || d.eventName === 'mousemove'),
58
- // distinctUntilChanged((prev, current) => prev.eventName === current.eventName)
59
- map(d => {
60
- return d.datum
61
- ? {
62
- id: (d.datum as any).id,
63
- seriesLabel: (d.datum as any).seriesLabel,
64
- groupLabel: (d.datum as any).groupLabel,
65
- categoryLabel: (d.datum as any).categoryLabel,
66
- highlightDefault: null
67
- }
68
- : {
69
- id: null,
70
- seriesLabel: null,
71
- groupLabel: null,
72
- categoryLabel: null,
73
- highlightDefault: null
74
- }
75
- })
76
- )
77
- const highlightMouseout$ = event$.pipe(
78
- takeUntil(destroy$),
79
- filter(d => d.eventName === 'mouseout'),
80
- // distinctUntilChanged((prev, current) => prev.eventName === current.eventName)
81
- // map(d => {
82
- // return { id: '', label: '' }
83
- // })
84
- switchMap(d => highlightDefault$)
85
- )
86
-
87
- function getDatumIds (datumList: ComputedDatumTypeMap<T>[], id: string | null) {
88
- const datum = datumList.find(d => d.id === id)
89
- return datum ? [datum] : []
90
- }
91
-
92
- function getSeriesIds (datumList: ComputedDatumTypeMap<T>[], seriesLabel: string | null) {
93
- return seriesLabel == null
94
- ? []
95
- : datumList.filter(d => (d as ComputedDatumTypeMap<"series">).seriesLabel === seriesLabel)
96
- }
97
-
98
- function getGroupIds (datumList: ComputedDatumTypeMap<T>[], groupLabel: string | null) {
99
- return groupLabel == null
100
- ? []
101
- : datumList.filter(d => (d as ComputedDatumTypeMap<"grid">).groupLabel === groupLabel)
102
- }
103
-
104
- function getCategoryIds (datumList: ComputedDatumTypeMap<T>[], categoryLabel: string | null) {
105
- return categoryLabel == null
106
- ? []
107
- : datumList.filter(d => (d as ComputedDatumTypeMap<"multiValue" | "relationship" | "tree">).categoryLabel === categoryLabel)
108
- }
109
-
110
- return new Observable<D[]>(subscriber => {
111
- combineLatest({
112
- target: merge(highlightMouseover$, highlightMouseout$, highlightDefault$),
113
- datumList: datumList$,
114
- fullChartParams: fullChartParams$,
115
- }).pipe(
116
- takeUntil(destroy$),
117
- switchMap(async d => d)
118
- ).subscribe(data => {
119
- let datumList: ComputedDatumTypeMap<T>[] = []
120
- if (data.fullChartParams.highlightTarget === 'datum') {
121
- datumList = getDatumIds(data.datumList as ComputedDatumTypeMap<T>[], data.target.id)
122
- } else if (data.fullChartParams.highlightTarget === 'series') {
123
- datumList = getSeriesIds(data.datumList as ComputedDatumTypeMap<T>[], data.target.seriesLabel)
124
- } else if (data.fullChartParams.highlightTarget === 'group') {
125
- datumList = getGroupIds(data.datumList as ComputedDatumTypeMap<T>[], data.target.groupLabel)
126
- } else if (data.fullChartParams.highlightTarget === 'category') {
127
- datumList = getCategoryIds(data.datumList as ComputedDatumTypeMap<T>[], data.target.categoryLabel)
128
- }
129
- subscriber.next(datumList as D[])
130
- })
131
-
132
- return function unsubscribe () {
133
- destroy$.next(undefined)
134
- }
135
- })
136
- }
137
-
138
- export const seriesDataMapObservable = <DatumType extends ComputedDatumTypeMap<'series' | 'grid'>>({ datumList$ }: { datumList$: Observable<DatumType[]> }) => {
139
- return datumList$.pipe(
140
- map(data => {
141
- const SeriesDataMap: Map<string, DatumType[]> = new Map()
142
- data.forEach(d => {
143
- const seriesData = SeriesDataMap.get(d.seriesLabel) ?? []
144
- seriesData.push(d)
145
- SeriesDataMap.set(d.seriesLabel, seriesData)
146
- })
147
- return SeriesDataMap
148
- })
149
- )
150
- }
151
-
152
- export const groupDataMapObservable = <DatumType extends ComputedDatumTypeMap<'grid'>> ({ datumList$ }: { datumList$: Observable<DatumType[]> }) => {
153
- return datumList$.pipe(
154
- map(data => {
155
- const GroupDataMap: Map<string, DatumType[]> = new Map()
156
- data.forEach(d => {
157
- const groupData = GroupDataMap.get(d.groupLabel) ?? []
158
- groupData.push(d)
159
- GroupDataMap.set(d.groupLabel, groupData)
160
- })
161
- return GroupDataMap
162
- })
163
- )
164
- }
165
-
166
- export const categoryDataMapObservable = <DatumType extends ComputedDatumTypeMap<'multiValue' | 'relationship' | 'tree'>> ({ datumList$ }: { datumList$: Observable<DatumType[]> }) => {
167
- return datumList$.pipe(
168
- map(data => {
169
- const GroupDataMap: Map<string, DatumType[]> = new Map()
170
- data
171
- .filter(d => d.categoryLabel != null)
172
- .forEach(d => {
173
- const groupData = GroupDataMap.get(d.categoryLabel) ?? []
174
- groupData.push(d)
175
- GroupDataMap.set(d.categoryLabel, groupData)
176
- })
177
- return GroupDataMap
178
- })
179
- )
180
- }
181
-
182
- export const textSizePxObservable = (chartParams$: Observable<ChartParams>) => {
183
- return chartParams$.pipe(
184
- map(d => d.styles.textSize),
185
- distinctUntilChanged(),
186
- map(data => {
187
- let value = NaN
188
- if (typeof data === 'string') {
189
- if (data.includes('rem')) {
190
- const rootFontSizePx = parseFloat(getComputedStyle(document.documentElement).fontSize)
191
- const num = parseFloat(data)
192
- value = num * rootFontSizePx
193
- } else if (data.includes('px')) {
194
- value = parseFloat(data)
195
- }
196
- } else if (typeof data === 'number') {
197
- return data
198
- }
199
- return value ? value : 14 // default
200
- })
201
- )
1
+ import {
2
+ combineLatest,
3
+ distinctUntilChanged,
4
+ filter,
5
+ map,
6
+ merge,
7
+ takeUntil,
8
+ shareReplay,
9
+ switchMap,
10
+ Subject,
11
+ Observable } from 'rxjs'
12
+ import type {
13
+ ChartType,
14
+ ChartParams,
15
+ ComputedDataTypeMap,
16
+ ComputedDatumTypeMap,
17
+ DataFormatterTypeMap,
18
+ EventTypeMap,
19
+ HighlightTarget,
20
+ Layout,
21
+ TransformData } from '../types'
22
+
23
+ // interface DatumUnknown {
24
+ // value: number | null
25
+ // id: string
26
+ // // label: string
27
+ // seriesLabel?: string // 要符合每一種computedData所以不一定會有seriesLabel
28
+ // groupLabel?: string // 要符合每一種computedData所以不一定會有groupLabel
29
+ // }
30
+
31
+ // 通用 highlight Observable
32
+ export const highlightObservable = <T extends ChartType, D>({ datumList$, fullChartParams$, event$ }: {
33
+ datumList$: Observable<D[]>
34
+ fullChartParams$: Observable<ChartParams>
35
+ event$: Subject<EventTypeMap<T>>
36
+ }): Observable<D[]> => {
37
+ const destroy$ = new Subject()
38
+
39
+ // 預設的highlight
40
+ const highlightDefault$ = fullChartParams$.pipe(
41
+ takeUntil(destroy$),
42
+ map(d => {
43
+ return {
44
+ id: null,
45
+ seriesLabel: null,
46
+ groupLabel: null,
47
+ categoryLabel: null,
48
+ highlightDefault: d.highlightDefault
49
+ }
50
+ }),
51
+ distinctUntilChanged()
52
+ )
53
+
54
+ // 事件觸發的highlight
55
+ const highlightMouseover$ = event$.pipe(
56
+ takeUntil(destroy$),
57
+ filter(d => d.eventName === 'mouseover' || d.eventName === 'mousemove'),
58
+ // distinctUntilChanged((prev, current) => prev.eventName === current.eventName)
59
+ map(d => {
60
+ return d.datum
61
+ ? {
62
+ id: (d.datum as any).id,
63
+ seriesLabel: (d.datum as any).seriesLabel,
64
+ groupLabel: (d.datum as any).groupLabel,
65
+ categoryLabel: (d.datum as any).categoryLabel,
66
+ highlightDefault: null
67
+ }
68
+ : {
69
+ id: null,
70
+ seriesLabel: null,
71
+ groupLabel: null,
72
+ categoryLabel: null,
73
+ highlightDefault: null
74
+ }
75
+ })
76
+ )
77
+ const highlightMouseout$ = event$.pipe(
78
+ takeUntil(destroy$),
79
+ filter(d => d.eventName === 'mouseout'),
80
+ // distinctUntilChanged((prev, current) => prev.eventName === current.eventName)
81
+ // map(d => {
82
+ // return { id: '', label: '' }
83
+ // })
84
+ switchMap(d => highlightDefault$)
85
+ )
86
+
87
+ function getDatumIds (datumList: ComputedDatumTypeMap<T>[], id: string | null) {
88
+ const datum = datumList.find(d => d.id === id)
89
+ return datum ? [datum] : []
90
+ }
91
+
92
+ function getSeriesIds (datumList: ComputedDatumTypeMap<T>[], seriesLabel: string | null) {
93
+ return seriesLabel == null
94
+ ? []
95
+ : datumList.filter(d => (d as ComputedDatumTypeMap<"series">).seriesLabel === seriesLabel)
96
+ }
97
+
98
+ function getGroupIds (datumList: ComputedDatumTypeMap<T>[], groupLabel: string | null) {
99
+ return groupLabel == null
100
+ ? []
101
+ : datumList.filter(d => (d as ComputedDatumTypeMap<"grid">).groupLabel === groupLabel)
102
+ }
103
+
104
+ function getCategoryIds (datumList: ComputedDatumTypeMap<T>[], categoryLabel: string | null) {
105
+ return categoryLabel == null
106
+ ? []
107
+ : datumList.filter(d => (d as ComputedDatumTypeMap<"multiValue" | "relationship" | "tree">).categoryLabel === categoryLabel)
108
+ }
109
+
110
+ return new Observable<D[]>(subscriber => {
111
+ combineLatest({
112
+ target: merge(highlightMouseover$, highlightMouseout$, highlightDefault$),
113
+ datumList: datumList$,
114
+ fullChartParams: fullChartParams$,
115
+ }).pipe(
116
+ takeUntil(destroy$),
117
+ switchMap(async d => d)
118
+ ).subscribe(data => {
119
+ let datumList: ComputedDatumTypeMap<T>[] = []
120
+ if (data.fullChartParams.highlightTarget === 'datum') {
121
+ datumList = getDatumIds(data.datumList as ComputedDatumTypeMap<T>[], data.target.id)
122
+ } else if (data.fullChartParams.highlightTarget === 'series') {
123
+ datumList = getSeriesIds(data.datumList as ComputedDatumTypeMap<T>[], data.target.seriesLabel)
124
+ } else if (data.fullChartParams.highlightTarget === 'group') {
125
+ datumList = getGroupIds(data.datumList as ComputedDatumTypeMap<T>[], data.target.groupLabel)
126
+ } else if (data.fullChartParams.highlightTarget === 'category') {
127
+ datumList = getCategoryIds(data.datumList as ComputedDatumTypeMap<T>[], data.target.categoryLabel)
128
+ }
129
+ subscriber.next(datumList as D[])
130
+ })
131
+
132
+ return function unsubscribe () {
133
+ destroy$.next(undefined)
134
+ }
135
+ })
136
+ }
137
+
138
+ export const seriesDataMapObservable = <DatumType extends ComputedDatumTypeMap<'series' | 'grid'>>({ datumList$ }: { datumList$: Observable<DatumType[]> }) => {
139
+ return datumList$.pipe(
140
+ map(data => {
141
+ const SeriesDataMap: Map<string, DatumType[]> = new Map()
142
+ data.forEach(d => {
143
+ const seriesData = SeriesDataMap.get(d.seriesLabel) ?? []
144
+ seriesData.push(d)
145
+ SeriesDataMap.set(d.seriesLabel, seriesData)
146
+ })
147
+ return SeriesDataMap
148
+ })
149
+ )
150
+ }
151
+
152
+ export const groupDataMapObservable = <DatumType extends ComputedDatumTypeMap<'grid'>> ({ datumList$ }: { datumList$: Observable<DatumType[]> }) => {
153
+ return datumList$.pipe(
154
+ map(data => {
155
+ const GroupDataMap: Map<string, DatumType[]> = new Map()
156
+ data.forEach(d => {
157
+ const groupData = GroupDataMap.get(d.groupLabel) ?? []
158
+ groupData.push(d)
159
+ GroupDataMap.set(d.groupLabel, groupData)
160
+ })
161
+ return GroupDataMap
162
+ })
163
+ )
164
+ }
165
+
166
+ export const categoryDataMapObservable = <DatumType extends ComputedDatumTypeMap<'multiValue' | 'relationship' | 'tree'>> ({ datumList$ }: { datumList$: Observable<DatumType[]> }) => {
167
+ return datumList$.pipe(
168
+ map(data => {
169
+ const GroupDataMap: Map<string, DatumType[]> = new Map()
170
+ data
171
+ .filter(d => d.categoryLabel != null)
172
+ .forEach(d => {
173
+ const groupData = GroupDataMap.get(d.categoryLabel) ?? []
174
+ groupData.push(d)
175
+ GroupDataMap.set(d.categoryLabel, groupData)
176
+ })
177
+ return GroupDataMap
178
+ })
179
+ )
180
+ }
181
+
182
+ export const textSizePxObservable = (chartParams$: Observable<ChartParams>) => {
183
+ return chartParams$.pipe(
184
+ map(d => d.styles.textSize),
185
+ distinctUntilChanged(),
186
+ map(data => {
187
+ let value = NaN
188
+ if (typeof data === 'string') {
189
+ if (data.includes('rem')) {
190
+ const rootFontSizePx = parseFloat(getComputedStyle(document.documentElement).fontSize)
191
+ const num = parseFloat(data)
192
+ value = num * rootFontSizePx
193
+ } else if (data.includes('px')) {
194
+ value = parseFloat(data)
195
+ }
196
+ } else if (typeof data === 'number') {
197
+ return data
198
+ }
199
+ return value ? value : 14 // default
200
+ })
201
+ )
202
202
  }