@cqsjjb/jjb-react-admin-component 3.1.3 → 3.2.0-beta.0

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.
@@ -1,58 +1,66 @@
1
- function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
- import React from 'react';
1
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
+ import React, { useState, useEffect, Fragment } from 'react';
3
3
  import { tools } from '@cqsjjb/jjb-common-lib';
4
4
  import { FileOutlined, LinkOutlined } from '@ant-design/icons';
5
5
  import { Modal, Descriptions, Empty, Image, Tooltip, Spin, Table, Space, TreeSelect } from 'antd';
6
6
  const formilyItemMargin = new Map([['small', 8], ['middle', 12], ['default', 16]]);
7
7
  const IS_PDF_REG = /\.pdf$/;
8
8
  const IS_VIDEO_REG = /\.(mp4|ogg|mkv|webm)$/;
9
- export default function FormilyDescriptions(props) {
10
- const [regions, setRegions] = React.useState([]);
11
- React.useEffect(() => {
9
+ export default function FormilyDescriptions({
10
+ schema,
11
+ values,
12
+ ...props
13
+ }) {
14
+ const [regions, setRegions] = useState([]);
15
+ useEffect(() => {
12
16
  fetch(`${window.process.env.app.API_HOST}/system/operation/regions`, {
13
17
  headers: {
14
18
  token: sessionStorage.token
15
19
  }
16
20
  }).then(res => res.json()).then(res => {
17
- if (res.success) {
18
- setRegions(res.data);
19
- }
21
+ if (res.success) setRegions(res.data);
20
22
  });
21
23
  }, []);
22
- const dataSource = tools.getDynamicFormilyFields(props.schema, props.values, {
24
+ const dataSource = tools.getDynamicFormilyFields(schema, values, {
23
25
  regions
24
26
  });
25
- return dataSource.length === 0 ? /*#__PURE__*/React.createElement(Empty, {
27
+ console.log(schema, values);
28
+ if (!dataSource.length) return /*#__PURE__*/React.createElement(Empty, {
26
29
  image: Empty.PRESENTED_IMAGE_SIMPLE
27
- }) : /*#__PURE__*/React.createElement(DescriptionsRender, _extends({
30
+ });
31
+ return /*#__PURE__*/React.createElement(DescriptionsRender, _extends({
28
32
  dataSource: dataSource
29
33
  }, props));
30
34
  }
31
- function DescriptionsRender(props) {
32
- return props.dataSource.map((item, index) => {
33
- const isLast = index === props.dataSource.length - 1;
35
+ export function DescriptionsRender({
36
+ dataSource,
37
+ size = 'default',
38
+ ...props
39
+ }) {
40
+ return dataSource.map((item, index) => {
41
+ const isLast = index === dataSource.length - 1;
42
+ const marginBottom = isLast ? 0 : formilyItemMargin.get(size);
43
+ const items = item.fromComponentEnum === 'GRID_FORM' ? item.children.map((child, childIndex) => ({
44
+ key: childIndex,
45
+ span: child.formType === 'Table' ? props.column : 1,
46
+ label: child.name,
47
+ children: /*#__PURE__*/React.createElement(ItemRender, _extends({
48
+ data: child
49
+ }, props))
50
+ })) : [{
51
+ key: 1,
52
+ label: item.name,
53
+ children: /*#__PURE__*/React.createElement(ItemRender, _extends({
54
+ data: item
55
+ }, props))
56
+ }];
34
57
  return /*#__PURE__*/React.createElement(Descriptions, {
35
58
  key: index,
36
- size: props.size,
59
+ size: size,
37
60
  style: {
38
- marginBottom: isLast ? 0 : formilyItemMargin.get(props.size || 'default')
61
+ marginBottom
39
62
  },
40
- items: item.fromComponentEnum === 'GRID_FORM' ? item.children.map((child, childIndex) => {
41
- return {
42
- key: childIndex,
43
- span: child.formType === 'Table' ? props.column : 1,
44
- label: child.name,
45
- children: /*#__PURE__*/React.createElement(ItemRender, _extends({
46
- data: child
47
- }, props))
48
- };
49
- }) : [{
50
- key: 1,
51
- label: item.name,
52
- children: /*#__PURE__*/React.createElement(ItemRender, _extends({
53
- data: item
54
- }, props))
55
- }],
63
+ items: items,
56
64
  colon: props.colon,
57
65
  title: props.title,
58
66
  extra: props.extra,
@@ -63,69 +71,61 @@ function DescriptionsRender(props) {
63
71
  });
64
72
  });
65
73
  }
66
- function ItemRender(props) {
67
- const [open, setOpen] = React.useState(false);
68
- const [previewUrl, setPreviewUrl] = React.useState('');
69
- const {
70
- data,
71
- imageWidth,
72
- imageHeight,
73
- imagePreview,
74
- extraFileLink
75
- } = props;
76
- return /*#__PURE__*/React.createElement(React.Fragment, null, tools.isArray(data.value)
77
- // 如果数据是字符串集合 或 数字集合
78
- ? tools.isStringArray(data.value) || tools.isNumberArray(data.value)
79
- // 直接字符串拼接
80
- ? data.value.join('、')
81
- // 如果是对象集合
82
- : tools.isObjectArray(data.value)
83
- // 如果数据表单类型是 数据表格
84
- ? data.formType === 'Table'
85
- // 处理数据表格
86
- ? /*#__PURE__*/React.createElement("div", {
87
- style: {
88
- width: '100%'
89
- }
90
- }, /*#__PURE__*/React.createElement(RenderTable, {
91
- columns: data.tableColumns,
92
- dataSource: data.value,
93
- imageWidth: imageWidth,
94
- imageHeight: imageHeight,
95
- imagePreview: imagePreview,
96
- extraFileLink: extraFileLink,
97
- onPreview: url => {
98
- setOpen(true);
99
- setPreviewUrl(url);
100
- }
101
- }))
102
-
103
- // 否则就是文件数据
104
- : /*#__PURE__*/React.createElement("div", null, data.value.map((file, index) => /*#__PURE__*/React.createElement(RenderFileItem, {
105
- key: index,
106
- url: file.url,
107
- name: file.name,
108
- isImage: file.isImage,
109
- imageWidth: imageWidth,
110
- imageHeight: imageHeight,
111
- imagePreview: imagePreview,
112
- extraFileLink: extraFileLink,
113
- onPreview: () => {
114
- setOpen(true);
115
- setPreviewUrl(file.url);
74
+ export function ItemRender({
75
+ data,
76
+ imageWidth,
77
+ imageHeight,
78
+ imagePreview,
79
+ extraFileLink,
80
+ ...props
81
+ }) {
82
+ const [open, setOpen] = useState(false);
83
+ const [previewUrl, setPreviewUrl] = useState('');
84
+ const handlePreview = url => {
85
+ setPreviewUrl(url);
86
+ setOpen(true);
87
+ };
88
+ const renderContent = () => {
89
+ if (tools.isArray(data.value)) {
90
+ if (tools.isStringArray(data.value) || tools.isNumberArray(data.value)) {
91
+ return data.value.join('、');
92
+ }
93
+ if (tools.isObjectArray(data.value)) {
94
+ return data.formType === 'Table' ? /*#__PURE__*/React.createElement(RenderTable, {
95
+ columns: data.tableColumns,
96
+ dataSource: data.value,
97
+ imageWidth: imageWidth,
98
+ imageHeight: imageHeight,
99
+ imagePreview: imagePreview,
100
+ extraFileLink: extraFileLink,
101
+ onPreview: handlePreview
102
+ }) : data.value.map((file, index) => /*#__PURE__*/React.createElement(RenderFileItem, {
103
+ key: index,
104
+ url: file.url,
105
+ name: file.name,
106
+ isImage: file.isImage,
107
+ imageWidth: imageWidth,
108
+ imageHeight: imageHeight,
109
+ imagePreview: imagePreview,
110
+ extraFileLink: extraFileLink,
111
+ onPreview: () => handlePreview(file.url)
112
+ }));
113
+ }
114
+ return tools.textPlaceholder();
116
115
  }
117
- }))) : tools.textPlaceholder()
118
- // 处理文本数据
119
- : /*#__PURE__*/React.createElement(RenderText, {
120
- name: data.name,
121
- value: data.value,
122
- renderItemText: props.renderItemText
123
- }), /*#__PURE__*/React.createElement(Modal, {
116
+ return /*#__PURE__*/React.createElement(RenderText, {
117
+ name: data.name,
118
+ value: data.value,
119
+ maxTagCount: props.maxTagCount,
120
+ renderItemText: props.renderItemText
121
+ });
122
+ };
123
+ return /*#__PURE__*/React.createElement(Fragment, null, renderContent(), /*#__PURE__*/React.createElement(Modal, {
124
124
  destroyOnClose: true,
125
125
  title: "\u67E5\u770B\u6587\u4EF6",
126
126
  open: open,
127
127
  width: 1100,
128
- footer: false,
128
+ footer: null,
129
129
  onCancel: () => setOpen(false)
130
130
  }, IS_PDF_REG.test(previewUrl) && /*#__PURE__*/React.createElement("embed", {
131
131
  src: previewUrl,
@@ -135,90 +135,92 @@ function ItemRender(props) {
135
135
  controls: true,
136
136
  src: previewUrl,
137
137
  width: "100%",
138
- height: "350"
138
+ height: 350
139
139
  })));
140
140
  }
141
- function RenderText(props) {
142
- const {
143
- value
144
- } = props;
145
- const [text, setText] = React.useState();
146
- const [options, setOptions] = React.useState([]);
147
- const [loading, setLoading] = React.useState(false);
148
- React.useEffect(() => {
149
- if (value) {
150
- if (value.load) {
151
- setLoading(true);
152
- value.load().then(res => res.json()).then(res => {
153
- if (res.success) {
154
- setOptions(res.data);
155
- setText(value?.selected?.map?.(i => `${i.key}&${i.label}`));
156
- }
157
- setLoading(false);
158
- });
159
- } else {
160
- setText(value);
161
- }
162
- }
163
- }, [props.value]);
164
- return Array.isArray(text) ? /*#__PURE__*/React.createElement("div", {
165
- style: {
166
- gap: 6,
167
- width: '100%',
168
- display: 'flex',
169
- minHeight: 22,
170
- flexDirection: 'column'
141
+ export function RenderText({
142
+ value,
143
+ name,
144
+ maxTagCount = 1,
145
+ renderItemText
146
+ }) {
147
+ const [text, setText] = useState();
148
+ const [options, setOptions] = useState([]);
149
+ const [loading, setLoading] = useState(false);
150
+ useEffect(() => {
151
+ if (!value) return;
152
+ if (value.load) {
153
+ setLoading(true);
154
+ value.load().then(res => res.json()).then(res => {
155
+ if (res.success) {
156
+ setOptions(res.data);
157
+ setText(value?.selected?.map(i => `${i.key}&${i.label}`));
158
+ }
159
+ setLoading(false);
160
+ });
161
+ } else {
162
+ setText(value);
171
163
  }
172
- }, /*#__PURE__*/React.createElement(Spin, {
173
- spinning: loading
174
- }, /*#__PURE__*/React.createElement(TreeSelect, {
175
- treeCheckable: true,
176
- treeDefaultExpandAll: true,
177
- style: {
178
- width: '100%'
179
- },
180
- value: text,
181
- variant: "borderless",
182
- treeData: options,
183
- showSearch: false,
184
- maxTagCount: 1
185
- }))) : props.renderItemText ? props.renderItemText({
164
+ }, [value]);
165
+ if (Array.isArray(text)) {
166
+ return /*#__PURE__*/React.createElement("div", {
167
+ style: {
168
+ gap: 6,
169
+ width: '100%',
170
+ display: 'flex',
171
+ minHeight: 22,
172
+ flexDirection: 'column'
173
+ }
174
+ }, /*#__PURE__*/React.createElement(Spin, {
175
+ spinning: loading
176
+ }, /*#__PURE__*/React.createElement(TreeSelect, {
177
+ treeCheckable: true,
178
+ treeDefaultExpandAll: true,
179
+ style: {
180
+ width: '100%'
181
+ },
182
+ value: text,
183
+ variant: "borderless",
184
+ treeData: options,
185
+ showSearch: false,
186
+ maxTagCount: maxTagCount
187
+ })));
188
+ }
189
+ return renderItemText ? renderItemText({
186
190
  text,
187
- name: props.name
191
+ name
188
192
  }) : tools.textPlaceholder(text);
189
193
  }
190
- function RenderFileItem({
191
- url,
192
- name,
193
- isImage,
194
- imageWidth,
195
- imageHeight,
196
- imagePreview,
197
- extraFileLink,
198
- onPreview
199
- }) {
200
- if (isImage) {
201
- return /*#__PURE__*/React.createElement(RenderImage, {
202
- url: url,
203
- imageWidth: imageWidth,
204
- imageHeight: imageHeight,
205
- imagePreview: imagePreview,
206
- extraFileLink: extraFileLink
207
- });
208
- } else {
209
- return /*#__PURE__*/React.createElement(Tooltip, {
210
- title: url
211
- }, IS_PDF_REG.test(url) || IS_VIDEO_REG.test(url) ? /*#__PURE__*/React.createElement(RenderValidFile, {
212
- url: url,
213
- name: name,
214
- onPreview: onPreview
215
- }) : /*#__PURE__*/React.createElement(RenderInvalidFile, {
216
- url: url,
217
- name: name
218
- }));
219
- }
194
+ export function RenderFileItem(props) {
195
+ const {
196
+ isImage,
197
+ url,
198
+ name,
199
+ imageWidth,
200
+ imageHeight,
201
+ imagePreview,
202
+ extraFileLink,
203
+ onPreview
204
+ } = props;
205
+ return isImage ? /*#__PURE__*/React.createElement(RenderImage, {
206
+ url: url,
207
+ imageWidth: imageWidth,
208
+ imageHeight: imageHeight,
209
+ imagePreview: imagePreview,
210
+ extraFileLink: extraFileLink
211
+ }) : /*#__PURE__*/React.createElement(Tooltip, {
212
+ title: url
213
+ }, IS_PDF_REG.test(url) || IS_VIDEO_REG.test(url) ? /*#__PURE__*/React.createElement(RenderValidFile, {
214
+ url: url,
215
+ name: name,
216
+ onPreview: onPreview,
217
+ extraFileLink: extraFileLink
218
+ }) : /*#__PURE__*/React.createElement(RenderInvalidFile, {
219
+ url: url,
220
+ name: name
221
+ }));
220
222
  }
221
- function RenderImage({
223
+ export function RenderImage({
222
224
  url,
223
225
  imageWidth,
224
226
  imageHeight,
@@ -237,48 +239,41 @@ function RenderImage({
237
239
  height: imageHeight || 64,
238
240
  preview: extraFileLink ? {
239
241
  visible: false,
240
- onVisibleChange: () => {
241
- window.open(url);
242
- }
242
+ onVisibleChange: () => window.open(url)
243
243
  } : imagePreview
244
244
  }));
245
245
  }
246
- function RenderValidFile({
246
+ export function RenderValidFile({
247
247
  url,
248
248
  name,
249
249
  extraFileLink,
250
250
  onPreview
251
251
  }) {
252
+ const handleClick = () => extraFileLink ? window.open(url) : onPreview();
252
253
  return /*#__PURE__*/React.createElement("a", {
253
254
  style: {
254
255
  gap: 4,
255
256
  display: 'flex',
256
257
  alignItems: 'center'
257
258
  },
258
- onClick: () => {
259
- if (extraFileLink) {
260
- window.open(url);
261
- } else {
262
- onPreview();
263
- }
264
- }
259
+ onClick: handleClick
265
260
  }, /*#__PURE__*/React.createElement(FileOutlined, null), name);
266
261
  }
267
- function RenderInvalidFile({
262
+ export function RenderInvalidFile({
268
263
  url,
269
264
  name
270
265
  }) {
271
266
  return /*#__PURE__*/React.createElement("a", {
272
267
  href: url,
268
+ target: "_blank",
273
269
  style: {
274
270
  gap: 4,
275
271
  display: 'flex',
276
272
  alignItems: 'center'
277
- },
278
- target: "_blank"
273
+ }
279
274
  }, /*#__PURE__*/React.createElement(LinkOutlined, null), name);
280
275
  }
281
- function RenderTable({
276
+ export function RenderTable({
282
277
  columns,
283
278
  dataSource,
284
279
  imageWidth,
@@ -287,39 +282,33 @@ function RenderTable({
287
282
  extraFileLink,
288
283
  onPreview
289
284
  }) {
285
+ const renderColumn = col => {
286
+ const originalRender = col.render;
287
+ col.render = row => {
288
+ if (tools.isNumberArray(row) || tools.isStringArray(row)) return row.join(',');
289
+ if (tools.isUploadFileListArray(row)) {
290
+ return /*#__PURE__*/React.createElement(Space, {
291
+ direction: "vertical"
292
+ }, tools.getDynamicUploadFileList(row).map((file, index) => /*#__PURE__*/React.createElement(RenderFileItem, {
293
+ key: index,
294
+ url: file.url,
295
+ name: file.name,
296
+ isImage: file.isImage,
297
+ imageWidth: imageWidth,
298
+ imageHeight: imageHeight,
299
+ imagePreview: imagePreview,
300
+ extraFileLink: extraFileLink,
301
+ onPreview: () => onPreview(file.url)
302
+ })));
303
+ }
304
+ if (tools.isObject(row)) return '数据错误';
305
+ return originalRender ? originalRender(row) : row;
306
+ };
307
+ return col;
308
+ };
290
309
  return /*#__PURE__*/React.createElement(Table, {
291
310
  rowKey: (record, index) => index,
292
- columns: columns.map(item => {
293
- item.render = row => {
294
- if (tools.isNumberArray(row) || tools.isStringArray(row)) {
295
- return row?.join(',');
296
- }
297
- if (tools.isUploadFileListArray(row)) {
298
- return /*#__PURE__*/React.createElement(Space, {
299
- direction: "vertical"
300
- }, tools.getDynamicUploadFileList(row).map((file, index) => {
301
- return /*#__PURE__*/React.createElement(RenderFileItem, {
302
- key: index,
303
- url: file.url,
304
- name: file.name,
305
- isImage: file.isImage,
306
- imageWidth: imageWidth,
307
- imageHeight: imageHeight,
308
- imagePreview: imagePreview,
309
- extraFileLink: extraFileLink,
310
- onPreview: () => {
311
- onPreview(file.url);
312
- }
313
- });
314
- }));
315
- }
316
- if (tools.isObject(row)) {
317
- return '数据错误';
318
- }
319
- return row;
320
- };
321
- return item;
322
- }),
311
+ columns: columns.map(renderColumn),
323
312
  dataSource: dataSource
324
313
  });
325
314
  }
@@ -1,38 +1,21 @@
1
- // @ts-ignore
2
1
  import * as React from 'react';
3
- import { ComponentProps } from '../types';
2
+ import { CSSProperties } from 'react';
4
3
 
5
- interface FormilyRendererProps extends ComponentProps {
6
- /**
7
- * @description 表单code
8
- */
9
- code: string,
10
- /**
11
- * @description 表单初始化值
12
- */
13
- initialValues?: Record<string, any>,
14
- /**
15
- * @description 禁用字段
16
- */
17
- disabledFields?: string[];
18
- /**
19
- * @description 获取表单示例
20
- * @see https://core.formilyjs.org/api/models/form#method
21
- */
22
- getRef?: (form: object) => void;
23
- /**
24
- * @description 图片高度
25
- */
26
- width?: number;
27
- /**
28
- * @description 样式
29
- * @see https://ant.design/components/image-cn#previewtype
30
- */
31
- style?: React.CSSProperties
4
+ export interface FormilyRendererProps {
5
+ /** 设计编码,用于请求后端配置 */
6
+ code: string;
7
+ /** 初始表单值 */
8
+ initialValues?: Record<string, any>;
9
+ /** 需要禁用的字段 */
10
+ disabledFields?: string[] | string;
11
+ /** 样式 */
12
+ style?: CSSProperties;
13
+ /** 获取内部 formRef 的回调 */
14
+ getRef?: (ref: React.RefObject<any>) => void;
32
15
  }
33
16
 
34
- interface FormilyRendererFc extends React.FC<FormilyRendererProps> {
35
- }
17
+ declare const FormilyRenderer: React.ForwardRefExoticComponent<
18
+ FormilyRendererProps & React.RefAttributes<any>
19
+ >;
36
20
 
37
- declare const FormilyRenderer: FormilyRendererFc;
38
21
  export default FormilyRenderer;
@@ -1,38 +1,58 @@
1
- import React from 'react';
1
+ import React, { useEffect, useRef, useState, forwardRef, useImperativeHandle } from 'react';
2
2
  import Renderer from '@cqsjjb-formily/renderer';
3
3
  import { http, tools } from '@cqsjjb/jjb-common-lib';
4
- export default /*#__PURE__*/React.forwardRef((props, ref) => {
5
- const form = React.useRef();
6
- const [schema, setSchema] = React.useState({});
7
- React.useEffect(() => {
8
- http.Get(`/design/designs/${props.code}`).then(res => {
9
- if (res.success) {
4
+ const FormilyRenderer = /*#__PURE__*/forwardRef((props, ref) => {
5
+ const {
6
+ code,
7
+ style,
8
+ initialValues = {},
9
+ disabledFields = [],
10
+ getRef
11
+ } = props;
12
+ const formRef = useRef(null);
13
+ const [schema, setSchema] = useState({});
14
+
15
+ // 暴露 formRef 给父组件
16
+ useImperativeHandle(ref, () => formRef.current);
17
+ useEffect(() => {
18
+ let isMounted = true;
19
+
20
+ // 获取设计配置
21
+ http.Get(`/design/designs/${code}`).then(res => {
22
+ if (isMounted && res.success) {
10
23
  const {
11
24
  config
12
25
  } = res.data;
13
26
  setSchema(tools.parseObject(config));
14
27
  }
15
28
  });
16
- }, []);
17
- React.useEffect(() => {
18
- if (ref) {
19
- ref.current = form.current;
20
- }
21
- form.current.setValues(props.initialValues);
22
- setTimeout(() => {
23
- for (const field of tools.toArray(props.disabledFields)) {
24
- if (form.current.fields[field]) {
25
- form.current.fields[field].required = false;
26
- form.current.fields[field].disabled = true;
27
- }
29
+ return () => {
30
+ isMounted = false;
31
+ };
32
+ }, [code]);
33
+ useEffect(() => {
34
+ if (!formRef.current || !Object.keys(schema).length) return;
35
+
36
+ // 设置初始值
37
+ formRef.current.setValues(initialValues);
38
+
39
+ // 禁用字段
40
+ tools.toArray(disabledFields).forEach(field => {
41
+ const f = formRef.current.fields[field];
42
+ if (f) {
43
+ f.required = false;
44
+ f.disabled = true;
28
45
  }
29
- }, 1000);
30
- props.getRef && props.getRef(form);
31
- }, [schema]);
46
+ });
47
+
48
+ // 返回 formRef 给父组件
49
+ getRef && getRef(formRef);
50
+ }, [schema, initialValues, disabledFields, getRef]);
32
51
  return /*#__PURE__*/React.createElement("div", {
33
- style: props.style
52
+ style: style
34
53
  }, /*#__PURE__*/React.createElement(Renderer, {
35
- ref: form,
54
+ ref: formRef,
36
55
  schema: schema
37
56
  }));
38
- });
57
+ });
58
+ export default FormilyRenderer;