@nocobase/plugin-data-visualization 0.11.1-alpha.5 → 0.12.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/client.d.ts +2 -2
  2. package/client.js +1 -1
  3. package/dist/client/chart/antd/antd.d.ts +7 -0
  4. package/dist/client/chart/antd/index.d.ts +4 -0
  5. package/dist/client/chart/antd/statistic.d.ts +19 -0
  6. package/dist/client/chart/antd/table.d.ts +6 -0
  7. package/dist/client/chart/chart.d.ts +65 -0
  8. package/dist/client/chart/g2plot/bar.d.ts +16 -0
  9. package/dist/client/chart/g2plot/dualAxes.d.ts +20 -0
  10. package/dist/client/chart/g2plot/g2plot.d.ts +19 -0
  11. package/dist/client/chart/g2plot/index.d.ts +6 -0
  12. package/dist/client/chart/g2plot/pie.d.ts +17 -0
  13. package/dist/client/chart/library.d.ts +28 -0
  14. package/{lib → dist}/client/hooks.d.ts +22 -154
  15. package/{lib → dist}/client/index.d.ts +3 -1
  16. package/dist/client/index.js +67448 -0
  17. package/{lib → dist}/client/renderer/ChartRendererProvider.d.ts +1 -8
  18. package/{lib → dist}/client/renderer/index.d.ts +0 -2
  19. package/{lib → dist}/client/utils.d.ts +1 -1
  20. package/{lib → dist}/index.d.ts +1 -0
  21. package/dist/index.js +18 -0
  22. package/dist/locale/en-US.js +26 -0
  23. package/dist/locale/fr-FR.js +5 -0
  24. package/dist/locale/ja-JP.js +5 -0
  25. package/dist/locale/pt-BR.js +26 -0
  26. package/dist/locale/ru-RU.js +5 -0
  27. package/dist/locale/tr-TR.js +5 -0
  28. package/dist/locale/zh-CN.js +74 -0
  29. package/dist/server/actions/formatter.js +41 -0
  30. package/{src/server/actions/query.ts → dist/server/actions/query.js} +75 -133
  31. package/dist/server/index.js +11 -0
  32. package/dist/server/plugin.js +42 -0
  33. package/package.json +23 -22
  34. package/server.d.ts +2 -2
  35. package/server.js +1 -1
  36. package/lib/client/Settings.js +0 -81
  37. package/lib/client/block/ChartBlock.js +0 -74
  38. package/lib/client/block/ChartBlockDesigner.js +0 -35
  39. package/lib/client/block/ChartBlockInitializer.js +0 -114
  40. package/lib/client/block/ChartConfigure.js +0 -499
  41. package/lib/client/block/formatters.js +0 -58
  42. package/lib/client/block/index.js +0 -49
  43. package/lib/client/block/schemas/configure.js +0 -517
  44. package/lib/client/block/transformers.js +0 -68
  45. package/lib/client/hooks.js +0 -275
  46. package/lib/client/index.js +0 -80
  47. package/lib/client/locale/index.js +0 -37
  48. package/lib/client/renderer/ChartLibrary.d.ts +0 -72
  49. package/lib/client/renderer/ChartLibrary.js +0 -146
  50. package/lib/client/renderer/ChartRenderer.js +0 -181
  51. package/lib/client/renderer/ChartRendererProvider.js +0 -105
  52. package/lib/client/renderer/index.js +0 -49
  53. package/lib/client/renderer/library/AntdLibrary.d.ts +0 -2
  54. package/lib/client/renderer/library/AntdLibrary.js +0 -123
  55. package/lib/client/renderer/library/G2PlotLibrary.d.ts +0 -2
  56. package/lib/client/renderer/library/G2PlotLibrary.js +0 -288
  57. package/lib/client/renderer/library/index.d.ts +0 -3
  58. package/lib/client/renderer/library/index.js +0 -15
  59. package/lib/client/utils.js +0 -137
  60. package/lib/index.js +0 -13
  61. package/lib/locale/en-US.js +0 -29
  62. package/lib/locale/fr-FR.js +0 -8
  63. package/lib/locale/ja-JP.js +0 -8
  64. package/lib/locale/pt-BR.js +0 -29
  65. package/lib/locale/ru-RU.js +0 -8
  66. package/lib/locale/tr-TR.js +0 -8
  67. package/lib/locale/zh-CN.js +0 -77
  68. package/lib/server/actions/formatter.js +0 -44
  69. package/lib/server/actions/query.js +0 -331
  70. package/lib/server/index.js +0 -13
  71. package/lib/server/plugin.js +0 -64
  72. package/src/client/Settings.tsx +0 -43
  73. package/src/client/__tests__/chart-configure.test.tsx +0 -14
  74. package/src/client/__tests__/chart-library.test.ts +0 -78
  75. package/src/client/__tests__/chart-renderer.test.tsx +0 -30
  76. package/src/client/__tests__/hooks.test.ts +0 -261
  77. package/src/client/block/ChartBlock.tsx +0 -24
  78. package/src/client/block/ChartBlockDesigner.tsx +0 -19
  79. package/src/client/block/ChartBlockInitializer.tsx +0 -82
  80. package/src/client/block/ChartConfigure.tsx +0 -446
  81. package/src/client/block/formatters.ts +0 -70
  82. package/src/client/block/index.ts +0 -4
  83. package/src/client/block/schemas/configure.ts +0 -504
  84. package/src/client/block/transformers.ts +0 -52
  85. package/src/client/hooks.ts +0 -239
  86. package/src/client/index.tsx +0 -47
  87. package/src/client/locale/index.ts +0 -18
  88. package/src/client/renderer/ChartLibrary.tsx +0 -183
  89. package/src/client/renderer/ChartRenderer.tsx +0 -129
  90. package/src/client/renderer/ChartRendererProvider.tsx +0 -123
  91. package/src/client/renderer/index.ts +0 -4
  92. package/src/client/renderer/library/AntdLibrary.tsx +0 -94
  93. package/src/client/renderer/library/G2PlotLibrary.tsx +0 -236
  94. package/src/client/renderer/library/index.tsx +0 -4
  95. package/src/client/utils.ts +0 -102
  96. package/src/index.ts +0 -1
  97. package/src/locale/en-US.ts +0 -23
  98. package/src/locale/fr-FR.ts +0 -1
  99. package/src/locale/ja-JP.ts +0 -1
  100. package/src/locale/pt-BR.ts +0 -23
  101. package/src/locale/ru-RU.ts +0 -1
  102. package/src/locale/tr-TR.ts +0 -1
  103. package/src/locale/zh-CN.ts +0 -72
  104. package/src/server/__tests__/api.test.ts +0 -102
  105. package/src/server/__tests__/formatter.test.ts +0 -49
  106. package/src/server/__tests__/query.test.ts +0 -220
  107. package/src/server/actions/formatter.ts +0 -49
  108. package/src/server/collections/.gitkeep +0 -0
  109. package/src/server/index.ts +0 -1
  110. package/src/server/plugin.ts +0 -37
  111. /package/{lib → dist}/client/Settings.d.ts +0 -0
  112. /package/{lib → dist}/client/block/ChartBlock.d.ts +0 -0
  113. /package/{lib → dist}/client/block/ChartBlockDesigner.d.ts +0 -0
  114. /package/{lib → dist}/client/block/ChartBlockInitializer.d.ts +0 -0
  115. /package/{lib → dist}/client/block/ChartConfigure.d.ts +0 -0
  116. /package/{lib → dist}/client/block/formatters.d.ts +0 -0
  117. /package/{lib → dist}/client/block/index.d.ts +0 -0
  118. /package/{lib → dist}/client/block/schemas/configure.d.ts +0 -0
  119. /package/{lib → dist}/client/block/transformers.d.ts +0 -0
  120. /package/{lib → dist}/client/locale/index.d.ts +0 -0
  121. /package/{lib → dist}/client/renderer/ChartRenderer.d.ts +0 -0
  122. /package/{lib → dist}/locale/en-US.d.ts +0 -0
  123. /package/{lib → dist}/locale/fr-FR.d.ts +0 -0
  124. /package/{lib → dist}/locale/ja-JP.d.ts +0 -0
  125. /package/{lib → dist}/locale/pt-BR.d.ts +0 -0
  126. /package/{lib → dist}/locale/ru-RU.d.ts +0 -0
  127. /package/{lib → dist}/locale/tr-TR.d.ts +0 -0
  128. /package/{lib → dist}/locale/zh-CN.d.ts +0 -0
  129. /package/{lib → dist}/server/actions/formatter.d.ts +0 -0
  130. /package/{lib → dist}/server/actions/query.d.ts +0 -0
  131. /package/{lib → dist}/server/index.d.ts +0 -0
  132. /package/{lib → dist}/server/plugin.d.ts +0 -0
@@ -1,239 +0,0 @@
1
- import { ArrayField } from '@formily/core';
2
- import { ISchema, Schema } from '@formily/react';
3
- import { useACLRoleContext, useCollectionManager } from '@nocobase/client';
4
- import { useContext } from 'react';
5
- import { useTranslation } from 'react-i18next';
6
- import { ChartConfigContext } from './block/ChartConfigure';
7
- import formatters from './block/formatters';
8
- import transformers from './block/transformers';
9
- import { lang } from './locale';
10
- import { ChartRendererProps } from './renderer';
11
- import { getField, getSelectedFields, parseField } from './utils';
12
-
13
- export type FieldOption = {
14
- value: string;
15
- label: string;
16
- key: string;
17
- alias?: string;
18
- name?: string;
19
- type?: string;
20
- interface?: string;
21
- uiSchema?: ISchema;
22
- target?: string;
23
- targetFields?: FieldOption[];
24
- };
25
-
26
- export const useFields = (collection?: string) => {
27
- const { current } = useContext(ChartConfigContext);
28
- if (!collection) {
29
- collection = current?.collection || '';
30
- }
31
- const { getCollectionFields } = useCollectionManager();
32
- const fields = (getCollectionFields(collection) || [])
33
- .filter((field) => {
34
- return field.interface;
35
- })
36
- .map((field) => ({
37
- ...field,
38
- key: field.name,
39
- label: field.uiSchema?.title || field.name,
40
- value: field.name,
41
- }));
42
- return fields;
43
- };
44
-
45
- export const useFieldsWithAssociation = (collection?: string) => {
46
- const { getCollectionFields } = useCollectionManager();
47
- const { t } = useTranslation();
48
- const fields = useFields(collection);
49
- return fields.map((field) => {
50
- const label = Schema.compile(field.uiSchema?.title || field.name, { t });
51
- if (!field.target) {
52
- return { ...field, label };
53
- }
54
- const targetFields = (getCollectionFields(field.target) || [])
55
- .filter((targetField) => {
56
- return targetField.interface;
57
- })
58
- .map((targetField) => ({
59
- ...targetField,
60
- key: `${field.name}.${targetField.name}`,
61
- label: `${label} / ${Schema.compile(targetField.uiSchema?.title || targetField.name, { t })}`,
62
- value: `${field.name}.${targetField.name}`,
63
- }));
64
- return {
65
- ...field,
66
- label,
67
- targetFields,
68
- };
69
- });
70
- };
71
-
72
- export const useChartFields = (fields: FieldOption[]) => (field: any) => {
73
- const query = field.query('query').get('value') || {};
74
- const selectedFields = getSelectedFields(fields, query);
75
- field.dataSource = selectedFields;
76
- };
77
-
78
- export const useFormatters = (fields: FieldOption[]) => (field: any) => {
79
- const selectedField = field.query('.field').get('value');
80
- if (!selectedField) {
81
- field.dataSource = [];
82
- return;
83
- }
84
- let options = [];
85
- const fieldInterface = getField(fields, selectedField)?.interface;
86
- switch (fieldInterface) {
87
- case 'datetime':
88
- case 'createdAt':
89
- case 'updatedAt':
90
- options = formatters.datetime;
91
- break;
92
- case 'date':
93
- options = formatters.date;
94
- break;
95
- case 'time':
96
- options = formatters.time;
97
- break;
98
- default:
99
- options = [];
100
- }
101
- field.dataSource = options;
102
- };
103
-
104
- export const useCollectionOptions = () => {
105
- const { t } = useTranslation();
106
- const { collections } = useCollectionManager();
107
- const { allowAll, parseAction } = useACLRoleContext();
108
- const options = collections
109
- .filter((collection: { name: string }) => {
110
- if (allowAll) {
111
- return true;
112
- }
113
- const params = parseAction(`${collection.name}:list`);
114
- return params;
115
- })
116
- .map((collection: { name: string; title: string }) => ({
117
- label: collection.title,
118
- value: collection.name,
119
- key: collection.name,
120
- }));
121
- return Schema.compile(options, { t });
122
- };
123
-
124
- /**
125
- * useFieldTypes
126
- * Get field types for using transformers
127
- * Only supported types will be displayed
128
- * Some interfaces and types will be mapped to supported types
129
- */
130
- export const useFieldTypes = (fields: FieldOption[]) => (field: any) => {
131
- const selectedField = field.query('.field').get('value');
132
- const query = field.query('query').get('value') || {};
133
- const selectedFields = getSelectedFields(fields, query);
134
- const fieldProps = selectedFields.find((field) => field.value === selectedField);
135
- const supports = Object.keys(transformers);
136
- field.dataSource = supports.map((key) => ({
137
- label: lang(key),
138
- value: key,
139
- }));
140
- const map = {
141
- createdAt: 'datetime',
142
- updatedAt: 'datetime',
143
- double: 'number',
144
- integer: 'number',
145
- percent: 'number',
146
- };
147
- const fieldInterface = fieldProps?.interface;
148
- const fieldType = fieldProps?.type;
149
- const key = map[fieldInterface] || map[fieldType] || fieldType;
150
- if (supports.includes(key)) {
151
- field.setState({
152
- value: key,
153
- disabled: true,
154
- });
155
- return;
156
- }
157
- field.setState({
158
- value: null,
159
- disabled: false,
160
- });
161
- };
162
-
163
- export const useTransformers = (field: any) => {
164
- const selectedType = field.query('.type').get('value');
165
- if (!selectedType) {
166
- field.dataSource = [];
167
- return;
168
- }
169
- const options = Object.keys(transformers[selectedType] || {}).map((key) => ({
170
- label: lang(key),
171
- value: key,
172
- }));
173
- field.dataSource = options;
174
- };
175
-
176
- export const useFieldTransformer = (transform: ChartRendererProps['transform'], locale = 'en-US') => {
177
- return (transform || [])
178
- .filter((item) => item.field && item.type && item.format)
179
- .reduce((mp, item) => {
180
- const transformer = transformers[item.type][item.format];
181
- if (!transformer) {
182
- return mp;
183
- }
184
- mp[item.field] = (val: any) => transformer(val, locale);
185
- return mp;
186
- }, {});
187
- };
188
-
189
- export const useOrderFieldsOptions = (defaultOptions: any[], fields: FieldOption[]) => (field: any) => {
190
- const query = field.query('query').get('value') || {};
191
- const { measures = [] } = query;
192
- const hasAgg = measures.some((measure: { aggregation?: string }) => measure.aggregation);
193
- if (!hasAgg) {
194
- field.componentProps.fieldNames = {
195
- label: 'title',
196
- value: 'name',
197
- children: 'children',
198
- };
199
- field.dataSource = defaultOptions;
200
- return;
201
- }
202
- const selectedFields = getSelectedFields(fields, query);
203
- field.componentProps.fieldNames = {};
204
- field.dataSource = selectedFields;
205
- };
206
-
207
- export const useOrderReaction = (defaultOptions: any[], fields: FieldOption[]) => (field: ArrayField) => {
208
- const query = field.query('query').get('value') || {};
209
- const { measures = [] } = query;
210
- const hasAgg = measures.some((measure: { aggregation?: string }) => measure.aggregation);
211
- let dataSource = defaultOptions;
212
- const allValues = [];
213
- if (hasAgg) {
214
- dataSource = getSelectedFields(fields, query);
215
- dataSource.forEach((field) => {
216
- allValues.push(field.value);
217
- });
218
- } else {
219
- dataSource.forEach((field) => {
220
- const children = field.children || [];
221
- if (!children.length) {
222
- allValues.push(field.value || field.name);
223
- }
224
- children.forEach((child: any) => {
225
- allValues.push(`${field.name}.${child.name}`);
226
- });
227
- });
228
- }
229
-
230
- const orders = field.value || [];
231
- const newOrders = orders.reduce((newOrders: any[], item: any) => {
232
- const { alias } = parseField(item.field);
233
- if (!item.field || allValues.includes(alias)) {
234
- newOrders.push(item);
235
- }
236
- return newOrders;
237
- }, []);
238
- field.setValue(newOrders);
239
- };
@@ -1,47 +0,0 @@
1
- import { Plugin, SchemaComponentOptions, SchemaInitializerContext, SchemaInitializerProvider } from '@nocobase/client';
2
- import React, { useContext } from 'react';
3
- import { ChartInitializers, ChartV2Block, ChartV2BlockDesigner, ChartV2BlockInitializer } from './block';
4
- import { useChartsTranslation } from './locale';
5
- import { ChartRenderer, ChartRendererProvider, InternalLibrary } from './renderer';
6
- import { ChartLibraryProvider } from './renderer/ChartLibrary';
7
-
8
- const Chart: React.FC = (props) => {
9
- const { t } = useChartsTranslation();
10
- const initializers = useContext<any>(SchemaInitializerContext);
11
- const children = initializers.BlockInitializers.items[0].children;
12
- const has = children.some((initializer) => initializer.component === 'ChartV2BlockInitializer');
13
- if (!has) {
14
- children.push({
15
- key: 'chart-v2',
16
- type: 'item',
17
- title: t('Charts'),
18
- component: 'ChartV2BlockInitializer',
19
- });
20
- }
21
- return (
22
- <SchemaComponentOptions
23
- components={{
24
- ChartV2BlockInitializer,
25
- ChartRenderer,
26
- ChartV2BlockDesigner,
27
- ChartV2Block,
28
- ChartRendererProvider,
29
- }}
30
- >
31
- <SchemaInitializerProvider initializers={{ ...initializers, ChartInitializers }}>
32
- <ChartLibraryProvider name="Built-in" charts={InternalLibrary}>
33
- {props.children}
34
- </ChartLibraryProvider>
35
- </SchemaInitializerProvider>
36
- </SchemaComponentOptions>
37
- );
38
- };
39
-
40
- class DataVisualizationPlugin extends Plugin {
41
- async load() {
42
- this.app.addProvider(Chart);
43
- }
44
- }
45
-
46
- export default DataVisualizationPlugin;
47
- export { ChartLibraryProvider };
@@ -1,18 +0,0 @@
1
- import { i18n } from '@nocobase/client';
2
- import { useTranslation } from 'react-i18next';
3
-
4
- export const NAMESPACE = 'data-visualization';
5
-
6
- // i18n.addResources('zh-CN', NAMESPACE, zhCN);
7
- // i18n.addResources('en-US', NAMESPACE, enUS);
8
- // i18n.addResources('ja-JP', NAMESPACE, jaJP);
9
- // i18n.addResources('ru-RU', NAMESPACE, ruRU);
10
- // i18n.addResources('tr-TR', NAMESPACE, trTR);
11
-
12
- export function lang(key: string) {
13
- return i18n.t(key, { ns: NAMESPACE });
14
- }
15
-
16
- export function useChartsTranslation() {
17
- return useTranslation(NAMESPACE);
18
- }
@@ -1,183 +0,0 @@
1
- import { ISchema } from '@formily/react';
2
- import React, { createContext, useContext } from 'react';
3
- import { FieldOption } from '../hooks';
4
- import { lang } from '../locale';
5
- import { parseField } from '../utils';
6
- import { QueryProps } from './ChartRendererProvider';
7
-
8
- /**
9
- * @params {usePropsFunc} useProps - Accept the information that the chart component needs to render,
10
- * process it and return the props of the chart component.
11
- */
12
- export type usePropsFunc = (props: {
13
- data: any[];
14
- fieldProps: {
15
- [field: string]: FieldOption & {
16
- transformer: (val: any) => string;
17
- };
18
- };
19
- general: any;
20
- advanced: any;
21
- }) => any;
22
-
23
- export type ChartProps = {
24
- name: string;
25
- component: React.FC<any>;
26
- schema?: ISchema;
27
- useProps?: usePropsFunc;
28
- // The init function is used to initialize the configuration of the chart component from the query configuration.
29
- init?: (
30
- fields: FieldOption[],
31
- query: {
32
- measures?: QueryProps['measures'];
33
- dimensions?: QueryProps['dimensions'];
34
- },
35
- ) => {
36
- general?: any;
37
- advanced?: any;
38
- };
39
- reference?: {
40
- title: string;
41
- link: string;
42
- };
43
- };
44
-
45
- export type Charts = {
46
- [type: string]: ChartProps;
47
- };
48
-
49
- export type ChartLibraries = {
50
- [library: string]: {
51
- enabled: boolean;
52
- charts: Charts;
53
- };
54
- };
55
-
56
- export const ChartLibraryContext = createContext<ChartLibraries>({});
57
-
58
- export const useCharts = (): Charts => {
59
- const library = useContext(ChartLibraryContext);
60
- return Object.values(library)
61
- .filter((l) => l.enabled)
62
- .reduce((charts, l) => ({ ...charts, ...l.charts }), {});
63
- };
64
-
65
- export const useChartTypes = (): {
66
- label: string;
67
- children: (ChartProps & {
68
- key: string;
69
- label: string;
70
- value: string;
71
- })[];
72
- }[] => {
73
- const library = useContext(ChartLibraryContext);
74
- return Object.entries(library)
75
- .filter(([_, l]) => l.enabled)
76
- .reduce((charts, [name, l]) => {
77
- const children = Object.entries(l.charts).map(([type, chart]) => ({
78
- ...chart,
79
- key: type,
80
- label: lang(chart.name),
81
- value: type,
82
- }));
83
- return [
84
- ...charts,
85
- {
86
- label: lang(name),
87
- children,
88
- },
89
- ];
90
- }, []);
91
- };
92
-
93
- export const useDefaultChartType = () => {
94
- const chartTypes = useChartTypes();
95
- return chartTypes[0]?.children?.[0]?.value;
96
- };
97
-
98
- export const useToggleChartLibrary = () => {
99
- const ctx = useContext(ChartLibraryContext);
100
- return {
101
- toggle: (library: string) => {
102
- ctx[library].enabled = !ctx[library].enabled;
103
- },
104
- };
105
- };
106
-
107
- export const ChartLibraryProvider: React.FC<{
108
- name: string;
109
- charts: Charts;
110
- }> = (props) => {
111
- const { children, charts, name } = props;
112
- const ctx = useContext(ChartLibraryContext);
113
- const library = {
114
- ...ctx,
115
- [name]: {
116
- charts,
117
- enabled: true,
118
- },
119
- };
120
- return <ChartLibraryContext.Provider value={library}>{children}</ChartLibraryContext.Provider>;
121
- };
122
-
123
- export const infer = (
124
- fields: FieldOption[],
125
- {
126
- measures,
127
- dimensions,
128
- }: {
129
- measures?: QueryProps['measures'];
130
- dimensions?: QueryProps['dimensions'];
131
- },
132
- ) => {
133
- let xField: FieldOption;
134
- let yField: FieldOption;
135
- let seriesField: FieldOption;
136
- let yFields: FieldOption[];
137
- const getField = (fields: FieldOption[], selected: { field: string | string[]; alias?: string }) => {
138
- if (selected.alias) {
139
- return fields.find((f) => f.value === selected.alias);
140
- }
141
- const { alias } = parseField(selected.field);
142
- return fields.find((f) => f.value === alias);
143
- };
144
- if (measures?.length) {
145
- yField = getField(fields, measures[0]);
146
- yFields = measures.map((m) => getField(fields, m));
147
- }
148
- if (dimensions) {
149
- if (dimensions.length === 1) {
150
- xField = getField(fields, dimensions[0]);
151
- } else if (dimensions.length > 1) {
152
- // If there is a time field, it is used as the x-axis field by default.
153
- let xIndex: number;
154
- dimensions.forEach((d, i) => {
155
- const field = getField(fields, d);
156
- if (['date', 'time', 'datetime'].includes(field?.type)) {
157
- xField = field;
158
- xIndex = i;
159
- }
160
- });
161
- if (xIndex) {
162
- // If there is a time field, the other field is used as the series field by default.
163
- const index = xIndex === 0 ? 1 : 0;
164
- seriesField = getField(fields, dimensions[index]);
165
- } else {
166
- xField = getField(fields, dimensions[0]);
167
- seriesField = getField(fields, dimensions[1]);
168
- }
169
- }
170
- }
171
- return { xField, yField, seriesField, yFields };
172
- };
173
-
174
- export const commonInit: ChartProps['init'] = (fields, { measures, dimensions }) => {
175
- const { xField, yField, seriesField } = infer(fields, { measures, dimensions });
176
- return {
177
- general: {
178
- xField: xField?.value,
179
- yField: yField?.value,
180
- seriesField: seriesField?.value,
181
- },
182
- };
183
- };
@@ -1,129 +0,0 @@
1
- import { useField, useFieldSchema } from '@formily/react';
2
- import {
3
- GeneralSchemaDesigner,
4
- SchemaSettings,
5
- gridRowColWrap,
6
- useAPIClient,
7
- useCollection,
8
- useDesignable,
9
- } from '@nocobase/client';
10
- import { Empty, Result, Spin, Typography } from 'antd';
11
- import React, { useContext } from 'react';
12
- import { ErrorBoundary } from 'react-error-boundary';
13
- import { ChartConfigContext } from '../block';
14
- import { useFieldTransformer, useFieldsWithAssociation } from '../hooks';
15
- import { useChartsTranslation } from '../locale';
16
- import { createRendererSchema, getField, processData } from '../utils';
17
- import { useCharts } from './ChartLibrary';
18
- import { ChartRendererContext } from './ChartRendererProvider';
19
- const { Paragraph, Text } = Typography;
20
-
21
- export const ChartRenderer: React.FC & {
22
- Designer: React.FC;
23
- } = (props) => {
24
- const { t } = useChartsTranslation();
25
- const ctx = useContext(ChartRendererContext);
26
- const { config, transform, collection, service, data: _data } = ctx;
27
- const fields = useFieldsWithAssociation(collection);
28
- const data = processData(fields, service?.data || _data || [], { t });
29
- const general = config?.general || {};
30
- const advanced = config?.advanced || {};
31
- const api = useAPIClient();
32
-
33
- const charts = useCharts();
34
- const chart = charts[config?.chartType];
35
- const Component = chart?.component;
36
- const locale = api.auth.getLocale();
37
- const transformers = useFieldTransformer(transform, locale);
38
- const info = {
39
- data,
40
- general,
41
- advanced,
42
- fieldProps: Object.keys(data[0] || {}).reduce((props, name) => {
43
- if (!props[name]) {
44
- const field = getField(fields, name.split('.'));
45
- const transformer = transformers[name];
46
- props[name] = { ...field, transformer };
47
- }
48
- return props;
49
- }, {}),
50
- locale,
51
- };
52
- const componentProps = chart?.useProps?.(info) || info;
53
- const C = () =>
54
- Component ? (
55
- <ErrorBoundary
56
- onError={(error) => {
57
- console.error(error);
58
- }}
59
- FallbackComponent={ErrorFallback}
60
- >
61
- <Component {...componentProps} />
62
- </ErrorBoundary>
63
- ) : (
64
- <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description={t('Please configure chart')} />
65
- );
66
-
67
- if (service.loading) {
68
- return <Spin />;
69
- }
70
-
71
- if (!(data && data.length)) {
72
- return <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description={t('Please configure and run query')} />;
73
- }
74
-
75
- return <C />;
76
- };
77
-
78
- ChartRenderer.Designer = function Designer() {
79
- const { t } = useChartsTranslation();
80
- const { setVisible, setCurrent } = useContext(ChartConfigContext);
81
- const { service } = useContext(ChartRendererContext);
82
- const field = useField();
83
- const schema = useFieldSchema();
84
- const { insertAdjacent } = useDesignable();
85
- const { name, title } = useCollection();
86
- return (
87
- <GeneralSchemaDesigner disableInitializer title={title || name}>
88
- <SchemaSettings.Item
89
- key="configure"
90
- onClick={() => {
91
- setCurrent({ schema, field, collection: name, service, data: service?.data });
92
- setVisible(true);
93
- }}
94
- >
95
- {t('Configure')}
96
- </SchemaSettings.Item>
97
- <SchemaSettings.Item
98
- key="duplicate"
99
- onClick={() => insertAdjacent('afterEnd', gridRowColWrap(createRendererSchema(schema?.['x-decorator-props'])))}
100
- >
101
- {t('Duplicate')}
102
- </SchemaSettings.Item>
103
- <SchemaSettings.BlockTitleItem />
104
- <SchemaSettings.Divider />
105
- <SchemaSettings.Remove
106
- // removeParentsIfNoChildren
107
- breakRemoveOn={{
108
- 'x-component': 'ChartV2Block',
109
- }}
110
- />
111
- </GeneralSchemaDesigner>
112
- );
113
- };
114
-
115
- const ErrorFallback = ({ error }) => {
116
- const { t } = useChartsTranslation();
117
-
118
- return (
119
- <div style={{ backgroundColor: 'white' }}>
120
- <Result status="error" title={t('Render Failed')} subTitle={t('Please check the configuration.')}>
121
- <Paragraph copyable>
122
- <Text type="danger" style={{ whiteSpace: 'pre-line', textAlign: 'center' }}>
123
- {error.message}
124
- </Text>
125
- </Paragraph>
126
- </Result>
127
- </div>
128
- );
129
- };