Commit a5dc3a3e8a632980e1bcd1bbbde5df709a193845
Merge branch 'feature/dataflow' of http://gitlab.qgutech.com/tianqiang/qx-common…
… into feature/dataflow
Showing
13 changed files
with
482 additions
and
216 deletions
1 | 1 | { |
2 | 2 | "name": "@qx/common", |
3 | - "version": "3.0.0-alpha.6", | |
3 | + "version": "3.0.0-alpha.8", | |
4 | 4 | "lockfileVersion": 2, |
5 | 5 | "requires": true, |
6 | 6 | "packages": { |
7 | 7 | "": { |
8 | 8 | "name": "@qx/common", |
9 | - "version": "3.0.0-alpha.6", | |
9 | + "version": "3.0.0-alpha.8", | |
10 | 10 | "license": "MIT", |
11 | 11 | "dependencies": { |
12 | 12 | "@ant-design/icons": "^5.2.5", | ... | ... |
... | ... | @@ -35,10 +35,11 @@ |
35 | 35 | .qx-field-setter { |
36 | 36 | display: flex; |
37 | 37 | width: 100%; |
38 | - background-color: transparent; | |
39 | 38 | border: 1px solid @N4; |
40 | 39 | border-radius: 4px; |
41 | 40 | min-height: 32px; |
41 | + box-sizing: border-box; | |
42 | + background-color: transparent; | |
42 | 43 | |
43 | 44 | &__icon-text { |
44 | 45 | color: @N9; |
... | ... | @@ -64,48 +65,62 @@ |
64 | 65 | border-radius: 4px 0 0 4px; |
65 | 66 | box-sizing: border-box; |
66 | 67 | } |
68 | + | |
67 | 69 | .ant-select-single:not(.ant-select-customize-input) .ant-select-selector { |
68 | 70 | padding: 0 4px 0 8px; |
69 | 71 | } |
72 | + | |
70 | 73 | .ant-picker { |
71 | 74 | padding: 4px 8px; |
72 | 75 | } |
76 | + | |
73 | 77 | .ant-input-number-input { |
74 | 78 | padding: 0 8px; |
75 | 79 | line-height: 30px; |
76 | 80 | } |
81 | + | |
77 | 82 | .ant-select.select.qx-filter-select { |
78 | - width: calc(100% - 24px); | |
83 | + width: calc(100% - 32px); | |
79 | 84 | padding: 0; |
80 | 85 | .ant-select-selector { |
86 | + border-radius: 6px 0 0 6px; | |
87 | + } | |
88 | + | |
89 | + .ant-select-selector { | |
81 | 90 | min-height: 32px; |
82 | 91 | padding: 0 4px 4px 8px; |
83 | 92 | } |
93 | + | |
84 | 94 | .ant-select-selection-overflow-item { |
85 | 95 | height: 28px; |
86 | 96 | } |
97 | + | |
87 | 98 | .ant-select-selection-placeholder { |
88 | 99 | left: 8px; |
89 | 100 | } |
101 | + | |
90 | 102 | .ant-select-selection-overflow-item-suffix { |
91 | 103 | padding-top: 4px; |
92 | 104 | } |
93 | 105 | } |
94 | 106 | |
95 | 107 | .ant-select-focused:not(.ant-select-disabled).ant-select:not(.ant-select-customize-input) |
96 | - .ant-select-selector { | |
108 | + .ant-select-selector { | |
97 | 109 | box-shadow: none; |
98 | 110 | } |
111 | + | |
99 | 112 | .ant-picker { |
100 | 113 | padding: 4px 8px; |
101 | 114 | } |
102 | 115 | |
103 | 116 | .ant-tag { |
104 | 117 | font-size: 14px; |
118 | + | |
105 | 119 | .anticon + span { |
106 | 120 | margin-left: 0; |
107 | 121 | } |
108 | 122 | } |
123 | + | |
109 | 124 | // todo 目前表单名字过长导致页面变形 |
110 | 125 | .qx-tags-input.ant-input .ant-tag, |
111 | 126 | .tag.qx-select-tag { |
... | ... | @@ -131,10 +146,12 @@ |
131 | 146 | font-size: 8px; |
132 | 147 | } |
133 | 148 | } |
149 | + | |
134 | 150 | .qx-tags-input__box { |
135 | 151 | margin-top: 4px; |
136 | 152 | padding-left: 0; |
137 | 153 | } |
154 | + | |
138 | 155 | .qx-tags-input.ant-input > .ant-tag:first-child { |
139 | 156 | margin-left: unset; |
140 | 157 | } | ... | ... |
... | ... | @@ -7,7 +7,6 @@ import { QxAppSelector } from '../qx-app-selector'; |
7 | 7 | import type { InputSelectProps } from '../qx-input-select'; |
8 | 8 | import { QxInputSelect } from '../qx-input-select'; |
9 | 9 | |
10 | -import { getFunInfo } from './service'; | |
11 | 10 | import './styles.less'; |
12 | 11 | |
13 | 12 | const prefix = 'qx-form-select'; |
... | ... | @@ -26,7 +25,7 @@ export const QxFormSelect: React.FC<FormSelectProps> = (props) => { |
26 | 25 | request, |
27 | 26 | disabled, |
28 | 27 | placeholder, |
29 | - title, | |
28 | + title | |
30 | 29 | } = props; |
31 | 30 | |
32 | 31 | const [state, setState] = useSetState<FormSelectState>({ |
... | ... | @@ -40,25 +39,10 @@ export const QxFormSelect: React.FC<FormSelectProps> = (props) => { |
40 | 39 | if (!val?.code) return; |
41 | 40 | function onOk() { |
42 | 41 | if (val?.code) { |
43 | - getFunInfo(request, val.code) | |
44 | - .then((res: any) => { | |
45 | - if (res) { | |
46 | - onChange?.({ | |
47 | - ...res, | |
48 | - appId: res.extract?.appId || val.appId, | |
49 | - isTree: res.extract?.isTree, | |
50 | - funId: res.code, | |
51 | - }); | |
52 | - } | |
53 | - setState({ | |
54 | - visible: false, | |
55 | - }); | |
56 | - }) | |
57 | - .catch(() => { | |
58 | - setState({ | |
59 | - visible: false, | |
60 | - }); | |
61 | - }); | |
42 | + onChange?.(val); | |
43 | + setState({ | |
44 | + visible: false, | |
45 | + }); | |
62 | 46 | } |
63 | 47 | } |
64 | 48 | onOk(); |
... | ... | @@ -96,6 +80,7 @@ export const QxFormSelect: React.FC<FormSelectProps> = (props) => { |
96 | 80 | ), |
97 | 81 | }} |
98 | 82 | disabled={disabled} |
83 | + popupOnBody={props?.popupOnBody} | |
99 | 84 | /> |
100 | 85 | |
101 | 86 | {state.modalVisible ? ( |
... | ... | @@ -129,6 +114,7 @@ interface FormSelectProps extends InputSelectProps { |
129 | 114 | appId?: string; |
130 | 115 | request?: any; |
131 | 116 | disabled?: boolean; |
117 | + popupOnBody?: boolean; | |
132 | 118 | } |
133 | 119 | interface FormSelectState { |
134 | 120 | visible: boolean; | ... | ... |
src/qx-form-select/service.ts
deleted
100644 → 0
... | ... | @@ -73,7 +73,13 @@ export const QxInputSelect = React.forwardRef<any, InputSelectProps>( |
73 | 73 | {...dropdownProps} |
74 | 74 | /> |
75 | 75 | )} |
76 | - getPopupContainer={(triggerNode) => triggerNode} | |
76 | + getPopupContainer={(triggerNode) => { | |
77 | + if (props?.popupOnBody) { | |
78 | + return document.body; | |
79 | + } else { | |
80 | + return triggerNode; | |
81 | + } | |
82 | + }} | |
77 | 83 | onOpenChange={onVisibleChange} |
78 | 84 | disabled={disabled} |
79 | 85 | > |
... | ... | @@ -96,6 +102,7 @@ export interface InputSelectProps extends Omit<InputProps, 'onChange'> { |
96 | 102 | options?: DropdownContentOptions[]; |
97 | 103 | dropdownProps?: DropdownContentProps; |
98 | 104 | disabled?: boolean; |
105 | + popupOnBody?: boolean; | |
99 | 106 | } |
100 | 107 | export interface InputSelectState { |
101 | 108 | visible: boolean; | ... | ... |
1 | 1 | /* eslint-disable array-callback-return */ |
2 | 2 | /* eslint-disable eqeqeq */ |
3 | 3 | import { |
4 | - DeleteOutlined, | |
5 | - PlusOutlined, | |
6 | - SisternodeOutlined, | |
7 | 4 | SnippetsOutlined, |
8 | 5 | } from '@ant-design/icons'; |
9 | 6 | import { |
... | ... | @@ -30,7 +27,7 @@ import React, { |
30 | 27 | } from 'react'; |
31 | 28 | import JSONEditor from './codeMirror'; |
32 | 29 | import './style.less'; |
33 | -import { QxFieldSetter } from '@qx/common'; | |
30 | +import { QxFieldSetter, QxFormSelect, ValueOptionProps } from '@qx/common'; | |
34 | 31 | import { formatEnum } from './constant'; |
35 | 32 | import { |
36 | 33 | typeTranslateFieIdtype, |
... | ... | @@ -39,11 +36,10 @@ import { |
39 | 36 | typeTranslateItemtype, |
40 | 37 | } from './constant'; |
41 | 38 | // import { Controlled as CodeMirror } from 'react-codemirror2' |
42 | -import { cloneDeep, debounce } from 'lodash-es'; | |
43 | -import _ from 'lodash'; | |
39 | +import { cloneDeep, debounce, isEmpty } from 'lodash-es'; | |
44 | 40 | import moment from 'dayjs'; |
45 | 41 | import { QxBaseIcon } from '@qx/common'; |
46 | - | |
42 | +import Icon from '@ant-design/icons'; | |
47 | 43 | const valueOptions = [ |
48 | 44 | { key: 'STRING', title: '文本' }, |
49 | 45 | { key: 'NUMBER', title: '数字' }, |
... | ... | @@ -58,6 +54,8 @@ const valueOptions = [ |
58 | 54 | { key: 'ORG', title: '部门' }, |
59 | 55 | ]; |
60 | 56 | |
57 | +import { ReactComponent as SubNodeIcon } from './sub-node.svg'; | |
58 | + | |
61 | 59 | const timeFormat = [ |
62 | 60 | { lable: '年', value: 'YEAR' }, |
63 | 61 | { lable: '年-月', value: 'YEAR_MONTH' }, |
... | ... | @@ -77,9 +75,11 @@ interface ParameterSettingProps { |
77 | 75 | handleChangeField: (val?: any, data?: any) => void; |
78 | 76 | handleChange: (e?: any, data?: any, code?: string) => void; |
79 | 77 | handleDrop: (val: any) => void; |
80 | - handleAddtree: (val: any) => void; | |
78 | + handleAddTree: (val: any) => void; | |
81 | 79 | handleAdd: (val: any) => void; |
82 | 80 | handleDelete: (val: any) => void; |
81 | + appFormList?: any[]; // 当前应用表单list | |
82 | + request?: any, | |
83 | 83 | } |
84 | 84 | const EditableContext = React.createContext<FormInstance<any> | null>(null); |
85 | 85 | |
... | ... | @@ -115,7 +115,7 @@ const ParameterModal: React.FC<ParameterSettingProps> = (props) => { |
115 | 115 | handleCancel, |
116 | 116 | handleDrop, |
117 | 117 | handleAdd, |
118 | - handleAddtree, | |
118 | + handleAddTree, | |
119 | 119 | handleDelete, |
120 | 120 | handleChange, |
121 | 121 | handleChangeField, |
... | ... | @@ -139,7 +139,7 @@ const ParameterModal: React.FC<ParameterSettingProps> = (props) => { |
139 | 139 | }; |
140 | 140 | |
141 | 141 | const checkShowTree = (_data: any) => { |
142 | - console.log('_data', _data) | |
142 | + // console.log('_data', _data) | |
143 | 143 | if (_data.type == 'ARRAY') { |
144 | 144 | if (_data.child && _data.child.length > 0) { |
145 | 145 | return false; |
... | ... | @@ -243,36 +243,33 @@ const ParameterModal: React.FC<ParameterSettingProps> = (props) => { |
243 | 243 | dataIndex: 'qxProps', |
244 | 244 | editable: true, |
245 | 245 | key: 'qxProps', |
246 | - render: (text, record) => ( | |
247 | - <div key={record.id}> | |
248 | - <span> | |
249 | - {record.type == 'TIME' | |
250 | - ? moment(text?.min).format( | |
251 | - formatEnum[text?.format] || 'YYYY-MM-DD', | |
252 | - ) | |
253 | - : text?.min} | |
254 | - </span> | |
255 | - {text?.min && ( | |
256 | - <Space style={{ marginLeft: 5, marginRight: 5 }}>-</Space> | |
257 | - )} | |
258 | - <span> | |
259 | - {record.type == 'TIME' | |
260 | - ? moment(text?.max).format( | |
261 | - formatEnum[text?.format] || 'YYYY-MM-DD', | |
262 | - ) | |
263 | - : text?.max} | |
264 | - </span> | |
265 | - </div> | |
266 | - // <Form.Item | |
267 | - // name={'qxProps' + record.id} | |
268 | - // > | |
269 | - // <> | |
270 | - // <Input disabled={record.disabled} defaultValue={text?.min} onBlur={(e) => props.handleChange(e, record, 'qxProps-min')} style={{ width: '45%' }} /> | |
271 | - // - | |
272 | - // <Input disabled={record.disabled} defaultValue={text?.max} onBlur={(e) => props.handleChange(e, record, 'qxProps-max')} style={{ width: '45%' }} /> | |
273 | - // </> | |
274 | - // </Form.Item> | |
275 | - ), | |
246 | + render: (text: any, record: any) => { | |
247 | + console.log('record ====', record); | |
248 | + console.log('text ====', text); | |
249 | + return ( | |
250 | + <> | |
251 | + {record.type === 'FORM' ? <> | |
252 | + <div key={record.id}> | |
253 | + <span> | |
254 | + {text?.name} | |
255 | + </span> | |
256 | + </div> | |
257 | + </> : <> | |
258 | + <div key={record.id}> | |
259 | + <span>{record.type == 'TIME' ? moment(text?.min).format( | |
260 | + formatEnum[text?.format] || 'YYYY-MM-DD') : text?.min} | |
261 | + </span> | |
262 | + {text?.min && ( | |
263 | + <Space style={{ marginLeft: 5, marginRight: 5 }}>-</Space> | |
264 | + )} | |
265 | + <span>{record.type == 'TIME' ? moment(text?.max).format( | |
266 | + formatEnum[text?.format] || 'YYYY-MM-DD') : text?.max} | |
267 | + </span> | |
268 | + </div> | |
269 | + </>} | |
270 | + </> | |
271 | + ) | |
272 | + }, | |
276 | 273 | }, |
277 | 274 | { |
278 | 275 | title: '必填', |
... | ... | @@ -343,26 +340,29 @@ const ParameterModal: React.FC<ParameterSettingProps> = (props) => { |
343 | 340 | <Space size="small"> |
344 | 341 | {isShowAdd && ( |
345 | 342 | <Button |
343 | + size={'small'} | |
346 | 344 | type="link" |
347 | 345 | disabled={record.disabled} |
348 | - icon={<PlusOutlined />} | |
346 | + icon={<QxBaseIcon style={{ fontSize: 16 }} type={'qx-icon-plus'} />} | |
349 | 347 | onClick={() => handleAdd(record.pid)} |
350 | 348 | /> |
351 | 349 | )} |
352 | 350 | {(record.type === 'OBJECT' || record.type === 'ARRAY') && |
353 | 351 | isShowTree && ( |
354 | 352 | <Button |
353 | + size={'small'} | |
355 | 354 | type="link" |
356 | 355 | disabled={record.disabled} |
357 | - icon={<SisternodeOutlined />} | |
358 | - onClick={() => handleAddtree(record.id)} | |
356 | + icon={<Icon style={{ fontSize: 16 }} component={SubNodeIcon} />} | |
357 | + onClick={() => handleAddTree(record.id)} | |
359 | 358 | /> |
360 | 359 | )} |
361 | 360 | <Button |
361 | + size={'small'} | |
362 | 362 | type="link" |
363 | 363 | className="btn-high-del" |
364 | 364 | disabled={record.disabled} |
365 | - icon={<DeleteOutlined />} | |
365 | + icon={<QxBaseIcon style={{ fontSize: 16 }} className={'title-btn-del-btn'} type={'qx-icon-delete'} />} | |
366 | 366 | onClick={() => handleDelete(record)} |
367 | 367 | /> |
368 | 368 | </Space> |
... | ... | @@ -434,6 +434,7 @@ const ParameterModal: React.FC<ParameterSettingProps> = (props) => { |
434 | 434 | const toggleEdit1 = (e) => { |
435 | 435 | const values = form.getFieldsValue(); |
436 | 436 | e.persist(); |
437 | + // console.log('vae.target.tagNamelues', e.target.tagName) | |
437 | 438 | if (e.target.tagName == 'DIV') { |
438 | 439 | setCurrentNode(e.target) |
439 | 440 | // console.log('values', values) |
... | ... | @@ -452,11 +453,11 @@ const ParameterModal: React.FC<ParameterSettingProps> = (props) => { |
452 | 453 | // form.setFieldsValue({ [dataIndex]: record[dataIndex] }); |
453 | 454 | }; |
454 | 455 | |
455 | - // const onQxpropsChangen = (value) => { | |
456 | + // const test = (value) => { | |
456 | 457 | // console.log('value', value) |
457 | - // form.setFieldsValue({ | |
458 | - // ['qxProps']: { value: value } | |
459 | - // }) | |
458 | + // // form.setFieldsValue({ | |
459 | + // // ['qxProps']: { value: value } | |
460 | + // // }) | |
460 | 461 | // } |
461 | 462 | // const toggleEdit2 = (e) => { |
462 | 463 | // e.persist(); |
... | ... | @@ -648,6 +649,29 @@ const ParameterModal: React.FC<ParameterSettingProps> = (props) => { |
648 | 649 | </Select> |
649 | 650 | </div> |
650 | 651 | ); |
652 | + case 'FORM': | |
653 | + return ( | |
654 | + <div | |
655 | + key={record.id} | |
656 | + ref={inputRef} | |
657 | + className="editable-around-cell" | |
658 | + // onBlur={(e) => toggleEdit1(e)} | |
659 | + tabIndex={ | |
660 | + 0 | |
661 | + } | |
662 | + > | |
663 | + <QxFormSelect | |
664 | + value={qxProps} | |
665 | + request={props?.request} | |
666 | + options={props?.appFormList} | |
667 | + placeholder={'选择表单'} | |
668 | + popupOnBody={true} | |
669 | + onChange={(val: any) => { | |
670 | + props.handleChange(val, record, 'qxProps'); | |
671 | + }} | |
672 | + /> | |
673 | + </div> | |
674 | + ); | |
651 | 675 | default: |
652 | 676 | return ( |
653 | 677 | <div |
... | ... | @@ -678,7 +702,7 @@ const ParameterModal: React.FC<ParameterSettingProps> = (props) => { |
678 | 702 | }; |
679 | 703 | |
680 | 704 | const handleField = (val) => { |
681 | - if (!val || _.isEmpty(val)) { | |
705 | + if (!val || isEmpty(val)) { | |
682 | 706 | return; |
683 | 707 | } |
684 | 708 | if (val[0].extVal) { |
... | ... | @@ -1041,8 +1065,8 @@ const ParameterModal: React.FC<ParameterSettingProps> = (props) => { |
1041 | 1065 | ) : ( |
1042 | 1066 | <Row> |
1043 | 1067 | <Col span={12}> |
1044 | - <Button type="link" onClick={() => onOpen()}> | |
1045 | - {'</>JSON参数设置'} | |
1068 | + <Button type="link" icon={<QxBaseIcon style={{ fontSize: 16 }} type={'qx-icon-flow-code'} />} onClick={() => onOpen()}> | |
1069 | + JSON参数设置 | |
1046 | 1070 | </Button> |
1047 | 1071 | </Col> |
1048 | 1072 | <Col | ... | ... |
... | ... | @@ -14,90 +14,22 @@ |
14 | 14 | Demo: |
15 | 15 | |
16 | 16 | ```tsx |
17 | -import { QxParameterSetting } from '@qx/common'; | |
17 | +import { QxParameterSetting, request } from '@qx/common'; | |
18 | 18 | import { Input } from 'antd'; |
19 | 19 | import React, { useState } from 'react'; |
20 | - | |
20 | +import { appFormList } from './mock'; | |
21 | 21 | export default () => { |
22 | 22 | const [value, setValue] = useState([ |
23 | 23 | { |
24 | - code: '29gnd', | |
25 | - id: 'f7724ff3557041588fcdcf69d31bec1d', | |
26 | - pid: '', | |
27 | - showCode: true, | |
28 | - qxProps: { | |
29 | - appId: 'HBZy3te6d9SxSMO3lLr', | |
30 | - formId: 'j9s5sUXvLiT2a1PJOsh', | |
31 | - formName: '合同管理', | |
32 | - }, | |
33 | - required: false, | |
34 | - title: '流程类萨', | |
35 | - type: 'OBJECT', | |
36 | - disabled: true, | |
37 | - child: [ | |
38 | - { | |
39 | - id: '519338cceed64b08aeadcc7f5b4c9d94', | |
40 | - pid: 'f7724ff3557041588fcdcf69d31bec1d', | |
41 | - code: '60edb3', | |
42 | - showCode: true, | |
43 | - title: '问问', | |
44 | - required: true, | |
45 | - qxProps: { | |
46 | - min: '2023-08-18', | |
47 | - max: '2023-08-08', | |
48 | - options: ['1231231231321'], | |
49 | - default: '2023-08-02', | |
50 | - format: 'YEAR_DATE', | |
51 | - }, | |
52 | - disabled: false, | |
53 | - type: 'TIME', | |
54 | - }, | |
55 | - ], | |
56 | - }, | |
57 | - { | |
58 | 24 | id: '6370b8fd52484b83abd702379870b05f', |
59 | 25 | pid: '', |
60 | 26 | code: 'ufsqtk', |
61 | 27 | showCode: true, |
62 | 28 | title: '爱的人翁热', |
63 | 29 | required: true, |
64 | - qxProps: { | |
65 | - min: 1, | |
66 | - max: 10, | |
67 | - options: ['232312312323423'], | |
68 | - default: 112, | |
69 | - precision: 2, | |
70 | - }, | |
71 | - disabled: false, | |
72 | - type: 'NUMBER', | |
73 | - }, | |
74 | - { | |
75 | - id: '2df392beea224ad5af58ac96dad04e7b', | |
76 | - pid: '', | |
77 | - code: 'ci4ihw', | |
78 | - showCode: true, | |
79 | - title: '来来来', | |
80 | - required: false, | |
81 | - child: [ | |
82 | - { | |
83 | - id: 'db1cd3c513534a82ae85f63e82cf0951', | |
84 | - pid: '2df392beea224ad5af58ac96dad04e7b', | |
85 | - code: 'b3cbef', | |
86 | - title: '啊实打实', | |
87 | - required: false, | |
88 | - qxProps: { | |
89 | - min: '2023-08-16', | |
90 | - max: '2023-08-01', | |
91 | - options: ["asdaa'd "], | |
92 | - default: '2023-08-03', | |
93 | - format: 'YEAR_DATE', | |
94 | - }, | |
95 | - disabled: false, | |
96 | - type: 'TIME', | |
97 | - }, | |
98 | - ], | |
30 | + qxProps: {}, | |
99 | 31 | disabled: false, |
100 | - type: 'ARRAY', | |
32 | + type: 'FORM', | |
101 | 33 | }, |
102 | 34 | ]); |
103 | 35 | const handleChange = (newValue) => { |
... | ... | @@ -140,39 +72,70 @@ export default () => { |
140 | 72 | }; |
141 | 73 | |
142 | 74 | const isHide = true; |
143 | - const isShow = true; | |
144 | 75 | |
145 | 76 | const componentItem = { |
146 | 77 | value: comValue, |
147 | 78 | onChange: comHandleChange, |
148 | 79 | }; |
80 | + const titleDom = ( | |
81 | + <div | |
82 | + style={{ | |
83 | + width: '100%', | |
84 | + display: 'flex', | |
85 | + justifyContent: 'flex-start', | |
86 | + flexDirection: 'column', | |
87 | + }} | |
88 | + > | |
89 | + <span | |
90 | + style={{ | |
91 | + overflow: 'hidden', | |
92 | + whiteSpace: 'nowrap', | |
93 | + textOverflow: 'ellipsis', | |
94 | + }} | |
95 | + > | |
96 | + 标题展示标题展示标题展示标题展示标题展示标题展示标题展示标题展示标题展示标题展示标题展示 | |
97 | + </span> | |
98 | + <span | |
99 | + style={{ | |
100 | + overflow: 'hidden', | |
101 | + whiteSpace: 'nowrap', | |
102 | + textOverflow: 'ellipsis', | |
103 | + }} | |
104 | + > | |
105 | + 标题展示标题展示标题展示标题展示标题展示标题展示标题展示标题展示标题展示标题展示标题展示 | |
106 | + </span> | |
107 | + </div> | |
108 | + ); | |
109 | + | |
149 | 110 | return ( |
150 | - <QxParameterSetting | |
151 | - value={value} | |
152 | - nodeItem={nodeItem} | |
153 | - // componentItem={componentItem} | |
154 | - onChange={handleChange} | |
155 | - isHideSearch={isHide} | |
156 | - isShowTitle={isShow} | |
157 | - isShowField={true} | |
158 | - title={'sadaasdasdasdwwwwwwwasdasdasdsdsd'} | |
159 | - // component={QxTagsInput} | |
160 | - /> | |
111 | + <div style={{ width: '400px' }}> | |
112 | + <QxParameterSetting | |
113 | + value={value} | |
114 | + nodeItem={nodeItem} | |
115 | + // componentItem={componentItem} | |
116 | + onChange={handleChange} | |
117 | + isHideSearch={isHide} | |
118 | + isShowField={true} | |
119 | + title={titleDom} | |
120 | + // component={QxTagsInput} | |
121 | + request={request} | |
122 | + appFormList={appFormList} | |
123 | + /> | |
124 | + </div> | |
161 | 125 | ); |
162 | 126 | }; |
163 | 127 | ``` |
164 | 128 | |
165 | 129 | ## 入参数据格式 |
166 | 130 | |
167 | -| 参数 | 说明 | 类型 | 默认值 | | |
168 | -| ------------ | -------------------------------- | ------ | ------ | | |
169 | -| isHideSearch | 是否隐藏搜索框 | bool | - | | |
170 | -| nodeItem | 节点信息,默认值右侧选择节点使用 | [] | - | | |
171 | -| value | | [] | - | | |
172 | -| isShowTitle | 是否显示左侧标题 | bool | - | | |
173 | -| title | 左侧标题 | string | - | | |
174 | -| isShowField | 是否显示下部默认值 item | bool | - | | |
175 | -| onChange | | | - | | |
131 | +| 参数 | 说明 | 类型 | 默认值 | | |
132 | +| ------------ | -------------------------------- | --------------- | ------ | | |
133 | +| isHideSearch | 是否隐藏搜索框 | bool | - | | |
134 | +| nodeItem | 节点信息,默认值右侧选择节点使用 | [] | - | | |
135 | +| value | | [] | - | | |
136 | +| title | 左侧标题 | React.ReactNode | - | | |
137 | +| isShowField | 是否显示下部默认值 item | bool | - | | |
138 | +| onChange | | | - | | |
176 | 139 | |
177 | 140 | ## 出参数据格式 |
178 | 141 | ... | ... |
1 | 1 | /* eslint-disable eqeqeq */ |
2 | 2 | /* eslint-disable array-callback-return */ |
3 | 3 | import React, { useCallback, useEffect, useState } from 'react'; |
4 | -// import type { FRWidgetProps } from '@/packages/qx-form-generator/src'; | |
5 | -import { | |
6 | - DeleteOutlined, | |
7 | - PlusOutlined, | |
8 | - SettingOutlined, | |
9 | -} from '@ant-design/icons'; | |
10 | 4 | import { |
11 | 5 | Button, |
12 | 6 | Dropdown, |
... | ... | @@ -17,6 +11,7 @@ import { |
17 | 11 | Tree, |
18 | 12 | message, |
19 | 13 | } from 'antd'; |
14 | +import Icon from '@ant-design/icons'; | |
20 | 15 | import type { TreeProps } from 'antd/lib/tree'; |
21 | 16 | import ParameterModal from './ParameterModal'; |
22 | 17 | import { formatEnum } from './constant'; |
... | ... | @@ -36,6 +31,8 @@ import { QxFieldSetter, QxBaseIcon } from '@qx/common'; |
36 | 31 | |
37 | 32 | import './style.less'; |
38 | 33 | |
34 | +import { ReactComponent as SubNodeIcon } from './sub-node.svg'; | |
35 | + | |
39 | 36 | const valueOptions = [ |
40 | 37 | { key: 'STRING', label: '文本' }, |
41 | 38 | { key: 'NUMBER', label: '数字' }, |
... | ... | @@ -70,12 +67,13 @@ interface ParameterSettingProps { |
70 | 67 | onChange: (val: any) => void; |
71 | 68 | value: any; |
72 | 69 | isHideSearch?: boolean; //是否隐藏搜索框 |
73 | - isShowTitle?: boolean; //是否显示左侧标题 | |
74 | - isShowField?: boolean; //是否显示下部默认值组件 | |
75 | - title?: string; | |
70 | + isShowField?: boolean; // 是否显示下部默认值组件 | |
71 | + title?: React.ReactNode; // 左侧标题 | |
76 | 72 | // component?: any; |
77 | 73 | // componentItem?: any; |
78 | 74 | // comHandleChange?: (val: any) => void; |
75 | + appFormList?: any[]; // 当前应用表单list | |
76 | + request?: any, | |
79 | 77 | } |
80 | 78 | |
81 | 79 | export const QxParameterSetting: React.FC<ParameterSettingProps> = (props) => { |
... | ... | @@ -451,7 +449,7 @@ export const QxParameterSetting: React.FC<ParameterSettingProps> = (props) => { |
451 | 449 | }; |
452 | 450 | |
453 | 451 | //增加子节点 |
454 | - const onAddtree = (key: string) => { | |
452 | + const onAddTree = (key: string) => { | |
455 | 453 | function addNode(pid: string, data: any) { |
456 | 454 | data.forEach((item) => { |
457 | 455 | const id = uidGen(); |
... | ... | @@ -623,18 +621,18 @@ export const QxParameterSetting: React.FC<ParameterSettingProps> = (props) => { |
623 | 621 | {(nodeData.type === 'OBJECT' || nodeData.type === 'ARRAY') && |
624 | 622 | isShowTree && ( |
625 | 623 | <Button |
626 | - icon={<PlusOutlined />} | |
624 | + icon={<Icon component={SubNodeIcon} />} | |
627 | 625 | disabled={disabled} |
628 | - type="text" | |
626 | + type="link" | |
629 | 627 | className="title-btn" |
630 | - onClick={() => onAddtree(nodeData.id)} | |
628 | + onClick={() => onAddTree(nodeData.id)} | |
631 | 629 | /> |
632 | 630 | )} |
633 | 631 | <Button |
634 | 632 | className="title-btn-del" |
635 | - icon={<DeleteOutlined />} | |
633 | + icon={<QxBaseIcon className={'title-btn-del-btn'} type={'qx-icon-delete'} />} | |
636 | 634 | disabled={disabled} |
637 | - type="text" | |
635 | + type="link" | |
638 | 636 | onClick={() => deleteParameter(nodeData)} |
639 | 637 | /> |
640 | 638 | </div> |
... | ... | @@ -702,18 +700,28 @@ export const QxParameterSetting: React.FC<ParameterSettingProps> = (props) => { |
702 | 700 | /> |
703 | 701 | )} |
704 | 702 | > |
705 | - <Button type={'link'}> | |
706 | - <PlusOutlined /> | |
703 | + <Button | |
704 | + size={'small'} | |
705 | + type={'link'} | |
706 | + style={{ | |
707 | + padding: '0 0 0 8px', | |
708 | + }} | |
709 | + > | |
710 | + <QxBaseIcon style={{fontSize: '16px'}} type={'qx-icon-plus'} /> | |
707 | 711 | 添加参数 |
708 | 712 | </Button> |
709 | 713 | </Dropdown> |
710 | 714 | <Button |
715 | + size={'small'} | |
711 | 716 | type={'link'} |
717 | + style={{ | |
718 | + padding: '0 0 0 12px', | |
719 | + }} | |
712 | 720 | onClick={() => { |
713 | 721 | openModal(); |
714 | 722 | }} |
715 | 723 | > |
716 | - <SettingOutlined /> | |
724 | + <QxBaseIcon style={{fontSize: '16px'}} type={'icon-app-terminal-box-line'} /> | |
717 | 725 | 高级设置 |
718 | 726 | </Button> |
719 | 727 | </div> |
... | ... | @@ -725,9 +733,9 @@ export const QxParameterSetting: React.FC<ParameterSettingProps> = (props) => { |
725 | 733 | onChange={onChange} |
726 | 734 | /> |
727 | 735 | )} |
728 | - {props.isShowTitle && ( | |
729 | - <div style={{ overflow: 'hidden', textOverflow: 'ellipsis' }}> | |
730 | - <span style={{ fontSize: '18px' }}>{props.title}</span> | |
736 | + {props.isHideSearch && !!props.title && ( | |
737 | + <div className={'header-title'}> | |
738 | + {props.title} | |
731 | 739 | </div> |
732 | 740 | )} |
733 | 741 | </div> |
... | ... | @@ -749,8 +757,6 @@ export const QxParameterSetting: React.FC<ParameterSettingProps> = (props) => { |
749 | 757 | onDrop={onDrop} |
750 | 758 | draggable |
751 | 759 | blockNode |
752 | - selectable | |
753 | - checkStrictly={true} //??这是啥意思 | |
754 | 760 | expandedKeys={expandedKeys ? expandedKeys : defaultExpandedKeys} |
755 | 761 | autoExpandParent={autoExpandParent} |
756 | 762 | onExpand={onExpand} |
... | ... | @@ -769,8 +775,10 @@ export const QxParameterSetting: React.FC<ParameterSettingProps> = (props) => { |
769 | 775 | handleDelete={deleteParameter} |
770 | 776 | handleChange={handleChange} |
771 | 777 | handleDrop={handleDrop} |
772 | - handleAddtree={onAddtree} | |
778 | + handleAddTree={onAddTree} | |
773 | 779 | visible={visible} |
780 | + request={props?.request} | |
781 | + appFormList={props?.appFormList} | |
774 | 782 | /> |
775 | 783 | </div> |
776 | 784 | ); | ... | ... |
src/qx-parameter-setting/mock.ts
0 → 100644
1 | +export const appFormList = [ | |
2 | + { | |
3 | + name: '地址', | |
4 | + code: 'UdXaoSj9EHYr3wZL253', | |
5 | + extract: { | |
6 | + code: 'o72gf', | |
7 | + isTree: false, | |
8 | + appName: 'LT-表单', | |
9 | + type: 'form', | |
10 | + }, | |
11 | + }, | |
12 | + { | |
13 | + name: '测试关联记录按钮', | |
14 | + code: 'ZRLa6NjJ98u3lFVLSur', | |
15 | + extract: { | |
16 | + code: 'vwxxw', | |
17 | + isTree: false, | |
18 | + appName: 'LT-表单', | |
19 | + type: 'form', | |
20 | + }, | |
21 | + }, | |
22 | + { | |
23 | + name: '测试关联记录权限', | |
24 | + code: 'SRqC0JJmcjKquqnn228', | |
25 | + extract: { | |
26 | + code: '60jte', | |
27 | + isTree: false, | |
28 | + appName: 'LT-表单', | |
29 | + type: 'form', | |
30 | + }, | |
31 | + }, | |
32 | + { | |
33 | + name: '子表', | |
34 | + code: 'GYsqE8yphn1amjVM2OY', | |
35 | + extract: { | |
36 | + code: 'oi0d2', | |
37 | + isTree: false, | |
38 | + appName: 'LT-表单', | |
39 | + type: 'form', | |
40 | + }, | |
41 | + }, | |
42 | + { | |
43 | + name: '关联基础', | |
44 | + code: '2wN04K7nF0fHjRbOAvu', | |
45 | + extract: { | |
46 | + code: '0jpbl', | |
47 | + isTree: false, | |
48 | + appName: 'LT-表单', | |
49 | + type: 'form', | |
50 | + }, | |
51 | + }, | |
52 | + { | |
53 | + name: '关联记录', | |
54 | + code: 's6k5W5aovjtiU7kvqVl', | |
55 | + extract: { | |
56 | + code: 'zbynu', | |
57 | + isTree: false, | |
58 | + appName: 'LT-表单', | |
59 | + type: 'form', | |
60 | + }, | |
61 | + }, | |
62 | + { | |
63 | + name: '关联记录-关联记录', | |
64 | + code: 'hfbs4k6Lbs4WV7tOept', | |
65 | + extract: { | |
66 | + code: 'fz7nl', | |
67 | + isTree: false, | |
68 | + appName: 'LT-表单', | |
69 | + type: 'form', | |
70 | + }, | |
71 | + }, | |
72 | + { | |
73 | + name: '关联属性-关联记录', | |
74 | + code: 'WPjXCOemcBxoXqeEX6x', | |
75 | + extract: { | |
76 | + code: 's585f', | |
77 | + isTree: false, | |
78 | + appName: 'LT-表单', | |
79 | + type: 'form', | |
80 | + }, | |
81 | + }, | |
82 | + { | |
83 | + name: '子表-关联记录', | |
84 | + code: 'H3moABKMnhVqjqcVbsa', | |
85 | + extract: { | |
86 | + code: 'snfhq', | |
87 | + isTree: false, | |
88 | + appName: 'LT-表单', | |
89 | + type: 'form', | |
90 | + }, | |
91 | + }, | |
92 | + { | |
93 | + name: '关联记录1', | |
94 | + code: 'PQspcwgyiewytF9iizd', | |
95 | + extract: { | |
96 | + code: 'f53ql', | |
97 | + isTree: false, | |
98 | + appName: 'LT-表单', | |
99 | + type: 'form', | |
100 | + }, | |
101 | + }, | |
102 | + { | |
103 | + name: '富文本', | |
104 | + code: 'On7QbrZv9u1qtVgMAGm', | |
105 | + extract: { | |
106 | + code: 'tmh23', | |
107 | + isTree: false, | |
108 | + appName: 'LT-表单', | |
109 | + type: 'form', | |
110 | + }, | |
111 | + }, | |
112 | + { | |
113 | + name: '关联记录删除', | |
114 | + code: 'MdUFSBxWOYKXSYGSqSk', | |
115 | + extract: { | |
116 | + code: 'uxenf', | |
117 | + isTree: false, | |
118 | + appName: 'LT-表单', | |
119 | + type: 'form', | |
120 | + }, | |
121 | + }, | |
122 | + { | |
123 | + name: '1', | |
124 | + code: 'HAJ8dEcoPLnjx81Uxjc', | |
125 | + extract: { | |
126 | + code: '3xtcr', | |
127 | + isTree: false, | |
128 | + appName: 'LT-表单', | |
129 | + type: 'form', | |
130 | + }, | |
131 | + }, | |
132 | + { | |
133 | + name: '基础表单', | |
134 | + code: 'oOY4njEfrHx7PlSlFRf', | |
135 | + extract: { | |
136 | + code: 'fd3eb', | |
137 | + isTree: false, | |
138 | + appName: 'LT-表单', | |
139 | + type: 'form', | |
140 | + }, | |
141 | + }, | |
142 | + { | |
143 | + name: '关联记录', | |
144 | + code: 'HaIdxngReF8WtKclakp', | |
145 | + extract: { | |
146 | + code: 'qbroi', | |
147 | + isTree: false, | |
148 | + appName: 'LT-表单', | |
149 | + type: 'form', | |
150 | + }, | |
151 | + }, | |
152 | + { | |
153 | + name: '筛选', | |
154 | + code: 'amWz1TlerTCrysLhKdD', | |
155 | + extract: { | |
156 | + code: 'ionr7', | |
157 | + isTree: false, | |
158 | + appName: 'LT-表单', | |
159 | + type: 'form', | |
160 | + }, | |
161 | + }, | |
162 | + { | |
163 | + name: '子表', | |
164 | + code: 'JV5IeD1Xc4MtwWdbPhB', | |
165 | + extract: { | |
166 | + code: 'x4lh4', | |
167 | + isTree: false, | |
168 | + appName: 'LT-表单', | |
169 | + type: 'form', | |
170 | + }, | |
171 | + }, | |
172 | + { | |
173 | + name: '附件图片', | |
174 | + code: 'jCfTNFw7tjERB5jnnWv', | |
175 | + extract: { | |
176 | + code: 'pqqko', | |
177 | + isTree: false, | |
178 | + appName: 'LT-表单', | |
179 | + type: 'form', | |
180 | + }, | |
181 | + }, | |
182 | + { | |
183 | + name: '日期时间', | |
184 | + code: 'WruqGjaxMj0jLsZ6Ufr', | |
185 | + extract: { | |
186 | + code: 'z15we', | |
187 | + isTree: false, | |
188 | + appName: 'LT-表单', | |
189 | + type: 'form', | |
190 | + }, | |
191 | + }, | |
192 | + { | |
193 | + name: '选人员部门', | |
194 | + code: 'wqsubyh5kJFsxXuHYyQ', | |
195 | + extract: { | |
196 | + code: '0h42r', | |
197 | + isTree: false, | |
198 | + appName: 'LT-表单', | |
199 | + type: 'form', | |
200 | + }, | |
201 | + }, | |
202 | + { | |
203 | + name: '数值', | |
204 | + code: 'HEsh8KhnUToggsWuboT', | |
205 | + extract: { | |
206 | + code: 'bb8ev', | |
207 | + isTree: false, | |
208 | + appName: 'LT-表单', | |
209 | + type: 'form', | |
210 | + }, | |
211 | + }, | |
212 | + { | |
213 | + name: '多字段', | |
214 | + code: 'deTV0Jjc1prqYZTERfN', | |
215 | + extract: { | |
216 | + code: 'hxaxj', | |
217 | + isTree: false, | |
218 | + appName: 'LT-表单', | |
219 | + type: 'form', | |
220 | + }, | |
221 | + }, | |
222 | +]; | ... | ... |
... | ... | @@ -12,6 +12,14 @@ |
12 | 12 | flex-direction: row-reverse; |
13 | 13 | flex-wrap: nowrap; |
14 | 14 | justify-content: space-between; |
15 | + align-items: flex-end; | |
16 | + | |
17 | + .header-title { | |
18 | + overflow:hidden; | |
19 | + white-space: nowrap; | |
20 | + text-overflow: ellipsis; | |
21 | + -o-text-overflow:ellipsis; | |
22 | + } | |
15 | 23 | } |
16 | 24 | |
17 | 25 | .tree-wrapper { |
... | ... | @@ -36,10 +44,10 @@ |
36 | 44 | } |
37 | 45 | |
38 | 46 | .border-none |
39 | - .ant-select-focused:not(.ant-select-disabled).ant-select:not( | |
47 | +.ant-select-focused:not(.ant-select-disabled).ant-select:not( | |
40 | 48 | .ant-select-customize-input |
41 | 49 | ) |
42 | - .ant-select-selector { | |
50 | +.ant-select-selector { | |
43 | 51 | border: none; |
44 | 52 | box-shadow: none; |
45 | 53 | } |
... | ... | @@ -61,24 +69,48 @@ |
61 | 69 | align-items: center; |
62 | 70 | margin-left: 10px; |
63 | 71 | |
64 | - .title-btn-del { | |
65 | - display: none; | |
66 | - color: #666; | |
72 | + .ant-btn.ant-btn-icon-only, | |
73 | + .ant-btn.ant-btn-icon-only { | |
74 | + font-size: 16px; | |
75 | + color: @N7; | |
67 | 76 | |
68 | 77 | &:hover { |
69 | - color: @E3; | |
78 | + color: @B8; | |
70 | 79 | opacity: 1; |
80 | + | |
81 | + .anticon { | |
82 | + color: @B8; | |
83 | + | |
84 | + &.title-btn-del-btn { | |
85 | + color: @E3; | |
86 | + } | |
87 | + } | |
88 | + } | |
89 | + | |
90 | + &:disabled, | |
91 | + &.ant-btn-disabled { | |
92 | + color: @N5; | |
93 | + | |
94 | + &:hover { | |
95 | + color: @N5; | |
96 | + | |
97 | + .anticon { | |
98 | + color: @N5; | |
99 | + | |
100 | + &.title-btn-del-btn { | |
101 | + color: @N5; | |
102 | + } | |
103 | + } | |
104 | + } | |
71 | 105 | } |
72 | 106 | } |
73 | 107 | |
74 | - .title-btn { | |
108 | + .title-btn-del { | |
75 | 109 | display: none; |
76 | - color: #666; | |
110 | + } | |
77 | 111 | |
78 | - &:hover { | |
79 | - color: #91d5ff; | |
80 | - opacity: 1; | |
81 | - } | |
112 | + .title-btn { | |
113 | + display: none; | |
82 | 114 | } |
83 | 115 | |
84 | 116 | .select-tree { |
... | ... | @@ -100,6 +132,10 @@ |
100 | 132 | margin-bottom: 2px; |
101 | 133 | overflow: hidden; |
102 | 134 | text-overflow: ellipsis; |
135 | + | |
136 | + .ant-input-affix-wrapper { | |
137 | + border-color: @N4; | |
138 | + } | |
103 | 139 | } |
104 | 140 | |
105 | 141 | .opt-left-down { |
... | ... | @@ -114,6 +150,8 @@ |
114 | 150 | margin-bottom: 2px; |
115 | 151 | overflow: hidden; |
116 | 152 | text-overflow: ellipsis; |
153 | + background-color: #fff; | |
154 | + border-radius: 4px; | |
117 | 155 | } |
118 | 156 | |
119 | 157 | // .ant-tree-node-content-wrapper :hover .select-tree { |
... | ... | @@ -298,3 +336,10 @@ |
298 | 336 | padding-top: 0 !important; |
299 | 337 | } |
300 | 338 | } |
339 | + | |
340 | +.qx-parameter-setting--search { | |
341 | + .anticon { | |
342 | + font-size: 16px; | |
343 | + color: @N6; | |
344 | + } | |
345 | +} | ... | ... |
src/qx-parameter-setting/sub-node.svg
0 → 100644
1 | +<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" aria-hidden="true" focusable="false"><path fill-rule="evenodd" d="M6.333 5.333a1 1 0 0 0-1 1v3h-.667V2.667h10V1.333H1.333v1.334h2v6.666c0 .737.597 1.334 1.333 1.334h.667v3a1 1 0 0 0 1 1h7.333a1 1 0 0 0 1-1V6.333a1 1 0 0 0-1-1H6.333Zm.333 8V6.667h6.667v6.666H6.666Zm2.667-2.666h-2V9.333h2v-2h1.333v2h2v1.334h-2v2H9.333v-2Z" clip-rule="evenodd"/></svg> | ... | ... |