@orbcharts/core 3.0.0-alpha.40 → 3.0.0-alpha.41

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. package/LICENSE +200 -200
  2. package/dist/orbcharts-core.es.js +1152 -1124
  3. package/dist/orbcharts-core.umd.js +2 -2
  4. package/dist/src/types/ChartParams.d.ts +1 -1
  5. package/dist/src/types/ContextObserverGrid.d.ts +1 -0
  6. package/dist/src/types/ContextObserverMultiGrid.d.ts +1 -0
  7. package/dist/src/types/ContextObserverSeries.d.ts +1 -0
  8. package/dist/src/types/ContextObserverTree.d.ts +1 -0
  9. package/dist/src/utils/observables.d.ts +1 -0
  10. package/package.json +41 -41
  11. package/src/AbstractChart.ts +48 -48
  12. package/src/GridChart.ts +20 -20
  13. package/src/MultiGridChart.ts +20 -20
  14. package/src/MultiValueChart.ts +20 -20
  15. package/src/RelationshipChart.ts +20 -20
  16. package/src/SeriesChart.ts +20 -20
  17. package/src/TreeChart.ts +20 -20
  18. package/src/base/createBaseChart.ts +367 -367
  19. package/src/base/createBasePlugin.ts +89 -89
  20. package/src/defaults.ts +248 -247
  21. package/src/defineGridPlugin.ts +3 -3
  22. package/src/defineMultiGridPlugin.ts +3 -3
  23. package/src/defineMultiValuePlugin.ts +3 -3
  24. package/src/defineNoneDataPlugin.ts +4 -4
  25. package/src/defineRelationshipPlugin.ts +3 -3
  26. package/src/defineSeriesPlugin.ts +3 -3
  27. package/src/defineTreePlugin.ts +3 -3
  28. package/src/grid/computeGridData.ts +205 -205
  29. package/src/grid/createGridContextObserver.ts +130 -124
  30. package/src/grid/gridObservables.ts +486 -486
  31. package/src/index.ts +21 -21
  32. package/src/multiGrid/computeMultiGridData.ts +173 -173
  33. package/src/multiGrid/createMultiGridContextObserver.ts +40 -34
  34. package/src/multiGrid/multiGridObservables.ts +285 -285
  35. package/src/multiValue/computeMultiValueData.ts +136 -136
  36. package/src/multiValue/createMultiValueContextObserver.ts +12 -12
  37. package/src/relationship/computeRelationshipData.ts +106 -106
  38. package/src/relationship/createRelationshipContextObserver.ts +12 -12
  39. package/src/series/computeSeriesData.ts +153 -153
  40. package/src/series/createSeriesContextObserver.ts +38 -33
  41. package/src/series/seriesObservables.ts +23 -23
  42. package/src/tree/computeTreeData.ts +128 -128
  43. package/src/tree/createTreeContextObserver.ts +61 -56
  44. package/src/tree/treeObservables.ts +94 -94
  45. package/src/types/Chart.ts +48 -48
  46. package/src/types/ChartParams.ts +51 -51
  47. package/src/types/ComputedData.ts +82 -82
  48. package/src/types/ComputedDataGrid.ts +13 -13
  49. package/src/types/ComputedDataMultiGrid.ts +2 -2
  50. package/src/types/ComputedDataMultiValue.ts +9 -9
  51. package/src/types/ComputedDataRelationship.ts +19 -19
  52. package/src/types/ComputedDataSeries.ts +7 -7
  53. package/src/types/ComputedDataTree.ts +19 -19
  54. package/src/types/ContextObserver.ts +38 -38
  55. package/src/types/ContextObserverGrid.ts +33 -33
  56. package/src/types/ContextObserverMultiGrid.ts +28 -27
  57. package/src/types/ContextObserverMultiValue.ts +4 -4
  58. package/src/types/ContextObserverRelationship.ts +4 -4
  59. package/src/types/ContextObserverSeries.ts +8 -7
  60. package/src/types/ContextObserverTree.ts +11 -10
  61. package/src/types/ContextSubject.ts +18 -18
  62. package/src/types/Data.ts +45 -45
  63. package/src/types/DataFormatter.ts +95 -95
  64. package/src/types/DataFormatterGrid.ts +55 -55
  65. package/src/types/DataFormatterMultiGrid.ts +42 -42
  66. package/src/types/DataFormatterMultiValue.ts +20 -20
  67. package/src/types/DataFormatterRelationship.ts +22 -22
  68. package/src/types/DataFormatterSeries.ts +29 -29
  69. package/src/types/DataFormatterTree.ts +12 -12
  70. package/src/types/DataGrid.ts +11 -11
  71. package/src/types/DataMultiGrid.ts +6 -6
  72. package/src/types/DataMultiValue.ts +12 -12
  73. package/src/types/DataRelationship.ts +27 -27
  74. package/src/types/DataSeries.ts +11 -11
  75. package/src/types/DataTree.ts +20 -20
  76. package/src/types/Event.ts +153 -153
  77. package/src/types/Layout.ts +11 -11
  78. package/src/types/Padding.ts +5 -5
  79. package/src/types/Plugin.ts +60 -60
  80. package/src/types/TransformData.ts +7 -7
  81. package/src/types/index.ts +37 -37
  82. package/src/utils/commonUtils.ts +50 -50
  83. package/src/utils/d3Utils.ts +89 -89
  84. package/src/utils/index.ts +4 -4
  85. package/src/utils/observables.ts +202 -181
  86. package/src/utils/orbchartsUtils.ts +253 -253
  87. package/tsconfig.json +13 -13
  88. package/vite.config.js +44 -44
@@ -1,153 +1,153 @@
1
- import type { DataSeries, DataSeriesDatum } from '../types/DataSeries'
2
- import type { ComputedDataFn } from '../types/ComputedData'
3
- import type { ComputedDataSeries, ComputedDatumSeries } from '../types/ComputedDataSeries'
4
- import { formatValueToLabel, createDefaultDatumId, createDefaultSeriesLabel, seriesColorPredicate } from '../utils/orbchartsUtils'
5
-
6
- interface SortValue {
7
- rowIndex: number
8
- columnIndex: number
9
- index: number
10
- datum: number | DataSeriesDatum
11
- }
12
-
13
- type GetSortedIndex = (computedDataSeries: ComputedDatumSeries[], rowIndex: number, columnIndex: number) => number
14
-
15
- function createSortedIndexMap (data: DataSeries, sort: (a: number | DataSeriesDatum, b: number | DataSeriesDatum) => number): Map<string, number> {
16
-
17
- const SortedIndexMap: Map<string, number> = new Map() // Map<[rowIndex, columnIndex], sortedIndex>
18
-
19
- let _data = Object.assign([], data) as DataSeries
20
- // 建立排序所需資料的物件
21
- let sortValueData: SortValue[] = []
22
- _data.forEach((d, i) => {
23
- if (Array.isArray(d)) {
24
- d.forEach((_d, _i) => {
25
- sortValueData.push({
26
- rowIndex: i,
27
- columnIndex: _i,
28
- index: -1,
29
- datum: _d
30
- })
31
- })
32
- } else {
33
- sortValueData.push({
34
- rowIndex: i,
35
- columnIndex: 0,
36
- index: -1,
37
- datum: d
38
- })
39
- }
40
- })
41
- // 排序
42
- sortValueData.sort((a, b) => sort(a.datum, b.datum))
43
- // 取得排序後的index
44
- sortValueData = sortValueData.map((d, i) => {
45
- return {
46
- ...d,
47
- index: i
48
- }
49
- })
50
- // 建立SortedIndexMap
51
- sortValueData.forEach(d => {
52
- SortedIndexMap.set(String([d.rowIndex, d.columnIndex]), d.index)
53
- })
54
-
55
- return SortedIndexMap
56
- }
57
-
58
- export const computeSeriesData: ComputedDataFn<'series'> = (context) => {
59
- const { data = [], dataFormatter, chartParams } = context
60
- if (!data.length) {
61
- return []
62
- }
63
-
64
- const computedDataSeries: ComputedDatumSeries[] = []
65
-
66
- try {
67
- // 取得排序後的索引
68
- const getSortedIndex: GetSortedIndex = ((hasSort: boolean) => {
69
- if (hasSort) {
70
- // 資料索引對應排序後的索引 Map<[rowIndex, columnIndex], sortedIndex>
71
- const SortedIndexMap: Map<string, number> = createSortedIndexMap(data, dataFormatter.sort)
72
- return (computedDataSeries: ComputedDatumSeries[], rowIndex: number, columnIndex: number) => {
73
- return SortedIndexMap.get(String([rowIndex, columnIndex]))
74
- }
75
- } else {
76
- return (computedDataSeries: ComputedDatumSeries[], rowIndex: number, columnIndex: number) => {
77
- return computedDataSeries.length
78
- }
79
- }
80
- })(dataFormatter.sort != null)
81
-
82
- // 資料索引對應排序後的索引 Map<[rowIndex, columnIndex], sortedIndex>
83
- // let SortedIndexMap: Map<string, number> = new Map()
84
- // if (dataFormatter.sort) {
85
- // SortedIndexMap = createSortedIndexMap(data, dataFormatter.sort)
86
- // }
87
-
88
- const createComputedDatumSeries = (detailData: number | DataSeriesDatum, rowIndex: number, columnIndex: number, currentIndex: number, sortedIndex: number): ComputedDatumSeries => {
89
- const defaultId = createDefaultDatumId(dataFormatter.type, rowIndex, columnIndex)
90
- // const seriesLabel = dataFormatter.mapSeries(detailData, rowIndex, columnIndex, context)
91
- const seriesLabel = dataFormatter.seriesLabels[rowIndex] || createDefaultSeriesLabel('series', rowIndex)
92
- // const color = dataFormatter.colorsPredicate(detailData, rowIndex, columnIndex, context)
93
- const color = seriesColorPredicate(rowIndex, chartParams)
94
- const visible = dataFormatter.visibleFilter(detailData, rowIndex, columnIndex, context)
95
- if (typeof detailData === 'number') {
96
- return {
97
- id: defaultId,
98
- index: currentIndex,
99
- sortedIndex,
100
- label: defaultId,
101
- description: '',
102
- // tooltipContent: dataFormatter.tooltipContentFormat(detailData, rowIndex, columnIndex, context),
103
- data: {},
104
- value: detailData,
105
- // valueLabel: formatValueToLabel(detailData, dataFormatter.valueFormat),
106
- seriesIndex: rowIndex,
107
- seriesLabel,
108
- color,
109
- visible
110
- }
111
- } else {
112
- return {
113
- id: detailData.id ? detailData.id : defaultId,
114
- index: currentIndex,
115
- sortedIndex,
116
- label: detailData.label ? detailData.label : defaultId,
117
- description: detailData.description,
118
- // tooltipContent: detailData.tooltipContent ? detailData.tooltipContent : dataFormatter.tooltipContentFormat(detailData, rowIndex, columnIndex, context),
119
- data: detailData.data ?? {},
120
- value: detailData.value,
121
- // valueLabel: formatValueToLabel(detailData.value, dataFormatter.valueFormat),
122
- seriesIndex: rowIndex,
123
- seriesLabel,
124
- color,
125
- visible
126
- }
127
- }
128
- }
129
-
130
- data.forEach((mainData, rowIndex) => {
131
- if (Array.isArray(mainData)) {
132
- mainData.forEach((detailData, columnIndex) => {
133
- const sortedIndex = getSortedIndex(computedDataSeries, rowIndex, columnIndex)
134
- const datum = createComputedDatumSeries(detailData, rowIndex, columnIndex, computedDataSeries.length, sortedIndex)
135
- computedDataSeries.push(datum)
136
- })
137
- } else {
138
- const sortedIndex = getSortedIndex(computedDataSeries, rowIndex, 0)
139
- const datum = createComputedDatumSeries(mainData, rowIndex, 0, computedDataSeries.length, sortedIndex) // 只有一維陣列所以columnIndex為0
140
- computedDataSeries.push(datum)
141
- }
142
- })
143
-
144
- // if (dataFormatter.sort != null) {
145
- // computedDataSeries.sort((a, b) => a.sortedIndex - b.sortedIndex)
146
- // }
147
- } catch (e) {
148
- // console.error(e)
149
- throw Error(e)
150
- }
151
-
152
- return computedDataSeries
153
- }
1
+ import type { DataSeries, DataSeriesDatum } from '../types/DataSeries'
2
+ import type { ComputedDataFn } from '../types/ComputedData'
3
+ import type { ComputedDataSeries, ComputedDatumSeries } from '../types/ComputedDataSeries'
4
+ import { formatValueToLabel, createDefaultDatumId, createDefaultSeriesLabel, seriesColorPredicate } from '../utils/orbchartsUtils'
5
+
6
+ interface SortValue {
7
+ rowIndex: number
8
+ columnIndex: number
9
+ index: number
10
+ datum: number | DataSeriesDatum
11
+ }
12
+
13
+ type GetSortedIndex = (computedDataSeries: ComputedDatumSeries[], rowIndex: number, columnIndex: number) => number
14
+
15
+ function createSortedIndexMap (data: DataSeries, sort: (a: number | DataSeriesDatum, b: number | DataSeriesDatum) => number): Map<string, number> {
16
+
17
+ const SortedIndexMap: Map<string, number> = new Map() // Map<[rowIndex, columnIndex], sortedIndex>
18
+
19
+ let _data = Object.assign([], data) as DataSeries
20
+ // 建立排序所需資料的物件
21
+ let sortValueData: SortValue[] = []
22
+ _data.forEach((d, i) => {
23
+ if (Array.isArray(d)) {
24
+ d.forEach((_d, _i) => {
25
+ sortValueData.push({
26
+ rowIndex: i,
27
+ columnIndex: _i,
28
+ index: -1,
29
+ datum: _d
30
+ })
31
+ })
32
+ } else {
33
+ sortValueData.push({
34
+ rowIndex: i,
35
+ columnIndex: 0,
36
+ index: -1,
37
+ datum: d
38
+ })
39
+ }
40
+ })
41
+ // 排序
42
+ sortValueData.sort((a, b) => sort(a.datum, b.datum))
43
+ // 取得排序後的index
44
+ sortValueData = sortValueData.map((d, i) => {
45
+ return {
46
+ ...d,
47
+ index: i
48
+ }
49
+ })
50
+ // 建立SortedIndexMap
51
+ sortValueData.forEach(d => {
52
+ SortedIndexMap.set(String([d.rowIndex, d.columnIndex]), d.index)
53
+ })
54
+
55
+ return SortedIndexMap
56
+ }
57
+
58
+ export const computeSeriesData: ComputedDataFn<'series'> = (context) => {
59
+ const { data = [], dataFormatter, chartParams } = context
60
+ if (!data.length) {
61
+ return []
62
+ }
63
+
64
+ const computedDataSeries: ComputedDatumSeries[] = []
65
+
66
+ try {
67
+ // 取得排序後的索引
68
+ const getSortedIndex: GetSortedIndex = ((hasSort: boolean) => {
69
+ if (hasSort) {
70
+ // 資料索引對應排序後的索引 Map<[rowIndex, columnIndex], sortedIndex>
71
+ const SortedIndexMap: Map<string, number> = createSortedIndexMap(data, dataFormatter.sort)
72
+ return (computedDataSeries: ComputedDatumSeries[], rowIndex: number, columnIndex: number) => {
73
+ return SortedIndexMap.get(String([rowIndex, columnIndex]))
74
+ }
75
+ } else {
76
+ return (computedDataSeries: ComputedDatumSeries[], rowIndex: number, columnIndex: number) => {
77
+ return computedDataSeries.length
78
+ }
79
+ }
80
+ })(dataFormatter.sort != null)
81
+
82
+ // 資料索引對應排序後的索引 Map<[rowIndex, columnIndex], sortedIndex>
83
+ // let SortedIndexMap: Map<string, number> = new Map()
84
+ // if (dataFormatter.sort) {
85
+ // SortedIndexMap = createSortedIndexMap(data, dataFormatter.sort)
86
+ // }
87
+
88
+ const createComputedDatumSeries = (detailData: number | DataSeriesDatum, rowIndex: number, columnIndex: number, currentIndex: number, sortedIndex: number): ComputedDatumSeries => {
89
+ const defaultId = createDefaultDatumId(dataFormatter.type, rowIndex, columnIndex)
90
+ // const seriesLabel = dataFormatter.mapSeries(detailData, rowIndex, columnIndex, context)
91
+ const seriesLabel = dataFormatter.seriesLabels[rowIndex] || createDefaultSeriesLabel('series', rowIndex)
92
+ // const color = dataFormatter.colorsPredicate(detailData, rowIndex, columnIndex, context)
93
+ const color = seriesColorPredicate(rowIndex, chartParams)
94
+ const visible = dataFormatter.visibleFilter(detailData, rowIndex, columnIndex, context)
95
+ if (typeof detailData === 'number') {
96
+ return {
97
+ id: defaultId,
98
+ index: currentIndex,
99
+ sortedIndex,
100
+ label: defaultId,
101
+ description: '',
102
+ // tooltipContent: dataFormatter.tooltipContentFormat(detailData, rowIndex, columnIndex, context),
103
+ data: {},
104
+ value: detailData,
105
+ // valueLabel: formatValueToLabel(detailData, dataFormatter.valueFormat),
106
+ seriesIndex: rowIndex,
107
+ seriesLabel,
108
+ color,
109
+ visible
110
+ }
111
+ } else {
112
+ return {
113
+ id: detailData.id ? detailData.id : defaultId,
114
+ index: currentIndex,
115
+ sortedIndex,
116
+ label: detailData.label ? detailData.label : defaultId,
117
+ description: detailData.description,
118
+ // tooltipContent: detailData.tooltipContent ? detailData.tooltipContent : dataFormatter.tooltipContentFormat(detailData, rowIndex, columnIndex, context),
119
+ data: detailData.data ?? {},
120
+ value: detailData.value,
121
+ // valueLabel: formatValueToLabel(detailData.value, dataFormatter.valueFormat),
122
+ seriesIndex: rowIndex,
123
+ seriesLabel,
124
+ color,
125
+ visible
126
+ }
127
+ }
128
+ }
129
+
130
+ data.forEach((mainData, rowIndex) => {
131
+ if (Array.isArray(mainData)) {
132
+ mainData.forEach((detailData, columnIndex) => {
133
+ const sortedIndex = getSortedIndex(computedDataSeries, rowIndex, columnIndex)
134
+ const datum = createComputedDatumSeries(detailData, rowIndex, columnIndex, computedDataSeries.length, sortedIndex)
135
+ computedDataSeries.push(datum)
136
+ })
137
+ } else {
138
+ const sortedIndex = getSortedIndex(computedDataSeries, rowIndex, 0)
139
+ const datum = createComputedDatumSeries(mainData, rowIndex, 0, computedDataSeries.length, sortedIndex) // 只有一維陣列所以columnIndex為0
140
+ computedDataSeries.push(datum)
141
+ }
142
+ })
143
+
144
+ // if (dataFormatter.sort != null) {
145
+ // computedDataSeries.sort((a, b) => a.sortedIndex - b.sortedIndex)
146
+ // }
147
+ } catch (e) {
148
+ // console.error(e)
149
+ throw Error(e)
150
+ }
151
+
152
+ return computedDataSeries
153
+ }
@@ -1,33 +1,38 @@
1
- import { shareReplay } from 'rxjs'
2
- import type { ContextObserverFn } from '../types'
3
- import {
4
- seriesDataMapObservable,
5
- groupDataMapObservable } from '../utils/observables'
6
- import { highlightObservable } from '../utils/observables'
7
-
8
- export const createSeriesContextObserver: ContextObserverFn<'series'> = ({ subject, observer }) => {
9
-
10
- const seriesHighlight$ = highlightObservable({
11
- datumList$: observer.computedData$,
12
- fullChartParams$: observer.fullChartParams$,
13
- event$: subject.event$
14
- }).pipe(
15
- shareReplay(1)
16
- )
17
-
18
- const SeriesDataMap$ = seriesDataMapObservable({
19
- datumList$: observer.computedData$
20
- }).pipe(
21
- shareReplay(1)
22
- )
23
-
24
- return {
25
- fullParams$: observer.fullParams$,
26
- fullChartParams$: observer.fullChartParams$,
27
- fullDataFormatter$: observer.fullDataFormatter$,
28
- computedData$: observer.computedData$,
29
- layout$: observer.layout$,
30
- seriesHighlight$,
31
- SeriesDataMap$
32
- }
33
- }
1
+ import { shareReplay } from 'rxjs'
2
+ import type { ContextObserverFn } from '../types'
3
+ import {
4
+ seriesDataMapObservable,
5
+ groupDataMapObservable } from '../utils/observables'
6
+ import { highlightObservable, textSizePxObservable } from '../utils/observables'
7
+
8
+ export const createSeriesContextObserver: ContextObserverFn<'series'> = ({ subject, observer }) => {
9
+
10
+ const textSizePx$ = textSizePxObservable(observer.fullChartParams$).pipe(
11
+ shareReplay(1)
12
+ )
13
+
14
+ const seriesHighlight$ = highlightObservable({
15
+ datumList$: observer.computedData$,
16
+ fullChartParams$: observer.fullChartParams$,
17
+ event$: subject.event$
18
+ }).pipe(
19
+ shareReplay(1)
20
+ )
21
+
22
+ const SeriesDataMap$ = seriesDataMapObservable({
23
+ datumList$: observer.computedData$
24
+ }).pipe(
25
+ shareReplay(1)
26
+ )
27
+
28
+ return {
29
+ fullParams$: observer.fullParams$,
30
+ fullChartParams$: observer.fullChartParams$,
31
+ fullDataFormatter$: observer.fullDataFormatter$,
32
+ computedData$: observer.computedData$,
33
+ layout$: observer.layout$,
34
+ textSizePx$,
35
+ seriesHighlight$,
36
+ SeriesDataMap$
37
+ }
38
+ }
@@ -1,24 +1,24 @@
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
- ChartParams,
14
- ComputedDatumSeries,
15
- ComputedDataTypeMap } from '../types'
16
- import { highlightObservable } from '../utils/observables'
17
-
18
- // export const seriesHighlightObservable = ({ computedData$, fullChartParams$, event$ }: {
19
- // computedData$: Observable<ComputedDataTypeMap<'series'>>
20
- // fullChartParams$: Observable<ChartParams>
21
- // event$: Subject<any>
22
- // }): Observable<string[]> => {
23
- // return highlightObservable ({ datumList$: computedData$, fullChartParams$, event$ })
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
+ ChartParams,
14
+ ComputedDatumSeries,
15
+ ComputedDataTypeMap } from '../types'
16
+ import { highlightObservable } from '../utils/observables'
17
+
18
+ // export const seriesHighlightObservable = ({ computedData$, fullChartParams$, event$ }: {
19
+ // computedData$: Observable<ComputedDataTypeMap<'series'>>
20
+ // fullChartParams$: Observable<ChartParams>
21
+ // event$: Subject<any>
22
+ // }): Observable<string[]> => {
23
+ // return highlightObservable ({ datumList$: computedData$, fullChartParams$, event$ })
24
24
  // }