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

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,8 +3,17 @@ import { DataFormatterGrid } from './DataFormatterGrid';
3
3
 
4
4
  export interface DataFormatterMultiGrid extends DataFormatterBase<'multiGrid'> {
5
5
  visibleFilter: VisibleFilter<'multiGrid'>;
6
- multiGrid: Array<DataFormatterGrid>;
6
+ multiGrid: Array<DataFormatterMultiGridMultiGrid>;
7
+ container: DataFormatterMultiGridContainer;
7
8
  }
8
9
  export interface DataFormatterMultiGridPartial extends DataFormatterBasePartial<'multiGrid'> {
9
- multiGrid?: Array<Partial<DataFormatterGrid>>;
10
+ multiGrid?: Array<Partial<DataFormatterMultiGridMultiGrid>>;
11
+ }
12
+ export interface DataFormatterMultiGridMultiGrid extends DataFormatterGrid {
13
+ slotIndex: number;
14
+ }
15
+ export interface DataFormatterMultiGridContainer {
16
+ gap: number;
17
+ rowAmount: number;
18
+ columnAmount: number;
10
19
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orbcharts/core",
3
- "version": "3.0.0-alpha.30",
3
+ "version": "3.0.0-alpha.32",
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",
@@ -140,8 +140,6 @@ export const createBaseChart: CreateBaseChart = <T extends ChartType>({ defaultD
140
140
  description: preset.description ?? ''
141
141
  }
142
142
  })(options)
143
-
144
-
145
143
 
146
144
  const sharedData$ = chartSubject.data$.pipe(shareReplay(1))
147
145
  const shareAndMergedDataFormatter$ = chartSubject.dataFormatter$
@@ -165,7 +163,9 @@ export const createBaseChart: CreateBaseChart = <T extends ChartType>({ defaultD
165
163
  .pipe(
166
164
  takeUntil(destroy$),
167
165
  startWith({}),
168
- map((d) => mergeOptionsWithDefault(d, mergedPresetWithDefault.chartParams)),
166
+ map((d) => {
167
+ return mergeOptionsWithDefault(d, mergedPresetWithDefault.chartParams)
168
+ }),
169
169
  shareReplay(1)
170
170
  )
171
171
 
@@ -175,7 +175,9 @@ export const createBaseChart: CreateBaseChart = <T extends ChartType>({ defaultD
175
175
  .pipe(
176
176
  takeUntil(destroy$),
177
177
  startWith({}),
178
- map((d: any) => mergeOptionsWithDefault(d.padding ?? {}, PADDING_DEFAULT))
178
+ map((d: any) => {
179
+ return mergeOptionsWithDefault(d.padding ?? {}, PADDING_DEFAULT)
180
+ })
179
181
  )
180
182
  mergedPadding$
181
183
  .pipe(
@@ -262,13 +264,16 @@ export const createBaseChart: CreateBaseChart = <T extends ChartType>({ defaultD
262
264
  } catch (e) {
263
265
  console.error(e)
264
266
  throw new Error(e)
265
- }
267
+ }
266
268
  }),
267
269
  catchError(() => EMPTY)
268
270
  )
269
271
  }),
270
272
  shareReplay(1)
271
273
  )
274
+
275
+ // subscribe - computedData組合了所有的chart參數,所以訂閱computedData可以一次訂閱所有的資料流
276
+ computedData$.subscribe()
272
277
 
273
278
  // -- plugins --
274
279
  const pluginEntityMap: any = {} // 用於destroy
package/src/defaults.ts CHANGED
@@ -10,7 +10,7 @@ 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
12
  import type { DataFormatterGrid } from './types/DataFormatterGrid'
13
- import type { DataFormatterMultiGrid } from './types/DataFormatterMultiGrid'
13
+ import type { DataFormatterMultiGrid, DataFormatterMultiGridMultiGrid } 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'
@@ -180,24 +180,25 @@ export const DATA_FORMATTER_GRID_DEFAULT: DataFormatterGrid = {
180
180
  // },
181
181
  }
182
182
 
183
+ export const DATA_FORMATTER_MULTI_GRID_MULTI_GRID_DEFAULT: DataFormatterMultiGridMultiGrid = {
184
+ ...DATA_FORMATTER_GRID_DEFAULT,
185
+ slotIndex: 0,
186
+ }
187
+
183
188
  export const DATA_FORMATTER_MULTI_GRID_DEFAULT: DataFormatterMultiGrid = {
184
189
  type: 'multiGrid',
185
190
  visibleFilter: (datum, rowIndex, columnIndex, context) => true,
186
191
  multiGrid: [
187
192
  {
188
- ...DATA_FORMATTER_GRID_DEFAULT
193
+ ...DATA_FORMATTER_MULTI_GRID_MULTI_GRID_DEFAULT
189
194
  },
190
- // // @Q@ 暫時性的邏輯,之後colorsPredicate移除掉後,這邊也要移除(但colors使用的seriesIndex要接續前一組grid)
191
- // {
192
- // ...DATA_FORMATTER_GRID_DEFAULT,
193
- // colorsPredicate: (datum, rowIndex, columnIndex, { data, chartParams, dataFormatter }) => {
194
- // const seriesIndex = dataFormatter.grid.seriesType === 'row' ? rowIndex : columnIndex
195
- // const reverseIndex = chartParams.colors[chartParams.colorScheme].series.length - 1 - seriesIndex
196
- // return chartParams.colors[chartParams.colorScheme].series[reverseIndex]
197
- // },
198
- // }
199
195
  ],
200
196
  // visibleGroupRange: null,
197
+ container: {
198
+ gap: 120,
199
+ rowAmount: 1,
200
+ columnAmount: 1
201
+ }
201
202
  }
202
203
 
203
204
  export const DATA_FORMATTER_MULTI_VALUE_DEFAULT: DataFormatterMultiValue = {
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  shareReplay } from 'rxjs'
3
3
  import type { ContextObserverFn } from '../types'
4
- import { multiGridObservable } from './multiGridObservables'
4
+ import { multiGridEachDetailObservable, multiGridContainerObservable } from './multiGridObservables'
5
5
 
6
6
  export const createMultiGridContextObserver: ContextObserverFn<'multiGrid'> = ({ subject, observer }) => {
7
7
 
8
- const multiGrid$ = multiGridObservable({
8
+ const multiGridEachDetail$ = multiGridEachDetailObservable({
9
9
  fullDataFormatter$: observer.fullDataFormatter$,
10
10
  computedData$: observer.computedData$,
11
11
  layout$: observer.layout$,
@@ -15,12 +15,20 @@ export const createMultiGridContextObserver: ContextObserverFn<'multiGrid'> = ({
15
15
  shareReplay(1)
16
16
  )
17
17
 
18
+ const multiGridContainer$ = multiGridContainerObservable({
19
+ computedData$: observer.computedData$,
20
+ fullDataFormatter$: observer.fullDataFormatter$,
21
+ fullChartParams$: observer.fullChartParams$,
22
+ layout$: observer.layout$,
23
+ })
24
+
18
25
  return {
19
26
  fullParams$: observer.fullParams$,
20
27
  fullChartParams$: observer.fullChartParams$,
21
28
  fullDataFormatter$: observer.fullDataFormatter$,
22
29
  computedData$: observer.computedData$,
23
30
  layout$: observer.layout$,
24
- multiGrid$
31
+ multiGridEachDetail$,
32
+ multiGridContainer$
25
33
  }
26
34
  }
@@ -24,6 +24,7 @@ import type {
24
24
  DataFormatterContext,
25
25
  DataFormatterValueAxis,
26
26
  DataFormatterGroupAxis,
27
+ DataFormatterMultiGridContainer,
27
28
  EventMultiGrid,
28
29
  HighlightTarget,
29
30
  Layout,
@@ -40,8 +41,9 @@ import {
40
41
  gridAxesOppositeTransformObservable,
41
42
  gridAxesSizeObservable,
42
43
  gridVisibleComputedDataObservable } from '../grid/gridObservables'
44
+ import { DATA_FORMATTER_MULTI_GRID_MULTI_GRID_DEFAULT } from '../defaults'
43
45
 
44
- export const multiGridObservable = ({ fullDataFormatter$, computedData$, layout$, fullChartParams$, event$ }: {
46
+ export const multiGridEachDetailObservable = ({ fullDataFormatter$, computedData$, layout$, fullChartParams$, event$ }: {
45
47
  fullDataFormatter$: Observable<DataFormatterTypeMap<'multiGrid'>>
46
48
  computedData$: Observable<ComputedDataTypeMap<'multiGrid'>>
47
49
  layout$: Observable<Layout>
@@ -151,4 +153,60 @@ export const multiGridObservable = ({ fullDataFormatter$, computedData$, layout$
151
153
  })
152
154
  })
153
155
  )
156
+ }
157
+
158
+
159
+
160
+ // 每一個grid的container位置
161
+ export const multiGridContainerObservable = ({ computedData$, fullDataFormatter$, fullChartParams$, layout$ }: {
162
+ computedData$: Observable<ComputedDataTypeMap<'multiGrid'>>
163
+ fullDataFormatter$: Observable<DataFormatterTypeMap<'multiGrid'>>
164
+ fullChartParams$: Observable<ChartParams>
165
+ layout$: Observable<Layout>
166
+ }) => {
167
+ function calcBox (layout: Layout, container: DataFormatterMultiGridContainer, rowIndex: number, columnIndex: number) {
168
+ const { gap, rowAmount, columnAmount } = container
169
+ const width = (layout.width - (gap * (columnAmount - 1))) / columnAmount
170
+ const height = (layout.height - (gap * (rowAmount - 1))) / rowAmount
171
+ const x = columnIndex * width + (columnIndex * gap)
172
+ const y = rowIndex * height + (rowIndex * gap)
173
+ const translate: [number, number] = [x, y]
174
+ const scale: [number, number] = [width / layout.width, height / layout.height]
175
+
176
+ return {
177
+ translate,
178
+ scale
179
+ }
180
+ }
181
+
182
+ const multiGridContainer$ = combineLatest({
183
+ computedData: computedData$,
184
+ fullDataFormatter: fullDataFormatter$,
185
+ fullChartParams: fullChartParams$,
186
+ layout: layout$,
187
+ }).pipe(
188
+ switchMap(async (d) => d),
189
+ map(data => {
190
+
191
+ const defaultGrid = data.fullDataFormatter.multiGrid[0] ?? DATA_FORMATTER_MULTI_GRID_MULTI_GRID_DEFAULT
192
+
193
+ const boxArr = data.computedData.map((gridData, gridIndex) => {
194
+ const grid = data.fullDataFormatter.multiGrid[gridIndex] ?? defaultGrid
195
+ const columnIndex = grid.slotIndex % data.fullDataFormatter.container.columnAmount
196
+ const rowIndex = Math.floor(grid.slotIndex / data.fullDataFormatter.container.columnAmount)
197
+ const { translate, scale } = calcBox(data.layout, data.fullDataFormatter.container, rowIndex, columnIndex)
198
+
199
+ return {
200
+ slotIndex: grid.slotIndex,
201
+ rowIndex,
202
+ columnIndex,
203
+ translate,
204
+ scale,
205
+ }
206
+ })
207
+ return boxArr
208
+ }),
209
+ )
210
+
211
+ return multiGridContainer$
154
212
  }
@@ -4,7 +4,8 @@ import type { ComputedDataGrid, ComputedDatumGrid } from './ComputedDataGrid'
4
4
  import type { TransformData } from './TransformData'
5
5
 
6
6
  export interface ContextObserverMultiGrid<PluginParams> extends ContextObserverBase<'multiGrid', PluginParams> {
7
- multiGrid$: Observable<MultiGridObservableAll[]>
7
+ multiGridEachDetail$: Observable<MultiGridObservableAll[]>
8
+ multiGridContainer$: Observable<GridContainerBox[]>
8
9
  }
9
10
 
10
11
  export interface MultiGridObservableAll {
@@ -16,4 +17,12 @@ export interface MultiGridObservableAll {
16
17
  SeriesDataMap$: Observable<Map<string, ComputedDatumGrid[]>>
17
18
  GroupDataMap$: Observable<Map<string, ComputedDatumGrid[]>>
18
19
  visibleComputedData$: Observable<ComputedDataGrid>
20
+ }
21
+
22
+ export interface GridContainerBox {
23
+ slotIndex: number
24
+ rowIndex: number
25
+ columnIndex: number
26
+ translate: [number, number]
27
+ scale: [number, number]
19
28
  }
@@ -10,12 +10,25 @@ import type { AxisPosition } from './Axis'
10
10
 
11
11
  export interface DataFormatterMultiGrid extends DataFormatterBase<'multiGrid'> {
12
12
  visibleFilter: VisibleFilter<'multiGrid'>
13
- multiGrid: Array<DataFormatterGrid>
13
+ multiGrid: Array<DataFormatterMultiGridMultiGrid>
14
14
  // visibleGroupRange: [number, number] | null
15
+ container: DataFormatterMultiGridContainer
15
16
  }
16
17
 
17
18
  export interface DataFormatterMultiGridPartial extends DataFormatterBasePartial<'multiGrid'> {
18
- multiGrid?: Array<Partial<DataFormatterGrid>>
19
+ multiGrid?: Array<Partial<DataFormatterMultiGridMultiGrid>>
20
+ }
21
+
22
+ // 比grid還多出來的額外參數
23
+ export interface DataFormatterMultiGridMultiGrid extends DataFormatterGrid {
24
+ slotIndex: number
25
+ }
26
+
27
+ // container
28
+ export interface DataFormatterMultiGridContainer {
29
+ gap: number
30
+ rowAmount: number
31
+ columnAmount: number
19
32
  }
20
33
 
21
34
  // multiGrid欄位