Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
szse
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zhaochengxiang
szse
Commits
3a5c1211
Commit
3a5c1211
authored
Aug 04, 2022
by
zhaochengxiang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
主数据定义
parent
069b5467
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
489 additions
and
146 deletions
+489
-146
msd.js
src/model/msd.js
+29
-0
msd.js
src/service/msd.js
+29
-0
DefineTable.jsx
src/view/Manage/DataMaster/Define/Component/DefineTable.jsx
+103
-27
UpdateBasicInfo.jsx
...ew/Manage/DataMaster/Define/Component/UpdateBasicInfo.jsx
+5
-5
UpdateField.jsx
src/view/Manage/DataMaster/Define/Component/UpdateField.jsx
+248
-104
UpdateTemplateModal.jsx
...anage/DataMaster/Define/Component/UpdateTemplateModal.jsx
+68
-8
index.jsx
src/view/Manage/DataMaster/Define/index.jsx
+7
-2
No files found.
src/model/msd.js
View file @
3a5c1211
...
@@ -15,4 +15,32 @@ export function* updateTreeNode(payload) {
...
@@ -15,4 +15,32 @@ export function* updateTreeNode(payload) {
export
function
*
deleteTreeNode
(
payload
)
{
export
function
*
deleteTreeNode
(
payload
)
{
return
yield
call
(
service
.
deleteTreeNode
,
payload
);
return
yield
call
(
service
.
deleteTreeNode
,
payload
);
}
export
function
*
getTypes
()
{
return
yield
call
(
service
.
getTypes
);
}
export
function
*
getModels
(
payload
)
{
return
yield
call
(
service
.
getModels
,
payload
);
}
export
function
*
addModel
(
payload
)
{
return
yield
call
(
service
.
addModel
,
payload
);
}
export
function
*
updateModel
(
payload
)
{
return
yield
call
(
service
.
updateModel
,
payload
);
}
export
function
*
deleteModels
(
payload
)
{
return
yield
call
(
service
.
deleteModels
,
payload
);
}
export
function
*
getColumns
(
payload
)
{
return
yield
call
(
service
.
getColumns
,
payload
);
}
export
function
*
saveColumns
(
payload
)
{
return
yield
call
(
service
.
saveColumns
,
payload
);
}
}
\ No newline at end of file
src/service/msd.js
View file @
3a5c1211
...
@@ -14,4 +14,32 @@ export function updateTreeNode(payload) {
...
@@ -14,4 +14,32 @@ export function updateTreeNode(payload) {
export
function
deleteTreeNode
(
payload
)
{
export
function
deleteTreeNode
(
payload
)
{
return
PostJSON
(
"/metadatarepo/rest/msdDefinition/deleteTreeNode"
,
payload
);
return
PostJSON
(
"/metadatarepo/rest/msdDefinition/deleteTreeNode"
,
payload
);
}
export
function
getTypes
()
{
return
GetJSON
(
"/metadatarepo/rest/msdDefinition/getTypes"
);
}
export
function
getModels
(
payload
)
{
return
PostJSON
(
"/metadatarepo/rest/msdDefinition/getModelByNodeId"
,
payload
);
}
export
function
addModel
(
payload
)
{
return
Post
(
"/metadatarepo/rest/msdDefinition/addModel"
,
payload
);
}
export
function
updateModel
(
payload
)
{
return
Post
(
"/metadatarepo/rest/msdDefinition/updateModel"
,
payload
);
}
export
function
deleteModels
(
payload
)
{
return
PostJSON
(
"/metadatarepo/rest/msdDefinition/deleteModel"
,
payload
);
}
export
function
getColumns
(
payload
)
{
return
PostJSON
(
"/metadatarepo/rest/msdDefinition/getColumnByModelId"
,
payload
);
}
export
function
saveColumns
(
payload
)
{
return
PostJSON
(
"/metadatarepo/rest/msdDefinition/batchSaveColumn"
,
payload
);
}
}
\ No newline at end of file
src/view/Manage/DataMaster/Define/Component/DefineTable.jsx
View file @
3a5c1211
import
{
useMemo
,
useState
}
from
'react'
;
import
{
use
Effect
,
use
Memo
,
useState
}
from
'react'
;
import
{
Space
,
Button
,
Input
}
from
'antd'
;
import
{
Space
,
Button
,
Input
,
Pagination
,
Tooltip
}
from
'antd'
;
import
{
useContextMenu
,
Menu
as
RcMenu
,
Item
as
RcItem
}
from
"react-contexify"
;
import
{
useContextMenu
,
Menu
as
RcMenu
,
Item
as
RcItem
}
from
"react-contexify"
;
import
ResizeableTable
from
'../../../ResizeableTable'
;
import
ResizeableTable
from
'../../../ResizeableTable'
;
import
DebounceInput
from
'../../../Model/Component/DebounceInput'
;
import
DebounceInput
from
'../../../Model/Component/DebounceInput'
;
import
{
UpdateTemplateModal
}
from
'./UpdateTemplateModal'
;
import
{
UpdateTemplateModal
}
from
'./UpdateTemplateModal'
;
import
{
inputWidth
}
from
'../../../../../util'
;
import
{
inputWidth
,
showMessage
}
from
'../../../../../util'
;
import
{
tableData
}
from
'./Mock'
;
import
'./DefineTable.less'
;
import
'./DefineTable.less'
;
import
'react-contexify/dist/ReactContexify.css'
;
import
'react-contexify/dist/ReactContexify.css'
;
import
{
dispatch
}
from
'../../../../../model'
;
const
InputDebounce
=
DebounceInput
(
300
)(
Input
);
const
InputDebounce
=
DebounceInput
(
300
)(
Input
);
const
DefineTable
=
(
props
)
=>
{
const
DefineTable
=
(
props
)
=>
{
const
{
nodeId
}
=
props
;
const
[
keyword
,
setKeyword
]
=
useState
(
''
);
const
[
keyword
,
setKeyword
]
=
useState
(
''
);
const
[
checkedKeys
,
setCheckedKeys
]
=
useState
([]);
const
[
checkedKeys
,
setCheckedKeys
]
=
useState
([]);
const
[
isTemplateModalVisible
,
setIsTemplateModalVisible
]
=
useState
(
false
);
const
[
isTemplateModalVisible
,
setIsTemplateModalVisible
]
=
useState
(
false
);
const
[
currentTemplate
,
setCurrentTemplate
]
=
useState
({});
const
[
currentTemplate
,
setCurrentTemplate
]
=
useState
({});
const
[
action
,
setAction
]
=
useState
(
''
);
const
[
action
,
setAction
]
=
useState
(
''
);
const
[
loading
,
setLoading
]
=
useState
(
false
);
const
[
deleteLoading
,
setDeleteLoading
]
=
useState
(
false
);
const
[
tableData
,
setTableData
]
=
useState
([]);
const
[
total
,
setTotal
]
=
useState
(
0
);
const
[
pagination
,
setPagination
]
=
useState
({
pageNum
:
1
,
pageSize
:
20
});
const
{
pageNum
,
pageSize
}
=
pagination
;
useEffect
(()
=>
{
setPagination
({...
pagination
,
pageNum
:
1
});
},
[
nodeId
])
useEffect
(()
=>
{
if
(
!
nodeId
||
nodeId
===
''
)
{
setTableData
([]);
setTotal
(
0
);
}
else
{
getTemplates
();
}
},
[
keyword
,
pagination
])
const
columns
=
useMemo
(()
=>
{
const
columns
=
useMemo
(()
=>
{
return
([
return
([
...
@@ -47,29 +68,17 @@ const DefineTable = (props) => {
...
@@ -47,29 +68,17 @@ const DefineTable = (props) => {
ellipsis
:
true
,
ellipsis
:
true
,
},
},
{
{
title
:
'创建人'
,
title
:
'修改时间'
,
dataIndex
:
'creator'
,
dataIndex
:
'lastUpdateTime'
,
width
:
200
,
ellipsis
:
true
,
},
{
title
:
'创建时间'
,
dataIndex
:
'createTime'
,
width
:
200
,
ellipsis
:
true
,
},
{
title
:
'修改人'
,
dataIndex
:
'modifier'
,
width
:
200
,
width
:
200
,
ellipsis
:
true
,
ellipsis
:
true
,
},
},
{
{
title
:
'
修改时间
'
,
title
:
'
模版描述
'
,
dataIndex
:
'
modifyTime
'
,
dataIndex
:
'
comment
'
,
width
:
200
,
width
:
200
,
ellipsis
:
true
,
ellipsis
:
true
,
}
,
}
]);
]);
},
[]);
},
[]);
...
@@ -78,22 +87,66 @@ const DefineTable = (props) => {
...
@@ -78,22 +87,66 @@ const DefineTable = (props) => {
id
:
MENU_ID
,
id
:
MENU_ID
,
});
});
const
getTemplates
=
()
=>
{
setLoading
(
true
);
dispatch
({
type
:
'msd.getModels'
,
payload
:
{
params
:
{
nodeId
,
keyword
,
pageNum
,
pageSize
}
},
callback
:
(
data
)
=>
{
setLoading
(
false
);
setTableData
(
data
?.
content
||
[]);
setTotal
(
data
?.
numberOfElements
||
0
);
},
error
:
()
=>
{
setLoading
(
false
);
}
});
}
const
onAddClick
=
()
=>
{
const
onAddClick
=
()
=>
{
setAction
(
'add'
);
setAction
(
'add'
);
setCurrentTemplate
(
null
);
setIsTemplateModalVisible
(
true
);
setIsTemplateModalVisible
(
true
);
}
}
const
onItemClick
=
()
=>
{
const
onItemClick
=
(
record
)
=>
{
setAction
(
'detail'
);
setAction
(
'detail'
);
setCurrentTemplate
(
record
);
setIsTemplateModalVisible
(
true
);
setIsTemplateModalVisible
(
true
);
}
}
const
onTemplateModalCancel
=
()
=>
{
const
onTemplateModalCancel
=
(
refresh
=
false
)
=>
{
setIsTemplateModalVisible
(
false
);
setIsTemplateModalVisible
(
false
);
if
(
refresh
)
{
getTemplates
();
}
}
}
const
onBatchDeleteClick
=
()
=>
{
const
onBatchDeleteClick
=
()
=>
{
setDeleteLoading
(
true
);
dispatch
({
type
:
'msd.deleteModels'
,
payload
:
{
params
:
{
modelIds
:
(
checkedKeys
||
[]).
join
(
','
)
}
},
callback
:
(
data
)
=>
{
setDeleteLoading
(
false
);
showMessage
(
'success'
,
'删除成功'
);
getTemplates
();
},
error
:
()
=>
{
setDeleteLoading
(
false
);
}
});
}
}
const
onSearchInputChange
=
(
value
)
=>
{
const
onSearchInputChange
=
(
value
)
=>
{
...
@@ -113,6 +166,11 @@ const DefineTable = (props) => {
...
@@ -113,6 +166,11 @@ const DefineTable = (props) => {
}
}
}
}
const
changeCurrent
=
(
page
,
size
)
=>
{
setCheckedKeys
([]);
setPagination
({
pageNum
:
page
,
pageSize
:
size
});
}
const
rowSelection
=
{
const
rowSelection
=
{
selectedRowKeys
:
checkedKeys
,
selectedRowKeys
:
checkedKeys
,
onChange
:
onTableSelectChange
,
onChange
:
onTableSelectChange
,
...
@@ -126,7 +184,9 @@ const DefineTable = (props) => {
...
@@ -126,7 +184,9 @@ const DefineTable = (props) => {
<
Button
onClick=
{
onAddClick
}
>
新建
</
Button
>
<
Button
onClick=
{
onAddClick
}
>
新建
</
Button
>
</
Space
>
</
Space
>
<
Space
>
<
Space
>
<
Button
onClick=
{
onBatchDeleteClick
}
>
删除
</
Button
>
<
Tooltip
title=
{
(
checkedKeys
||
[]).
length
===
0
?
'请先选择模版'
:
''
}
>
<
Button
onClick=
{
onBatchDeleteClick
}
disabled=
{
(
checkedKeys
||
[]).
length
===
0
}
loading=
{
deleteLoading
}
>
删除
</
Button
>
</
Tooltip
>
</
Space
>
</
Space
>
</
Space
>
</
Space
>
<
InputDebounce
<
InputDebounce
...
@@ -139,7 +199,8 @@ const DefineTable = (props) => {
...
@@ -139,7 +199,8 @@ const DefineTable = (props) => {
</
div
>
</
div
>
<
div
className=
'data-master-content p-3'
>
<
div
className=
'data-master-content p-3'
>
<
ResizeableTable
<
ResizeableTable
rowKey=
'id'
loading=
{
loading
}
rowKey=
'_id'
rowSelection=
{
rowSelection
}
rowSelection=
{
rowSelection
}
columns=
{
columns
}
columns=
{
columns
}
dataSource=
{
tableData
}
dataSource=
{
tableData
}
...
@@ -152,12 +213,27 @@ const DefineTable = (props) => {
...
@@ -152,12 +213,27 @@ const DefineTable = (props) => {
};
};
}
}
}
}
pagination=
{
false
}
pagination=
{
false
}
scroll=
{
{
y
:
'calc(100vh - 94px - 37px - 57px - 24px - 32px)'
}
}
scroll=
{
{
y
:
'calc(100vh - 94px - 37px - 57px - 24px - 32px - 48px)'
}
}
/>
<
Pagination
size=
"small"
className=
"text-center m-3"
showSizeChanger
showQuickJumper
onChange=
{
changeCurrent
}
onShowSizeChange=
{
changeCurrent
}
current=
{
pageNum
}
pageSize=
{
pageSize
}
defaultCurrent=
{
1
}
total=
{
total
}
showTotal=
{
total
=>
`共 ${total} 条`
}
/>
/>
</
div
>
</
div
>
<
UpdateTemplateModal
<
UpdateTemplateModal
action=
{
action
}
action=
{
action
}
nodeId=
{
nodeId
}
template=
{
currentTemplate
}
visible=
{
isTemplateModalVisible
}
visible=
{
isTemplateModalVisible
}
onCancel=
{
onTemplateModalCancel
}
onCancel=
{
onTemplateModalCancel
}
/>
/>
...
...
src/view/Manage/DataMaster/Define/Component/UpdateBasicInfo.jsx
View file @
3a5c1211
...
@@ -3,7 +3,7 @@ import { Form, Input, Row, Col, Descriptions } from "antd";
...
@@ -3,7 +3,7 @@ import { Form, Input, Row, Col, Descriptions } from "antd";
const
{
TextArea
}
=
Input
;
const
{
TextArea
}
=
Input
;
const
UpdateBasicInfo
=
(
props
)
=>
{
const
UpdateBasicInfo
=
(
props
)
=>
{
const
{
form
,
editable
}
=
props
;
const
{
form
,
editable
,
template
}
=
props
;
const
formItemLayout
=
{
const
formItemLayout
=
{
labelCol
:
{
labelCol
:
{
...
@@ -36,15 +36,15 @@ const UpdateBasicInfo = (props) => {
...
@@ -36,15 +36,15 @@ const UpdateBasicInfo = (props) => {
</
Form
.
Item
>
</
Form
.
Item
>
</
Col
>
</
Col
>
<
Col
xs=
{
24
}
sm=
{
24
}
lg=
{
12
}
>
<
Col
xs=
{
24
}
sm=
{
24
}
lg=
{
12
}
>
<
Form
.
Item
label=
'模版描述'
name=
'
desc
'
>
<
Form
.
Item
label=
'模版描述'
name=
'
comment
'
>
<
TextArea
row=
{
4
}
/>
<
TextArea
row=
{
4
}
/>
</
Form
.
Item
>
</
Form
.
Item
>
</
Col
>
</
Col
>
</
Row
>
</
Row
>
</
Form
>
:
<
Descriptions
column=
{
2
}
>
</
Form
>
:
<
Descriptions
column=
{
2
}
>
<
Descriptions
.
Item
label=
{
<
div
style=
{
{
textAlign
:
'right'
,
width
:
85
}
}
>
中文名称
</
div
>
}
>
中文
</
Descriptions
.
Item
>
<
Descriptions
.
Item
label=
{
<
div
style=
{
{
textAlign
:
'right'
,
width
:
85
}
}
>
中文名称
</
div
>
}
>
{
template
?.
cnName
||
''
}
</
Descriptions
.
Item
>
<
Descriptions
.
Item
label=
{
<
div
style=
{
{
textAlign
:
'right'
,
width
:
85
}
}
>
英文名称
</
div
>
}
>
英文
</
Descriptions
.
Item
>
<
Descriptions
.
Item
label=
{
<
div
style=
{
{
textAlign
:
'right'
,
width
:
85
}
}
>
英文名称
</
div
>
}
>
{
template
?.
name
||
''
}
</
Descriptions
.
Item
>
<
Descriptions
.
Item
label=
{
<
div
style=
{
{
textAlign
:
'right'
,
width
:
85
}
}
>
模版描述
</
div
>
}
>
描述
</
Descriptions
.
Item
>
<
Descriptions
.
Item
label=
{
<
div
style=
{
{
textAlign
:
'right'
,
width
:
85
}
}
>
模版描述
</
div
>
}
>
{
template
?.
comment
||
''
}
</
Descriptions
.
Item
>
</
Descriptions
>
</
Descriptions
>
}
}
</
div
>
</
div
>
...
...
src/view/Manage/DataMaster/Define/Component/UpdateField.jsx
View file @
3a5c1211
import
React
,
{
useState
,
useRef
,
useEffect
,
useMemo
,
useCallback
,
useContext
}
from
"react"
;
import
React
,
{
useState
,
useRef
,
useEffect
,
useMemo
,
useCallback
,
useContext
}
from
"react"
;
import
{
Tooltip
,
Table
,
Space
,
Popover
,
Input
,
Button
,
Form
}
from
"antd"
;
import
{
Tooltip
,
Table
,
Space
,
Popover
,
Input
,
Button
,
Form
,
Checkbox
}
from
"antd"
;
import
{
QuestionCircleOutlined
,
PlusOutlined
,
DeleteOutlined
}
from
'@ant-design/icons'
;
import
{
QuestionCircleOutlined
,
PlusOutlined
,
DeleteOutlined
}
from
'@ant-design/icons'
;
import
{
useClickAway
}
from
'ahooks'
;
import
{
useClickAway
}
from
'ahooks'
;
import
update
from
'immutability-helper'
;
import
update
from
'immutability-helper'
;
...
@@ -7,26 +7,122 @@ import { DndProvider } from 'react-dnd';
...
@@ -7,26 +7,122 @@ import { DndProvider } from 'react-dnd';
import
{
HTML5Backend
}
from
'react-dnd-html5-backend'
;
import
{
HTML5Backend
}
from
'react-dnd-html5-backend'
;
import
DebounceInput
from
"../../../Model/Component/DebounceInput"
;
import
DebounceInput
from
"../../../Model/Component/DebounceInput"
;
import
{
templateFileds
}
from
"./Mock"
;
import
{
inputWidth
,
generateUUID
}
from
"../../../../../util"
;
import
{
inputWidth
,
generateUUID
}
from
"../../../../../util"
;
import
{
EditableCell
,
DragableBodyRow
}
from
"../../../Model/Component/ImportActionTable"
;
import
{
DragableBodyRow
,
DatatypeInput
}
from
"../../../Model/Component/ImportActionTable"
;
import
{
dispatch
}
from
"../../../../../model"
;
import
{
dispatch
}
from
"../../../../../model"
;
import
{
EditTemplateContext
}
from
"./UpdateTemplateModal"
;
import
{
EditTemplateContext
}
from
"./UpdateTemplateModal"
;
import
{
getAllFileds
}
from
"../../../../../model/datamodel"
;
const
InputDebounce
=
DebounceInput
(
300
)(
Input
);
const
InputDebounce
=
DebounceInput
(
300
)(
Input
);
const
FieldTypeComp
=
(
props
)
=>
{
const
{
dataType
=
{}}
=
props
;
const
[
value
,
setValue
]
=
useState
(
''
);
useEffect
(()
=>
{
try
{
let
dataTypeJson
=
JSON
.
parse
(
dataType
);
if
((
dataTypeJson
?.
name
===
'Char'
||
dataTypeJson
?.
name
===
'Varchar'
)
&&
dataTypeJson
?.
parameterValues
?.
length
>
0
)
{
setValue
(
`
${
dataTypeJson
?.
name
||
''
}(
$
{(
dataTypeJson
?.
parameterValues
[
0
]?
dataTypeJson
?.
parameterValues
[
0
]:
0
)})
`);
} else if ((dataTypeJson?.name==='Decimal'||dataTypeJson?.name==='Numeric') && dataTypeJson?.parameterValues?.length>1) {
setValue(`
$
{
dataTypeJson
?.
name
||
''
}(
$
{(
dataTypeJson
?.
parameterValues
[
0
]?
dataTypeJson
?.
parameterValues
[
0
]:
0
)},
$
{(
dataTypeJson
?.
parameterValues
[
1
]?
dataTypeJson
?.
parameterValues
[
1
]:
0
)})
`);
} else {
setValue(dataTypeJson?.name||'');
}
} catch(error) {
setValue('');
}
}, [dataType])
return (
<span>{value}</span>
)
}
export const EditableCell = ({
editing,
dataIndex,
colTitle,
inputType,
record,
index,
datatypes,
require,
children,
...restProps
}) => {
let editingComponent = null;
if (editing) {
if (dataIndex !== 'dataType') {
const inputNode = inputType === 'check' ? <Checkbox /> : <InputDebounce />
editingComponent = (
<Form.Item
name={dataIndex}
style={{
margin: 0,
}}
valuePropName={(inputType==='check')? 'checked': 'value'}
rules={[
{
required: (require===null)?false:require,
message: `
请输入
$
{
colTitle
}
!
`,
},
]}
>
{ inputNode }
</Form.Item>
);
} else {
editingComponent = (
<Form.Item
name={dataIndex}
style={{
margin: 0,
}}
valuePropName={'value'}
rules={[
{
required: (require===null)?false:require,
message: `
请输入
$
{
colTitle
}
!
`,
},
]}
>
<DatatypeInput datatypes={datatypes} />
</Form.Item>
)
}
}
return (
<td {...restProps}>
{editing ? (
editingComponent
) : (
children
)}
</td>
);
};
const UpdateField = (props) => {
const UpdateField = (props) => {
const
{
editable
=
true
}
=
props
;
const {editable = true
, template, visible, onChange
} = props;
const
[
data
,
setData
]
=
useState
(
templateFileds
);
const [data, setData] = useState(
[]
);
const [keyword, setKeyword] = useState('');
const [keyword, setKeyword] = useState('');
const
[
editingKey
,
setEditingKey
]
=
useState
(
''
);
const [editingKey, setEditingKey] = useState(
null
);
const [insertIndex, setInsertIndex] = useState(0);
const [insertIndex, setInsertIndex] = useState(0);
const [supportedDatatypes, setSupportedDatatypes] = useState([]);
const [supportedDatatypes, setSupportedDatatypes] = useState([]);
const [loading, setLoading] = useState(false);
const [form] = Form.useForm();
const [form] = Form.useForm();
const tableRef = useRef(null);
const tableRef = useRef(null);
const { attrIsEditingFunction } = useContext(EditTemplateContext);
const { attrIsEditingFunction } = useContext(EditTemplateContext);
const
col
umn
s
=
[
const cols = [
{
{
title: '序号',
title: '序号',
dataIndex: 'key',
dataIndex: 'key',
...
@@ -68,31 +164,18 @@ const UpdateField = (props) => {
...
@@ -68,31 +164,18 @@ const UpdateField = (props) => {
},
},
{
{
title: '类型',
title: '类型',
width
:
(
editingKey
!==
''
)?
250
:
150
,
width: (editingKey!==
null
)?250:150,
dataIndex
:
'data
t
ype'
,
dataIndex: 'data
T
ype',
editable: true,
editable: true,
ellipsis: true,
ellipsis: true,
require: true,
require: true,
render: (_, record, __) => {
render: (_, record, __) => {
if
(
record
?.
datatype
)
{
return <FieldTypeComp dataType={record?.dataType} />;
if
((
record
?.
datatype
?.
name
===
'Char'
||
record
?.
datatype
?.
name
===
'Varchar'
)
&&
record
?.
datatype
?.
parameterValues
?.
length
>
0
)
{
return
`
${
record
?.
datatype
?.
name
||
''
}(
$
{(
record
?.
datatype
?.
parameterValues
[
0
]?
record
.
datatype
.
parameterValues
[
0
]:
0
)})
`;
} else if ((record?.datatype?.name==='Decimal'||record?.datatype?.name==='Numeric') && record?.datatype?.parameterValues?.length>1) {
return `
$
{
record
?.
datatype
?.
name
||
''
}(
$
{(
record
?.
datatype
?.
parameterValues
[
0
]?
record
.
datatype
.
parameterValues
[
0
]:
0
)},
$
{(
record
?.
datatype
?.
parameterValues
[
1
]?
record
.
datatype
.
parameterValues
[
1
]:
0
)})
`;
}
return record.datatype.name||'';
}
return '';
}
}
},
},
{
{
title: '业务含义',
title: '业务含义',
dataIndex: '
remark
',
dataIndex: '
comment
',
editable: true,
editable: true,
ellipsis: true,
ellipsis: true,
require: true,
require: true,
...
@@ -104,49 +187,71 @@ const UpdateField = (props) => {
...
@@ -104,49 +187,71 @@ const UpdateField = (props) => {
</Tooltip>
</Tooltip>
)
)
}
}
},
}
{
];
title: '操作',
dataIndex: 'action',
const actionCol = {
width: 90,
title: '操作',
fixed: 'right',
dataIndex: 'action',
render: (_, record) => {
width: 90,
return (
fixed: 'right',
<React.Fragment>
render: (_, record) => {
return (
<React.Fragment>
{
editable && <React.Fragment>
{
{
editable && <React.Fragment>
<React.Fragment>
{
<Button
<React.Fragment>
className='mr-3'
<Button
size='small'
className='mr-3'
type='text'
size='small'
icon={<PlusOutlined className='default' />}
type='text'
onClick={(event) => {
icon={<PlusOutlined className='default' />}
event.stopPropagation();
onClick={(event) => {
insertToFrontItem(record);
event.stopPropagation();
}}
insertToFrontItem(record);
/>
}}
/>
<Button
className='mr-3'
<Button
size='small'
className='mr-3'
type='text'
size='small'
icon={<DeleteOutlined style={{ color: 'red' }} />}
type='text'
onClick={(event) => {
icon={<DeleteOutlined style={{ color: 'red' }} />}
event.stopPropagation();
onClick={(event) => {
removeItem(record);
event.stopPropagation();
}}
removeItem(record);
/>
}}
</React.Fragment>
/>
</React.Fragment>
}
</React.Fragment>
}
}
</React.Fragment>
</React.Fragment>
)
}
},
</React.Fragment>
)
},
},
];
};
useEffect(() => {
if (visible) {
setEditingKey(null);
if (!template) {
setData([]);
} else {
getFileds();
}
}
}, [visible, template])
const columns = useMemo(() => {
const newColumns = [...cols];
if (editable) {
newColumns.push(actionCol);
}
return newColumns;
}, [editable]);
useClickAway(() => {
useClickAway(() => {
save();
save();
...
@@ -157,25 +262,53 @@ const UpdateField = (props) => {
...
@@ -157,25 +262,53 @@ const UpdateField = (props) => {
}, [])
}, [])
useEffect(() => {
useEffect(() => {
attrIsEditingFunction && attrIsEditingFunction(editingKey!=
=''
);
attrIsEditingFunction && attrIsEditingFunction(editingKey!=
null
);
//eslint-disable-next-line react-hooks/exhaustive-deps
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [
editingKey
])
}, [
editingKey
])
const filterData = useMemo(() => {
const filterData = useMemo(() => {
return (data||[]).filter(item => (item?.name||'').indexOf(keyword)!==-1 || (item.cnName).indexOf(keyword)!==-1);
return (data||[]).filter(item => (item?.name||'').indexOf(keyword)!==-1 || (item.cnName).indexOf(keyword)!==-1);
}, [keyword, data])
}, [keyword, data])
const isEditing = (record) => record?.
iid
=== editingKey;
const isEditing = (record) => record?.
name
=== editingKey;
const getSupportedDatatypes = () => {
const getSupportedDatatypes = () => {
dispatch({
dispatch({
type: '
datamodel.getSupportedDatat
ypes',
type: '
msd.getT
ypes',
callback: data => {
callback: data => {
setSupportedDatatypes(data||[]);
setSupportedDatatypes(data||[]);
}
}
});
});
}
}
const getFileds = () => {
setLoading(true);
dispatch({
type: 'msd.getColumns',
payload: {
params: {
modelId: template?._id||''
}
},
callback: data => {
setLoading(false);
function compare(val1, val2) {
var a = val1.seq;
var b = val2.seq;
return (a - b);
}
(data||[]).sort(compare);
setData(data||[]);
onChange && onChange(data||[]);
},
error: () => {
setLoading(false);
}
});
}
const onAddClick = (event) => {
const onAddClick = (event) => {
event.stopPropagation();
event.stopPropagation();
...
@@ -183,15 +316,15 @@ const UpdateField = (props) => {
...
@@ -183,15 +316,15 @@ const UpdateField = (props) => {
if (result) {
if (result) {
setKeyword('');
setKeyword('');
const iid = generateUUID();
const newData = [...data, {name: ''}];
const newData = [...data, { iid }];
setData(newData);
setData(newData);
setInsertIndex(newData.length-1);
setInsertIndex(newData.length-1);
editItem(newData[newData.length-1]);
editItem(newData[newData.length-1], false);
setTimeout(() => {
setTimeout(() => {
document.getElementById(`
field
-
$
{
iid
}
`)?.scrollIntoView();
document.getElementById(`
field
-
`)?.scrollIntoView();
}, 200)
}, 200)
}
}
})
})
...
@@ -203,16 +336,14 @@ const UpdateField = (props) => {
...
@@ -203,16 +336,14 @@ const UpdateField = (props) => {
setKeyword('');
setKeyword('');
let newData = [...data];
let newData = [...data];
const index = newData.findIndex((item) => record.iid === item.iid);
const index = newData.findIndex((item) => record.name === item.name);
const iid = generateUUID();
if (index === 0) {
if (index === 0) {
newData = [{
iid
}, ...newData];
newData = [{
name: ''
}, ...newData];
setInsertIndex(0);
setInsertIndex(0);
editItem(newData[0], false);
editItem(newData[0], false);
} else {
} else {
newData.splice(index, 0, {
iid
});
newData.splice(index, 0, {
name: ''
});
setInsertIndex(index);
setInsertIndex(index);
editItem(newData[index], false);
editItem(newData[index], false);
}
}
...
@@ -220,7 +351,7 @@ const UpdateField = (props) => {
...
@@ -220,7 +351,7 @@ const UpdateField = (props) => {
setData(newData);
setData(newData);
setTimeout(() => {
setTimeout(() => {
document.getElementById(`
field
-
$
{
iid
}
`)?.scrollIntoView();
document.getElementById(`
field
-
`)?.scrollIntoView();
}, 200)
}, 200)
}
}
})
})
...
@@ -228,20 +359,21 @@ const UpdateField = (props) => {
...
@@ -228,20 +359,21 @@ const UpdateField = (props) => {
const removeItemLogic = (record) => {
const removeItemLogic = (record) => {
const newData = [...data];
const newData = [...data];
const index = newData.findIndex((item) => record.
iid === item.iid
);
const index = newData.findIndex((item) => record.
name === item.name
);
if (index !== -1) {
if (index !== -1) {
newData.splice(index, 1);
newData.splice(index, 1);
}
}
setData(newData);
setData(newData);
onChange && onChange(newData);
}
}
const removeItem = (record) => {
const removeItem = (record) => {
if (record.
iid
!== editingKey) {
if (record.
name
!== editingKey) {
removeItemLogic(record);
removeItemLogic(record);
} else {
} else {
setEditingKey(
''
);
setEditingKey(
null
);
removeItemLogic(record);
removeItemLogic(record);
}
}
}
}
...
@@ -256,9 +388,16 @@ const UpdateField = (props) => {
...
@@ -256,9 +388,16 @@ const UpdateField = (props) => {
const editItemLogic = (record) => {
const editItemLogic = (record) => {
form.resetFields();
form.resetFields();
form.setFieldsValue(record);
setEditingKey(record?.iid);
try {
let dataTypeJson = JSON.parse(record?.dataType);
form.setFieldsValue({...record, dataType: dataTypeJson});
setEditingKey(record?.name);
} catch {
form.setFieldsValue({...record, dataType: {}});
setEditingKey(record?.name);
}
}
}
const editItem = (record) => {
const editItem = (record) => {
...
@@ -271,22 +410,22 @@ const UpdateField = (props) => {
...
@@ -271,22 +410,22 @@ const UpdateField = (props) => {
const save = async() => {
const save = async() => {
try {
try {
if (editingKey
!==''
) {
if (editingKey
!== null
) {
const row = await form.validateFields();
const row = await form.validateFields();
if ((row.data
t
ype.name||'')==='') {
if ((row.data
T
ype.name||'')==='') {
form.setFields([{ name: 'data
t
ype', errors: ['必须选择类型'] }]);
form.setFields([{ name: 'data
T
ype', errors: ['必须选择类型'] }]);
return;
return;
}
}
(row.data
t
ype.parameterNames||[]).forEach((parameterName, index) => {
(row.data
T
ype.parameterNames||[]).forEach((parameterName, index) => {
if (!row.data
type.parameterValues[index] || row.datat
ype.parameterValues[index]==='') {
if (!row.data
Type.parameterValues[index] || row.dataT
ype.parameterValues[index]==='') {
row.data
t
ype.parameterValues[index] = 0;
row.data
T
ype.parameterValues[index] = 0;
}
}
})
})
const newData = [...data];
const newData = [...data];
const index = newData.findIndex((item) => editingKey === item.
iid
);
const index = newData.findIndex((item) => editingKey === item.
name
);
//判断字段名称是否唯一
//判断字段名称是否唯一
let _index;
let _index;
...
@@ -303,9 +442,11 @@ const UpdateField = (props) => {
...
@@ -303,9 +442,11 @@ const UpdateField = (props) => {
return;
return;
}
}
row.dataType = JSON.stringify(row.dataType);
let attribute = {};
let attribute = {};
if (index === -1) {
if (index === -1) {
attribute = {...row
, iid: editingKey
};
attribute = {...row};
newData.splice(insertIndex, 0, attribute);
newData.splice(insertIndex, 0, attribute);
} else {
} else {
const item = newData[index];
const item = newData[index];
...
@@ -313,8 +454,9 @@ const UpdateField = (props) => {
...
@@ -313,8 +454,9 @@ const UpdateField = (props) => {
newData.splice(index, 1, attribute);
newData.splice(index, 1, attribute);
}
}
setEditingKey(
''
);
setEditingKey(
null
);
setData(newData);
setData(newData);
onChange && onChange(newData);
}
}
return true;
return true;
...
@@ -327,14 +469,15 @@ const UpdateField = (props) => {
...
@@ -327,14 +469,15 @@ const UpdateField = (props) => {
const moveRow = useCallback(
const moveRow = useCallback(
(dragIndex, hoverIndex) => {
(dragIndex, hoverIndex) => {
const dragRow = data[dragIndex];
const dragRow = data[dragIndex];
setData(
const newData = update(data, {
update(data, {
$splice: [
$splice: [
[dragIndex, 1],
[dragIndex, 1],
[hoverIndex, 0, dragRow],
[hoverIndex, 0, dragRow],
],
],
});
}),
);
setData(newData);
onChange && onChange(newData);
},
},
[data],
[data],
);
);
...
@@ -342,7 +485,7 @@ const UpdateField = (props) => {
...
@@ -342,7 +485,7 @@ const UpdateField = (props) => {
const onTableRow = (record, index) => {
const onTableRow = (record, index) => {
let rowParams = {
let rowParams = {
index,
index,
id: `
field
-
$
{
record
.
iid
}
`,
id: `
field
-
$
{
record
.
name
}
`,
};
};
if (editable) {
if (editable) {
...
@@ -384,7 +527,7 @@ const UpdateField = (props) => {
...
@@ -384,7 +527,7 @@ const UpdateField = (props) => {
<div>
<div>
<div className='d-flex mb-3' style={{ justifyContent: 'space-between' }}>
<div className='d-flex mb-3' style={{ justifyContent: 'space-between' }}>
<Space>
<Space>
<h
2 style={{ marginBottom: 0 }}>字段信息</h2
>
<h
3 style={{ marginBottom: 0 }}>字段信息</h3
>
{
{
editable && <Popover content='点击行进行编辑,表格可以通过拖拽来排序'>
editable && <Popover content='点击行进行编辑,表格可以通过拖拽来排序'>
<QuestionCircleOutlined className='pointer' />
<QuestionCircleOutlined className='pointer' />
...
@@ -410,7 +553,8 @@ const UpdateField = (props) => {
...
@@ -410,7 +553,8 @@ const UpdateField = (props) => {
<DndProvider backend={HTML5Backend} >
<DndProvider backend={HTML5Backend} >
<Form form={form} component={false}>
<Form form={form} component={false}>
<Table
<Table
rowKey='iid'
rowKey='_id'
loading={loading}
dataSource={filterData}
dataSource={filterData}
columns={mergedColumns}
columns={mergedColumns}
pagination={false}
pagination={false}
...
@@ -418,7 +562,7 @@ const UpdateField = (props) => {
...
@@ -418,7 +562,7 @@ const UpdateField = (props) => {
body: {
body: {
cell: EditableCell,
cell: EditableCell,
//编辑或者搜索状态下不允许拖动
//编辑或者搜索状态下不允许拖动
row: (editable&&editingKey===
''
&&keyword==='')?DragableBodyRow:null,
row: (editable&&editingKey===
null
&&keyword==='')?DragableBodyRow:null,
},
},
}}
}}
onRow={onTableRow}
onRow={onTableRow}
...
...
src/view/Manage/DataMaster/Define/Component/UpdateTemplateModal.jsx
View file @
3a5c1211
import
React
,
{
use
Memo
,
useRef
}
from
'react'
;
import
React
,
{
use
Effect
,
useMemo
,
useRef
,
useState
}
from
'react'
;
import
{
Modal
,
Form
,
Button
}
from
"antd"
;
import
{
Modal
,
Form
,
Button
}
from
"antd"
;
import
UpdateBasicInfo
from
"./UpdateBasicInfo"
;
import
UpdateBasicInfo
from
"./UpdateBasicInfo"
;
import
UpdateField
from
"./UpdateField"
;
import
UpdateField
from
"./UpdateField"
;
import
{
showMessage
}
from
'../../../../../util'
;
import
{
showMessage
}
from
'../../../../../util'
;
import
{
dispatch
}
from
'../../../../../model'
;
import
'./UpdateTemplateModal.less'
;
import
'./UpdateTemplateModal.less'
;
export
const
EditTemplateContext
=
React
.
createContext
({
export
const
EditTemplateContext
=
React
.
createContext
({
...
@@ -11,10 +12,19 @@ export const EditTemplateContext = React.createContext({
...
@@ -11,10 +12,19 @@ export const EditTemplateContext = React.createContext({
});
});
export
const
UpdateTemplateModal
=
(
props
)
=>
{
export
const
UpdateTemplateModal
=
(
props
)
=>
{
const
{
visible
,
onCancel
,
action
=
'add'
}
=
props
;
const
{
visible
,
onCancel
,
action
=
'add'
,
template
,
nodeId
}
=
props
;
const
[
form
]
=
Form
.
useForm
();
const
[
form
]
=
Form
.
useForm
();
const
[
fields
,
setFields
]
=
useState
([]);
const
[
confirmLoading
,
setConfirmLoading
]
=
useState
(
false
);
const
attrIsEditingRef
=
useRef
(
false
);
const
attrIsEditingRef
=
useRef
(
false
);
useEffect
(()
=>
{
if
(
visible
)
{
form
?.
setFieldsValue
({
name
:
template
?.
name
||
''
,
cnName
:
template
?.
cnName
||
''
,
comment
:
template
?.
comment
||
''
});
setFields
([]);
}
},
[
visible
])
const
title
=
useMemo
(()
=>
{
const
title
=
useMemo
(()
=>
{
if
(
action
===
'add'
)
{
if
(
action
===
'add'
)
{
return
'新建模版'
;
return
'新建模版'
;
...
@@ -32,6 +42,10 @@ export const UpdateTemplateModal = (props) => {
...
@@ -32,6 +42,10 @@ export const UpdateTemplateModal = (props) => {
attrIsEditingRef
.
current
=
value
;
attrIsEditingRef
.
current
=
value
;
}
}
const
onFieldChange
=
(
values
)
=>
{
setFields
(
values
);
}
const
save
=
(
e
)
=>
{
const
save
=
(
e
)
=>
{
e
.
stopPropagation
();
e
.
stopPropagation
();
...
@@ -44,8 +58,52 @@ export const UpdateTemplateModal = (props) => {
...
@@ -44,8 +58,52 @@ export const UpdateTemplateModal = (props) => {
const
saveLogic
=
async
()
=>
{
const
saveLogic
=
async
()
=>
{
try
{
try
{
await
form
.
validateFields
();
const
row
=
await
form
.
validateFields
();
// const row = await form.validateFields();
setConfirmLoading
(
true
);
let
url
=
''
,
newTemplate
=
{};
if
(
action
===
'add'
)
{
url
=
'msd.addModel'
;
newTemplate
=
{...
row
,
nodeId
:
nodeId
||
''
};
}
else
{
url
=
'msd.updateModel'
;
newTemplate
=
{...
template
,
...
row
}
}
dispatch
({
type
:
url
,
payload
:
{
data
:
newTemplate
},
callback
:
id
=>
{
(
fields
||
[]).
forEach
((
field
,
index
)
=>
{
field
.
parentId
=
id
;
field
.
seq
=
index
;
});
dispatch
({
type
:
'msd.saveColumns'
,
payload
:
{
params
:
{
modelId
:
id
},
data
:
fields
},
callback
:
()
=>
{
setConfirmLoading
(
false
);
onCancel
&&
onCancel
(
true
);
},
error
:
()
=>
{
setConfirmLoading
(
false
);
}
});
},
error
:
()
=>
{
setConfirmLoading
(
false
);
}
});
}
catch
(
errInfo
)
{
}
catch
(
errInfo
)
{
console
.
log
(
'Validate Failed:'
,
errInfo
);
console
.
log
(
'Validate Failed:'
,
errInfo
);
}
}
...
@@ -56,27 +114,29 @@ export const UpdateTemplateModal = (props) => {
...
@@ -56,27 +114,29 @@ export const UpdateTemplateModal = (props) => {
attrIsEditingFunction
,
attrIsEditingFunction
,
}
}
>
}
}
>
<
Modal
<
Modal
forceRender
className=
'update-template-modal'
className=
'update-template-modal'
width=
'80%'
width=
'80%'
title=
{
title
}
title=
{
title
}
visible=
{
visible
}
visible=
{
visible
}
onCancel=
{
onCancel
}
onCancel=
{
()
=>
{
onCancel
&&
onCancel
();}
}
onOk=
{
save
}
onOk=
{
save
}
footer=
{
[
footer=
{
[
<
Button
key=
"cancel"
onClick=
{
onCancel
}
>
<
Button
key=
"cancel"
onClick=
{
()
=>
{
onCancel
&&
onCancel
();}
}
>
取消
取消
</
Button
>,
</
Button
>,
action
!==
'detail'
&&
<
Button
action
!==
'detail'
&&
<
Button
key=
"ok"
key=
"ok"
type=
"primary"
type=
"primary"
loading=
{
confirmLoading
}
onClick=
{
save
}
onClick=
{
save
}
>
>
确定
确定
</
Button
>,
</
Button
>,
]
}
]
}
>
>
<
UpdateBasicInfo
form=
{
form
}
editable=
{
action
!==
'detail'
}
/>
<
UpdateBasicInfo
form=
{
form
}
editable=
{
action
!==
'detail'
}
template=
{
template
}
/>
<
UpdateField
editable=
{
action
!==
'detail'
}
/>
<
UpdateField
editable=
{
action
!==
'detail'
}
template=
{
template
}
onChange=
{
onFieldChange
}
visible=
{
visible
}
/>
</
Modal
>
</
Modal
>
</
EditTemplateContext
.
Provider
>
</
EditTemplateContext
.
Provider
>
);
);
...
...
src/view/Manage/DataMaster/Define/index.jsx
View file @
3a5c1211
...
@@ -11,6 +11,7 @@ import './index.less';
...
@@ -11,6 +11,7 @@ import './index.less';
const
DataMasterDefine
=
(
props
)
=>
{
const
DataMasterDefine
=
(
props
)
=>
{
const
[
collapse
,
setCollapse
]
=
useState
(
false
);
const
[
collapse
,
setCollapse
]
=
useState
(
false
);
const
[
nodeId
,
setNodeId
]
=
useState
(
''
);
const
classes
=
useMemo
(()
=>
{
const
classes
=
useMemo
(()
=>
{
return
classNames
(
'data-master'
,
{
return
classNames
(
'data-master'
,
{
...
@@ -18,6 +19,10 @@ const DataMasterDefine = (props) => {
...
@@ -18,6 +19,10 @@ const DataMasterDefine = (props) => {
});
});
},
[
collapse
]);
},
[
collapse
]);
const
onTreeClick
=
(
value
)
=>
{
setNodeId
(
value
);
}
const
onCollapseClick
=
()
=>
{
const
onCollapseClick
=
()
=>
{
setCollapse
(
!
collapse
);
setCollapse
(
!
collapse
);
}
}
...
@@ -31,7 +36,7 @@ const DataMasterDefine = (props) => {
...
@@ -31,7 +36,7 @@ const DataMasterDefine = (props) => {
axis=
'x'
axis=
'x'
minConstraints=
{
[
230
,
Infinity
]
}
maxConstraints=
{
[
Infinity
,
Infinity
]
}
minConstraints=
{
[
230
,
Infinity
]
}
maxConstraints=
{
[
Infinity
,
Infinity
]
}
>
>
<
DefineTree
/>
<
DefineTree
onClick=
{
onTreeClick
}
/>
</
ResizableBox
>
</
ResizableBox
>
<
div
className=
'left-collapse-wrap'
>
<
div
className=
'left-collapse-wrap'
>
<
div
className=
'left-collapse'
onClick=
{
onCollapseClick
}
>
<
div
className=
'left-collapse'
onClick=
{
onCollapseClick
}
>
...
@@ -39,7 +44,7 @@ const DataMasterDefine = (props) => {
...
@@ -39,7 +44,7 @@ const DataMasterDefine = (props) => {
</
div
>
</
div
>
</
div
>
</
div
>
<
div
className=
'right-wrap'
>
<
div
className=
'right-wrap'
>
<
DefineTable
/>
<
DefineTable
nodeId=
{
nodeId
}
/>
</
div
>
</
div
>
</
div
>
</
div
>
)
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment