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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. package/dist/orbcharts-core.es.js +1905 -1896
  2. package/dist/orbcharts-core.umd.js +2 -2
  3. package/dist/src/defaults.d.ts +4 -3
  4. package/dist/src/grid/computeGridData.d.ts +4 -11
  5. package/dist/src/grid/gridObservables.d.ts +15 -18
  6. package/dist/src/multiGrid/multiGridObservables.d.ts +4 -11
  7. package/dist/src/series/seriesObservables.d.ts +26 -1
  8. package/dist/src/types/ComputedData.d.ts +1 -0
  9. package/dist/src/types/ComputedDataGrid.d.ts +0 -3
  10. package/dist/src/types/ComputedDataSeries.d.ts +1 -2
  11. package/dist/src/types/ContextObserverGrid.d.ts +11 -4
  12. package/dist/src/types/ContextObserverMultiGrid.d.ts +8 -3
  13. package/dist/src/types/ContextObserverSeries.d.ts +18 -0
  14. package/dist/src/types/DataFormatter.d.ts +8 -5
  15. package/dist/src/types/DataFormatterGrid.d.ts +13 -16
  16. package/dist/src/types/DataFormatterMultiGrid.d.ts +6 -3
  17. package/dist/src/types/DataFormatterMultiValue.d.ts +3 -0
  18. package/dist/src/types/DataFormatterRelationship.d.ts +3 -0
  19. package/dist/src/types/DataFormatterSeries.d.ts +11 -4
  20. package/dist/src/utils/orbchartsUtils.d.ts +14 -13
  21. package/package.json +1 -1
  22. package/src/base/createBaseChart.ts +10 -10
  23. package/src/defaults.ts +36 -64
  24. package/src/grid/computeGridData.ts +15 -86
  25. package/src/grid/createGridContextObserver.ts +33 -16
  26. package/src/grid/gridObservables.ts +157 -70
  27. package/src/multiGrid/computeMultiGridData.ts +77 -120
  28. package/src/multiGrid/createMultiGridContextObserver.ts +8 -8
  29. package/src/multiGrid/multiGridObservables.ts +236 -171
  30. package/src/multiValue/computeMultiValueData.ts +22 -15
  31. package/src/relationship/computeRelationshipData.ts +16 -4
  32. package/src/series/computeSeriesData.ts +51 -114
  33. package/src/series/createSeriesContextObserver.ts +59 -4
  34. package/src/series/seriesObservables.ts +162 -10
  35. package/src/tree/computeTreeData.ts +6 -3
  36. package/src/types/ComputedData.ts +1 -0
  37. package/src/types/ComputedDataGrid.ts +3 -3
  38. package/src/types/ComputedDataSeries.ts +2 -2
  39. package/src/types/ContextObserverGrid.ts +18 -10
  40. package/src/types/ContextObserverMultiGrid.ts +6 -18
  41. package/src/types/ContextObserverSeries.ts +21 -1
  42. package/src/types/DataFormatter.ts +11 -32
  43. package/src/types/DataFormatterGrid.ts +32 -20
  44. package/src/types/DataFormatterMultiGrid.ts +6 -4
  45. package/src/types/DataFormatterMultiValue.ts +3 -0
  46. package/src/types/DataFormatterRelationship.ts +3 -0
  47. package/src/types/DataFormatterSeries.ts +11 -21
  48. package/src/utils/d3Utils.ts +7 -7
  49. package/src/utils/orbchartsUtils.ts +128 -32
@@ -1,6 +1,7 @@
1
1
  import type { ChartType } from './Chart'
2
2
  import type { ChartParams } from './ChartParams'
3
3
  import type { DataTypeMap, DatumTypeMap } from './Data'
4
+ import type { ComputedDataTypeMap, ComputedDatumTypeMap } from './ComputedData'
4
5
  import type { DataFormatterSeries, DataFormatterSeriesPartial } from './DataFormatterSeries'
5
6
  import type { DataFormatterGrid, DataFormatterGridPartial } from './DataFormatterGrid'
6
7
  import type { DataFormatterMultiGrid, DataFormatterMultiGridPartial } from './DataFormatterMultiGrid'
@@ -8,28 +9,14 @@ import type { DataFormatterMultiValue, DataFormatterMultiValuePartial } from './
8
9
  import type { DataFormatterTree, DataFormatterTreePartial } from './DataFormatterTree'
9
10
  import type { DataFormatterRelationship, DataFormatterRelationshipPartial } from './DataFormatterRelationship'
10
11
  import type { AxisPosition } from './Axis'
11
- import type { Layout } from './Layout'
12
12
 
13
- // export type DataFormatter = DataFormatterSeries
14
- // | DataFormatterGrid
15
- // | DataFormatterMultiGrid
16
- // | DataFormatterMultiValue
17
- // | DataFormatterTree
18
- // | DataFormatterRelationship
19
-
20
- // export type DataFormatterPartial = DataFormatterSeriesPartial
21
- // | DataFormatterGridPartial
22
- // | DataFormatterMultiGridPartial
23
- // | DataFormatterMultiValuePartial
24
- // | DataFormatterTreePartial
25
- // | DataFormatterRelationshipPartial
26
13
 
27
14
  // dataFormatter計算當中會使用的資料
28
15
  export interface DataFormatterContext<T extends ChartType> {
29
16
  data: DataTypeMap<T>
30
17
  dataFormatter: DataFormatterTypeMap<T>
31
18
  chartParams: ChartParams
32
- layout: Layout
19
+ // layout: Layout
33
20
  }
34
21
 
35
22
 
@@ -58,21 +45,6 @@ export interface DataFormatterBase<T extends ChartType> {
58
45
 
59
46
  export type DataFormatterBasePartial<T extends ChartType> = Partial<DataFormatterBase<T>>
60
47
 
61
- // 有value
62
- // export interface DataFormatterValue {
63
- // valueFormat: ValueFormat
64
- // }
65
-
66
- // 有axis
67
- // export interface DataFormatterAxis {
68
- // // domainMinValue?: number
69
- // // domainMaxValue?: number
70
- // // domainMinRange?: number
71
- // // domainMaxRange?: number
72
- // valueDomain: [number | 'auto', number | 'auto']
73
- // valueRange: [number, number] // 0-1
74
- // }
75
-
76
48
  export interface DataFormatterValueAxis {
77
49
  position: AxisPosition
78
50
  scaleDomain: [number | 'auto', number | 'auto']
@@ -90,6 +62,13 @@ export interface DataFormatterGroupAxis {
90
62
 
91
63
  // export type ValueFormat = string | ((text: d3.NumberValue) => string)
92
64
 
93
- export type VisibleFilter<T extends ChartType> = (datum: DatumTypeMap<T>, rowIndex: number, columnIndex: number, context: DataFormatterContext<T>) => boolean | null
65
+ export type VisibleFilter<T extends ChartType> = (datum: ComputedDatumTypeMap<T>, context: DataFormatterContext<T>) => boolean | null
66
+
67
+ // export type TooltipContentFormat<T extends ChartType> = (datum: DatumTypeMap<T>, rowIndex: number, columnIndex: number, context: DataFormatterContext<T>) => string | null
68
+
69
+ export interface DataFormatterContainer {
70
+ gap: number
71
+ rowAmount: number
72
+ columnAmount: number
73
+ }
94
74
 
95
- export type TooltipContentFormat<T extends ChartType> = (datum: DatumTypeMap<T>, rowIndex: number, columnIndex: number, context: DataFormatterContext<T>) => string | null
@@ -1,37 +1,49 @@
1
- import type { DataGridDatum, DataGridValue } from './DataGrid'
2
- import type { DataFormatterBase, DataFormatterBasePartial, DataFormatterValueAxis, DataFormatterGroupAxis, VisibleFilter } from './DataFormatter'
3
- // import type { AxisPosition } from './Axis'
1
+ import type {
2
+ DataFormatterBase,
3
+ DataFormatterBasePartial,
4
+ DataFormatterValueAxis,
5
+ DataFormatterGroupAxis,
6
+ VisibleFilter,
7
+ DataFormatterContainer
8
+ } from './DataFormatter'
9
+
4
10
 
5
11
  export type SeriesDirection = 'row' | 'column' // default: 'row'
6
12
 
7
13
  export interface DataFormatterGrid extends DataFormatterBase<'grid'> {
14
+ visibleFilter: VisibleFilter<'grid'>
8
15
  grid: DataFormatterGridGrid
9
- container: DataFormatterGridContainer
10
- // visibleGroupRange: [number, number] | null
11
- // colorsPredicate: (datum: DataGridDatum | DataGridValue, rowIndex: number, columnIndex: number, context: DataFormatterContext<'grid'>) => string
16
+ container: DataFormatterContainer
12
17
  }
13
18
 
14
19
  export interface DataFormatterGridPartial extends DataFormatterBasePartial<'grid'> {
20
+ visibleFilter?: VisibleFilter<'grid'>
15
21
  grid?: DataFormatterGridGridPartial
16
- container?: Partial<DataFormatterGridContainer>
22
+ container?: Partial<DataFormatterContainer>
17
23
  }
18
24
 
19
25
  export interface DataFormatterGridGrid {
20
- visibleFilter: VisibleFilter<'grid'>
21
- gridData: DataFormatterGridGridData
26
+ // gridData: DataFormatterGridGridData
27
+ // slotIndex: number | null
28
+ // seriesSlotIndexes: number[] | null
29
+ seriesDirection: SeriesDirection
30
+ rowLabels: string[]
31
+ columnLabels: string[]
22
32
  valueAxis: DataFormatterValueAxis
23
33
  groupAxis: DataFormatterGroupAxis
24
- slotIndex: number | null
25
- seriesSlotIndexes: number[] | null
34
+ separateSeries: boolean
26
35
  }
27
36
 
28
37
  export interface DataFormatterGridGridPartial {
29
- visibleFilter?: VisibleFilter<'grid'>
30
- gridData?: Partial<DataFormatterGridGridData>
38
+ // gridData?: Partial<DataFormatterGridGridData>
39
+ // slotIndex?: number | null
40
+ // seriesSlotIndexes?: number[] | null
41
+ seriesDirection?: SeriesDirection
42
+ rowLabels?: string[]
43
+ columnLabels?: string[]
31
44
  valueAxis?: Partial<DataFormatterValueAxis>
32
45
  groupAxis?: Partial<DataFormatterGroupAxis>
33
- slotIndex?: number | null
34
- seriesSlotIndexes?: number[] | null
46
+ separateSeries?: boolean
35
47
  }
36
48
 
37
49
  export interface DataFormatterGridContainer {
@@ -41,11 +53,11 @@ export interface DataFormatterGridContainer {
41
53
  }
42
54
 
43
55
  // grid欄位
44
- export interface DataFormatterGridGridData {
45
- seriesDirection: SeriesDirection
46
- rowLabels: string[]
47
- columnLabels: string[]
48
- }
56
+ // export interface DataFormatterGridGridData {
57
+ // seriesDirection: SeriesDirection
58
+ // rowLabels: string[]
59
+ // columnLabels: string[]
60
+ // }
49
61
 
50
62
  // const test: DataFormatterGridPartial = {
51
63
  // type: 'grid',
@@ -1,5 +1,5 @@
1
- import type { VisibleFilter } from './DataFormatter'
2
- import type { DataFormatterGridGrid, DataFormatterGridGridPartial, DataFormatterGridContainer } from './DataFormatterGrid'
1
+ import type { VisibleFilter, DataFormatterContainer } from './DataFormatter'
2
+ import type { DataFormatterGridGrid, DataFormatterGridGridPartial } from './DataFormatterGrid'
3
3
  import type {
4
4
  DataFormatterBase,
5
5
  DataFormatterBasePartial,
@@ -9,15 +9,17 @@ import type {
9
9
  import type { AxisPosition } from './Axis'
10
10
 
11
11
  export interface DataFormatterMultiGrid extends DataFormatterBase<'multiGrid'> {
12
- // visibleFilter: VisibleFilter<'multiGrid'>
12
+ visibleFilter: VisibleFilter<'multiGrid'>
13
13
  gridList: Array<DataFormatterGridGrid>
14
14
  container: DataFormatterMultiGridContainer
15
+ separateGrid: boolean
15
16
  }
16
17
 
17
18
  export interface DataFormatterMultiGridPartial extends DataFormatterBasePartial<'multiGrid'> {
18
19
  // visibleFilter?: VisibleFilter<'multiGrid'>
19
20
  gridList?: Array<DataFormatterGridGridPartial>
20
21
  container?: Partial<DataFormatterMultiGridContainer>
22
+ separateGrid?: boolean
21
23
  }
22
24
 
23
25
  export interface DataFormatterMultiGridGrid extends DataFormatterGridGrid {
@@ -29,7 +31,7 @@ export interface DataFormatterMultiGridGridPartial extends DataFormatterGridGrid
29
31
  }
30
32
 
31
33
  // container
32
- export interface DataFormatterMultiGridContainer extends DataFormatterGridContainer {
34
+ export interface DataFormatterMultiGridContainer extends DataFormatterContainer {
33
35
 
34
36
  }
35
37
 
@@ -4,12 +4,15 @@ import { DataFormatterBase, DataFormatterBasePartial, DataFormatterValueAxis, Vi
4
4
  export interface DataFormatterMultiValue extends DataFormatterBase<'multiValue'> {
5
5
  visibleFilter: VisibleFilter<'multiValue'>
6
6
  // labelFormat: (datum: unknown) => string
7
+ categoryLabels: string[]
7
8
  multiValue: Array<DataFormatterMultiValueMultiValue>
8
9
  xAxis: DataFormatterValueAxis
9
10
  yAxis: DataFormatterValueAxis
10
11
  }
11
12
 
12
13
  export interface DataFormatterMultiValuePartial extends DataFormatterBasePartial<'multiValue'> {
14
+ visibleFilter?: VisibleFilter<'multiValue'>
15
+ categoryLabels?: string[]
13
16
  multiValue?: Array<Partial<DataFormatterMultiValueMultiValue>>
14
17
  xAxis?: Partial<DataFormatterValueAxis>
15
18
  yAxis?: Partial<DataFormatterValueAxis>
@@ -3,11 +3,14 @@ import { DataFormatterBase, DataFormatterBasePartial, VisibleFilter } from './Da
3
3
 
4
4
  export interface DataFormatterRelationship extends DataFormatterBase<'relationship'> {
5
5
  visibleFilter: VisibleFilter<'relationship'>
6
+ categoryLabels: string[]
6
7
  // node: DataFormatterRelationshipNode
7
8
  // edge: DataFormatterRelationshipEdge
8
9
  }
9
10
 
10
11
  export interface DataFormatterRelationshipPartial extends DataFormatterBasePartial<'relationship'> {
12
+ visibleFilter?: VisibleFilter<'relationship'>
13
+ categoryLabels?: string[]
11
14
  // node: Partial<DataFormatterRelationshipNode>
12
15
  // edge: Partial<DataFormatterRelationshipEdge>
13
16
  }
@@ -1,30 +1,20 @@
1
- import { DataSeriesDatum, DataSeriesValue, DataSeries } from './DataSeries'
2
- import { DataFormatterBase, DataFormatterBasePartial, VisibleFilter } from './DataFormatter'
3
- // import { ComputedDatumSeries } from './ComputedDataSeries'
1
+ import type { ComputedDatumSeries } from './ComputedDataSeries'
2
+ import type { DataFormatterBase, DataFormatterBasePartial, VisibleFilter, DataFormatterContainer } from './DataFormatter'
4
3
 
5
4
  export interface DataFormatterSeries extends DataFormatterBase<'series'> {
6
5
  visibleFilter: VisibleFilter<'series'>
7
- // series: DataFormatterSeriesSeries
8
- // unitLabel: string
6
+ sort: ((a: ComputedDatumSeries, b: ComputedDatumSeries) => number) | null
9
7
  seriesLabels: string[]
10
- // labelFormat: (datum: DataSeriesDatum) => string
11
- // mapSeries: (datum: DataSeriesDatum | DataSeriesValue, rowIndex: number, columnIndex: number, context: DataFormatterContext<'series'>) => string
12
- // colorsPredicate: (datum: DataSeriesDatum | DataSeriesValue, rowIndex: number, columnIndex: number, context: DataFormatterContext<'series'>) => string
13
- sort: ((a: DataSeriesDatum | DataSeriesValue, b: DataSeriesDatum | number) => number) | null
14
- // colors: Colors
8
+ container: DataFormatterContainer
9
+ separateSeries: boolean
10
+ sumSeries: boolean
15
11
  }
16
12
 
17
13
  export interface DataFormatterSeriesPartial extends DataFormatterBasePartial<'series'> {
18
- // series: Partial<DataFormatterSeriesSeries>
19
- // unitLabel?: string
14
+ visibleFilter?: VisibleFilter<'series'>
15
+ sort?: ((a: ComputedDatumSeries, b: ComputedDatumSeries) => number) | null
20
16
  seriesLabels?: string[]
21
- // colorsPredicate?: (datum: DataSeriesDatum | DataSeriesValue, rowIndex: number, columnIndex: number, context: DataFormatterContext<'series'>) => string
22
- sort?: ((a: DataSeriesDatum | DataSeriesValue, b: DataSeriesDatum | number) => number) | null
17
+ container?: Partial<DataFormatterContainer>
18
+ separateSeries?: boolean
19
+ sumSeries?: boolean
23
20
  }
24
-
25
- // export interface DataFormatterSeriesSeries {
26
- // unitLabel: string
27
- // seriesLabels: string[]
28
- // // labelFormat: (datum: DataSeriesDatum) => string
29
- // sort: ((computedDatum: ComputedDatumSeries) => number) | null
30
- // }
@@ -1,13 +1,13 @@
1
1
  import * as d3 from 'd3'
2
- import { DATA_FORMATTER_VALUE_AXIS } from '../defaults'
2
+ import { DATA_FORMATTER_VALUE_AXIS_DEFAULT } from '../defaults'
3
3
 
4
4
  // scaleLinear - 連續資料對應到比較尺座標上
5
5
  export const createAxisLinearScale = ({
6
6
  maxValue = 1,
7
7
  minValue = 0,
8
8
  axisWidth,
9
- scaleDomain = DATA_FORMATTER_VALUE_AXIS.scaleDomain,
10
- scaleRange = DATA_FORMATTER_VALUE_AXIS.scaleRange,
9
+ scaleDomain = DATA_FORMATTER_VALUE_AXIS_DEFAULT.scaleDomain,
10
+ scaleRange = DATA_FORMATTER_VALUE_AXIS_DEFAULT.scaleRange,
11
11
  }: {
12
12
  maxValue: number
13
13
  minValue: number
@@ -16,10 +16,10 @@ export const createAxisLinearScale = ({
16
16
  scaleRange: [number, number] // 0-1
17
17
  }) => {
18
18
  // -- 無值補上預設值 --
19
- const domainMin: number | 'auto' = scaleDomain[0] ?? DATA_FORMATTER_VALUE_AXIS.scaleDomain[0]
20
- const domainMax: number | 'auto' = scaleDomain[1] ?? DATA_FORMATTER_VALUE_AXIS.scaleDomain[1]
21
- const rangeMin: number = scaleRange[0] ?? DATA_FORMATTER_VALUE_AXIS.scaleRange[0]
22
- const rangeMax: number = scaleRange[1] ?? DATA_FORMATTER_VALUE_AXIS.scaleRange[1]
19
+ const domainMin: number | 'auto' = scaleDomain[0] ?? DATA_FORMATTER_VALUE_AXIS_DEFAULT.scaleDomain[0]
20
+ const domainMax: number | 'auto' = scaleDomain[1] ?? DATA_FORMATTER_VALUE_AXIS_DEFAULT.scaleDomain[1]
21
+ const rangeMin: number = scaleRange[0] ?? DATA_FORMATTER_VALUE_AXIS_DEFAULT.scaleRange[0]
22
+ const rangeMax: number = scaleRange[1] ?? DATA_FORMATTER_VALUE_AXIS_DEFAULT.scaleRange[1]
23
23
 
24
24
  // -- 'auto'提換成實際值 --
25
25
  const domainMinValue = domainMin === 'auto' ? minValue : domainMin
@@ -6,12 +6,15 @@ import type { DataSeries, DataSeriesDatum, DataSeriesValue } from '../types/Data
6
6
  import type { DataGrid, DataGridDatum, DataGridValue } from '../types/DataGrid'
7
7
  import type { DataMultiGrid } from '../types/DataMultiGrid'
8
8
  import type { DataMultiValue, DataMultiValueDatum, DataMultiValueValue } from '../types/DataMultiValue'
9
- import type { SeriesDirection, DataFormatterGrid, DataFormatterGridContainer } from '../types/DataFormatterGrid'
9
+ import type { DataFormatterContainer } from '../types/DataFormatter'
10
+ import type { SeriesDirection, DataFormatterGrid, DataFormatterGridGrid } from '../types/DataFormatterGrid'
10
11
  import type { DataFormatterMultiGrid } from '../types/DataFormatterMultiGrid'
11
12
  import type { ComputedDatumSeriesValue } from '../types/ComputedData'
12
13
  import type { ComputedDatumSeries } from '../types/ComputedDataSeries'
13
14
  import type { ComputedDatumGrid, ComputedDataGrid } from '../types/ComputedDataGrid'
14
15
  import type { ComputedDataMultiGrid } from '../types/ComputedDataMultiGrid'
16
+ import type { SeriesContainerPosition } from '../types/ContextObserverSeries'
17
+ import type { GridContainerPosition } from '../types/ContextObserverGrid'
15
18
  import type { Layout } from '../types/Layout'
16
19
  // import type { ComputedDatumMultiGrid } from '../types/ComputedDataMultiGrid'
17
20
  import { isPlainObject } from './commonUtils'
@@ -39,14 +42,14 @@ export function createDefaultGroupLabel (chartTypeOrPrefix: string, groupIndex:
39
42
  return `${chartTypeOrPrefix}_group${groupIndex}`
40
43
  }
41
44
 
42
- export function createGridSeriesLabels ({ transposedDataGrid, dataFormatter, chartType = 'grid' }: {
45
+ export function createGridSeriesLabels ({ transposedDataGrid, dataFormatterGrid, chartType = 'grid' }: {
43
46
  transposedDataGrid: DataGridDatum[][],
44
- dataFormatter: DataFormatterGrid
47
+ dataFormatterGrid: DataFormatterGridGrid
45
48
  chartType?: ChartType
46
49
  }) {
47
- const labels = dataFormatter.grid.gridData.seriesDirection === 'row'
48
- ? dataFormatter.grid.gridData.rowLabels
49
- : dataFormatter.grid.gridData.columnLabels
50
+ const labels = dataFormatterGrid.seriesDirection === 'row'
51
+ ? dataFormatterGrid.rowLabels
52
+ : dataFormatterGrid.columnLabels
50
53
  return transposedDataGrid.map((_, rowIndex) => {
51
54
  return labels[rowIndex] != null
52
55
  ? labels[rowIndex]
@@ -54,15 +57,15 @@ export function createGridSeriesLabels ({ transposedDataGrid, dataFormatter, cha
54
57
  })
55
58
  }
56
59
 
57
- export function createMultiGridSeriesLabels ({ transposedDataGrid, dataFormatter, chartType = 'multiGrid', gridIndex = 0 }: {
60
+ export function createMultiGridSeriesLabels ({ transposedDataGrid, dataFormatterGrid, chartType = 'multiGrid', gridIndex = 0 }: {
58
61
  transposedDataGrid: DataGridDatum[][],
59
- dataFormatter: DataFormatterGrid
62
+ dataFormatterGrid: DataFormatterGridGrid
60
63
  chartType?: ChartType
61
64
  gridIndex?: number
62
65
  }) {
63
- const labels = dataFormatter.grid.gridData.seriesDirection === 'row'
64
- ? dataFormatter.grid.gridData.rowLabels
65
- : dataFormatter.grid.gridData.columnLabels
66
+ const labels = dataFormatterGrid.seriesDirection === 'row'
67
+ ? dataFormatterGrid.rowLabels
68
+ : dataFormatterGrid.columnLabels
66
69
  return transposedDataGrid.map((_, rowIndex) => {
67
70
  return labels[rowIndex] != null
68
71
  ? labels[rowIndex]
@@ -70,17 +73,17 @@ export function createMultiGridSeriesLabels ({ transposedDataGrid, dataFormatter
70
73
  })
71
74
  }
72
75
 
73
- export function createGridGroupLabels ({ transposedDataGrid, dataFormatter, chartType = 'grid' }: {
76
+ export function createGridGroupLabels ({ transposedDataGrid, dataFormatterGrid, chartType = 'grid' }: {
74
77
  transposedDataGrid: DataGridDatum[][],
75
- dataFormatter: DataFormatterGrid
78
+ dataFormatterGrid: DataFormatterGridGrid
76
79
  chartType?: ChartType
77
80
  }) {
78
81
  if (transposedDataGrid[0] == null) {
79
82
  return []
80
83
  }
81
- const labels = dataFormatter.grid.gridData.seriesDirection === 'row'
82
- ? dataFormatter.grid.gridData.columnLabels
83
- : dataFormatter.grid.gridData.rowLabels
84
+ const labels = dataFormatterGrid.seriesDirection === 'row'
85
+ ? dataFormatterGrid.columnLabels
86
+ : dataFormatterGrid.rowLabels
84
87
  return transposedDataGrid[0].map((_, columnLabels) => {
85
88
  return labels[columnLabels] != null
86
89
  ? labels[columnLabels]
@@ -88,18 +91,18 @@ export function createGridGroupLabels ({ transposedDataGrid, dataFormatter, char
88
91
  })
89
92
  }
90
93
 
91
- export function createMultiGridGroupLabels ({ transposedDataGrid, dataFormatter, chartType = 'multiGrid', gridIndex = 0 }: {
94
+ export function createMultiGridGroupLabels ({ transposedDataGrid, dataFormatterGrid, chartType = 'multiGrid', gridIndex = 0 }: {
92
95
  transposedDataGrid: DataGridDatum[][],
93
- dataFormatter: DataFormatterGrid
96
+ dataFormatterGrid: DataFormatterGridGrid
94
97
  chartType?: ChartType
95
98
  gridIndex?: number
96
99
  }) {
97
100
  if (transposedDataGrid[0] == null) {
98
101
  return []
99
102
  }
100
- const labels = dataFormatter.grid.gridData.seriesDirection === 'row'
101
- ? dataFormatter.grid.gridData.columnLabels
102
- : dataFormatter.grid.gridData.rowLabels
103
+ const labels = dataFormatterGrid.seriesDirection === 'row'
104
+ ? dataFormatterGrid.columnLabels
105
+ : dataFormatterGrid.rowLabels
103
106
  return transposedDataGrid[0].map((_, columnLabels) => {
104
107
  return labels[columnLabels] != null
105
108
  ? labels[columnLabels]
@@ -214,19 +217,112 @@ export function seriesColorPredicate (seriesIndex: number, chartParams: ChartPar
214
217
  ]
215
218
  }
216
219
 
217
- export function calcGridContainerPosition (layout: Layout, container: DataFormatterGridContainer, rowIndex: number, columnIndex: number) {
218
- const { gap, rowAmount, columnAmount } = container
219
- const width = (layout.width - (gap * (columnAmount - 1))) / columnAmount
220
- const height = (layout.height - (gap * (rowAmount - 1))) / rowAmount
221
- const x = columnIndex * width + (columnIndex * gap)
222
- const y = rowIndex * height + (rowIndex * gap)
223
- const translate: [number, number] = [x, y]
224
- const scale: [number, number] = [width / layout.width, height / layout.height]
220
+ // export function calcSeriesContainerPosition (layout: Layout, container: DataFormatterContainer, rowIndex: number, columnIndex: number) {
221
+ // const { gap, rowAmount, columnAmount } = container
222
+ // const width = (layout.width - (gap * (columnAmount - 1))) / columnAmount
223
+ // const height = (layout.height - (gap * (rowAmount - 1))) / rowAmount
224
+ // const x = columnIndex * width + (columnIndex * gap)
225
+ // const y = rowIndex * height + (rowIndex * gap)
226
+ // // const translate: [number, number] = [x, y]
227
+
228
+ // return {
229
+ // // translate,
230
+ // startX: x,
231
+ // startY: y,
232
+ // centerX: x + width / 2,
233
+ // centerY: y + height / 2,
234
+ // width,
235
+ // height
236
+ // }
237
+ // }
225
238
 
226
- return {
227
- translate,
228
- scale
239
+ // 計算預設欄列數量
240
+ // 規則1.rowAmount*columnAmount要大於或等於amount,並且數字要盡可能小
241
+ // 規則2.columnAmount要大於或等於rowAmount,並且數字要盡可能小
242
+ function calcGridDimensions (amount: number): { rowAmount: number; columnAmount: number } {
243
+ let rowAmount = Math.floor(Math.sqrt(amount))
244
+ let columnAmount = Math.ceil(amount / rowAmount)
245
+ while (rowAmount * columnAmount < amount) {
246
+ columnAmount++
229
247
  }
248
+ return { rowAmount, columnAmount }
249
+ }
250
+
251
+ export function calcSeriesContainerLayout (layout: Layout, container: DataFormatterContainer, amount: number): SeriesContainerPosition[] {
252
+ const { gap } = container
253
+ const { rowAmount, columnAmount } = (container.rowAmount * container.columnAmount) >= amount
254
+ // 如果container設定的rowAmount和columnAmount的乘積大於或等於amount,則使用目前設定
255
+ ? container
256
+ // 否則計算一個合適的預設值
257
+ : calcGridDimensions(amount)
258
+
259
+ return new Array(amount).fill(null).map((_, index) => {
260
+ const columnIndex = index % columnAmount
261
+ const rowIndex = Math.floor(index / columnAmount)
262
+
263
+ const width = (layout.width - (gap * (columnAmount - 1))) / columnAmount
264
+ const height = (layout.height - (gap * (rowAmount - 1))) / rowAmount
265
+ const x = columnIndex * width + (columnIndex * gap)
266
+ const y = rowIndex * height + (rowIndex * gap)
267
+ // const translate: [number, number] = [x, y]
268
+
269
+ return {
270
+ slotIndex: index,
271
+ rowIndex,
272
+ columnIndex,
273
+ // translate,
274
+ startX: x,
275
+ startY: y,
276
+ centerX: x + width / 2,
277
+ centerY: y + height / 2,
278
+ width,
279
+ height
280
+ }
281
+ })
282
+ }
283
+
284
+ // export function calcGridContainerPosition (layout: Layout, container: DataFormatterContainer, rowIndex: number, columnIndex: number) {
285
+ // const { gap, rowAmount, columnAmount } = container
286
+ // const width = (layout.width - (gap * (columnAmount - 1))) / columnAmount
287
+ // const height = (layout.height - (gap * (rowAmount - 1))) / rowAmount
288
+ // const x = columnIndex * width + (columnIndex * gap)
289
+ // const y = rowIndex * height + (rowIndex * gap)
290
+ // const translate: [number, number] = [x, y]
291
+ // const scale: [number, number] = [width / layout.width, height / layout.height]
292
+
293
+ // return {
294
+ // translate,
295
+ // scale
296
+ // }
297
+ // }
298
+
299
+ export function calcGridContainerLayout (layout: Layout, container: DataFormatterContainer, amount: number): GridContainerPosition[] {
300
+ const { gap } = container
301
+ const { rowAmount, columnAmount } = (container.rowAmount * container.columnAmount) >= amount
302
+ // 如果container設定的rowAmount和columnAmount的乘積大於或等於amount,則使用目前設定
303
+ ? container
304
+ // 否則計算一個合適的預設值
305
+ : calcGridDimensions(amount)
306
+
307
+ return new Array(amount).fill(null).map((_, index) => {
308
+ const columnIndex = index % columnAmount
309
+ const rowIndex = Math.floor(index / columnAmount)
310
+
311
+ const width = (layout.width - (gap * (columnAmount - 1))) / columnAmount
312
+ const height = (layout.height - (gap * (rowAmount - 1))) / rowAmount
313
+ const x = columnIndex * width + (columnIndex * gap)
314
+ const y = rowIndex * height + (rowIndex * gap)
315
+ const translate: [number, number] = [x, y]
316
+ const scale: [number, number] = [width / layout.width, height / layout.height]
317
+
318
+ return {
319
+ slotIndex: index,
320
+ rowIndex,
321
+ columnIndex,
322
+ translate,
323
+ scale
324
+ }
325
+ })
230
326
  }
231
327
 
232
328
  // // multiGrid datum color