@nocobase/plugin-charts 0.9.4-alpha.2 → 0.10.0-alpha.3
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.
- package/lib/client/ChartBlockEngine.d.ts +3 -2
- package/lib/client/ChartBlockEngineDesigner.d.ts +4 -3
- package/lib/client/ChartBlockInitializer.d.ts +2 -2
- package/lib/client/ChartBlockInitializer.js +2 -0
- package/lib/client/ChartQueryBlockInitializer.d.ts +2 -1
- package/lib/client/ChartQueryBlockInitializer.js +46 -40
- package/lib/client/DataSetPreviewTable.d.ts +2 -1
- package/lib/client/hooks/index.js +1 -1
- package/lib/client/index.d.ts +2 -2
- package/lib/client/index.js +3 -1
- package/lib/client/select/ReadPretty.d.ts +1 -1
- package/lib/client/select/ReadPretty.js +2 -0
- package/lib/client/settings/AddNewQuery.d.ts +3 -2
- package/lib/client/settings/AddNewQuery.js +34 -26
- package/lib/client/settings/ConfigureFields.d.ts +2 -1
- package/lib/client/settings/QueriesTable.d.ts +2 -1
- package/package.json +9 -5
- package/src/client/ChartBlockInitializer.tsx +21 -18
- package/src/client/ChartQueryBlockInitializer.tsx +107 -92
- package/src/client/hooks/index.ts +1 -1
- package/src/client/index.tsx +5 -2
- package/src/client/select/ReadPretty.tsx +25 -22
- package/src/client/select/index.md +3 -10
- package/src/client/settings/AddNewQuery.tsx +36 -21
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
export interface IQueryConfig {
|
|
2
3
|
id: number;
|
|
3
4
|
}
|
|
@@ -21,7 +22,7 @@ export declare const useGetDataSet: (chartQueryId: number) => {
|
|
|
21
22
|
declare const ChartBlockEngine: {
|
|
22
23
|
({ chartBlockEngineMetaData }: {
|
|
23
24
|
chartBlockEngineMetaData: ChartBlockEngineMetaData;
|
|
24
|
-
}): JSX.Element;
|
|
25
|
-
Designer: () => JSX.Element;
|
|
25
|
+
}): React.JSX.Element;
|
|
26
|
+
Designer: () => React.JSX.Element;
|
|
26
27
|
};
|
|
27
28
|
export { ChartBlockEngine };
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
export declare const
|
|
3
|
-
export declare const
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export declare const jsonConfigDesc: (title: string, link: string) => React.JSX.Element;
|
|
3
|
+
export declare const ChartBlockEngineDesigner: () => React.JSX.Element;
|
|
4
|
+
export declare const ChartBlockEngineDesignerInitializer: (props: any) => React.JSX.Element;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
export declare const Options: React.MemoExoticComponent<
|
|
3
|
-
export declare const ChartBlockInitializer: (props: any) => JSX.Element;
|
|
2
|
+
export declare const Options: React.MemoExoticComponent<import("@formily/react").ReactFC<unknown>>;
|
|
3
|
+
export declare const ChartBlockInitializer: (props: any) => React.JSX.Element;
|
|
@@ -100,6 +100,8 @@ const Options = (0, _react().observer)(props => {
|
|
|
100
100
|
return _react2().default.createElement(_react().RecursionField, {
|
|
101
101
|
schema: s
|
|
102
102
|
});
|
|
103
|
+
}, {
|
|
104
|
+
displayName: 'Options'
|
|
103
105
|
});
|
|
104
106
|
exports.Options = Options;
|
|
105
107
|
const ChartBlockInitializer = props => {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
export interface ChartQueryMetadata {
|
|
2
3
|
id: number;
|
|
3
4
|
title: string;
|
|
@@ -6,4 +7,4 @@ export interface ChartQueryMetadata {
|
|
|
6
7
|
name: string;
|
|
7
8
|
}[];
|
|
8
9
|
}
|
|
9
|
-
export declare const ChartQueryBlockInitializer: (props: any) => JSX.Element;
|
|
10
|
+
export declare const ChartQueryBlockInitializer: (props: any) => React.JSX.Element;
|
|
@@ -32,6 +32,13 @@ function _client() {
|
|
|
32
32
|
};
|
|
33
33
|
return data;
|
|
34
34
|
}
|
|
35
|
+
function _client2() {
|
|
36
|
+
const data = require("@nocobase/utils/client");
|
|
37
|
+
_client2 = function _client2() {
|
|
38
|
+
return data;
|
|
39
|
+
};
|
|
40
|
+
return data;
|
|
41
|
+
}
|
|
35
42
|
function _react2() {
|
|
36
43
|
const data = _interopRequireWildcard(require("react"));
|
|
37
44
|
_react2 = function _react2() {
|
|
@@ -52,20 +59,9 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
|
|
|
52
59
|
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
53
60
|
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
|
|
54
61
|
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
55
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
56
|
-
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
57
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
58
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
59
|
-
function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
|
|
60
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
61
62
|
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
62
63
|
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
63
64
|
const ChartQueryBlockInitializer = props => {
|
|
64
|
-
const defaultItems = [{
|
|
65
|
-
type: 'itemGroup',
|
|
66
|
-
title: (0, _locale.lang)('Select query data'),
|
|
67
|
-
children: []
|
|
68
|
-
}];
|
|
69
65
|
const templateWrap = props.templateWrap,
|
|
70
66
|
onCreateBlockSchema = props.onCreateBlockSchema,
|
|
71
67
|
componentType = props.componentType,
|
|
@@ -74,14 +70,10 @@ const ChartQueryBlockInitializer = props => {
|
|
|
74
70
|
others = _objectWithoutProperties(props, _excluded);
|
|
75
71
|
const _useContext = (0, _react2().useContext)(_client().SchemaInitializerButtonContext),
|
|
76
72
|
setVisible = _useContext.setVisible;
|
|
77
|
-
const _useState = (0, _react2().useState)(defaultItems),
|
|
78
|
-
_useState2 = _slicedToArray(_useState, 2),
|
|
79
|
-
items = _useState2[0],
|
|
80
|
-
setItems = _useState2[1];
|
|
81
73
|
const apiClient = (0, _client().useAPIClient)();
|
|
82
74
|
const ctx = (0, _ChartQueryMetadataProvider.useChartQueryMetadataContext)();
|
|
83
75
|
const options = (0, _react2().useContext)(_react().SchemaOptionsContext);
|
|
84
|
-
const onAddQuery = info => {
|
|
76
|
+
const onAddQuery = (0, _react2().useCallback)(info => {
|
|
85
77
|
(0, _antd().FormDialog)({
|
|
86
78
|
sql: (0, _locale.lang)('Add SQL query'),
|
|
87
79
|
json: (0, _locale.lang)('Add JSON query')
|
|
@@ -112,37 +104,50 @@ const ChartQueryBlockInitializer = props => {
|
|
|
112
104
|
}).then( /*#__PURE__*/function () {
|
|
113
105
|
var _ref = _asyncToGenerator(function* (values) {
|
|
114
106
|
try {
|
|
115
|
-
var _apiClient$resource
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
107
|
+
var _apiClient$resource;
|
|
108
|
+
if ((_apiClient$resource = apiClient.resource('chartsQueries')) === null || _apiClient$resource === void 0 ? void 0 : _apiClient$resource.create) {
|
|
109
|
+
const _yield$apiClient$reso = yield apiClient.resource('chartsQueries').create({
|
|
110
|
+
values
|
|
111
|
+
}),
|
|
112
|
+
data = _yield$apiClient$reso.data;
|
|
113
|
+
const items = yield ctx.refresh();
|
|
114
|
+
const item = items.find(item => {
|
|
115
|
+
var _data$data;
|
|
116
|
+
return item.id === (data === null || data === void 0 ? void 0 : (_data$data = data.data) === null || _data$data === void 0 ? void 0 : _data$data.id);
|
|
117
|
+
});
|
|
118
|
+
onCreateBlockSchema({
|
|
119
|
+
item
|
|
120
|
+
});
|
|
121
|
+
}
|
|
128
122
|
setVisible(false);
|
|
129
|
-
} catch (
|
|
123
|
+
} catch (err) {
|
|
124
|
+
(0, _client2().error)(err);
|
|
125
|
+
}
|
|
130
126
|
});
|
|
131
|
-
return function (
|
|
127
|
+
return function (_x) {
|
|
132
128
|
return _ref.apply(this, arguments);
|
|
133
129
|
};
|
|
134
|
-
}()).catch(
|
|
135
|
-
|
|
136
|
-
|
|
130
|
+
}()).catch(err => {
|
|
131
|
+
(0, _client2().error)(err);
|
|
132
|
+
});
|
|
133
|
+
}, [apiClient, ctx, onCreateBlockSchema, options.components, options.scope, setVisible]);
|
|
134
|
+
const items = (0, _react2().useMemo)(() => {
|
|
135
|
+
const defaultItems = [{
|
|
136
|
+
type: 'itemGroup',
|
|
137
|
+
title: (0, _locale.lang)('Select query data'),
|
|
138
|
+
children: []
|
|
139
|
+
}];
|
|
137
140
|
const chartQueryMetadata = ctx.data;
|
|
138
141
|
if (chartQueryMetadata && Array.isArray(chartQueryMetadata)) {
|
|
139
|
-
|
|
142
|
+
const item1 = chartQueryMetadata.length > 0 ? {
|
|
140
143
|
type: 'itemGroup',
|
|
141
144
|
title: '{{t("Select chart query", {ns: "charts"})}}',
|
|
142
145
|
children: chartQueryMetadata
|
|
143
|
-
} : null
|
|
146
|
+
} : null;
|
|
147
|
+
const item2 = chartQueryMetadata.length > 0 ? {
|
|
144
148
|
type: 'divider'
|
|
145
|
-
} : null
|
|
149
|
+
} : null;
|
|
150
|
+
return [item1, item2, {
|
|
146
151
|
type: 'subMenu',
|
|
147
152
|
title: (0, _locale.lang)('Add chart query'),
|
|
148
153
|
// component: AddChartQuery,
|
|
@@ -157,9 +162,10 @@ const ChartQueryBlockInitializer = props => {
|
|
|
157
162
|
title: 'JSON',
|
|
158
163
|
onClick: onAddQuery
|
|
159
164
|
}]
|
|
160
|
-
}].filter(Boolean)
|
|
165
|
+
}].filter(Boolean);
|
|
161
166
|
}
|
|
162
|
-
|
|
167
|
+
return defaultItems;
|
|
168
|
+
}, [ctx.data, onAddQuery]);
|
|
163
169
|
return _react2().default.createElement(_client().SchemaInitializer.Item, _objectSpread(_objectSpread({
|
|
164
170
|
icon: _react2().default.createElement(_icons().TableOutlined, null)
|
|
165
171
|
}, others), {}, {
|
|
@@ -172,7 +178,7 @@ const ChartQueryBlockInitializer = props => {
|
|
|
172
178
|
});
|
|
173
179
|
setVisible(false);
|
|
174
180
|
});
|
|
175
|
-
function onClick(
|
|
181
|
+
function onClick(_x2) {
|
|
176
182
|
return _onClick.apply(this, arguments);
|
|
177
183
|
}
|
|
178
184
|
return onClick;
|
|
@@ -28,7 +28,7 @@ const useFieldsById = queryId => {
|
|
|
28
28
|
const chartQueryList = ctx === null || ctx === void 0 ? void 0 : ctx.data;
|
|
29
29
|
if (chartQueryList && Array.isArray(chartQueryList)) {
|
|
30
30
|
const currentQuery = chartQueryList.find(chartQuery => chartQuery.id === queryId);
|
|
31
|
-
setFields(currentQuery === null || currentQuery === void 0 ? void 0 : currentQuery.fields);
|
|
31
|
+
setFields((currentQuery === null || currentQuery === void 0 ? void 0 : currentQuery.fields) || []);
|
|
32
32
|
}
|
|
33
33
|
}, [queryId]);
|
|
34
34
|
return {
|
package/lib/client/index.d.ts
CHANGED
package/lib/client/index.js
CHANGED
|
@@ -65,7 +65,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
});
|
|
68
|
-
|
|
68
|
+
const Charts = _react().default.memo(props => {
|
|
69
69
|
const api = (0, _client().useAPIClient)();
|
|
70
70
|
const items = (0, _react().useContext)(_client().SchemaInitializerContext);
|
|
71
71
|
const children = items.BlockInitializers.items[0].children;
|
|
@@ -125,4 +125,6 @@ var _default = _react().default.memo(props => {
|
|
|
125
125
|
value: items
|
|
126
126
|
}, props.children))));
|
|
127
127
|
});
|
|
128
|
+
Charts.displayName = 'Charts';
|
|
129
|
+
var _default = Charts;
|
|
128
130
|
exports.default = _default;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
export declare const ReadPretty: React.MemoExoticComponent<
|
|
2
|
+
export declare const ReadPretty: React.MemoExoticComponent<import("@formily/react").ReactFC<Pick<any, string | number | symbol>>>;
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
export declare const
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export declare const AddNewQuery: () => React.JSX.Element;
|
|
3
|
+
export declare const EditQuery: () => React.JSX.Element;
|
|
@@ -54,8 +54,8 @@ function _react2() {
|
|
|
54
54
|
return data;
|
|
55
55
|
}
|
|
56
56
|
var _ChartQueryMetadataProvider = require("../ChartQueryMetadataProvider");
|
|
57
|
-
var _queryTypes = require("./queryTypes");
|
|
58
57
|
var _locale = require("../locale");
|
|
58
|
+
var _queryTypes = require("./queryTypes");
|
|
59
59
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
60
60
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
61
61
|
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
@@ -188,36 +188,44 @@ const AddNewQuery = () => {
|
|
|
188
188
|
schema = _useState4[0],
|
|
189
189
|
setSchema = _useState4[1];
|
|
190
190
|
const form = (0, _react2().useMemo)(() => (0, _core().createForm)(), []);
|
|
191
|
-
const menu = _react2().
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
191
|
+
const menu = (0, _react2().useMemo)(() => {
|
|
192
|
+
return {
|
|
193
|
+
onClick: info => {
|
|
194
|
+
setVisible(true);
|
|
195
|
+
form.setValues({
|
|
196
|
+
type: info.key
|
|
197
|
+
});
|
|
198
|
+
setSchema(getSchema({
|
|
199
|
+
type: info.key
|
|
200
|
+
}, {
|
|
201
|
+
form,
|
|
202
|
+
isNewRecord: true
|
|
203
|
+
}));
|
|
204
|
+
},
|
|
205
|
+
items: [{
|
|
206
|
+
key: 'json',
|
|
207
|
+
label: 'JSON'
|
|
199
208
|
}, {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
return _react2().default.createElement(_client().ActionContext.Provider, {
|
|
209
|
+
key: 'sql',
|
|
210
|
+
label: 'SQL'
|
|
211
|
+
}, {
|
|
212
|
+
key: 'api',
|
|
213
|
+
label: 'API',
|
|
214
|
+
disabled: true
|
|
215
|
+
}, {
|
|
216
|
+
key: 'collection',
|
|
217
|
+
label: 'Collection',
|
|
218
|
+
disabled: true
|
|
219
|
+
}]
|
|
220
|
+
};
|
|
221
|
+
}, [form]);
|
|
222
|
+
return _react2().default.createElement(_client().ActionContextProvider, {
|
|
215
223
|
value: {
|
|
216
224
|
visible,
|
|
217
225
|
setVisible
|
|
218
226
|
}
|
|
219
227
|
}, _react2().default.createElement(_antd().Dropdown, {
|
|
220
|
-
|
|
228
|
+
menu: menu
|
|
221
229
|
}, _react2().default.createElement(_antd().Button, {
|
|
222
230
|
icon: _react2().default.createElement(_icons().PlusOutlined, null),
|
|
223
231
|
type: 'primary'
|
|
@@ -241,7 +249,7 @@ const EditQuery = () => {
|
|
|
241
249
|
form,
|
|
242
250
|
isNewRecord: false
|
|
243
251
|
});
|
|
244
|
-
return _react2().default.createElement(_client().
|
|
252
|
+
return _react2().default.createElement(_client().ActionContextProvider, {
|
|
245
253
|
value: {
|
|
246
254
|
visible,
|
|
247
255
|
setVisible
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export declare const ConfigureFields: () => React.JSX.Element;
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export declare const QueriesTable: () => React.JSX.Element;
|
package/package.json
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nocobase/plugin-charts",
|
|
3
|
-
"
|
|
3
|
+
"displayName": "charts",
|
|
4
|
+
"displayName.zh-CN": "图表",
|
|
5
|
+
"description": "Out-of-the-box, feature-rich chart plugins.",
|
|
6
|
+
"description.zh-CN": "开箱即用、丰富的报表。",
|
|
7
|
+
"version": "0.10.0-alpha.3",
|
|
4
8
|
"main": "lib/server/index.js",
|
|
5
9
|
"devDependencies": {
|
|
6
|
-
"@nocobase/client": "0.
|
|
7
|
-
"@nocobase/server": "0.
|
|
8
|
-
"@nocobase/test": "0.
|
|
10
|
+
"@nocobase/client": "0.10.0-alpha.3",
|
|
11
|
+
"@nocobase/server": "0.10.0-alpha.3",
|
|
12
|
+
"@nocobase/test": "0.10.0-alpha.3"
|
|
9
13
|
},
|
|
10
14
|
"dependencies": {
|
|
11
15
|
"json5": "^2.2.3"
|
|
12
16
|
},
|
|
13
|
-
"gitHead": "
|
|
17
|
+
"gitHead": "1f0b27fc9ab2398cd41c308a6b01a986e025cd20"
|
|
14
18
|
}
|
|
@@ -20,24 +20,27 @@ import DataSetPreviewTable from './DataSetPreviewTable';
|
|
|
20
20
|
import { lang, useChartsTranslation } from './locale';
|
|
21
21
|
import { templates } from './templates';
|
|
22
22
|
|
|
23
|
-
export const Options = observer(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
form
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
}
|
|
23
|
+
export const Options = observer(
|
|
24
|
+
(props) => {
|
|
25
|
+
const form = useForm<ChartFormInterface>();
|
|
26
|
+
const field = useField<Field>();
|
|
27
|
+
const [s, setSchema] = useState(new Schema({}));
|
|
28
|
+
const [chartType, setChartType] = useState(form.values.type);
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
// form.clearFormGraph('options.*');
|
|
31
|
+
setChartType(form?.values?.type);
|
|
32
|
+
if (chartType !== form?.values?.type) {
|
|
33
|
+
form.clearFormGraph('options.*');
|
|
34
|
+
}
|
|
35
|
+
if (form.values.type) {
|
|
36
|
+
const template = templates.get(form.values.type);
|
|
37
|
+
setSchema(new Schema(template.configurableProperties || {}));
|
|
38
|
+
}
|
|
39
|
+
}, [form.values.type]);
|
|
40
|
+
return <RecursionField schema={s} />;
|
|
41
|
+
},
|
|
42
|
+
{ displayName: 'Options' },
|
|
43
|
+
);
|
|
41
44
|
|
|
42
45
|
interface ChartFormInterface {
|
|
43
46
|
type: string;
|
|
@@ -8,7 +8,8 @@ import {
|
|
|
8
8
|
SchemaInitializerButtonContext,
|
|
9
9
|
useAPIClient,
|
|
10
10
|
} from '@nocobase/client';
|
|
11
|
-
import
|
|
11
|
+
import { error } from '@nocobase/utils/client';
|
|
12
|
+
import React, { useCallback, useContext, useMemo } from 'react';
|
|
12
13
|
import { useChartQueryMetadataContext } from './ChartQueryMetadataProvider';
|
|
13
14
|
import { lang } from './locale';
|
|
14
15
|
import { getQueryTypeSchema } from './settings/queryTypes';
|
|
@@ -21,107 +22,121 @@ export interface ChartQueryMetadata {
|
|
|
21
22
|
}
|
|
22
23
|
|
|
23
24
|
export const ChartQueryBlockInitializer = (props) => {
|
|
24
|
-
const defaultItems: any = [
|
|
25
|
-
{
|
|
26
|
-
type: 'itemGroup',
|
|
27
|
-
title: lang('Select query data'),
|
|
28
|
-
children: [],
|
|
29
|
-
},
|
|
30
|
-
];
|
|
31
25
|
const { templateWrap, onCreateBlockSchema, componentType, createBlockSchema, insert, ...others } = props;
|
|
32
26
|
const { setVisible } = useContext(SchemaInitializerButtonContext);
|
|
33
|
-
const [items, setItems] = useState(defaultItems);
|
|
34
27
|
const apiClient = useAPIClient();
|
|
35
28
|
const ctx = useChartQueryMetadataContext();
|
|
36
29
|
const options = useContext(SchemaOptionsContext);
|
|
37
|
-
const onAddQuery = (
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
<
|
|
47
|
-
<
|
|
48
|
-
<
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
title:
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
30
|
+
const onAddQuery = useCallback(
|
|
31
|
+
(info) => {
|
|
32
|
+
FormDialog(
|
|
33
|
+
{
|
|
34
|
+
sql: lang('Add SQL query'),
|
|
35
|
+
json: lang('Add JSON query'),
|
|
36
|
+
}[info.key],
|
|
37
|
+
() => {
|
|
38
|
+
return (
|
|
39
|
+
<div>
|
|
40
|
+
<SchemaComponentOptions scope={options.scope} components={{ ...options.components }}>
|
|
41
|
+
<FormLayout layout={'vertical'}>
|
|
42
|
+
<SchemaComponent
|
|
43
|
+
schema={{
|
|
44
|
+
type: 'object',
|
|
45
|
+
properties: {
|
|
46
|
+
title: {
|
|
47
|
+
title: lang('Title'),
|
|
48
|
+
required: true,
|
|
49
|
+
'x-component': 'Input',
|
|
50
|
+
'x-decorator': 'FormItem',
|
|
51
|
+
},
|
|
52
|
+
options: getQueryTypeSchema(info.key),
|
|
57
53
|
},
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
</div>
|
|
65
|
-
);
|
|
66
|
-
},
|
|
67
|
-
)
|
|
68
|
-
.open({
|
|
69
|
-
initialValues: {
|
|
70
|
-
type: info.key,
|
|
54
|
+
}}
|
|
55
|
+
/>
|
|
56
|
+
</FormLayout>
|
|
57
|
+
</SchemaComponentOptions>
|
|
58
|
+
</div>
|
|
59
|
+
);
|
|
71
60
|
},
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
61
|
+
)
|
|
62
|
+
.open({
|
|
63
|
+
initialValues: {
|
|
64
|
+
type: info.key,
|
|
65
|
+
},
|
|
66
|
+
})
|
|
67
|
+
.then(async (values) => {
|
|
68
|
+
try {
|
|
69
|
+
if (apiClient.resource('chartsQueries')?.create) {
|
|
70
|
+
const { data } = await apiClient.resource('chartsQueries').create({ values });
|
|
71
|
+
const items = (await ctx.refresh()) as any;
|
|
72
|
+
const item = items.find((item) => item.id === data?.data?.id);
|
|
73
|
+
onCreateBlockSchema({ item });
|
|
74
|
+
}
|
|
75
|
+
setVisible(false);
|
|
76
|
+
} catch (err) {
|
|
77
|
+
error(err);
|
|
78
|
+
}
|
|
79
|
+
})
|
|
80
|
+
.catch((err) => {
|
|
81
|
+
error(err);
|
|
82
|
+
});
|
|
83
|
+
},
|
|
84
|
+
[apiClient, ctx, onCreateBlockSchema, options.components, options.scope, setVisible],
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
const items = useMemo(() => {
|
|
88
|
+
const defaultItems: any = [
|
|
89
|
+
{
|
|
90
|
+
type: 'itemGroup',
|
|
91
|
+
title: lang('Select query data'),
|
|
92
|
+
children: [],
|
|
93
|
+
},
|
|
94
|
+
];
|
|
85
95
|
const chartQueryMetadata = ctx.data;
|
|
86
96
|
if (chartQueryMetadata && Array.isArray(chartQueryMetadata)) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
97
|
+
const item1 =
|
|
98
|
+
chartQueryMetadata.length > 0
|
|
99
|
+
? {
|
|
100
|
+
type: 'itemGroup',
|
|
101
|
+
title: '{{t("Select chart query", {ns: "charts"})}}',
|
|
102
|
+
children: chartQueryMetadata,
|
|
103
|
+
}
|
|
104
|
+
: null;
|
|
105
|
+
const item2 =
|
|
106
|
+
chartQueryMetadata.length > 0
|
|
107
|
+
? {
|
|
108
|
+
type: 'divider',
|
|
109
|
+
}
|
|
110
|
+
: null;
|
|
111
|
+
|
|
112
|
+
return [
|
|
113
|
+
item1,
|
|
114
|
+
item2,
|
|
115
|
+
{
|
|
116
|
+
type: 'subMenu',
|
|
117
|
+
title: lang('Add chart query'),
|
|
118
|
+
// component: AddChartQuery,
|
|
119
|
+
children: [
|
|
120
|
+
{
|
|
121
|
+
key: 'sql',
|
|
122
|
+
type: 'item',
|
|
123
|
+
title: 'SQL',
|
|
124
|
+
onClick: onAddQuery,
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
key: 'json',
|
|
128
|
+
type: 'item',
|
|
129
|
+
title: 'JSON',
|
|
130
|
+
onClick: onAddQuery,
|
|
131
|
+
},
|
|
132
|
+
],
|
|
133
|
+
},
|
|
134
|
+
].filter(Boolean);
|
|
123
135
|
}
|
|
124
|
-
|
|
136
|
+
|
|
137
|
+
return defaultItems;
|
|
138
|
+
}, [ctx.data, onAddQuery]);
|
|
139
|
+
|
|
125
140
|
return (
|
|
126
141
|
<SchemaInitializer.Item
|
|
127
142
|
icon={<TableOutlined />}
|
|
@@ -8,7 +8,7 @@ const useFieldsById = (queryId: number) => {
|
|
|
8
8
|
const chartQueryList = ctx?.data;
|
|
9
9
|
if (chartQueryList && Array.isArray(chartQueryList)) {
|
|
10
10
|
const currentQuery = chartQueryList.find((chartQuery) => chartQuery.id === queryId);
|
|
11
|
-
setFields(currentQuery?.fields);
|
|
11
|
+
setFields(currentQuery?.fields || []);
|
|
12
12
|
}
|
|
13
13
|
}, [queryId]);
|
|
14
14
|
return {
|
package/src/client/index.tsx
CHANGED
|
@@ -39,9 +39,9 @@ registerValidateRules({
|
|
|
39
39
|
},
|
|
40
40
|
});
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
const Charts = React.memo((props) => {
|
|
43
43
|
const api = useAPIClient();
|
|
44
|
-
const items = useContext(SchemaInitializerContext);
|
|
44
|
+
const items = useContext<any>(SchemaInitializerContext);
|
|
45
45
|
const children = items.BlockInitializers.items[0].children;
|
|
46
46
|
if (children) {
|
|
47
47
|
const hasChartItem = children.some((child) => child?.component === 'ChartBlockInitializer');
|
|
@@ -99,3 +99,6 @@ export default React.memo((props) => {
|
|
|
99
99
|
</ChartQueryMetadataProvider>
|
|
100
100
|
);
|
|
101
101
|
});
|
|
102
|
+
Charts.displayName = 'Charts';
|
|
103
|
+
|
|
104
|
+
export default Charts;
|
|
@@ -11,26 +11,29 @@ type Composed = {
|
|
|
11
11
|
Object?: React.FC<any>;
|
|
12
12
|
};
|
|
13
13
|
|
|
14
|
-
export const ReadPretty = observer(
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
export const ReadPretty = observer(
|
|
15
|
+
(props: any) => {
|
|
16
|
+
const fieldNames = { ...defaultFieldNames, ...props.fieldNames };
|
|
17
|
+
const field = useField<any>();
|
|
18
|
+
const compile = useCompile();
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
20
|
+
if (!isValid(props.value)) {
|
|
21
|
+
return <div />;
|
|
22
|
+
}
|
|
23
|
+
if (isArrayField(field) && field?.value?.length === 0) {
|
|
24
|
+
return <div />;
|
|
25
|
+
}
|
|
26
|
+
const dataSource = field.dataSource || props.options || [];
|
|
27
|
+
const options = getCurrentOptions(field.value, dataSource, fieldNames);
|
|
28
|
+
return (
|
|
29
|
+
<div>
|
|
30
|
+
{options.map((option, key) => (
|
|
31
|
+
<Tag key={key} color={option[fieldNames.color]} icon={option.icon}>
|
|
32
|
+
{compile(option[fieldNames.label])}
|
|
33
|
+
</Tag>
|
|
34
|
+
))}
|
|
35
|
+
</div>
|
|
36
|
+
);
|
|
37
|
+
},
|
|
38
|
+
{ displayName: 'ReadPretty' },
|
|
39
|
+
);
|
|
@@ -1,25 +1,18 @@
|
|
|
1
|
-
---
|
|
2
|
-
nav:
|
|
3
|
-
path: /client
|
|
4
|
-
group:
|
|
5
|
-
path: /schema-components
|
|
6
|
-
---
|
|
7
|
-
|
|
8
1
|
# Select
|
|
9
2
|
|
|
10
3
|
## Examples
|
|
11
4
|
|
|
12
5
|
### 单选
|
|
13
6
|
|
|
14
|
-
<code src="./demos/demo1.tsx"
|
|
7
|
+
<code src="./demos/demo1.tsx"></code>
|
|
15
8
|
|
|
16
9
|
### 多选
|
|
17
10
|
|
|
18
|
-
<code src="./demos/demo2.tsx"
|
|
11
|
+
<code src="./demos/demo2.tsx"></code>
|
|
19
12
|
|
|
20
13
|
### 值为 Object 类型的 Select
|
|
21
14
|
|
|
22
|
-
<code src="./demos/demo3.tsx"
|
|
15
|
+
<code src="./demos/demo3.tsx"></code>
|
|
23
16
|
|
|
24
17
|
## API
|
|
25
18
|
|
|
@@ -3,18 +3,18 @@ import { createForm } from '@formily/core';
|
|
|
3
3
|
import { ISchema, useForm } from '@formily/react';
|
|
4
4
|
import { uid } from '@formily/shared';
|
|
5
5
|
import {
|
|
6
|
-
|
|
6
|
+
ActionContextProvider,
|
|
7
7
|
SchemaComponent,
|
|
8
8
|
useActionContext,
|
|
9
9
|
useRecord,
|
|
10
10
|
useResourceActionContext,
|
|
11
11
|
useResourceContext,
|
|
12
12
|
} from '@nocobase/client';
|
|
13
|
-
import { Button, Dropdown,
|
|
13
|
+
import { Button, Dropdown, MenuProps } from 'antd';
|
|
14
14
|
import React, { useMemo, useState } from 'react';
|
|
15
15
|
import { useChartQueryMetadataContext } from '../ChartQueryMetadataProvider';
|
|
16
|
-
import { getQueryTypeSchema } from './queryTypes';
|
|
17
16
|
import { lang } from '../locale';
|
|
17
|
+
import { getQueryTypeSchema } from './queryTypes';
|
|
18
18
|
|
|
19
19
|
const useCreateAction = () => {
|
|
20
20
|
const { setVisible } = useActionContext();
|
|
@@ -112,31 +112,46 @@ export const AddNewQuery = () => {
|
|
|
112
112
|
const [visible, setVisible] = useState(false);
|
|
113
113
|
const [schema, setSchema] = useState({});
|
|
114
114
|
const form = useMemo(() => createForm(), []);
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
|
|
116
|
+
const menu = useMemo<MenuProps>(() => {
|
|
117
|
+
return {
|
|
118
|
+
onClick: (info) => {
|
|
118
119
|
setVisible(true);
|
|
119
120
|
form.setValues({ type: info.key });
|
|
120
121
|
setSchema(getSchema({ type: info.key }, { form, isNewRecord: true }));
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
122
|
+
},
|
|
123
|
+
items: [
|
|
124
|
+
{
|
|
125
|
+
key: 'json',
|
|
126
|
+
label: 'JSON',
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
key: 'sql',
|
|
130
|
+
label: 'SQL',
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
key: 'api',
|
|
134
|
+
label: 'API',
|
|
135
|
+
disabled: true,
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
key: 'collection',
|
|
139
|
+
label: 'Collection',
|
|
140
|
+
disabled: true,
|
|
141
|
+
},
|
|
142
|
+
],
|
|
143
|
+
};
|
|
144
|
+
}, [form]);
|
|
145
|
+
|
|
131
146
|
return (
|
|
132
|
-
<
|
|
133
|
-
<Dropdown
|
|
147
|
+
<ActionContextProvider value={{ visible, setVisible }}>
|
|
148
|
+
<Dropdown menu={menu}>
|
|
134
149
|
<Button icon={<PlusOutlined />} type={'primary'}>
|
|
135
150
|
{lang('Add query')} <DownOutlined />
|
|
136
151
|
</Button>
|
|
137
152
|
</Dropdown>
|
|
138
153
|
<SchemaComponent schema={schema} scope={{ useCloseAction, useSubmitAction: useCreateAction }} />
|
|
139
|
-
</
|
|
154
|
+
</ActionContextProvider>
|
|
140
155
|
);
|
|
141
156
|
};
|
|
142
157
|
|
|
@@ -146,7 +161,7 @@ export const EditQuery = () => {
|
|
|
146
161
|
const form = useMemo(() => createForm(), []);
|
|
147
162
|
const schema = getSchema(record, { form, isNewRecord: false });
|
|
148
163
|
return (
|
|
149
|
-
<
|
|
164
|
+
<ActionContextProvider value={{ visible, setVisible }}>
|
|
150
165
|
<a
|
|
151
166
|
onClick={() => {
|
|
152
167
|
form.setValues(record);
|
|
@@ -156,6 +171,6 @@ export const EditQuery = () => {
|
|
|
156
171
|
{lang('Edit')}
|
|
157
172
|
</a>
|
|
158
173
|
<SchemaComponent schema={schema} scope={{ useCloseAction, useSubmitAction: useUpdateAction }} />
|
|
159
|
-
</
|
|
174
|
+
</ActionContextProvider>
|
|
160
175
|
);
|
|
161
176
|
};
|