Commit ef698b43 by zhaochengxiang

增加模型视角

parent 332294b5
...@@ -76,7 +76,7 @@ const onDragOver = (event) => { ...@@ -76,7 +76,7 @@ const onDragOver = (event) => {
*/ */
const throttleOnDragOver = throttle(onDragOver, 150); const throttleOnDragOver = throttle(onDragOver, 150);
const addEventListenerForSidebar = (elementId) => { const addEventListenerForSidebar = (elementId) => {
// In Chrome the scrolling works. // In Chrome the scrolling works.
if (navigator.userAgent.indexOf("Chrome") === -1) { if (navigator.userAgent.indexOf("Chrome") === -1) {
sidebarElement = document.getElementById(elementId); sidebarElement = document.getElementById(elementId);
......
...@@ -486,7 +486,7 @@ const ImportActionTable = (props) => { ...@@ -486,7 +486,7 @@ const ImportActionTable = (props) => {
(datatype.parameterCnNames||[]).forEach((cnName, index) => { (datatype.parameterCnNames||[]).forEach((cnName, index) => {
_text += ` ${cnName}: ` + `${(datatype.parameterValues[index]?datatype.parameterValues[index]:0)}`; _text += ` ${cnName}: ${(datatype.parameterValues[index]?datatype.parameterValues[index]:0)}`;
}) })
return _text; return _text;
......
import React, { useState, useEffect, useRef } from "react"; import React, { useState, useEffect, useRef } from "react";
import { Tooltip, Tree, Modal, Spin, Select } from "antd"; import { Tooltip, Tree, Modal, Spin, Dropdown, Menu } from "antd";
import { PlusOutlined, EditOutlined, SyncOutlined, DeleteOutlined } from '@ant-design/icons'; import { PlusOutlined, EditOutlined, SyncOutlined, DeleteOutlined, UnorderedListOutlined } from '@ant-design/icons';
import UpdateTreeItemModal from './UpdateTreeItemModal'; import UpdateTreeItemModal from './UpdateTreeItemModal';
import { dispatch } from '../../../../model'; import { dispatch } from '../../../../model';
...@@ -9,15 +9,21 @@ import { AnchorId, AnchorTimestamp } from '../../../../util/constant'; ...@@ -9,15 +9,21 @@ import { AnchorId, AnchorTimestamp } from '../../../../util/constant';
import './ModelTree.less'; import './ModelTree.less';
const { Option } = Select; const viewModes = [
{
key: 'dir',
name: '目录视角'
},
{
key: 'state',
name: '发布状态视角'
}
];
const ModelTree = (props) => { const ModelTree = (props) => {
const { onSelect, onStateChange } = props; const { onSelect, onViewChange } = props;
const [ loading, setLoading ] = useState(false); const [ loading, setLoading ] = useState(false);
const [ loadingStates, setLoadingStates ] = useState(false);
const [ modelStates, setModelStates ] = useState(null);
const [ currentModelState, setCurrentModelState ] = useState('');
const [ treeData, setTreeData ] = useState(null); const [ treeData, setTreeData ] = useState(null);
const [ item, setItem ] = useState(null); const [ item, setItem ] = useState(null);
const [ visible, setVisible ] = useState(false); const [ visible, setVisible ] = useState(false);
...@@ -25,6 +31,7 @@ const ModelTree = (props) => { ...@@ -25,6 +31,7 @@ const ModelTree = (props) => {
const [ rootId, setRootId ] = useState(''); const [ rootId, setRootId ] = useState('');
const [ expandedKeys, setExpandedKeys ] = useState([]); const [ expandedKeys, setExpandedKeys ] = useState([]);
const [ autoExpandParent, setAutoExpandParent ] = useState(false); const [ autoExpandParent, setAutoExpandParent ] = useState(false);
const [ viewSelectedKey, setViewSelectedKey ] = useState(viewModes[0].key);
const [modal, contextHolder] = Modal.useModal(); const [modal, contextHolder] = Modal.useModal();
...@@ -32,23 +39,22 @@ const ModelTree = (props) => { ...@@ -32,23 +39,22 @@ const ModelTree = (props) => {
const id = getQueryParam(AnchorId, props.location.search); const id = getQueryParam(AnchorId, props.location.search);
const itemRef = useRef(); const itemRef = useRef();
itemRef.current = item; itemRef.current = null;
useEffect(() => { useEffect(() => {
setViewSelectedKey(viewModes[0].key);
onViewChange && onViewChange(viewModes[0].key);
if ((id||'') !== '') { if ((id||'') !== '') {
getDataModelLocationThenGetTreeData(); getDataModelLocationThenGetDirTreeData();
} else { } else {
getTreeData(); getDirTreeData();
}
if (!modelStates) {
getModelStates();
} }
//eslint-disable-next-line react-hooks/exhaustive-deps //eslint-disable-next-line react-hooks/exhaustive-deps
}, [timestamp]) }, [timestamp])
const getDataModelLocationThenGetTreeData = () => { const getDataModelLocationThenGetDirTreeData = () => {
setLoading(true); setLoading(true);
dispatch({ dispatch({
type: 'datamodel.getDataModelLocation', type: 'datamodel.getDataModelLocation',
...@@ -56,7 +62,7 @@ const ModelTree = (props) => { ...@@ -56,7 +62,7 @@ const ModelTree = (props) => {
id id
}, },
callback: data => { callback: data => {
getTreeData(data.easyDataModelerDataModelCatalogId||''); getDirTreeData(data.easyDataModelerDataModelCatalogId||'');
}, },
error: () => { error: () => {
setLoading(false); setLoading(false);
...@@ -64,7 +70,7 @@ const ModelTree = (props) => { ...@@ -64,7 +70,7 @@ const ModelTree = (props) => {
}); });
} }
const getTreeData = (defaultSelectedId='') => { const getDirTreeData = (defaultSelectedId='') => {
setLoading(true); setLoading(true);
dispatch({ dispatch({
...@@ -100,7 +106,6 @@ const ModelTree = (props) => { ...@@ -100,7 +106,6 @@ const ModelTree = (props) => {
setRootId(data.id||''); setRootId(data.id||'');
if (defaultItem) { if (defaultItem) {
const _dataList = []; const _dataList = [];
generateList(data.subCatalogs||[], _dataList); generateList(data.subCatalogs||[], _dataList);
...@@ -121,16 +126,17 @@ const ModelTree = (props) => { ...@@ -121,16 +126,17 @@ const ModelTree = (props) => {
} else { } else {
let firstItem = itemRef.current; let currentItem = itemRef.current;
if (firstItem === null) {
firstItem = (data.subCatalogs||[]).length>0?data.subCatalogs[0]: null;
setItem(firstItem); if (currentItem === null) {
currentItem = (data.subCatalogs||[]).length>0?data.subCatalogs[0]: null;
setItem(currentItem);
} }
itemRef.current = firstItem; itemRef.current = currentItem;
onSelect && onSelect(firstItem?(firstItem.key||''):''); onSelect && onSelect(currentItem?(currentItem.key||''):'');
} }
}, },
...@@ -140,16 +146,24 @@ const ModelTree = (props) => { ...@@ -140,16 +146,24 @@ const ModelTree = (props) => {
}) })
} }
const getModelStates = () => { const getStateTreeData = () => {
setLoadingStates(true); setLoading(true);
dispatch({ dispatch({
type: 'datamodel.loadDataModelStateCatalog', type: 'datamodel.loadDataModelStateCatalog',
callback: data => { callback: data => {
setLoadingStates(false); setLoading(false);
setModelStates([{ name: 'all', id: '', cnName: '所有状态' }, ...(data?.subCatalogs||[])]); let _treeData = data?.subCatalogs||[];
_treeData.forEach(item => {
item.title = item.cnName;
item.key = item.id;
})
setTreeData(_treeData);
setItem(_treeData.length>0?_treeData[0]:{});
onSelect && onSelect(_treeData.length>0?_treeData[0].key:'');
}, },
error: () => { error: () => {
setLoadingStates(false); setLoading(false);
} }
}); });
} }
...@@ -185,9 +199,19 @@ const ModelTree = (props) => { ...@@ -185,9 +199,19 @@ const ModelTree = (props) => {
setAutoExpandParent(false); setAutoExpandParent(false);
}; };
const onModelStateChange = (value) => { const onViewClick = ({ key }) => {
setCurrentModelState(value);
onStateChange && onStateChange(value); if (viewSelectedKey && viewSelectedKey===key ) return;
itemRef.current = null;
setViewSelectedKey(key);
onViewChange && onViewChange(key);
if (key === 'dir') {
getDirTreeData();
} else {
getStateTreeData();
}
} }
const onTreeSelect = (keys,data) => { const onTreeSelect = (keys,data) => {
...@@ -219,7 +243,11 @@ const ModelTree = (props) => { ...@@ -219,7 +243,11 @@ const ModelTree = (props) => {
} }
const refresh = () => { const refresh = () => {
getTreeData(); if (viewSelectedKey==='dir') {
getDirTreeData();
} else {
getStateTreeData();
}
} }
const deleteNode = () => { const deleteNode = () => {
...@@ -244,7 +272,7 @@ const ModelTree = (props) => { ...@@ -244,7 +272,7 @@ const ModelTree = (props) => {
showMessage('success', '删除目录成功'); showMessage('success', '删除目录成功');
setItem(null); setItem(null);
itemRef.current = null; itemRef.current = null;
getTreeData(); getDirTreeData();
} }
}); });
} }
...@@ -256,40 +284,27 @@ const ModelTree = (props) => { ...@@ -256,40 +284,27 @@ const ModelTree = (props) => {
setVisible(false); setVisible(false);
setItem(updateItem); setItem(updateItem);
itemRef.current = updateItem; itemRef.current = updateItem;
getTreeData(); getDirTreeData();
} }
const onUpdateTreeItemModalCancel = () => { const onUpdateTreeItemModalCancel = () => {
setVisible(false); setVisible(false);
} }
return ( const exportMenu = (
<div className='model-tree'> <Menu selectedKeys={[viewSelectedKey]} onClick={onViewClick}>
<div
className='p-3'
style={{
display: 'flex',
borderBottom: "1px solid #EFEFEF",
height: 57,
alignItems: 'center'
}}
>
<span className='pr-2'>模型状态:</span>
<Select
style={{ width: 120 }}
onChange={onModelStateChange}
loading={loadingStates}
value={currentModelState}
>
{ {
(modelStates||[]).map(item => { viewModes && viewModes.map(item => {
return ( return (
<Option key={item.id} value={item.id}>{item.cnName||''}</Option> <Menu.Item key={item.key} value={item.key} >{item.name}</Menu.Item>
); )
}) })
} }
</Select> </Menu>
</div> );
return (
<div className='model-tree'>
<div <div
className='p-3' className='p-3'
style={{ style={{
...@@ -299,18 +314,35 @@ const ModelTree = (props) => { ...@@ -299,18 +314,35 @@ const ModelTree = (props) => {
alignItems: 'center' alignItems: 'center'
}} }}
> >
<Tooltip title="新增目录"> <Dropdown overlay={exportMenu} placement="bottomLeft">
<Tooltip title="视角">
<UnorderedListOutlined style={{ fontSize:16,cursor:'pointer' }} />
</Tooltip>
</Dropdown>
{
viewSelectedKey==='dir' && (
<Tooltip title="新增目录" className='ml-4'>
<PlusOutlined onClick={add} style={{ fontSize:16,cursor:'pointer' }} /> <PlusOutlined onClick={add} style={{ fontSize:16,cursor:'pointer' }} />
</Tooltip> </Tooltip>
)
}
{
viewSelectedKey==='dir' && (
<Tooltip title="修改目录" className='ml-4'> <Tooltip title="修改目录" className='ml-4'>
<EditOutlined onClick={update} style={{ fontSize:16,cursor:'pointer' }} /> <EditOutlined onClick={update} style={{ fontSize:16,cursor:'pointer' }} />
</Tooltip> </Tooltip>
)
}
<Tooltip title="刷新目录" className='ml-4'> <Tooltip title="刷新目录" className='ml-4'>
<SyncOutlined onClick={refresh} style={{ fontSize:16,cursor:'pointer' }} /> <SyncOutlined onClick={refresh} style={{ fontSize:16,cursor:'pointer' }} />
</Tooltip> </Tooltip>
{
viewSelectedKey==='dir' && (
<Tooltip title="删除目录" className='ml-4'> <Tooltip title="删除目录" className='ml-4'>
<DeleteOutlined onClick={deleteNode} style={{ fontSize:16,cursor:'pointer' }} /> <DeleteOutlined onClick={deleteNode} style={{ fontSize:16,cursor:'pointer' }} />
</Tooltip> </Tooltip>
)
}
</div> </div>
<div className='p-3'> <div className='p-3'>
<Spin spinning={loading} > <Spin spinning={loading} >
......
@import '../../../../variables.less'; @import '../../../../variables.less';
.model-tree { .model-tree {
.yy-tree-list { .yy-tree-list {
height: calc(100vh - @header-height - @pm-4 - 54px - 54px - @pm-3) !important; height: calc(100vh - @header-height - @pm-4 - 54px - @pm-3) !important;
overflow: auto !important; overflow: auto !important;
} }
} }
\ No newline at end of file
import React from 'react'; import React from 'react';
import { Button, Input, Space, Spin } from 'antd'; import { Button, Input, Space, Spin, Select } from 'antd';
import copy from "copy-to-clipboard"; import copy from "copy-to-clipboard";
import ModelTree from './Component/ModelTree'; import ModelTree from './Component/ModelTree';
...@@ -16,6 +16,8 @@ import { Action, CatalogId, ModelerId, Hints } from '../../../util/constant'; ...@@ -16,6 +16,8 @@ import { Action, CatalogId, ModelerId, Hints } from '../../../util/constant';
import './index.less'; import './index.less';
const { Option } = Select;
class Model extends React.Component { class Model extends React.Component {
constructor() { constructor() {
...@@ -38,17 +40,46 @@ class Model extends React.Component { ...@@ -38,17 +40,46 @@ class Model extends React.Component {
keyword: '', keyword: '',
exportErwinLoading: false, exportErwinLoading: false,
hints: [], hints: [],
modelStateId: '' loadingStates: false,
modelStates: [],
currentModelState: '',
currentView: '',
}
} }
componentDidMount() {
this.getModelStates();
}
getModelStates = () => {
this.setState({ loadingStates: true }, () => {
dispatch({
type: 'datamodel.loadDataModelStateCatalog',
callback: data => {
this.setState({
loadingStates: false,
modelStates: [{ name: 'all', id: '', cnName: '所有状态' }, ...(data?.subCatalogs||[])]
});
},
error: () => {
this.setState({ loadingStates: false });
}
});
})
}
onViewChange = (value) => {
this.setState({ currentView: value, currentModelState: '' });
} }
onModelStateChange = (value) => { onModelStateChange = (value) => {
this.setState({ modelStateId: value }, () => { this.setState({ currentModelState: value }, () => {
this.setFilterData(); this.setFilterData();
}) })
} }
onTreeSelect = (key) => { onTreeSelect = (key) => {
this.setState({ catalogId: key, keyword: '' }, () => { this.setState({ catalogId: key, keyword: '' }, () => {
if (!key || key==='') { if (!key || key==='') {
this.setState({ tableData: [], filterTableData: [] }); this.setState({ tableData: [], filterTableData: [] });
...@@ -59,9 +90,10 @@ class Model extends React.Component { ...@@ -59,9 +90,10 @@ class Model extends React.Component {
} }
onTableChange = () => { onTableChange = () => {
const { catalogId } = this.state; const { currentView, catalogId } = this.state;
this.setState({ loadingTableData: true }, () => { this.setState({ loadingTableData: true }, () => {
if (currentView === 'dir') {
dispatch({ dispatch({
type: 'datamodel.getCurrentDataModelCatalog', type: 'datamodel.getCurrentDataModelCatalog',
payload: { payload: {
...@@ -76,6 +108,23 @@ class Model extends React.Component { ...@@ -76,6 +108,23 @@ class Model extends React.Component {
this.setState({ loadingTableData: false }); this.setState({ loadingTableData: false });
} }
}) })
} else {
dispatch({
type: 'datamodel.getCurrentDataModelStateCatalog',
payload: {
easyDataModelerStateCatalogId: catalogId
},
callback: data => {
this.setState({ loadingTableData: false, tableData: data.easyDataModelerDataModels||[] }, () => {
this.setFilterData();
});
},
error: () => {
this.setState({ loadingTableData: false });
}
})
}
}) })
} }
...@@ -110,9 +159,9 @@ class Model extends React.Component { ...@@ -110,9 +159,9 @@ class Model extends React.Component {
} }
setFilterData = () => { setFilterData = () => {
const { keyword, tableData, modelStateId } = this.state; const { keyword, tableData, currentModelState } = this.state;
const _filterData = (tableData||[]).filter(item => (modelStateId===''||modelStateId===item.state?.id) && ((item.name||'').indexOf(keyword)!==-1||(item.cnName).indexOf(keyword)!==-1)); const _filterData = (tableData||[]).filter(item => (currentModelState===''||currentModelState===item.state?.id) && ((item.name||'').indexOf(keyword)!==-1||(item.cnName).indexOf(keyword)!==-1));
this.setState({ filterTableData: _filterData }); this.setState({ filterTableData: _filterData });
} }
...@@ -266,7 +315,7 @@ class Model extends React.Component { ...@@ -266,7 +315,7 @@ class Model extends React.Component {
} }
render() { render() {
const { importModalVisible, catalogId, loadingTableData, selectModelerIds, keyword, filterTableData, selectModelerNames, importModalAddMode, exportErwinLoading, exportDDLModalVisible, templateCURDModalVisible, wordTemplateModalVisible, constraintDetailModalVisible, importWordModalVisible } = this.state; const { importModalVisible, catalogId, loadingTableData, selectModelerIds, keyword, filterTableData, selectModelerNames, importModalAddMode, exportErwinLoading, exportDDLModalVisible, templateCURDModalVisible, wordTemplateModalVisible, constraintDetailModalVisible, importWordModalVisible, loadingStates, modelStates, currentModelState, currentView } = this.state;
const content = ( const content = (
<ModelTable loading={loadingTableData} catalogId={catalogId} data={filterTableData} onChange={this.onTableChange} onSelect={this.onTableSelect} onItemAction={this.onTableItemAction} {...this.props} /> <ModelTable loading={loadingTableData} catalogId={catalogId} data={filterTableData} onChange={this.onTableChange} onSelect={this.onTableSelect} onItemAction={this.onTableItemAction} {...this.props} />
...@@ -275,7 +324,7 @@ class Model extends React.Component { ...@@ -275,7 +324,7 @@ class Model extends React.Component {
return ( return (
<div className='data-model'> <div className='data-model'>
<div className='left'> <div className='left'>
<ModelTree onStateChange={this.onModelStateChange} onSelect={this.onTreeSelect} {...this.props} /> <ModelTree onViewChange={this.onViewChange} onSelect={this.onTreeSelect} {...this.props} />
</div> </div>
<div className='right'> <div className='right'>
<div <div
...@@ -285,6 +334,26 @@ class Model extends React.Component { ...@@ -285,6 +334,26 @@ class Model extends React.Component {
justifyContent: 'space-between' justifyContent: 'space-between'
}} }}
> >
<div>
{
currentView==='dir' && <Space className='mr-3'>
<span>模型状态:</span>
<Select
style={{ width: 120 }}
onChange={this.onModelStateChange}
loading={loadingStates}
value={currentModelState}
>
{
(modelStates||[]).map(item => {
return (
<Option key={item.id} value={item.id}>{item.cnName||''}</Option>
);
})
}
</Select>
</Space>
}
<Space> <Space>
<span>模型搜索:</span> <span>模型搜索:</span>
<Input <Input
...@@ -295,6 +364,7 @@ class Model extends React.Component { ...@@ -295,6 +364,7 @@ class Model extends React.Component {
style={{ width: 240, marginLeft: 'auto' }} style={{ width: 240, marginLeft: 'auto' }}
/> />
</Space> </Space>
</div>
<Space> <Space>
<Button type="primary" onClick={this.onWordTemplateCURDClick}>Word模版配置</Button> <Button type="primary" onClick={this.onWordTemplateCURDClick}>Word模版配置</Button>
<Button type="primary" onClick={this.onTemplateCURDClick}>数据表类型配置</Button> <Button type="primary" onClick={this.onTemplateCURDClick}>数据表类型配置</Button>
......
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