Commit e2fec0c2 by zhaochengxiang

批量合并到基线

parent ce14da50
import React from 'react' import React from 'react'
import { Modal, Button, Spin, Form, Checkbox, Typography, Tooltip } from 'antd' import { Modal, Button, Spin, Form, Checkbox, Typography, Tooltip, Row, Col, Tree, } from 'antd'
import { dispatch } from '../../../../model' import { dispatch } from '../../../../model'
import VersionCompareHeader from './VersionCompareHeader' import VersionCompareHeader from './VersionCompareHeader'
...@@ -8,6 +8,7 @@ import VersionCompareIndex from './VersionCompareIndex' ...@@ -8,6 +8,7 @@ import VersionCompareIndex from './VersionCompareIndex'
import { defaultColumnTitles } from './VersionCompare' import { defaultColumnTitles } from './VersionCompare'
import FilterColumnAction from './FilterColumnAction' import FilterColumnAction from './FilterColumnAction'
import '../../AssetManage/add-resources.less'
import './VersionCompare.less' import './VersionCompare.less'
const FC = (props) => { const FC = (props) => {
...@@ -49,16 +50,17 @@ const FC = (props) => { ...@@ -49,16 +50,17 @@ const FC = (props) => {
return ( return (
<Modal <Modal
className='add-resources'
visible={visible} visible={visible}
footer={footer} footer={footer}
width='80%' width='80%'
bodyStyle={{ padding: '15px', overflowX: 'auto', height: '80vh' }} bodyStyle={{ padding: '15px', height: '80vh', overflow: 'auto' }}
title='合并到基线' title='合并到基线'
centered destroyOnClose centered destroyOnClose
onCancel={() => { close() }} onCancel={() => { close() }}
> >
<Spin spinning={waiting}> <Spin spinning={waiting}>
<Diff items={items} /> <Basic items={items} />
</Spin> </Spin>
</Modal> </Modal>
) )
...@@ -66,7 +68,54 @@ const FC = (props) => { ...@@ -66,7 +68,54 @@ const FC = (props) => {
export default FC export default FC
export const Diff = React.forwardRef(function ({ items }, ref) { export const Basic = React.forwardRef(function ({ items }, ref) {
const [currentItem, setItem] = React.useState()
React.useEffect(() => {
if ((items??[]).length > 0) {
setItem(items[0])
}
}, [items])
const treeData = React.useMemo(() => {
return (items??[]).map(item => ({
title: item.name,
key: item.id
}))
}, [items])
return (
<div>
{
(items??[]).length === 1 && <Diff item={currentItem} />
}
{
(items??[]).length > 1 && <Row gutter={10}>
<Col span={4}>
<Tree
className='tree'
selectedKeys={currentItem?[currentItem?.id]:[]}
treeData={treeData}
onSelect={(vals) => {
if ((vals??[]).length > 0) {
const filterItems = (items??[]).filter(item => (vals??[]).indexOf(item.id) !== -1)
if ((filterItems??[]).length > 0) {
setItem(filterItems[0])
}
}
}}
/>
</Col>
<Col span={20}>
<Diff item={currentItem} />
</Col>
</Row>
}
</div>
)
})
export const Diff = ({ item }) => {
const [loading, setLoading] = React.useState(false) const [loading, setLoading] = React.useState(false)
const [data, setData] = React.useState() const [data, setData] = React.useState()
const [onlyShowChange, setOnlyShowChange] = React.useState(true) const [onlyShowChange, setOnlyShowChange] = React.useState(true)
...@@ -74,66 +123,79 @@ export const Diff = React.forwardRef(function ({ items }, ref) { ...@@ -74,66 +123,79 @@ export const Diff = React.forwardRef(function ({ items }, ref) {
const [attrColumns, setAttrColumns] = React.useState() const [attrColumns, setAttrColumns] = React.useState()
React.useEffect(() => { React.useEffect(() => {
if ((items??[]).length>0) { if (item) {
getDiffForked() getDiffForked()
} }
}, [items, onlyShowChange]) }, [item, onlyShowChange])
React.useEffect(() => {
if (data) {
const newAttrOptionColumns = [];
(data?.heads?.columnHead||[]).forEach((item, index) => {
newAttrOptionColumns.push({
title: item||'',
dataIndex: `column${index}`,
render: (attrValue, record, index) => {
let stateClassName = '';
if (attrValue?.state==='ADD' || attrValue?.state==='UPDATE') {
stateClassName = 'add';
} else if (attrValue?.state === 'DELETE') {
stateClassName = 'delete';
}
return (
<Typography.Paragraph>
<Tooltip title={attrValue?.value||''}>
<Typography.Text className={stateClassName} ellipsis={true}>{attrValue?.value||''}</Typography.Text>
</Tooltip>
</Typography.Paragraph>
);
},
width: (item==='序号')?60: 150,
ellipsis: true,
option: true,
});
});
const newAttrColumns = [...newAttrOptionColumns, {
title: <FilterColumnAction columns={newAttrOptionColumns} defaultSelectedKeys={defaultColumnTitles} onChange={onFilterChange} />,
dataIndex: 'columnFilter',
render: (_, record, index) => {
return '';
},
width: 40,
ellipsis: true,
option: false
}];
setAttrColumns(newAttrColumns)
}
}, [data])
const attrFilterColumns = React.useMemo(() => { const attrFilterColumns = React.useMemo(() => {
return (attrColumns??[]).filter(column => column.option===false || (attrSelectedTitles??[]).indexOf(column.title) !== -1) return (attrColumns??[]).filter(column => column.option===false || (attrSelectedTitles??[]).indexOf(column.title) !== -1)
}, [attrSelectedTitles, attrColumns]) }, [attrSelectedTitles, attrColumns])
const onFilterChange = (values) => {
setAttrSelectedTitles(values)
}
const onOnlyShowChange = (e) => {
setOnlyShowChange(e.target.checked)
}
const getDiffForked = () => { const getDiffForked = () => {
setLoading(true) setLoading(true)
dispatch({ dispatch({
type: 'datamodel.getBranchDiffForked', type: 'datamodel.getBranchDiffForked',
payload: { payload: {
id: items[0].id, id: item?.id,
includeSame: !onlyShowChange, includeSame: !onlyShowChange,
}, },
callback: data => { callback: data => {
setLoading(false) setLoading(false)
setData(data) setData(data)
const newAttrOptionColumns = [];
(data?.heads?.columnHead||[]).forEach((item, index) => {
newAttrOptionColumns.push({
title: item||'',
dataIndex: `column${index}`,
render: (attrValue, record, index) => {
let stateClassName = '';
if (attrValue?.state==='ADD' || attrValue?.state==='UPDATE') {
stateClassName = 'add';
} else if (attrValue?.state === 'DELETE') {
stateClassName = 'delete';
}
return (
<Typography.Paragraph>
<Tooltip title={attrValue?.value||''}>
<Typography.Text className={stateClassName} ellipsis={true}>{attrValue?.value||''}</Typography.Text>
</Tooltip>
</Typography.Paragraph>
);
},
width: (item==='序号')?60: 150,
ellipsis: true,
option: true,
});
})
const newAttrColumns = [...newAttrOptionColumns, {
title: <FilterColumnAction columns={newAttrOptionColumns} defaultSelectedKeys={defaultColumnTitles} onChange={onFilterChange} />,
dataIndex: 'columnFilter',
render: (_, record, index) => {
return '';
},
width: 40,
ellipsis: true,
option: false
}];
setAttrColumns(newAttrColumns)
}, },
error: () => { error: () => {
setLoading(false) setLoading(false)
...@@ -141,25 +203,21 @@ export const Diff = React.forwardRef(function ({ items }, ref) { ...@@ -141,25 +203,21 @@ export const Diff = React.forwardRef(function ({ items }, ref) {
}) })
} }
const onOnlyShowChange = (e) => {
setOnlyShowChange(e.target.checked)
}
const onFilterChange = (values) => {
setAttrSelectedTitles(values)
}
return ( return (
<div className='model-version-compare'> <div className='model-version-compare'>
<Form layout='inline'> <div className='flex'>
<Form.Item label='分支版本'> <div style={{ flex: 1, paddingRight: 10, overflow: 'hidden'}}>
</Form.Item> 分支版本
<Form.Item label='基线版本'> </div>
</Form.Item> <div style={{ flex: 1, paddingLeft: 10, overflow: 'hidden'}}>
<Form.Item> <div className='flex' style={{ justifyContent: 'space-between', alignItems: 'center' }}>
<Checkbox onChange={onOnlyShowChange} checked={onlyShowChange}>仅显示差异</Checkbox> <span>基线版本</span>
</Form.Item> <Checkbox onChange={onOnlyShowChange} checked={onlyShowChange}>
</Form> 仅显示差异
</Checkbox>
</div>
</div>
</div>
<div className='py-5'> <div className='py-5'>
<Spin spinning={loading} > <Spin spinning={loading} >
...@@ -181,4 +239,4 @@ export const Diff = React.forwardRef(function ({ items }, ref) { ...@@ -181,4 +239,4 @@ export const Diff = React.forwardRef(function ({ items }, ref) {
</div> </div>
</div> </div>
) )
}) }
\ No newline at end of file \ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment