@orbcharts/core 3.0.0-alpha.32 → 3.0.0-alpha.34

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,18 +1,23 @@
1
1
  import { Observable } from 'rxjs';
2
- import { ComputedDataTypeMap, DataFormatterTypeMap, DataFormatterGrid, Layout, TransformData } from '../types';
2
+ import { ChartParams, ComputedDataTypeMap, DataFormatterTypeMap, DataFormatterGrid, ContainerPosition, Layout, TransformData } from '../types';
3
3
 
4
4
  export declare const gridAxesTransformObservable: ({ fullDataFormatter$, layout$ }: {
5
5
  fullDataFormatter$: Observable<DataFormatterTypeMap<"grid">>;
6
6
  layout$: Observable<Layout>;
7
7
  }) => Observable<TransformData>;
8
+ export declare const gridAxesReverseTransformObservable: ({ gridAxesTransform$ }: {
9
+ gridAxesTransform$: Observable<TransformData>;
10
+ }) => Observable<TransformData>;
8
11
  export declare const gridGraphicTransformObservable: ({ computedData$, fullDataFormatter$, layout$ }: {
9
12
  computedData$: Observable<ComputedDataTypeMap<"grid">>;
10
13
  fullDataFormatter$: Observable<DataFormatterTypeMap<"grid">>;
11
14
  layout$: Observable<Layout>;
12
15
  }) => Observable<TransformData>;
13
- export declare const gridAxesOppositeTransformObservable: ({ gridAxesTransform$ }: {
16
+ export declare const gridGraphicReverseScaleObservable: ({ gridContainer$, gridAxesTransform$, gridGraphicTransform$ }: {
17
+ gridContainer$: Observable<ContainerPosition[]>;
14
18
  gridAxesTransform$: Observable<TransformData>;
15
- }) => Observable<TransformData>;
19
+ gridGraphicTransform$: Observable<TransformData>;
20
+ }) => Observable<[number, number][]>;
16
21
  export declare const gridAxesSizeObservable: ({ fullDataFormatter$, layout$ }: {
17
22
  fullDataFormatter$: Observable<DataFormatterGrid>;
18
23
  layout$: Observable<Layout>;
@@ -20,6 +25,25 @@ export declare const gridAxesSizeObservable: ({ fullDataFormatter$, layout$ }: {
20
25
  width: number;
21
26
  height: number;
22
27
  }>;
28
+ export declare const existedSeriesLabelsObservable: ({ computedData$ }: {
29
+ computedData$: Observable<ComputedDataTypeMap<"grid">>;
30
+ }) => Observable<string[]>;
23
31
  export declare const gridVisibleComputedDataObservable: ({ computedData$ }: {
24
32
  computedData$: Observable<ComputedDataTypeMap<"grid">>;
25
33
  }) => Observable<import('../types').ComputedDatumGrid[][]>;
34
+ export declare const isSeriesPositionSeprateObservable: ({ computedData$, fullDataFormatter$ }: {
35
+ computedData$: Observable<ComputedDataTypeMap<"grid">>;
36
+ fullDataFormatter$: Observable<DataFormatterTypeMap<"grid">>;
37
+ }) => Observable<boolean>;
38
+ export declare const gridContainerObservable: ({ computedData$, fullDataFormatter$, fullChartParams$, layout$ }: {
39
+ computedData$: Observable<ComputedDataTypeMap<"grid">>;
40
+ fullDataFormatter$: Observable<DataFormatterTypeMap<"grid">>;
41
+ fullChartParams$: Observable<ChartParams>;
42
+ layout$: Observable<Layout>;
43
+ }) => Observable<{
44
+ slotIndex: number;
45
+ rowIndex: number;
46
+ columnIndex: number;
47
+ translate: [number, number];
48
+ scale: [number, number];
49
+ }[]>;
@@ -1,5 +1,5 @@
1
1
  import { Subject, Observable } from 'rxjs';
2
- import { ChartParams, ComputedDataTypeMap, DataFormatterTypeMap, EventMultiGrid, Layout, TransformData } from '../types';
2
+ import { ChartParams, ComputedDataTypeMap, DataFormatterTypeMap, EventMultiGrid, Layout, ContextObserverGridDetail } from '../types';
3
3
 
4
4
  export declare const multiGridEachDetailObservable: ({ fullDataFormatter$, computedData$, layout$, fullChartParams$, event$ }: {
5
5
  fullDataFormatter$: Observable<DataFormatterTypeMap<"multiGrid">>;
@@ -7,19 +7,7 @@ export declare const multiGridEachDetailObservable: ({ fullDataFormatter$, compu
7
7
  layout$: Observable<Layout>;
8
8
  fullChartParams$: Observable<ChartParams>;
9
9
  event$: Subject<EventMultiGrid>;
10
- }) => Observable<{
11
- gridAxesTransform$: Observable<TransformData>;
12
- gridGraphicTransform$: Observable<TransformData>;
13
- gridAxesOppositeTransform$: Observable<TransformData>;
14
- gridAxesSize$: Observable<{
15
- width: number;
16
- height: number;
17
- }>;
18
- gridHighlight$: Observable<string[]>;
19
- SeriesDataMap$: Observable<Map<string, import('../types').ComputedDatumGrid[]>>;
20
- GroupDataMap$: Observable<Map<string, import('../types').ComputedDatumGrid[]>>;
21
- visibleComputedData$: Observable<import('../types').ComputedDatumGrid[][]>;
22
- }[]>;
10
+ }) => Observable<ContextObserverGridDetail[]>;
23
11
  export declare const multiGridContainerObservable: ({ computedData$, fullDataFormatter$, fullChartParams$, layout$ }: {
24
12
  computedData$: Observable<ComputedDataTypeMap<"multiGrid">>;
25
13
  fullDataFormatter$: Observable<DataFormatterTypeMap<"multiGrid">>;
@@ -31,4 +19,4 @@ export declare const multiGridContainerObservable: ({ computedData$, fullDataFor
31
19
  columnIndex: number;
32
20
  translate: [number, number];
33
21
  scale: [number, number];
34
- }[]>;
22
+ }[][]>;
@@ -3,16 +3,29 @@ import { ContextObserverBase } from './ContextObserver';
3
3
  import { ComputedDataGrid, ComputedDatumGrid } from './ComputedDataGrid';
4
4
  import { TransformData } from './TransformData';
5
5
 
6
- export interface ContextObserverGrid<PluginParams> extends ContextObserverBase<'grid', PluginParams> {
6
+ export interface ContextObserverGrid<PluginParams> extends ContextObserverBase<'grid', PluginParams>, ContextObserverGridDetail {
7
+ }
8
+ export interface ContextObserverGridDetail {
9
+ gridContainer$: Observable<ContainerPosition[]>;
7
10
  gridAxesTransform$: Observable<TransformData>;
11
+ gridAxesReverseTransform$: Observable<TransformData>;
8
12
  gridGraphicTransform$: Observable<TransformData>;
9
- gridAxesOppositeTransform$: Observable<TransformData>;
13
+ gridGraphicReverseScale$: Observable<[number, number][]>;
10
14
  gridAxesSize$: Observable<{
11
15
  width: number;
12
16
  height: number;
13
17
  }>;
14
18
  gridHighlight$: Observable<string[]>;
19
+ existedSeriesLabels$: Observable<string[]>;
15
20
  SeriesDataMap$: Observable<Map<string, ComputedDatumGrid[]>>;
16
21
  GroupDataMap$: Observable<Map<string, ComputedDatumGrid[]>>;
17
22
  visibleComputedData$: Observable<ComputedDataGrid>;
23
+ isSeriesPositionSeprate$: Observable<boolean>;
24
+ }
25
+ export interface ContainerPosition {
26
+ slotIndex: number;
27
+ rowIndex: number;
28
+ columnIndex: number;
29
+ translate: [number, number];
30
+ scale: [number, number];
18
31
  }
@@ -1,29 +1,8 @@
1
1
  import { Observable } from 'rxjs';
2
2
  import { ContextObserverBase } from './ContextObserver';
3
- import { ComputedDataGrid, ComputedDatumGrid } from './ComputedDataGrid';
4
- import { TransformData } from './TransformData';
3
+ import { ContainerPosition, ContextObserverGridDetail } from './ContextObserverGrid';
5
4
 
6
5
  export interface ContextObserverMultiGrid<PluginParams> extends ContextObserverBase<'multiGrid', PluginParams> {
7
- multiGridEachDetail$: Observable<MultiGridObservableAll[]>;
8
- multiGridContainer$: Observable<GridContainerBox[]>;
9
- }
10
- export interface MultiGridObservableAll {
11
- gridAxesTransform$: Observable<TransformData>;
12
- gridGraphicTransform$: Observable<TransformData>;
13
- gridAxesOppositeTransform$: Observable<TransformData>;
14
- gridAxesSize$: Observable<{
15
- width: number;
16
- height: number;
17
- }>;
18
- gridHighlight$: Observable<string[]>;
19
- SeriesDataMap$: Observable<Map<string, ComputedDatumGrid[]>>;
20
- GroupDataMap$: Observable<Map<string, ComputedDatumGrid[]>>;
21
- visibleComputedData$: Observable<ComputedDataGrid>;
22
- }
23
- export interface GridContainerBox {
24
- slotIndex: number;
25
- rowIndex: number;
26
- columnIndex: number;
27
- translate: [number, number];
28
- scale: [number, number];
6
+ multiGridEachDetail$: Observable<ContextObserverGridDetail[]>;
7
+ multiGridContainer$: Observable<ContainerPosition[][]>;
29
8
  }
@@ -1,19 +1,37 @@
1
1
  import { DataFormatterBase, DataFormatterBasePartial, DataFormatterValueAxis, DataFormatterGroupAxis, VisibleFilter } from './DataFormatter';
2
2
 
3
- export type SeriesType = 'row' | 'column';
3
+ export type SeriesDirection = 'row' | 'column';
4
4
  export interface DataFormatterGrid extends DataFormatterBase<'grid'> {
5
- visibleFilter: VisibleFilter<'grid'>;
6
5
  grid: DataFormatterGridGrid;
6
+ container: DataFormatterGridContainer;
7
+ }
8
+ export interface DataFormatterGridPartial extends DataFormatterBasePartial<'grid'> {
9
+ grid?: DataFormatterGridGridPartial;
10
+ container?: Partial<DataFormatterGridContainer>;
11
+ }
12
+ export interface DataFormatterGridGrid {
13
+ visibleFilter: VisibleFilter<'grid'>;
14
+ gridData: DataFormatterGridGridData;
7
15
  valueAxis: DataFormatterValueAxis;
8
16
  groupAxis: DataFormatterGroupAxis;
17
+ slotIndex: number | null;
18
+ seriesSlotIndexes: number[] | null;
9
19
  }
10
- export interface DataFormatterGridPartial extends DataFormatterBasePartial<'grid'> {
11
- grid?: Partial<DataFormatterGridGrid>;
20
+ export interface DataFormatterGridGridPartial {
21
+ visibleFilter?: VisibleFilter<'grid'>;
22
+ gridData?: Partial<DataFormatterGridGridData>;
12
23
  valueAxis?: Partial<DataFormatterValueAxis>;
13
24
  groupAxis?: Partial<DataFormatterGroupAxis>;
25
+ slotIndex?: number | null;
26
+ seriesSlotIndexes?: number[] | null;
14
27
  }
15
- export interface DataFormatterGridGrid {
28
+ export interface DataFormatterGridContainer {
29
+ gap: number;
30
+ rowAmount: number;
31
+ columnAmount: number;
32
+ }
33
+ export interface DataFormatterGridGridData {
34
+ seriesDirection: SeriesDirection;
16
35
  rowLabels: string[];
17
36
  columnLabels: string[];
18
- seriesType: SeriesType;
19
37
  }
@@ -1,19 +1,19 @@
1
1
  import { VisibleFilter, DataFormatterBase, DataFormatterBasePartial } from './DataFormatter';
2
- import { DataFormatterGrid } from './DataFormatterGrid';
2
+ import { DataFormatterGridGrid, DataFormatterGridGridPartial, DataFormatterGridContainer } from './DataFormatterGrid';
3
3
 
4
4
  export interface DataFormatterMultiGrid extends DataFormatterBase<'multiGrid'> {
5
5
  visibleFilter: VisibleFilter<'multiGrid'>;
6
- multiGrid: Array<DataFormatterMultiGridMultiGrid>;
6
+ gridList: Array<DataFormatterGridGrid>;
7
7
  container: DataFormatterMultiGridContainer;
8
8
  }
9
9
  export interface DataFormatterMultiGridPartial extends DataFormatterBasePartial<'multiGrid'> {
10
- multiGrid?: Array<Partial<DataFormatterMultiGridMultiGrid>>;
10
+ visibleFilter?: VisibleFilter<'multiGrid'>;
11
+ gridList?: Array<DataFormatterGridGridPartial>;
12
+ container?: Partial<DataFormatterMultiGridContainer>;
11
13
  }
12
- export interface DataFormatterMultiGridMultiGrid extends DataFormatterGrid {
13
- slotIndex: number;
14
+ export interface DataFormatterMultiGridGrid extends DataFormatterGridGrid {
14
15
  }
15
- export interface DataFormatterMultiGridContainer {
16
- gap: number;
17
- rowAmount: number;
18
- columnAmount: number;
16
+ export interface DataFormatterMultiGridGridPartial extends DataFormatterGridGridPartial {
17
+ }
18
+ export interface DataFormatterMultiGridContainer extends DataFormatterGridContainer {
19
19
  }
@@ -1,4 +1,4 @@
1
- export declare function isObject(variable: any): boolean;
1
+ export declare function isPlainObject(variable: any): boolean;
2
2
  export declare function isFunction(fn: any): boolean;
3
3
  export declare function mergeOptionsWithDefault<Options extends {
4
4
  [key: string]: any;
@@ -5,7 +5,8 @@ import { DataSeries } from '../types/DataSeries';
5
5
  import { DataGrid, DataGridDatum } from '../types/DataGrid';
6
6
  import { DataMultiGrid } from '../types/DataMultiGrid';
7
7
  import { DataMultiValue } from '../types/DataMultiValue';
8
- import { SeriesType, DataFormatterGrid } from '../types/DataFormatterGrid';
8
+ import { SeriesDirection, DataFormatterGrid, DataFormatterGridContainer } from '../types/DataFormatterGrid';
9
+ import { Layout } from '../types/Layout';
9
10
  import * as d3 from 'd3';
10
11
  export declare function formatValueToLabel(value: any, valueFormatter: string | ((text: d3.NumberValue) => string)): string;
11
12
  export declare function createDefaultDatumId(chartTypeOrPrefix: string, levelOneIndex: number, levelTwoIndex: number, levelThreeIndex?: number): string;
@@ -29,5 +30,9 @@ export declare function getMinAndMaxSeries(data: DataSeries): [number, number];
29
30
  export declare function getMinAndMaxGrid(data: DataGrid): [number, number];
30
31
  export declare function getMinAndMaxMultiGrid(data: DataMultiGrid): [number, number];
31
32
  export declare function getMinAndMaxMultiValue(data: DataMultiValue, valueIndex?: number): [number, number];
32
- export declare function transposeData<T>(seriesType: SeriesType, data: T[][]): T[][];
33
+ export declare function transposeData<T>(seriesDirection: SeriesDirection, data: T[][]): T[][];
33
34
  export declare function seriesColorPredicate(seriesIndex: number, chartParams: ChartParams): string;
35
+ export declare function calcGridContainerPosition(layout: Layout, container: DataFormatterGridContainer, rowIndex: number, columnIndex: number): {
36
+ translate: [number, number];
37
+ scale: [number, number];
38
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orbcharts/core",
3
- "version": "3.0.0-alpha.32",
3
+ "version": "3.0.0-alpha.34",
4
4
  "description": "OrbCharts is an open source chart library based on d3.js and rx.js",
5
5
  "author": "Blue Planet Inc.",
6
6
  "license": "Apache-2.0",
@@ -84,6 +84,18 @@ function resizeObservable(elem: HTMLElement | Element): Observable<DOMRectReadOn
84
84
  })
85
85
  }
86
86
 
87
+ function mergeDataFormatter <T>(dataFormatter: any, defaultDataFormatter: T, chartType: ChartType): T {
88
+ const mergedData = mergeOptionsWithDefault(dataFormatter, defaultDataFormatter)
89
+
90
+ if (chartType === 'multiGrid' && (dataFormatter as DataFormatterPartialTypeMap<'multiGrid'>).gridList != null) {
91
+ // multiGrid欄位為陣列,需要各別來merge預設值
92
+ (mergedData as DataFormatterTypeMap<'multiGrid'>).gridList = (dataFormatter as DataFormatterPartialTypeMap<'multiGrid'>).gridList.map(d => {
93
+ return mergeOptionsWithDefault(d, (defaultDataFormatter as DataFormatterTypeMap<'multiGrid'>).gridList[0])
94
+ })
95
+ }
96
+ return mergedData
97
+ }
98
+
87
99
  export const createBaseChart: CreateBaseChart = <T extends ChartType>({ defaultDataFormatter, computedDataFn, contextObserverFn }: {
88
100
  defaultDataFormatter: DataFormatterTypeMap<T>
89
101
  computedDataFn: ComputedDataFn<T>
@@ -127,12 +139,14 @@ export const createBaseChart: CreateBaseChart = <T extends ChartType>({ defaultD
127
139
  const mergedPresetWithDefault: Preset<T> = ((options) => {
128
140
  const _options = options ? options : CHART_OPTIONS_DEFAULT as ChartOptionsPartial<T>
129
141
  const preset = _options.preset ? _options.preset : {} as PresetPartial<T>
142
+
130
143
  return {
131
144
  chartParams: preset.chartParams
132
145
  ? mergeOptionsWithDefault(preset.chartParams, CHART_PARAMS_DEFAULT)
133
146
  : CHART_PARAMS_DEFAULT,
134
147
  dataFormatter: preset.dataFormatter
135
- ? mergeOptionsWithDefault(preset.dataFormatter, defaultDataFormatter)
148
+ // ? mergeOptionsWithDefault(preset.dataFormatter, defaultDataFormatter)
149
+ ? mergeDataFormatter(preset.dataFormatter, defaultDataFormatter, chartType)
136
150
  : defaultDataFormatter,
137
151
  allPluginParams: preset.allPluginParams
138
152
  ? preset.allPluginParams
@@ -147,15 +161,16 @@ export const createBaseChart: CreateBaseChart = <T extends ChartType>({ defaultD
147
161
  takeUntil(destroy$),
148
162
  startWith({}),
149
163
  map((dataFormatter) => {
150
- const mergedData = mergeOptionsWithDefault(dataFormatter, mergedPresetWithDefault.dataFormatter)
164
+ // const mergedData = mergeOptionsWithDefault(dataFormatter, mergedPresetWithDefault.dataFormatter)
151
165
 
152
- if (chartType === 'multiGrid' && (dataFormatter as DataFormatterPartialTypeMap<'multiGrid'>).multiGrid != null) {
153
- // multiGrid欄位為陣列,需要各別來merge預設值
154
- (mergedData as DataFormatterTypeMap<'multiGrid'>).multiGrid = (dataFormatter as DataFormatterPartialTypeMap<'multiGrid'>).multiGrid.map(d => {
155
- return mergeOptionsWithDefault(d, (mergedPresetWithDefault.dataFormatter as DataFormatterTypeMap<'multiGrid'>).multiGrid[0])
156
- })
157
- }
158
- return mergedData
166
+ // if (chartType === 'multiGrid' && (dataFormatter as DataFormatterPartialTypeMap<'multiGrid'>).gridList != null) {
167
+ // // multiGrid欄位為陣列,需要各別來merge預設值
168
+ // (mergedData as DataFormatterTypeMap<'multiGrid'>).gridList = (dataFormatter as DataFormatterPartialTypeMap<'multiGrid'>).gridList.map(d => {
169
+ // return mergeOptionsWithDefault(d, (mergedPresetWithDefault.dataFormatter as DataFormatterTypeMap<'multiGrid'>).gridList[0])
170
+ // })
171
+ // }
172
+ // return mergedData
173
+ return mergeDataFormatter(dataFormatter, mergedPresetWithDefault.dataFormatter, chartType)
159
174
  }),
160
175
  shareReplay(1)
161
176
  )
package/src/defaults.ts CHANGED
@@ -9,8 +9,8 @@ import type { DataTree } from './types/DataTree'
9
9
  import type { DataRelationship } from './types/DataRelationship'
10
10
  import type { DataFormatterBase, DataFormatterValueAxis, DataFormatterGroupAxis } from './types/DataFormatter'
11
11
  import type { DataFormatterSeries } from './types/DataFormatterSeries'
12
- import type { DataFormatterGrid } from './types/DataFormatterGrid'
13
- import type { DataFormatterMultiGrid, DataFormatterMultiGridMultiGrid } from './types/DataFormatterMultiGrid'
12
+ import type { DataFormatterGrid, DataFormatterGridGrid } from './types/DataFormatterGrid'
13
+ import type { DataFormatterMultiGrid, DataFormatterMultiGridGrid } from './types/DataFormatterMultiGrid'
14
14
  import type { DataFormatterMultiValue } from './types/DataFormatterMultiValue'
15
15
  import type { DataFormatterTree } from './types/DataFormatterTree'
16
16
  import type { DataFormatterRelationship } from './types/DataFormatterRelationship'
@@ -34,7 +34,6 @@ export const CHART_OPTIONS_DEFAULT: ChartOptionsPartial<any> = {
34
34
  // }
35
35
 
36
36
  // export const COLORS_DEFAULT = ['#67B7DC', '#6794DC', '#6771DC', '#8067DC', '#A367DC', '#C767DC', '#DC67CE', '#DC67AB', '#DC6788', '#DC6967', '#DC8C67', '#DCAF67']
37
- // @Q@ 桃園儀表板
38
37
  // ['#ff7ab9', '#66dec8', '#84c8ff', '#30ad1b', '#f8c43e', '#fa5640', '#9d79d7', '#ea4f98']
39
38
 
40
39
  export const PADDING_DEFAULT: Padding = {
@@ -158,42 +157,55 @@ export const DATA_FORMATTER_SERIES_DEFAULT: DataFormatterSeries = {
158
157
  sort: null,
159
158
  }
160
159
 
161
- export const DATA_FORMATTER_GRID_DEFAULT: DataFormatterGrid = {
162
- // ...DATA_FORMATTER_WITH_VALUE,
163
- type: 'grid',
160
+ export const DATA_FORMATTER_GRID_GRID_DEFAULT: DataFormatterGridGrid = {
164
161
  visibleFilter: (datum, rowIndex, columnIndex, context) => true,
165
- grid: {
166
- // rowUnitLabel: '',
162
+ gridData: {
163
+ seriesDirection: 'row',
167
164
  rowLabels: [],
168
- // rowLabelFormat: label => label,
169
- // columnUnitLabel: '',
170
165
  columnLabels: [],
171
- // columnLabelFormat: label => label,
172
- seriesType: 'row'
173
166
  },
174
167
  valueAxis: { ...DATA_FORMATTER_VALUE_AXIS },
175
168
  groupAxis: { ...DATA_FORMATTER_GROUP_AXIS, },
169
+ slotIndex: 0,
170
+ seriesSlotIndexes: null
171
+ }
172
+
173
+ export const DATA_FORMATTER_GRID_DEFAULT: DataFormatterGrid = {
174
+ // ...DATA_FORMATTER_WITH_VALUE,
175
+ type: 'grid',
176
+ grid: {
177
+ ...DATA_FORMATTER_GRID_GRID_DEFAULT
178
+ },
179
+ container: {
180
+ gap: 120,
181
+ rowAmount: 1,
182
+ columnAmount: 1
183
+ }
176
184
  // visibleGroupRange: null,
177
185
  // colorsPredicate: (datum, rowIndex, columnIndex, { chartParams, dataFormatter }) => {
178
- // const seriesIndex = dataFormatter.grid.seriesType === 'row' ? rowIndex : columnIndex
186
+ // const seriesIndex = dataFormatter.grid.seriesDirection === 'row' ? rowIndex : columnIndex
179
187
  // return chartParams.colors[chartParams.colorScheme].series[seriesIndex]
180
188
  // },
181
189
  }
182
190
 
183
- export const DATA_FORMATTER_MULTI_GRID_MULTI_GRID_DEFAULT: DataFormatterMultiGridMultiGrid = {
184
- ...DATA_FORMATTER_GRID_DEFAULT,
185
- slotIndex: 0,
191
+ // export const DATA_FORMATTER_MULTI_GRID_MULTI_GRID_DEFAULT: DataFormatterMultiGridMultiGrid = {
192
+ // ...DATA_FORMATTER_GRID_DEFAULT,
193
+ // slotIndex: 0,
194
+ // seriesSlotIndexes: null
195
+ // }
196
+
197
+ export const DATA_FORMATTER_MULTI_GRID_GRID_DEFAULT: DataFormatterMultiGridGrid = {
198
+ ...DATA_FORMATTER_GRID_GRID_DEFAULT
186
199
  }
187
200
 
188
201
  export const DATA_FORMATTER_MULTI_GRID_DEFAULT: DataFormatterMultiGrid = {
189
202
  type: 'multiGrid',
190
203
  visibleFilter: (datum, rowIndex, columnIndex, context) => true,
191
- multiGrid: [
204
+ gridList: [
192
205
  {
193
- ...DATA_FORMATTER_MULTI_GRID_MULTI_GRID_DEFAULT
206
+ ...DATA_FORMATTER_MULTI_GRID_GRID_DEFAULT
194
207
  },
195
208
  ],
196
- // visibleGroupRange: null,
197
209
  container: {
198
210
  gap: 120,
199
211
  rowAmount: 1,
@@ -49,7 +49,7 @@ export const computeBaseGridData = (context: DataFormatterContext<'grid'>, chart
49
49
  return d.map((_d, _i) => {
50
50
 
51
51
  // const _color = dataFormatter.colorsPredicate(_d, i, _i, context)
52
- const _visible = dataFormatter.visibleFilter(_d, i, _i, context)
52
+ const _visible = dataFormatter.grid.visibleFilter(_d, i, _i, context)
53
53
 
54
54
  const datum: DataGridDatumTemp = _d == null
55
55
  ? {
@@ -85,21 +85,26 @@ export const computeBaseGridData = (context: DataFormatterContext<'grid'>, chart
85
85
  })
86
86
  })
87
87
 
88
- // 依seriesType轉置資料矩陣
89
- const transposedDataGrid = transposeData(dataFormatter.grid.seriesType, dataGrid)
88
+ // 依seriesDirection轉置資料矩陣
89
+ const transposedDataGrid = transposeData(dataFormatter.grid.gridData.seriesDirection, dataGrid)
90
90
 
91
91
  // -- groupScale --
92
- const groupAxisWidth = (dataFormatter.groupAxis.position === 'top' || dataFormatter.groupAxis.position === 'bottom')
93
- ? layout.width
94
- : layout.height
95
- const groupEndIndex = transposedDataGrid[0] ? transposedDataGrid[0].length - 1 : 0
96
- const groupScale: d3.ScaleLinear<number, number> = createAxisLinearScale({
97
- maxValue: groupEndIndex,
98
- minValue: 0,
99
- axisWidth: groupAxisWidth,
100
- scaleDomain: [0, groupEndIndex], // 不使用dataFormatter設定
101
- scaleRange: [0, 1] // 不使用dataFormatter設定
102
- })
92
+ const { groupScale } = (() => {
93
+ const groupAxisWidth = (dataFormatter.grid.groupAxis.position === 'top' || dataFormatter.grid.groupAxis.position === 'bottom')
94
+ ? layout.width
95
+ : layout.height
96
+ const groupEndIndex = transposedDataGrid[0] ? transposedDataGrid[0].length - 1 : 0
97
+ const groupScale: d3.ScaleLinear<number, number> = createAxisLinearScale({
98
+ maxValue: groupEndIndex,
99
+ minValue: 0,
100
+ axisWidth: groupAxisWidth,
101
+ scaleDomain: [0, groupEndIndex], // 不使用dataFormatter設定
102
+ scaleRange: [0, 1] // 不使用dataFormatter設定
103
+ })
104
+ return { groupScale }
105
+ })()
106
+
107
+
103
108
 
104
109
  // const seriesColors = chartParams.colors[chartParams.colorScheme].series
105
110
 
@@ -131,26 +136,76 @@ export const computeBaseGridData = (context: DataFormatterContext<'grid'>, chart
131
136
  // })
132
137
  // })
133
138
 
134
- // -- valueScale --
135
- const visibleData = transposedDataGrid.flat().filter(d => d._visible != false)
136
- const [minValue, maxValue] = getMinAndMaxValue(visibleData)
137
-
138
- const valueAxisWidth = (dataFormatter.valueAxis.position === 'left' || dataFormatter.valueAxis.position === 'right')
139
- ? layout.height
140
- : layout.width
141
-
142
139
  const seriesLabels = createGridSeriesLabels({ transposedDataGrid, dataFormatter, chartType, gridIndex })
143
140
  const groupLabels = createGridGroupLabels({ transposedDataGrid, dataFormatter, chartType, gridIndex })
144
141
 
145
- const valueScale: d3.ScaleLinear<number, number> = createAxisLinearScale({
146
- maxValue,
147
- minValue,
148
- axisWidth: valueAxisWidth,
149
- scaleDomain: [minValue, maxValue], // 不使用dataFormatter設定
150
- scaleRange: [0, 1] // 不使用dataFormatter設定
151
- })
142
+ // 每一個series的valueScale
143
+ const seriesValueScaleArr = (() => {
144
+ const valueAxisWidth = (dataFormatter.grid.valueAxis.position === 'left' || dataFormatter.grid.valueAxis.position === 'right')
145
+ ? layout.height
146
+ : layout.width
147
+
148
+ // // 每一個series的 [minValue, maxValue]
149
+ // const minAndMaxValueArr = (() => {
150
+ // // 有設定series定位,各別series計算各自的最大最小值
151
+ // if (dataFormatter.grid.seriesSlotIndexes
152
+ // && dataFormatter.grid.seriesSlotIndexes.length === transposedDataGrid.length
153
+ // ) {
154
+ // return transposedDataGrid
155
+ // .map(series => {
156
+ // const visibleData = series.filter(d => d._visible != false)
157
+ // return getMinAndMaxValue(visibleData)
158
+ // })
159
+ // } else {
160
+ // // 沒有設定series定位,全部資料一起計算最大值最小值
161
+ // const visibleData = transposedDataGrid.flat().filter(d => d._visible != false)
162
+ // const [minValue, maxValue] = getMinAndMaxValue(visibleData)
163
+ // return transposedDataGrid
164
+ // .map(series => {
165
+ // return [minValue, maxValue]
166
+ // })
167
+ // }
168
+ // })()
152
169
 
153
- const zeroY = valueScale(0)
170
+ const visibleData = transposedDataGrid.flat().filter(d => d._visible != false)
171
+ const [minValue, maxValue] = getMinAndMaxValue(visibleData)
172
+
173
+ return transposedDataGrid.map((seriesData, seriesIndex) => {
174
+ // const minValue = minAndMaxValueArr[seriesIndex][0]
175
+ // const maxValue = minAndMaxValueArr[seriesIndex][1]
176
+ const valueScale: d3.ScaleLinear<number, number> = createAxisLinearScale({
177
+ maxValue,
178
+ minValue,
179
+ axisWidth: valueAxisWidth,
180
+ scaleDomain: [minValue, maxValue], // 不使用dataFormatter設定
181
+ scaleRange: [0, 1] // 不使用dataFormatter設定
182
+ })
183
+ return valueScale
184
+ })
185
+ })()
186
+
187
+ // const { valueScale } = (() => {
188
+
189
+ // const visibleData = transposedDataGrid.flat().filter(d => d._visible != false)
190
+ // const [minValue, maxValue] = getMinAndMaxValue(visibleData)
191
+
192
+ // const valueAxisWidth = (dataFormatter.grid.valueAxis.position === 'left' || dataFormatter.grid.valueAxis.position === 'right')
193
+ // ? layout.height
194
+ // : layout.width
195
+
196
+ // const valueScale: d3.ScaleLinear<number, number> = createAxisLinearScale({
197
+ // maxValue,
198
+ // minValue,
199
+ // axisWidth: valueAxisWidth,
200
+ // scaleDomain: [minValue, maxValue], // 不使用dataFormatter設定
201
+ // scaleRange: [0, 1] // 不使用dataFormatter設定
202
+ // })
203
+ // return { valueScale }
204
+ // })()
205
+
206
+ const zeroYArr = transposedDataGrid.map((series, seriesIndex) => {
207
+ return seriesValueScaleArr[seriesIndex]!(0)
208
+ })
154
209
 
155
210
  let _index = 0
156
211
  computedDataGrid = transposedDataGrid.map((seriesData, seriesIndex) => {
@@ -159,7 +214,9 @@ export const computeBaseGridData = (context: DataFormatterContext<'grid'>, chart
159
214
  const defaultId = createDefaultDatumId(chartType, gridIndex, seriesIndex, groupIndex)
160
215
  // const visible = visibleFilter(groupDatum, seriesIndex, groupIndex, context)
161
216
  const groupLabel = groupLabels[groupIndex]
217
+ const valueScale = seriesValueScaleArr[seriesIndex]
162
218
  const axisY = valueScale(groupDatum.value ?? 0)
219
+ const zeroY = zeroYArr[seriesIndex]
163
220
 
164
221
  const computedDatum: ComputedDatumGrid = {
165
222
  id: groupDatum.id ? groupDatum.id : defaultId,