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

Sign up to get free protection for your applications and to get access to all the features.
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,3 +1,3 @@
1
- import { createBasePlugin } from './base/createBasePlugin'
2
-
3
- export const defineGridPlugin = createBasePlugin<'grid'>()
1
+ import { createBasePlugin } from './base/createBasePlugin'
2
+
3
+ export const defineGridPlugin = createBasePlugin<'grid'>()
@@ -1,3 +1,3 @@
1
- import { createBasePlugin } from './base/createBasePlugin'
2
-
3
- export const defineMultiGridPlugin = createBasePlugin<'multiGrid'>()
1
+ import { createBasePlugin } from './base/createBasePlugin'
2
+
3
+ export const defineMultiGridPlugin = createBasePlugin<'multiGrid'>()
@@ -1,3 +1,3 @@
1
- import { createBasePlugin } from './base/createBasePlugin'
2
-
3
- export const defineMultiValuePlugin = createBasePlugin<'multiValue'>()
1
+ import { createBasePlugin } from './base/createBasePlugin'
2
+
3
+ export const defineMultiValuePlugin = createBasePlugin<'multiValue'>()
@@ -1,4 +1,4 @@
1
- import { createBasePlugin } from './base/createBasePlugin'
2
- import { ChartType } from './types/Chart'
3
-
4
- export const defineNoneDataPlugin = createBasePlugin<any>() // noneDataPlugin 可以使用在任何的 chartType
1
+ import { createBasePlugin } from './base/createBasePlugin'
2
+ import { ChartType } from './types/Chart'
3
+
4
+ export const defineNoneDataPlugin = createBasePlugin<any>() // noneDataPlugin 可以使用在任何的 chartType
@@ -1,3 +1,3 @@
1
- import { createBasePlugin } from './base/createBasePlugin'
2
-
3
- export const defineRelationshipPlugin = createBasePlugin<'relationship'>()
1
+ import { createBasePlugin } from './base/createBasePlugin'
2
+
3
+ export const defineRelationshipPlugin = createBasePlugin<'relationship'>()
@@ -1,3 +1,3 @@
1
- import { createBasePlugin } from './base/createBasePlugin'
2
-
3
- export const defineSeriesPlugin = createBasePlugin<'series'>()
1
+ import { createBasePlugin } from './base/createBasePlugin'
2
+
3
+ export const defineSeriesPlugin = createBasePlugin<'series'>()
@@ -1,3 +1,3 @@
1
- import { createBasePlugin } from './base/createBasePlugin'
2
-
3
- export const defineTreePlugin = createBasePlugin<'tree'>()
1
+ import { createBasePlugin } from './base/createBasePlugin'
2
+
3
+ export const defineTreePlugin = createBasePlugin<'tree'>()
@@ -1,205 +1,134 @@
1
- import * as d3 from 'd3'
2
- import type { ComputedDataFn } from '../types/ComputedData'
3
- import type { DataGrid, DataGridDatum } from '../types/DataGrid'
4
- import type { DataFormatterContext } from '../types/DataFormatter'
5
- import type { DataFormatterGrid } from '../types/DataFormatterGrid'
6
- import type { ComputedDataGrid, ComputedDatumGrid } from '../types/ComputedDataGrid'
7
- import type { Layout } from '../types/Layout'
8
- import { formatValueToLabel, createDefaultDatumId, createDefaultSeriesLabel, createDefaultGroupLabel } from '../utils/orbchartsUtils'
9
- import { createAxisLinearScale, createAxisPointScale } from '../utils/d3Utils'
10
- import { getMinAndMaxValue, transposeData, createGridSeriesLabels, createGridGroupLabels, seriesColorPredicate } from '../utils/orbchartsUtils'
11
-
12
- export interface DataGridDatumTemp extends DataGridDatum {
13
- // _color: string // 暫放的顏色資料
14
- _visible: boolean // 暫放的visible
15
- }
16
-
17
- export function createTransposedDataGrid (context: DataFormatterContext<'grid'>): DataGridDatumTemp[][] {
18
- const { data = [], dataFormatter, chartParams, layout } = context
19
- if (!data.length) {
20
- return []
21
- }
22
- try {
23
- // 最多的array length
24
- const maxArrayLength = data.reduce((prev, current) => {
25
- return current.length > prev ? current.length : prev
26
- }, 0)
27
-
28
- // 補齊短少資料
29
- const fullData = data.map((d, i) => {
30
- if (d.length === maxArrayLength) {
31
- return d
32
- }
33
- const newD = Object.assign([], d)
34
- for (let _i = newD.length; _i < maxArrayLength; _i++) {
35
- newD[_i] = null
36
- }
37
- return newD
38
- })
39
-
40
- // 完整的資料格式
41
- const dataGrid: DataGridDatumTemp[][] = fullData.map((d, i) => {
42
- return d.map((_d, _i) => {
43
-
44
- // const _color = dataFormatter.colorsPredicate(_d, i, _i, context)
45
- const _visible = dataFormatter.grid.visibleFilter(_d, i, _i, context)
46
-
47
- const datum: DataGridDatumTemp = _d == null
48
- ? {
49
- id: '',
50
- label: '',
51
- // tooltipContent: '',
52
- data: {},
53
- value: null,
54
- // _color,
55
- _visible
56
- }
57
- : typeof _d === 'number'
58
- ? {
59
- id: '',
60
- label: '',
61
- // tooltipContent: '',
62
- data: {},
63
- value: _d,
64
- // _color,
65
- _visible
66
- }
67
- : {
68
- id: _d.id ?? '',
69
- label: _d.label ?? '',
70
- // tooltipContent: _d.tooltipContent ?? '',
71
- data: _d.data ?? {},
72
- value: _d.value,
73
- // _color,
74
- _visible
75
- }
76
-
77
- return datum
78
- })
79
- })
80
-
81
- // 依seriesDirection轉置資料矩陣
82
- const transposedDataGrid = transposeData(dataFormatter.grid.gridData.seriesDirection, dataGrid)
83
-
84
- return transposedDataGrid
85
- } catch (e) {
86
- return []
87
- }
88
- }
89
-
90
- export function createGroupScale (transposedDataGrid: DataGridDatumTemp[][], dataFormatter: DataFormatterGrid, layout: Layout) {
91
- const groupAxisWidth = (dataFormatter.grid.groupAxis.position === 'top' || dataFormatter.grid.groupAxis.position === 'bottom')
92
- ? layout.width
93
- : layout.height
94
- const groupEndIndex = transposedDataGrid[0] ? transposedDataGrid[0].length - 1 : 0
95
- const groupScale: d3.ScaleLinear<number, number> = createAxisLinearScale({
96
- maxValue: groupEndIndex,
97
- minValue: 0,
98
- axisWidth: groupAxisWidth,
99
- scaleDomain: [0, groupEndIndex], // 不使用dataFormatter設定
100
- scaleRange: [0, 1] // 不使用dataFormatter設定
101
- })
102
- return groupScale
103
- }
104
-
105
- export function createSeriesValueScaleArr (transposedDataGrid: DataGridDatumTemp[][], dataFormatter: DataFormatterGrid, layout: Layout) {
106
- const valueAxisWidth = (dataFormatter.grid.valueAxis.position === 'left' || dataFormatter.grid.valueAxis.position === 'right')
107
- ? layout.height
108
- : layout.width
109
-
110
- const visibleData = transposedDataGrid.flat().filter(d => d._visible != false)
111
- const [minValue, maxValue] = getMinAndMaxValue(visibleData)
112
-
113
- return transposedDataGrid.map((seriesData, seriesIndex) => {
114
- const valueScale: d3.ScaleLinear<number, number> = createAxisLinearScale({
115
- maxValue,
116
- minValue,
117
- axisWidth: valueAxisWidth,
118
- scaleDomain: [minValue, maxValue], // 不使用dataFormatter設定
119
- scaleRange: [0, 1] // 不使用dataFormatter設定
120
- })
121
- return valueScale
122
- })
123
- }
124
-
125
- export const computeGridData: ComputedDataFn<'grid'> = (context) => {
126
- const { data = [], dataFormatter, chartParams, layout } = context
127
- if (!data.length) {
128
- return []
129
- }
130
-
131
- let computedDataGrid: ComputedDatumGrid[][]
132
-
133
- try {
134
-
135
- // 依seriesDirection轉置資料矩陣
136
- const transposedDataGrid = createTransposedDataGrid(context)
137
-
138
- const groupScale = createGroupScale(transposedDataGrid, dataFormatter, layout)
139
-
140
- const seriesLabels = createGridSeriesLabels({
141
- transposedDataGrid,
142
- dataFormatter,
143
- chartType: 'grid'
144
- })
145
- const groupLabels = createGridGroupLabels({
146
- transposedDataGrid,
147
- dataFormatter,
148
- chartType: 'grid'
149
- })
150
-
151
- // 每一個series的valueScale
152
- const seriesValueScaleArr = createSeriesValueScaleArr(transposedDataGrid, dataFormatter, layout)
153
-
154
- const zeroYArr = transposedDataGrid.map((series, seriesIndex) => {
155
- return seriesValueScaleArr[seriesIndex]!(0)
156
- })
157
-
158
- let _index = 0
159
- computedDataGrid = transposedDataGrid.map((seriesData, seriesIndex) => {
160
- return seriesData.map((groupDatum, groupIndex) => {
161
-
162
- const defaultId = createDefaultDatumId('grid', 0, seriesIndex, groupIndex)
163
- // const visible = visibleFilter(groupDatum, seriesIndex, groupIndex, context)
164
- const groupLabel = groupLabels[groupIndex]
165
- const valueScale = seriesValueScaleArr[seriesIndex]
166
- const axisY = valueScale(groupDatum.value ?? 0)
167
- const zeroY = zeroYArr[seriesIndex]
168
-
169
- const computedDatum: ComputedDatumGrid = {
170
- id: groupDatum.id ? groupDatum.id : defaultId,
171
- index: _index,
172
- label: groupDatum.label ? groupDatum.label : defaultId,
173
- description: groupDatum.description ?? '',
174
- // tooltipContent: groupDatum.tooltipContent ? groupDatum.tooltipContent : dataFormatter.tooltipContentFormat(groupDatum, seriesIndex, groupIndex, context),
175
- data: groupDatum.data,
176
- value: groupDatum.value,
177
- // valueLabel: formatValueToLabel(groupDatum.value, dataFormatter.valueFormat),
178
- gridIndex: 0,
179
- // accSeriesIndex: seriesIndex, // 預設為seriesIndex
180
- seriesIndex,
181
- seriesLabel: seriesLabels[seriesIndex],
182
- groupIndex,
183
- groupLabel,
184
- // color: groupDatum._color,
185
- color: seriesColorPredicate(seriesIndex, chartParams),
186
- axisX: groupScale(groupIndex),
187
- axisY,
188
- axisYFromZero: axisY - zeroY,
189
- // visible: groupDatum._visible == true && scaleDomainFilter(groupIndex) == true ? true : false // 兩者有一個false即為false
190
- visible: groupDatum._visible
191
- }
192
-
193
- _index ++
194
-
195
- return computedDatum
196
- })
197
- })
198
-
199
- } catch (e) {
200
- // console.error(e)
201
- throw Error(e)
202
- }
203
-
204
- return computedDataGrid
205
- }
1
+ import * as d3 from 'd3'
2
+ import type { ComputedDataFn } from '../types/ComputedData'
3
+ import type { DataGrid, DataGridDatum } from '../types/DataGrid'
4
+ import type { DataFormatterContext } from '../types/DataFormatter'
5
+ import type { DataFormatterGrid, DataFormatterGridGrid } from '../types/DataFormatterGrid'
6
+ import type { ComputedDataGrid, ComputedDatumGrid } from '../types/ComputedDataGrid'
7
+ import type { Layout } from '../types/Layout'
8
+ import { formatValueToLabel, createDefaultDatumId, createDefaultSeriesLabel, createDefaultGroupLabel } from '../utils/orbchartsUtils'
9
+ import { getMinAndMaxValue, transposeData, createGridSeriesLabels, createGridGroupLabels, seriesColorPredicate } from '../utils/orbchartsUtils'
10
+
11
+ // 統一 DataGrid 格式、並欄列資料轉置為一致方式
12
+ export function createTransposedDataGrid (data: DataGrid, dataFormatterGrid: DataFormatterGridGrid): DataGridDatum[][] {
13
+ // const { data = [], dataFormatter, chartParams } = context
14
+ if (!data.length) {
15
+ return []
16
+ }
17
+ try {
18
+ // 最多的array length
19
+ const maxArrayLength = data.reduce((prev, current) => {
20
+ return current.length > prev ? current.length : prev
21
+ }, 0)
22
+
23
+ // 補齊短少資料
24
+ const fullData = data.map((d, i) => {
25
+ if (d.length === maxArrayLength) {
26
+ return d
27
+ }
28
+ const newD = Object.assign([], d)
29
+ for (let _i = newD.length; _i < maxArrayLength; _i++) {
30
+ newD[_i] = null
31
+ }
32
+ return newD
33
+ })
34
+
35
+ // 完整的資料格式
36
+ const dataGrid: DataGridDatum[][] = fullData.map((d, i) => {
37
+ return d.map((_d, _i) => {
38
+
39
+ const datum: DataGridDatum = _d == null
40
+ ? {
41
+ id: '',
42
+ label: '',
43
+ data: {},
44
+ value: null,
45
+ }
46
+ : typeof _d === 'number'
47
+ ? {
48
+ id: '',
49
+ label: '',
50
+ data: {},
51
+ value: _d,
52
+ }
53
+ : {
54
+ id: _d.id ?? '',
55
+ label: _d.label ?? '',
56
+ data: _d.data ?? {},
57
+ value: _d.value,
58
+ }
59
+
60
+ return datum
61
+ })
62
+ })
63
+
64
+ // 依seriesDirection轉置資料矩陣
65
+ const transposedDataGrid = transposeData(dataFormatterGrid.seriesDirection, dataGrid)
66
+
67
+ return transposedDataGrid
68
+ } catch (e) {
69
+ return []
70
+ }
71
+ }
72
+
73
+ export const computeGridData: ComputedDataFn<'grid'> = (context) => {
74
+ const { data = [], dataFormatter, chartParams } = context
75
+ if (!data.length) {
76
+ return []
77
+ }
78
+
79
+ let computedDataGrid: ComputedDatumGrid[][]
80
+
81
+ try {
82
+
83
+ // 依seriesDirection轉置資料矩陣
84
+ const transposedDataGrid = createTransposedDataGrid(data, dataFormatter.grid)
85
+
86
+ const seriesLabels = createGridSeriesLabels({
87
+ transposedDataGrid,
88
+ dataFormatterGrid: dataFormatter.grid,
89
+ chartType: 'grid'
90
+ })
91
+ const groupLabels = createGridGroupLabels({
92
+ transposedDataGrid,
93
+ dataFormatterGrid: dataFormatter.grid,
94
+ chartType: 'grid'
95
+ })
96
+
97
+ let _index = 0
98
+ computedDataGrid = transposedDataGrid.map((seriesData, seriesIndex) => {
99
+ return seriesData.map((groupDatum, groupIndex) => {
100
+
101
+ const defaultId = createDefaultDatumId('grid', 0, seriesIndex, groupIndex)
102
+ const groupLabel = groupLabels[groupIndex]
103
+
104
+ const computedDatum: ComputedDatumGrid = {
105
+ id: groupDatum.id ? groupDatum.id : defaultId,
106
+ index: _index,
107
+ label: groupDatum.label ? groupDatum.label : defaultId,
108
+ description: groupDatum.description ?? '',
109
+ data: groupDatum.data,
110
+ value: groupDatum.value,
111
+ gridIndex: 0,
112
+ seriesIndex,
113
+ seriesLabel: seriesLabels[seriesIndex],
114
+ groupIndex,
115
+ groupLabel,
116
+ color: seriesColorPredicate(seriesIndex, chartParams),
117
+ visible: true // 先給一個預設值
118
+ }
119
+
120
+ // 先建立物件再計算visible欄位
121
+ computedDatum.visible = dataFormatter.visibleFilter(computedDatum, context)
122
+
123
+ _index ++
124
+
125
+ return computedDatum
126
+ })
127
+ })
128
+
129
+ } catch (e) {
130
+ throw Error(e)
131
+ }
132
+
133
+ return computedDataGrid
134
+ }