Commit cd4fa09c by zhaochengxiang

批量编辑

parent 9da5f4cf
......@@ -280,4 +280,12 @@ export function* getResourceRelatedMetadataStatus() {
export function* getElementValues(payload) {
return yield call(service.getElementValues, payload)
}
export function* getResourceBatchEditInfo(payload) {
return yield call(service.getResourceBatchEditInfo, payload)
}
export function* resourceBatchEdit(payload) {
return yield call(service.resourceBatchEdit, payload)
}
\ No newline at end of file
......@@ -270,5 +270,12 @@ export function getPreviewRangeByDirId(payload) {
export function getElementValues(payload) {
return GetJSON("/dataassetmanager/parameterApi/conf/getPropertiesByDataAssetType", payload);
}
export function getResourceBatchEditInfo(payload) {
return GetJSON("/dataassetmanager/resourceApi/getBatchEditInfo", payload)
}
}
\ No newline at end of file
export function resourceBatchEdit(payload) {
return PostJSON("/dataassetmanager/resourceApi/batchEdit", payload)
}
\ No newline at end of file
import React from 'react'
import { Modal, Button, Spin, Checkbox, Switch, Typography, Row, Col } from 'antd'
import { dispatch } from '../../../model'
import { getAssetRange, getAssetType, showMessage } from '../../../util'
const FC = (props) => {
const { type, visible, onCancel } = props
const [loading, setLoading] = React.useState(false)
const [elements, setElements] = React.useState()
const basicRef = React.useRef()
React.useEffect(() => {
if (visible) {
getElements()
}
}, [visible])
const getElements = () => {
setLoading(true)
dispatch({
type: 'assetmanage.listFilterElements',
payload: {
range: getAssetRange(type),
dataAssetType: getAssetType(type)
},
callback: data => {
setLoading(false)
setElements(data)
},
error: () => {
setLoading(false)
}
})
}
const close = (refresh = false, value = undefined) => {
setLoading(false)
onCancel?.(refresh, value)
}
const save = () => {
const selectedKeys = basicRef.current?.getSelectedKeys
if ((selectedKeys??[]).length === 0) {
showMessage('warn', '请先选择要批量编辑的属性')
return
}
onCancel(true, selectedKeys)
}
const footer = React.useMemo(() => {
return [
<Button key={'cancel'}
onClick={() => close()}
>取消</Button>,
<Button key={'save'} type='primary'
onClick={() => save()}
>确定</Button>
]
}, [close, save])
return (
<Modal
visible={visible}
footer={footer}
width={520}
bodyStyle={{ padding: '15px 15px 0px 15px', overflowX: 'auto', height: '80vh' }}
title='选择批量编辑属性'
centered destroyOnClose
onCancel={() => { close() }}
>
<Spin spinning={loading} >
<Basic ref={basicRef} elements={elements} />
</Spin>
</Modal>
)
}
export default FC
export const Basic = React.forwardRef(function ({ elements }, ref) {
const [attributes, setAttributes] = React.useState()
const [selectedKeys, setSelectedKeys] = React.useState([])
React.useImperativeHandle(ref, () => ({
getSelectedKeys: selectedKeys,
}), [selectedKeys])
React.useEffect(() => {
setAttributes(Array.from(new Set((elements??[]).map(item => item.type))))
}, [elements])
const onCheckAllChange = (checked) => {
if (checked) {
setSelectedKeys((elements??[]).map(item => item.id))
} else {
setSelectedKeys([])
}
}
const onCheckChange = (e) => {
if (e.target.checked) {
setSelectedKeys([...selectedKeys, e.target.value]);
} else {
const index = selectedKeys.findIndex(key => key === e.target.value);
selectedKeys.splice(index, 1)
setSelectedKeys([...selectedKeys]);
}
}
return (
<div>
<div className='flex'>
<Switch
checkedChildren="全不选"
unCheckedChildren="全选"
onChange={onCheckAllChange}
style={{ marginLeft: 'auto' }}
/>
</div>
<div className='mt-3' style={{ maxHeight: 450, overflow: 'auto' }}>
{
(attributes??[]).map((item, index) => {
return (
<div key={index}>
<div className='flex' style={{ alignItems: 'center', padding: '15px 0' }}>
<div style={{ width: 3, height: 14, backgroundColor: '#0069AC', marginRight: 5 }} />
<span style={{ fontWeight: 'bold', color: '#464646' }}>{item}</span>
</div>
<Row>
{
(elements??[]).filter(element => element.type === item).map((element, _index) => {
return (
<Col className='mb-3' key={_index} md={6}>
<div className='flex'>
<Checkbox
checked={(selectedKeys??[]).indexOf(element.id)!==-1}
value={element.id}
onChange={onCheckChange}
>
</Checkbox>
<Typography.Paragraph
className='ml-1'
title={element.name}
ellipsis
>
{element.name}
</Typography.Paragraph>
</div>
</Col>
);
})
}
</Row>
</div>
)
})
}
</div>
</div>
)
})
\ No newline at end of file
......@@ -20,11 +20,12 @@ import ChangeCatalog from './change-catalog'
import AssetDelete from '../AssetManage/Component/AssetDeleteModal'
import FilterElement from '../AssetManage/Component/FilterElementModal'
import FilterElementValue from './filter-element-value'
import '../AssetManage/Component/AssetTable.less'
import SelectBatchEditElements from './select-batch-edit-elements'
import { AssetDirectorySubject } from '../AssetManage/Component/AssetDirectory'
import { AssetActionSubject } from '../AssetManage/Component/AssetAction'
import '../AssetManage/Component/AssetTable.less'
const FC = (props) => {
const { type = ResourceManageReference, node, onClick, onFullScreenChange } = props
const [args, setArgs] = React.useState(() => ({
......@@ -80,11 +81,15 @@ const FC = (props) => {
type: undefined,
reference: undefined
})
const [FilterElementValueParams, setFilterElementValueParams] = React.useState({
const [filterElementValueParams, setFilterElementValueParams] = React.useState({
visible: false,
type: undefined,
defaultValue: undefined,
})
const [selectBatchEditElementsParams, setSelectBatchEditElementsParams] = React.useState({
visible: false,
type: undefined
})
const [page, setPage] = usePage()
const [ modal, contextHolder ] = Modal.useModal()
......@@ -111,6 +116,12 @@ const FC = (props) => {
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
const storageChange = (e) => {
if (e.key === 'editAssetsChange') {
getAssets()
}
}
React.useEffect(() => {
getElements()
getResourceSortingStatus()
......@@ -132,6 +143,12 @@ const FC = (props) => {
}
})
window?.addEventListener("storage", storageChange)
return () => {
window?.removeEventListener("storage", storageChange)
}
return () => {
$$keyword.unsubscribe()
$$assetDirectorySubject.unsubscribe()
......@@ -439,7 +456,10 @@ const FC = (props) => {
}
const onBatchEditClick = () => {
setSelectBatchEditElementsParams({
visible: true,
type: ResourceManageReference
})
}
const onReviewClick = () => {
......@@ -569,7 +589,12 @@ const FC = (props) => {
自动分配
</div>
</PermissionMenuItem>
<PermissionMenuItem key='batchEdit' defaultPermission={true}>
<PermissionMenuItem
key='batchEdit'
defaultPermission={true}
disabled={(selectedRows??[]).length===0}
tip={(selectedRows??[]).length===0?'请先选择资源':''}
>
<div className='text-center'>
批量编辑
</div>
......@@ -597,7 +622,7 @@ const FC = (props) => {
key='changeDir'
defaultPermission={changeDirectoryAble}
disabled={(selectedRows??[]).length===0}
tip={(selectedRows??[]).length===0?'请先选择资':''}
tip={(selectedRows??[]).length===0?'请先选择资':''}
>
<div className='text-center'>
变更目录
......@@ -608,7 +633,7 @@ const FC = (props) => {
key='delete'
defaultPermission={deleteAble}
disabled={(selectedRows??[]).length===0}
tip={(selectedRows??[]).length===0?'请先选择资':''}
tip={(selectedRows??[]).length===0?'请先选择资':''}
>
<div className='text-center'>
删除
......@@ -671,6 +696,8 @@ const FC = (props) => {
<PermissionButton
defaultPermission={true}
onClick={onBatchEditClick}
disabled={(selectedRows??[]).length===0}
tip={(selectedRows??[]).length===0?'请先选择资源':''}
>
批量编辑
</PermissionButton>
......@@ -890,7 +917,7 @@ const FC = (props) => {
}}
/>
<FilterElementValue
{...FilterElementValueParams}
{...filterElementValueParams}
onCancel={(refresh, val) => {
setFilterElementValueParams({
visible: false,
......@@ -904,6 +931,19 @@ const FC = (props) => {
}
}}
/>
<SelectBatchEditElements
{...selectBatchEditElementsParams}
onCancel={(refresh, value) => {
setSelectBatchEditElementsParams({
visible: false,
type: undefined,
})
if (refresh) {
window.open(`/data-govern/edit-assets?ids=${(selectedRows??[]).map(item => item.id).toString()}&elementIds=${(value??[]).toString()}`)
}
}}
/>
{contextHolder}
</div>
)
......
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