Commit 532e3f96 by zhaochengxiang

资源属性关联

parent 5e398889
...@@ -204,6 +204,10 @@ export function* recoveryFromRecycleBin(payload) { ...@@ -204,6 +204,10 @@ export function* recoveryFromRecycleBin(payload) {
return yield call(service.recoveryFromRecycleBin, payload); return yield call(service.recoveryFromRecycleBin, payload);
} }
export function* listSourceModels(payload) {
return yield call(service.listSourceModels, payload);
}
export function* getMetadataModelTree() { export function* getMetadataModelTree() {
return yield call(service.getMetadataModelTree); return yield call(service.getMetadataModelTree);
} }
...@@ -216,12 +220,16 @@ export function* loadElementWithoutCustom(payload) { ...@@ -216,12 +220,16 @@ export function* loadElementWithoutCustom(payload) {
return yield call(service.loadElementWithoutCustom, payload); return yield call(service.loadElementWithoutCustom, payload);
} }
export function* saveEleAndAttrRel(payload) { export function* getRelAttrBySourceModel(payload) {
return yield call(service.saveEleAndAttrRel, payload); return yield call(service.getRelAttrBySourceModel, payload);
}
export function* saveEleAndAttrRelWithSourceModel(payload) {
return yield call(service.saveEleAndAttrRelWithSourceModel, payload);
} }
export function* getRelAttrByModel(payload) { export function* deleteRelAttrBySourceModel(payload) {
return yield call(service.getRelAttrByModel, payload); return yield call(service.deleteRelAttrBySourceModel, payload);
} }
export function* fillElementValueBeforeCreate(payload) { export function* fillElementValueBeforeCreate(payload) {
......
...@@ -220,6 +220,10 @@ export function getPersonalCustomDirecotryChild(payload) { ...@@ -220,6 +220,10 @@ export function getPersonalCustomDirecotryChild(payload) {
return GetJSON("/dataassetmanager/directoryApi/getPersonalCustomChildByParentId", payload); return GetJSON("/dataassetmanager/directoryApi/getPersonalCustomChildByParentId", payload);
} }
export function listSourceModels(payload){
return GetJSON("/dataassetmanager/eleAndAttrApi/listSourceModels", payload);
}
export function getMetadataModelTree() { export function getMetadataModelTree() {
return GetJSON("/metadatarepo/rest/model/tree"); return GetJSON("/metadatarepo/rest/model/tree");
} }
...@@ -232,12 +236,16 @@ export function loadElementWithoutCustom(payload) { ...@@ -232,12 +236,16 @@ export function loadElementWithoutCustom(payload) {
return GetJSON("/dataassetmanager/eleAndAttrApi/loadElementWithoutCustom", payload); return GetJSON("/dataassetmanager/eleAndAttrApi/loadElementWithoutCustom", payload);
} }
export function saveEleAndAttrRel(payload) { export function getRelAttrBySourceModel(payload) {
return PostJSON("/dataassetmanager/eleAndAttrApi/saveEleAndAttrRel", payload); return GetJSON("/dataassetmanager/eleAndAttrApi/getRelAttrBySourceModel", payload);
}
export function saveEleAndAttrRelWithSourceModel(payload) {
return PostJSON("/dataassetmanager/eleAndAttrApi/saveEleAndAttrRelWithSourceModel", payload);
} }
export function getRelAttrByModel(payload) { export function deleteRelAttrBySourceModel(payload) {
return PostJSON("/dataassetmanager/eleAndAttrApi/getRelAttrByModel", payload); return PostJSON("/dataassetmanager/eleAndAttrApi/delEleAndAttrRelWithSourceModel", payload);
} }
export function fillElementValueBeforeCreate(payload) { export function fillElementValueBeforeCreate(payload) {
......
import React, { useEffect, useState } from 'react'; import React, { useEffect, useMemo, useRef, useState } from 'react';
import { Modal, Form, TreeSelect, Select, Space, Button, Row, Col, } from 'antd'; import { Modal, Form, TreeSelect, Select, Space, Button, Row, Col, Tabs, Spin, Input, message } from 'antd';
import { dispatch } from '../../../../model';
import { AssetManageReference, ResourceManageReference } from '../../../../util/constant';
import { getAssetType, getAssetTypeName } from '../../../../util'; import { getAssetType, getAssetTypeName } from '../../../../util';
import { AssetManageReference } from '../../../../util/constant';
import { dispatch } from '../../../../model';
const AddSourceModelName = '新增数据来源'
const MetaModelSelect = ({ value = {}, metaModelTreeData = [], onChange, ...restProps }) => { const MetaModelSelect = ({ value = {}, metaModelTreeData = [], onChange, ...restProps }) => {
const [ attributes, setAttributes ] = useState([]); const [ attributes, setAttributes ] = useState([]);
...@@ -60,7 +61,7 @@ const MetaModelSelect = ({ value = {}, metaModelTreeData = [], onChange, ...rest ...@@ -60,7 +61,7 @@ const MetaModelSelect = ({ value = {}, metaModelTreeData = [], onChange, ...rest
error: () => { error: () => {
setLoading(false); setLoading(false);
} }
}); })
} }
//value有可能为空 //value有可能为空
...@@ -100,90 +101,78 @@ const MetaModelSelect = ({ value = {}, metaModelTreeData = [], onChange, ...rest ...@@ -100,90 +101,78 @@ const MetaModelSelect = ({ value = {}, metaModelTreeData = [], onChange, ...rest
); );
} }
const AttributeRelationModal = (props) => { const AttributeRelationWithSourceModel = (props) => {
const { visible, onCancel, type = AssetManageReference } = props; const { elements, sourceModel, supportSourceModelsName, metadataModelTreeData, activeKey, onChange } = props;
const [ confirmLoading, setConfirmLoading ] = useState(false);
const [ metadataModelTreeData, setMetadataModelTreeData ] = useState([]); console.log('sourceModel', sourceModel)
const [ elements, setElements] = useState([]);
const [ loading, setLoading ] = useState(false)
const [ confirmLoading, setConfirmLoading ] = useState(false);
const [ currentRelations, setCurrentRelations ] = useState();
const [ form ] = Form.useForm(); const [ form ] = Form.useForm();
const [modal, contextHolder] = Modal.useModal()
useEffect(() => { useEffect(() => {
if (visible) { if (sourceModel) {
getMetadataModelTree(); getRelAttrBySourceModel()
} else {
form.resetFields()
} }
//eslint-disable-next-line react-hooks/exhaustive-deps form.setFieldsValue({ sourceModel })
}, [visible]) }, [activeKey, sourceModel])
const getMetadataModelTree = () => { useEffect(() => {
dispatch({ if (currentRelations && elements?.length > 0) {
type: 'assetmanage.getMetadataModelTree', let newFiledsValue = {};
callback: data => { (currentRelations||[]).forEach(item => {
let newData = [...data]; newFiledsValue[item.elementId] = {model: item.model, modelValue: item.model, attrName: item.attrName||'', attrCnName: item.attrCnName||''};
})
function recursion(_data, superKey='') {
if ((_data||[]).length===0) return;
(_data||[]).forEach(item=> {
item.title = item.nodeName||'';
item.value = superKey + '/' +(item.nodeName||'');
recursion(item.children, item.value);
})
}
recursion(newData);
setMetadataModelTreeData(newData||[]);
loadElementWithoutCustom(); form.setFieldsValue(newFiledsValue);
}, }
error: () => { }, [currentRelations, elements])
}
});
}
const loadElementWithoutCustom = () => { const getRelAttrBySourceModel = () => {
setLoading(true)
dispatch({ dispatch({
type: 'assetmanage.loadElementWithoutCustom', type: 'assetmanage.getRelAttrBySourceModel',
payload: { payload: {
dataAssetType: getAssetType(type) sourceModel
}, },
callback: data => { callback: data => {
setElements(data||[]); setLoading(false);
getRelAttrByModel(); setCurrentRelations(data||[]);
}, },
error: () => { error: () => {
setLoading(false);
} }
}); })
} }
const getRelAttrByModel = () => { const onDelete = () => {
dispatch({ modal.confirm({
type: 'assetmanage.getRelAttrByModel', title: '提示!',
payload: { content: '您确定要删除该来源模型名称吗?',
params: { onOk: () => {
dataAssetType: getAssetType(type), dispatch({
} type: 'assetmanage.deleteRelAttrBySourceModel',
}, payload: {
callback: data => { params: {
let _fieldsValue = {}; sourceModel,
(data||[]).forEach(item => { }
_fieldsValue[item.elementId] = {model: item.model, modelValue: item.model, attrName: item.attrName||'', attrCnName: item.attrCnName||''}; },
callback: data => {
message.success('删除成功')
onChange?.('delete')
}
}) })
form.setFieldsValue(_fieldsValue);
},
error: () => {
} }
}); });
} }
const onOk = async() => { const onOk = async () => {
try { try {
const row = await form.validateFields(); const row = await form.validateFields();
...@@ -197,35 +186,30 @@ const AttributeRelationModal = (props) => { ...@@ -197,35 +186,30 @@ const AttributeRelationModal = (props) => {
} }
setConfirmLoading(true); setConfirmLoading(true);
dispatch({ dispatch({
type: 'assetmanage.saveEleAndAttrRel', type: 'assetmanage.saveEleAndAttrRelWithSourceModel',
payload: { payload: {
data: newRels, data: newRels,
params: { params: {
dataAssetType: getAssetType(type) sourceModel: row.sourceModel,
isAdd: sourceModel?false:true,
} }
}, },
callback: data => { callback: data => {
reset(); setConfirmLoading(false);
onCancel && onCancel(); message.success(sourceModel?'更新成功':'新增成功');
onChange?.('update', row.sourceModel);
}, },
error: () => { error: () => {
setConfirmLoading(false); setConfirmLoading(false);
} }
}); })
} catch (errInfo) { } catch (errInfo) {
console.log('Validate Failed:', errInfo); console.log('Validate Failed:', errInfo);
setConfirmLoading(false); setConfirmLoading(false);
} }
} }
const reset = () => {
setConfirmLoading(false);
form.resetFields();
}
const formItemLayout = { const formItemLayout = {
labelCol: { labelCol: {
xs: { span: 24 }, xs: { span: 24 },
...@@ -237,45 +221,185 @@ const AttributeRelationModal = (props) => { ...@@ -237,45 +221,185 @@ const AttributeRelationModal = (props) => {
}, },
}; };
return <Spin spinning={loading}>
<div style={{ textAlign: 'right', marginBottom: 15 }}>
<Space>
{
sourceModel && <Button type="primary" danger onClick={() => onDelete()}>删除</Button>
}
<Button type="primary" onClick={() => onOk()} loading={confirmLoading}>确定</Button>
</Space>
</div>
<Form form={form} style={{ maxHeight: 400, overflow: 'auto' }} {...formItemLayout}>
<Form.Item
label='来源模型名称'
name='sourceModel'
rules={[{ required: true, message: '请输入来源名称'}]}
>
<Select
allowClear
placeholder='请选择来源模型名称'
disabled={sourceModel}
>
{
supportSourceModelsName?.map((name, index) => {
return <Select.Option key={index} value={name}>
{ name }
</Select.Option>
})
}
</Select>
</Form.Item>
{
(elements||[]).map((element, index) => {
return (
<Form.Item
label={element.name||''}
name={element.id||''}
key={index}
>
<MetaModelSelect
metaModelTreeData={metadataModelTreeData}
/>
</Form.Item>
);
})
}
</Form>
{contextHolder}
</Spin>
}
const AttributeRelationModal = (props) => {
const { visible, type = AssetManageReference, onCancel } = props;
const [ supportSourceModelsName, setSupportSourceModelsName ] = useState()
const [ loadingSourceModels, setLoadingSourceModels] = useState(false)
const [ sourceModels, setSourceModels ] = useState()
const [ metadataModelTreeData, setMetadataModelTreeData ] = useState([]);
const [ elements, setElements] = useState([]);
const [ activeKey, setActiveKey ] = useState();
const activeKeyRef = useRef();
useEffect(() => {
if (visible) {
getSourceModels();
loadElementWithoutCustom();
getMetadataModelTree();
}
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [visible])
const tabData = useMemo(() => {
return [...sourceModels||[], AddSourceModelName]
}, [sourceModels])
const getSourceModels = () => {
setLoadingSourceModels(true)
dispatch({
type: 'assetmanage.listSourceModels',
callback: data => {
setLoadingSourceModels(false)
setSourceModels(data||[])
if (!activeKeyRef.current) {
activeKeyRef.current = data?.length > 0 ? data[0] : AddSourceModelName
setActiveKey(data?.length > 0 ? data[0] : AddSourceModelName)
} else if (activeKeyRef.current !== activeKey) {
setActiveKey(activeKeyRef.current)
}
},
error: () => {
setLoadingSourceModels(false)
}
})
}
const getMetadataModelTree = () => {
dispatch({
type: 'assetmanage.getMetadataModelTree',
callback: data => {
let newData = [...data];
function recursion(_data, superKey='') {
if ((_data||[]).length===0) return;
(_data||[]).forEach(item=> {
item.title = item.nodeName||'';
item.value = superKey + '/' +(item.nodeName||'');
recursion(item.children, item.value);
})
}
recursion(newData);
setSupportSourceModelsName((newData||[]).map(item=>item.nodeName));
setMetadataModelTreeData(newData||[]);
}
})
}
const loadElementWithoutCustom = () => {
dispatch({
type: 'assetmanage.loadElementWithoutCustom',
payload: {
dataAssetType: getAssetType(type),
},
callback: data => {
setElements(data||[]);
}
})
}
const onTabsChange = (value) => {
activeKeyRef.current = value
setActiveKey(value)
}
const onRelationChange = (type, value) => {
if (type === 'delete') {
activeKeyRef.current = undefined
getSourceModels()
} else if (type === 'update') {
activeKeyRef.current = value
getSourceModels()
}
}
const reset = () => {
setActiveKey(undefined);
}
return ( return (
<Modal <Modal
forceRender
title={`${getAssetTypeName(type)}属性关联`} title={`${getAssetTypeName(type)}属性关联`}
visible={visible} visible={visible}
width={600} width='80%'
centered destroyOnClose
onCancel={() => { onCancel={() => {
reset(); reset();
onCancel && onCancel() onCancel?.();
}} }}
footer={ footer={null}
<Space>
<Button onClick={() => {
reset();
onCancel && onCancel();
}}>返回</Button>
<Button type="primary" onClick={ onOk } loading={ confirmLoading }>确定</Button>
</Space>
}
> >
<div style={{ maxHeight: 500, overflow: 'auto' }}> <Tabs tabPosition='left' activeKey={activeKey} onChange={onTabsChange}>
<Form form={form} {...formItemLayout}> {
{ tabData?.map((item, i) => {
(elements||[]).map((element, index) => { return <Tabs.TabPane tab={item} key={item}>
return ( <AttributeRelationWithSourceModel
<Form.Item elements={elements}
label={element.name||''} supportSourceModelsName={supportSourceModelsName}
name={element.id||''} metadataModelTreeData={metadataModelTreeData}
key={index} sourceModel={item === AddSourceModelName ? undefined: item}
> activeKey={activeKey}
<MetaModelSelect onChange={onRelationChange}
metaModelTreeData={metadataModelTreeData} />
/> </Tabs.TabPane>
</Form.Item> })
); }
}) </Tabs>
}
</Form>
</div>
</Modal> </Modal>
); );
} }
......
...@@ -166,7 +166,7 @@ const FilterElementModal = (props) => { ...@@ -166,7 +166,7 @@ const FilterElementModal = (props) => {
return ( return (
<Modal <Modal
forceRender centered forceRender
visible={visible} visible={visible}
title={type==='global'?`${getAssetTypeName(reference)}属性管理`:'可见列设置'} title={type==='global'?`${getAssetTypeName(reference)}属性管理`:'可见列设置'}
width={520} width={520}
......
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