Commit e2abd806 by zhaochengxiang

主数据定义

parent ab593e04
...@@ -27,7 +27,7 @@ const ImportAction = loadable(()=> import('./view/Manage/Model/Component/ImportA ...@@ -27,7 +27,7 @@ const ImportAction = loadable(()=> import('./view/Manage/Model/Component/ImportA
const EditModel = loadable(()=> import('./view/Manage/Model/Component/EditModel')); const EditModel = loadable(()=> import('./view/Manage/Model/Component/EditModel'));
const EditTemplate = loadable(()=> import('./view/Manage/ModelConfig/Component/EditTemplate')); const EditTemplate = loadable(()=> import('./view/Manage/ModelConfig/Component/EditTemplate'));
const AssetTree = loadable(()=> import('./view/Manage/AssetManage/Component/AssetManageTree')); const AssetTree = loadable(()=> import('./view/Manage/AssetManage/Component/AssetManageTree'));
const DataMaster = loadable(()=> import('./view/Manage/DataMaster')); const DataMasterDefine = loadable(()=> import('./view/Manage/DataMaster/Define'));
export class App extends React.Component { export class App extends React.Component {
constructor() { constructor() {
...@@ -154,7 +154,7 @@ export class App extends React.Component { ...@@ -154,7 +154,7 @@ export class App extends React.Component {
<Route path={'/center-home/menu/asset-resource-browse'} component={AssetResourceBrowse} exact /> <Route path={'/center-home/menu/asset-resource-browse'} component={AssetResourceBrowse} exact />
<Route path={'/center-home/menu/asset-browse'} component={AssetBrowse} exact /> <Route path={'/center-home/menu/asset-browse'} component={AssetBrowse} exact />
<Route path={'/center-home/menu/asset-recycle'} component={AssetRecycle} exact /> <Route path={'/center-home/menu/asset-recycle'} component={AssetRecycle} exact />
<Route path={'/center-home/menu/data-master'} component={DataMaster} exact /> <Route path={'/center-home/menu/data-master-define'} component={DataMasterDefine} exact />
<Route path={'/center-home/data-model-action'} component={EditModel} exact /> <Route path={'/center-home/data-model-action'} component={EditModel} exact />
<Route path={'/center-home/asset-detail'} component={AssetDetailPage} exact /> <Route path={'/center-home/asset-detail'} component={AssetDetailPage} exact />
</Switch> </Switch>
......
...@@ -40,9 +40,13 @@ export const routes = [ ...@@ -40,9 +40,13 @@ export const routes = [
text: '未挂载资产', text: '未挂载资产',
}, },
{ {
name: 'data-master', name: 'data-master-define',
text: '主数据' text: '主数据定义'
} },
{
name: 'data-master-manage',
text: '主数据管理'
},
] ]
} }
]; ];
......
import { Modal, Form } from "antd";
import UpdateBasicInfo from "./UpdateBasicInfo";
import UpdateField from "./UpdateField";
import './UpdateTemplateModal.less';
const UpdateTemplateModal = (props) => {
const { visible, onCancel } = props;
const [form] = Form.useForm();
const onFormFinish = async() => {
try {
await form.validateFields();
// const row = await form.validateFields();
onCancel && onCancel();
} catch (errInfo) {
console.log('Validate Failed:', errInfo);
}
}
return (
<Modal
className='update-template-modal'
width='80%'
title='新建模版'
visible={visible}
onCancel={onCancel}
onOk={onFormFinish}
>
<UpdateBasicInfo form={form} />
<UpdateField />
</Modal>
);
}
export default UpdateTemplateModal;
\ No newline at end of file
import { useMemo } from 'react'; import { useMemo } from 'react';
import ResizeableTable from '../../ResizeableTable'; import ResizeableTable from '../../../ResizeableTable';
import { expandedTableData } from './Mock'; import { expandedTableData } from './Mock';
const DataMasterExpandedTable = (props) => { const DataMasterExpandedTable = (props) => {
......
...@@ -2,11 +2,11 @@ import { useMemo, useState } from 'react'; ...@@ -2,11 +2,11 @@ import { useMemo, useState } from 'react';
import { Space, Button, Input } from 'antd'; import { Space, Button, Input } 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 UpdateDataMasterModal from './UpdateDataMasterModal'; import UpdateDataMasterModal from './UpdateDataMasterModal';
import { inputWidth } from '../../../../util'; import { inputWidth } from '../../../../../util';
import DataMasterExpandedTable from './DataMasterExpandedTable'; import DataMasterExpandedTable from './DataMasterExpandedTable';
import { tableData } from './Mock'; import { tableData } from './Mock';
...@@ -21,6 +21,7 @@ const DataMasterTable = (props) => { ...@@ -21,6 +21,7 @@ const DataMasterTable = (props) => {
const [isTemplateModalVisible, setIsTemplateModalVisible] = useState(false); const [isTemplateModalVisible, setIsTemplateModalVisible] = useState(false);
const [isDataMasterModalVisible, setIsDataMasterModalVisible] = useState(false); const [isDataMasterModalVisible, setIsDataMasterModalVisible] = useState(false);
const [currentTemplate, setCurrentTemplate] = useState({}); const [currentTemplate, setCurrentTemplate] = useState({});
const [action, setAction] = useState('');
const columns = useMemo(() => { const columns = useMemo(() => {
return ([ return ([
...@@ -38,6 +39,9 @@ const DataMasterTable = (props) => { ...@@ -38,6 +39,9 @@ const DataMasterTable = (props) => {
dataIndex: 'name', dataIndex: 'name',
width: 200, width: 200,
ellipsis: true, ellipsis: true,
render: (text, record, index) => {
return <a onClick={() => {onItemClick(record);}}>{text}</a>
},
}, },
{ {
title: '模版英文名称', title: '模版英文名称',
...@@ -78,6 +82,12 @@ const DataMasterTable = (props) => { ...@@ -78,6 +82,12 @@ const DataMasterTable = (props) => {
}); });
const onAddClick = () => { const onAddClick = () => {
setAction('add');
setIsTemplateModalVisible(true);
}
const onItemClick = () => {
setAction('detail');
setIsTemplateModalVisible(true); setIsTemplateModalVisible(true);
} }
...@@ -102,6 +112,9 @@ const DataMasterTable = (props) => { ...@@ -102,6 +112,9 @@ const DataMasterTable = (props) => {
if (key === 'add') { if (key === 'add') {
setIsDataMasterModalVisible(true); setIsDataMasterModalVisible(true);
} else if (key === 'update') {
setAction('update');
setIsTemplateModalVisible(true);
} }
} }
...@@ -157,6 +170,7 @@ const DataMasterTable = (props) => { ...@@ -157,6 +170,7 @@ const DataMasterTable = (props) => {
</div> </div>
<UpdateTemplateModal <UpdateTemplateModal
action={action}
visible={isTemplateModalVisible} visible={isTemplateModalVisible}
onCancel={onTemplateModalCancel} onCancel={onTemplateModalCancel}
/> />
...@@ -171,6 +185,9 @@ const DataMasterTable = (props) => { ...@@ -171,6 +185,9 @@ const DataMasterTable = (props) => {
<RcItem id="add" onClick={handleItemClick}> <RcItem id="add" onClick={handleItemClick}>
新增主数据 新增主数据
</RcItem> </RcItem>
<RcItem id="update" onClick={handleItemClick}>
编辑
</RcItem>
</RcMenu> </RcMenu>
</div> </div>
); );
......
...@@ -2,7 +2,7 @@ import {useEffect, useMemo, useState} from 'react'; ...@@ -2,7 +2,7 @@ import {useEffect, useMemo, useState} from 'react';
import {Tooltip, Spin, AutoComplete, Tree} from 'antd'; import {Tooltip, Spin, AutoComplete, Tree} from 'antd';
import {PlusOutlined, ReloadOutlined} from '@ant-design/icons'; import {PlusOutlined, ReloadOutlined} from '@ant-design/icons';
import {highlightSearchContentByTerms} from '../../../../util'; import {highlightSearchContentByTerms} from '../../../../../util';
import {treeData} from './Mock'; import {treeData} from './Mock';
import './DataMasterTree.less'; import './DataMasterTree.less';
......
@import '../../../../variables.less'; @import '../../../../../variables.less';
.data-master-tree { .data-master-tree {
height: 100%; height: 100%;
......
import { Form, Input, Divider, Row, Col } from "antd"; import { Form, Input, Divider, Row, Col, Descriptions } from "antd";
const { TextArea } = Input; const { TextArea } = Input;
const UpdateBasicInfo = (props) => { const UpdateBasicInfo = (props) => {
const { form } = props; const { form, editable } = props;
const formItemLayout = { const formItemLayout = {
labelCol: { labelCol: {
...@@ -19,28 +19,34 @@ const UpdateBasicInfo = (props) => { ...@@ -19,28 +19,34 @@ const UpdateBasicInfo = (props) => {
return ( return (
<div> <div>
<h3>基本信息</h3> <h3>基本信息</h3>
<Form {
form={form} editable ? <Form
{...formItemLayout} form={form}
> {...formItemLayout}
<Row gutter={10}> >
<Col xs={24} sm={24} lg={12}> <Row gutter={10}>
<Form.Item label='中文名称' name='cnName' rules={[{ required: true, message: '请填写模版中文名称' }]}> <Col xs={24} sm={24} lg={12}>
<Input /> <Form.Item label='中文名称' name='cnName' rules={[{ required: true, message: '请填写模版中文名称' }]}>
</Form.Item> <Input />
</Col> </Form.Item>
<Col xs={24} sm={24} lg={12}> </Col>
<Form.Item label='英文名称' name='name' rules={[{ required: true, message: '请填写模版名称' }]}> <Col xs={24} sm={24} lg={12}>
<Input /> <Form.Item label='英文名称' name='name' rules={[{ required: true, message: '请填写模版名称' }]}>
</Form.Item> <Input />
</Col> </Form.Item>
<Col xs={24} sm={24} lg={12}> </Col>
<Form.Item label='模版描述' name='desc'> <Col xs={24} sm={24} lg={12}>
<TextArea row={4} /> <Form.Item label='模版描述' name='desc'>
</Form.Item> <TextArea row={4} />
</Col> </Form.Item>
</Row> </Col>
</Form> </Row>
</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>}>英文</Descriptions.Item>
<Descriptions.Item label={<div style={{ textAlign: 'right', width: 85 }}>模版描述</div>}>描述</Descriptions.Item>
</Descriptions>
}
</div> </div>
); );
} }
......
import React, { useState, useRef, useEffect, useMemo, useCallback } 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 } 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';
...@@ -6,11 +6,12 @@ import update from 'immutability-helper'; ...@@ -6,11 +6,12 @@ import update from 'immutability-helper';
import { DndProvider, useDrag, useDrop } from 'react-dnd'; import { DndProvider, useDrag, useDrop } 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 { templateFileds } from "./Mock";
import { inputWidth, generateUUID } from "../../../../util"; import { inputWidth, generateUUID } from "../../../../../util";
import { DatatypeInput, EditableCell, DragableBodyRow } from "../../Model/Component/ImportActionTable"; import { DatatypeInput, EditableCell, DragableBodyRow } from "../../../Model/Component/ImportActionTable";
import { dispatch } from "../../../../model"; import { dispatch } from "../../../../../model";
import { EditTemplateContext } from "./UpdateTemplateModal";
const InputDebounce = DebounceInput(300)(Input); const InputDebounce = DebounceInput(300)(Input);
...@@ -23,6 +24,7 @@ const UpdateField = (props) => { ...@@ -23,6 +24,7 @@ const UpdateField = (props) => {
const [supportedDatatypes, setSupportedDatatypes] = useState([]); const [supportedDatatypes, setSupportedDatatypes] = useState([]);
const [form] = Form.useForm(); const [form] = Form.useForm();
const tableRef = useRef(null); const tableRef = useRef(null);
const { attrIsEditingFunction } = useContext(EditTemplateContext);
const columns = [ const columns = [
{ {
...@@ -146,10 +148,6 @@ const UpdateField = (props) => { ...@@ -146,10 +148,6 @@ const UpdateField = (props) => {
}, },
]; ];
const filterData = useMemo(() => {
return (data||[]).filter(item => (item?.name||'').indexOf(keyword)!==-1 || (item.cnName).indexOf(keyword)!==-1);
}, [keyword, data])
useClickAway(() => { useClickAway(() => {
save(); save();
}, tableRef); }, tableRef);
...@@ -158,6 +156,15 @@ const UpdateField = (props) => { ...@@ -158,6 +156,15 @@ const UpdateField = (props) => {
getSupportedDatatypes(); getSupportedDatatypes();
}, []) }, [])
useEffect(() => {
attrIsEditingFunction && attrIsEditingFunction(editingKey!=='');
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [ editingKey ])
const filterData = useMemo(() => {
return (data||[]).filter(item => (item?.name||'').indexOf(keyword)!==-1 || (item.cnName).indexOf(keyword)!==-1);
}, [keyword, data])
const isEditing = (record) => record?.iid === editingKey; const isEditing = (record) => record?.iid === editingKey;
const getSupportedDatatypes = () => { const getSupportedDatatypes = () => {
...@@ -232,12 +239,9 @@ const UpdateField = (props) => { ...@@ -232,12 +239,9 @@ const UpdateField = (props) => {
const removeItem = (record) => { const removeItem = (record) => {
if (record.iid !== editingKey) { if (record.iid !== editingKey) {
save().then(result => { removeItemLogic(record);
if (result) {
removeItemLogic(record);
}
});
} else { } else {
setEditingKey('');
removeItemLogic(record); removeItemLogic(record);
} }
} }
...@@ -246,7 +250,7 @@ const UpdateField = (props) => { ...@@ -246,7 +250,7 @@ const UpdateField = (props) => {
save().then(result => { save().then(result => {
if (result) { if (result) {
setKeyword(value); setKeyword(value);
} }
}); });
} }
...@@ -389,7 +393,7 @@ const UpdateField = (props) => { ...@@ -389,7 +393,7 @@ const UpdateField = (props) => {
</Space> </Space>
<Space> <Space>
{ {
editable && <Button onClick={onAddClick} >新建</Button> editable && <Button onClick={onAddClick}>新建</Button>
} }
<div className='d-flex' style={{ alignItems: 'center' }}> <div className='d-flex' style={{ alignItems: 'center' }}>
<InputDebounce <InputDebounce
......
import React, { useMemo, useRef } from 'react';
import { Modal, Form, Button } from "antd";
import UpdateBasicInfo from "./UpdateBasicInfo";
import UpdateField from "./UpdateField";
import { showMessage } from '../../../../../util';
import './UpdateTemplateModal.less';
export const EditTemplateContext = React.createContext({
attrIsEditingFunction: null,
});
export const UpdateTemplateModal = (props) => {
const { visible, onCancel, action = 'add' } = props;
const [form] = Form.useForm();
const attrIsEditingRef = useRef(false);
const title = useMemo(() => {
if (action === 'add') {
return '新建模版';
}
if (action === 'detail') {
return '模版详情';
}
if (action === 'update') {
return '编辑模版';
}
}, [action])
const attrIsEditingFunction = (value) => {
attrIsEditingRef.current = value;
}
const save = (e) => {
e.stopPropagation();
if (attrIsEditingRef.current) {
showMessage("warn", '还有字段正在编辑,需先保存该字段!');
} else {
saveLogic();
}
}
const saveLogic = async () => {
try {
await form.validateFields();
// const row = await form.validateFields();
} catch (errInfo) {
console.log('Validate Failed:', errInfo);
}
}
return (
<EditTemplateContext.Provider value={{
attrIsEditingFunction,
}}>
<Modal
className='update-template-modal'
width='80%'
title={title}
visible={visible}
onCancel={onCancel}
onOk={save}
footer={[
<Button key="cancel" onClick={onCancel}>
取消
</Button>,
action!=='detail' && <Button
key="ok"
type="primary"
onClick={save}
>
确定
</Button>,
]}
>
<UpdateBasicInfo form={form} editable={action!=='detail'} />
<UpdateField editable={action!=='detail'} />
</Modal>
</EditTemplateContext.Provider>
);
}
...@@ -8,7 +8,7 @@ import DataMasterTree from './Component/DataMasterTree'; ...@@ -8,7 +8,7 @@ import DataMasterTree from './Component/DataMasterTree';
import './index.less'; import './index.less';
import DataMasterTable from './Component/DataMasterTable'; import DataMasterTable from './Component/DataMasterTable';
const DataMaster = (props) => { const DataMasterDefine = (props) => {
const [collapse, setCollapse] = useState(false); const [collapse, setCollapse] = useState(false);
...@@ -45,4 +45,4 @@ const DataMaster = (props) => { ...@@ -45,4 +45,4 @@ const DataMaster = (props) => {
) )
} }
export default DataMaster; export default DataMasterDefine;
\ No newline at end of file \ No newline at end of file
...@@ -12,7 +12,7 @@ import AssetManage from './AssetManage'; ...@@ -12,7 +12,7 @@ import AssetManage from './AssetManage';
import AssetResourceBrowse from './AssetResourceBrowse'; import AssetResourceBrowse from './AssetResourceBrowse';
import AssetBrowse from './AssetBrowse'; import AssetBrowse from './AssetBrowse';
import AssetRecycle from './AssetRecycle'; import AssetRecycle from './AssetRecycle';
import DataMaster from "./DataMaster"; import DataMasterDefine from "./DataMaster/Define";
class Manage extends Component { class Manage extends Component {
...@@ -34,7 +34,7 @@ class Manage extends Component { ...@@ -34,7 +34,7 @@ class Manage extends Component {
<Route path={`${match.path}/asset-resource-browse`} component={AssetResourceBrowse} /> <Route path={`${match.path}/asset-resource-browse`} component={AssetResourceBrowse} />
<Route path={`${match.path}/asset-browse`} component={AssetBrowse} /> <Route path={`${match.path}/asset-browse`} component={AssetBrowse} />
<Route path={`${match.path}/asset-recycle`} component={AssetRecycle} /> <Route path={`${match.path}/asset-recycle`} component={AssetRecycle} />
<Route path={`${match.path}/data-master`} component={DataMaster} /> <Route path={`${match.path}/data-master-define`} component={DataMasterDefine} />
</Switch> </Switch>
) : ( ) : (
<GetSession {...this.props} /> <GetSession {...this.props} />
......
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