Commit a4a47397 by zhaochengxiang

模型搜索

parent 86fb3308
...@@ -217,3 +217,7 @@ export function* getSchemasByDatasourceId(payload) { ...@@ -217,3 +217,7 @@ export function* getSchemasByDatasourceId(payload) {
export function* autoCreateTable(payload) { export function* autoCreateTable(payload) {
return yield call(datamodelerService.autoCreateTable, payload); return yield call(datamodelerService.autoCreateTable, payload);
} }
export function* searchModel(payload) {
return yield call(datamodelerService.searchModel, payload);
}
...@@ -121,6 +121,10 @@ export function getDataModelLocation(payload) { ...@@ -121,6 +121,10 @@ export function getDataModelLocation(payload) {
return GetJSON("/datamodeler/easyDataModelerCURD/getDataModelLocation", payload); return GetJSON("/datamodeler/easyDataModelerCURD/getDataModelLocation", payload);
} }
export function searchModel(payload) {
return GetJSON("/datamodeler/easyDataModelerCURD/searchEasyDataModelerDataModelsByNaming", payload);
}
export function ddlGenerators() { export function ddlGenerators() {
return GetJSON("/datamodeler/easyDataModelerExport/ddlGenerators"); return GetJSON("/datamodeler/easyDataModelerExport/ddlGenerators");
} }
......
import React, { useState } from "react";
import { Modal } from "antd";
import ModelTree from './ModelTree';
import { showMessage } from '../../../../util';
const CatalogModal = (props) => {
const { onCancel, visible } = props;
const [ catalogId, setCatalogId ] = useState('');
const onSelect = (value) => {
setCatalogId(value);
}
const onOk = () => {
if ((catalogId||'') === '') {
showMessage('warn', '请先选择模型目录');
return;
}
onCancel && onCancel(catalogId);
}
const reset = () => {
setCatalogId('');
}
return(
<Modal
title='选择目录'
visible={ visible }
width={ 400 }
onCancel={()=>{
reset();
onCancel && onCancel()
}}
onOk={ onOk }
>
{
visible && <ModelTree
refrence='recatalog'
onSelect={onSelect}
/>
}
</Modal>
)
}
export default CatalogModal;
\ No newline at end of file
...@@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react'; ...@@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react';
import { Form, Button, Space } from 'antd'; import { Form, Button, Space } from 'antd';
import ImportAction from './ImportAction'; import ImportAction from './ImportAction';
import CatalogModal from './CatalogModal';
import { dispatchLatest } from '../../../../model'; import { dispatchLatest } from '../../../../model';
import { getQueryParam, showMessage } from '../../../../util'; import { getQueryParam, showMessage } from '../../../../util';
import { Action, CatalogId, ModelerId, Hints, ModelerData } from '../../../../util/constant'; import { Action, CatalogId, ModelerId, Hints, ModelerData } from '../../../../util/constant';
...@@ -13,6 +14,7 @@ const EditModel = (props) => { ...@@ -13,6 +14,7 @@ const EditModel = (props) => {
const [ modelerData, setModelerData ] = useState({}); const [ modelerData, setModelerData ] = useState({});
const [ terms, setTerms ] = useState([]); const [ terms, setTerms ] = useState([]);
const [ confirmLoading, setConfirmLoading ] = useState(false); const [ confirmLoading, setConfirmLoading ] = useState(false);
const [ catalogModalVisible, setCatalogModalVisible ] = useState(false);
const { action, catalogId, modelerId, hints, roughModelerData } = actionData; const { action, catalogId, modelerId, hints, roughModelerData } = actionData;
...@@ -40,7 +42,7 @@ const EditModel = (props) => { ...@@ -40,7 +42,7 @@ const EditModel = (props) => {
//eslint-disable-next-line react-hooks/exhaustive-deps //eslint-disable-next-line react-hooks/exhaustive-deps
}, []) }, [])
const save = async () => { const save = async (e, cid = '') => {
try { try {
const row = await form.validateFields(); const row = await form.validateFields();
...@@ -48,6 +50,11 @@ const EditModel = (props) => { ...@@ -48,6 +50,11 @@ const EditModel = (props) => {
if (newModelerData.easyDataModelerModelingTemplate==='' || newModelerData.easyDataModelerModelingTemplate==={}) { if (newModelerData.easyDataModelerModelingTemplate==='' || newModelerData.easyDataModelerModelingTemplate==={}) {
newModelerData.easyDataModelerModelingTemplate = null; newModelerData.easyDataModelerModelingTemplate = null;
}
if (action==='add' && (cid||'')==='' && ((catalogId||'')==='')) {
setCatalogModalVisible(true);
return ;
} }
setConfirmLoading(true); setConfirmLoading(true);
...@@ -57,25 +64,32 @@ const EditModel = (props) => { ...@@ -57,25 +64,32 @@ const EditModel = (props) => {
data: newModelerData data: newModelerData
}, },
callback: data => { callback: data => {
dispatchLatest({ if (action === 'add') {
type: 'datamodel.bindCatalogDataModel', dispatchLatest({
payload: { type: 'datamodel.bindCatalogDataModel',
params: { payload: {
easyDataModelCatalogId: catalogId, params: {
easyDataModelerDataModelIds: data.id||'' easyDataModelCatalogId: ((cid||'')!=='')?cid:catalogId,
easyDataModelerDataModelIds: data.id||''
}
},
callback: () => {
setConfirmLoading(false);
showMessage("success", '新增模型成功');
setActionData({ ...actionData, ...{ action: 'detail', modelerId: data.id||'' } });
},
error: () => {
setConfirmLoading(false);
} }
}, })
callback: () => { } else {
setConfirmLoading(false); setConfirmLoading(false);
showMessage("success", (action==='add')?'新增模型成功':'保存模型成功') showMessage("success", '保存模型成功');
setActionData({ ...actionData, ...{ action: 'detail', modelerId: data.id||'' } }); setActionData({ ...actionData, ...{ action: 'detail', modelerId: data.id||'' } });
}
},
error: () => {
setConfirmLoading(false);
}
})
}, },
error: (err) => { error: (err) => {
setConfirmLoading(false); setConfirmLoading(false);
...@@ -101,6 +115,11 @@ const EditModel = (props) => { ...@@ -101,6 +115,11 @@ const EditModel = (props) => {
setModelerData(data); setModelerData(data);
} }
const onCatalogModalCancel = (id) => {
setCatalogModalVisible(false);
save(null, id);
}
let title = ''; let title = '';
if (action === 'add') { if (action === 'add') {
title = '新增模型'; title = '新增模型';
...@@ -169,6 +188,10 @@ const EditModel = (props) => { ...@@ -169,6 +188,10 @@ const EditModel = (props) => {
<ImportAction hints={hints} onChange={onActionChange} action={action} modelerId={modelerId} form={form} terms={terms} roughModelerData={roughModelerData} /> <ImportAction hints={hints} onChange={onActionChange} action={action} modelerId={modelerId} form={form} terms={terms} roughModelerData={roughModelerData} />
</div> </div>
</div> </div>
<CatalogModal
visible={catalogModalVisible}
onCancel={onCatalogModalCancel}
/>
</div> </div>
); );
} }
......
...@@ -660,6 +660,7 @@ const ImportActionTable = (props) => { ...@@ -660,6 +660,7 @@ const ImportActionTable = (props) => {
dataIndex: 'remark', dataIndex: 'remark',
editable: true, editable: true,
ellipsis: true, ellipsis: true,
require: true,
width: 200, width: 200,
render: (text, _, __) => { render: (text, _, __) => {
return ( return (
......
import React, { useState, useEffect, useRef } from "react"; import React, { useState, useEffect, useRef } from "react";
import { Tooltip, Tree, Modal, Spin, Dropdown, Menu } from "antd"; import { Tooltip, Tree, Modal, Spin } from "antd";
import { PlusOutlined, EditOutlined, SyncOutlined, DeleteOutlined, UnorderedListOutlined, ImportOutlined } from '@ant-design/icons'; import { PlusOutlined, EditOutlined, SyncOutlined, DeleteOutlined, ImportOutlined } from '@ant-design/icons';
import classnames from 'classnames'; import classnames from 'classnames';
import UpdateTreeItemModal from './UpdateTreeItemModal'; import UpdateTreeItemModal from './UpdateTreeItemModal';
...@@ -23,10 +23,11 @@ const viewModes = [ ...@@ -23,10 +23,11 @@ const viewModes = [
const ModelTree = (props) => { const ModelTree = (props) => {
const { onSelect, onViewChange, refrence='', importStockModel } = props; const { onSelect, onViewChange, refrence='', importStockModel, keyword } = props;
const [ loading, setLoading ] = useState(false); const [ loading, setLoading ] = useState(false);
const [ treeData, setTreeData ] = useState(null); const [ treeData, setTreeData ] = useState(null);
const [ item, setItem ] = useState(null); const [ item, setItem ] = useState(null);
const [ prevItem, setPrevItem ] = useState(null);
const [ visible, setVisible ] = useState(false); const [ visible, setVisible ] = useState(false);
const [ type, setType ] = useState(null); const [ type, setType ] = useState(null);
const [ rootId, setRootId ] = useState(''); const [ rootId, setRootId ] = useState('');
...@@ -59,6 +60,24 @@ const ModelTree = (props) => { ...@@ -59,6 +60,24 @@ const ModelTree = (props) => {
//eslint-disable-next-line react-hooks/exhaustive-deps //eslint-disable-next-line react-hooks/exhaustive-deps
}, [timestamp]) }, [timestamp])
useEffect(() => {
if (keyword!=='') {
if (item) {
setPrevItem(item);
}
setItem(null);
} else {
if (prevItem && !item) {
setItem(prevItem);
onSelect && onSelect(prevItem?.key||'');
}
}
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [ keyword ])
const getDataModelLocationThenGetDirTreeData = () => { const getDataModelLocationThenGetDirTreeData = () => {
setLoading(true); setLoading(true);
dispatch({ dispatch({
...@@ -205,20 +224,20 @@ const ModelTree = (props) => { ...@@ -205,20 +224,20 @@ const ModelTree = (props) => {
setAutoExpandParent(false); setAutoExpandParent(false);
}; };
const onViewClick = ({ key }) => { // const onViewClick = ({ key }) => {
if (viewSelectedKey && viewSelectedKey===key ) return; // if (viewSelectedKey && viewSelectedKey===key ) return;
itemRef.current = null; // itemRef.current = null;
setViewSelectedKey(key); // setViewSelectedKey(key);
onViewChange && onViewChange(key); // onViewChange && onViewChange(key);
if (key === 'dir') { // if (key === 'dir') {
getDirTreeData(); // getDirTreeData();
} else { // } else {
getStateTreeData(); // getStateTreeData();
} // }
} // }
const onTreeSelect = (keys,data) => { const onTreeSelect = (keys,data) => {
...@@ -297,17 +316,17 @@ const ModelTree = (props) => { ...@@ -297,17 +316,17 @@ const ModelTree = (props) => {
setVisible(false); setVisible(false);
} }
const exportMenu = ( // const exportMenu = (
<Menu selectedKeys={[viewSelectedKey]} onClick={onViewClick}> // <Menu selectedKeys={[viewSelectedKey]} onClick={onViewClick}>
{ // {
viewModes && viewModes.map(item => { // viewModes && viewModes.map(item => {
return ( // return (
<Menu.Item key={item.key} value={item.key} >{item.name}</Menu.Item> // <Menu.Item key={item.key} value={item.key} >{item.name}</Menu.Item>
) // )
}) // })
} // }
</Menu> // </Menu>
); // );
const classes = classnames('model-tree', { const classes = classnames('model-tree', {
'model-tree-recatalog': (refrence === 'recatalog') 'model-tree-recatalog': (refrence === 'recatalog')
......
...@@ -99,32 +99,49 @@ class Model extends React.Component { ...@@ -99,32 +99,49 @@ class Model extends React.Component {
} }
onTableChange = () => { onTableChange = () => {
const { currentView, catalogId } = this.state; const { currentView, catalogId, keyword } = this.state;
this.setState({ loadingTableData: true }, () => { this.setState({ loadingTableData: true }, () => {
if (currentView === 'dir') { if (keyword === '') {
dispatch({ if (currentView === 'dir') {
type: 'datamodel.getCurrentDataModelCatalog', dispatch({
payload: { type: 'datamodel.getCurrentDataModelCatalog',
easyDataModelerCatalogId: catalogId payload: {
}, easyDataModelerCatalogId: catalogId
callback: data => { },
this.setState({ loadingTableData: false, tableData: data.easyDataModelerDataModels||[] }, () => { callback: data => {
this.setFilterData(); this.setState({ loadingTableData: false, tableData: data.easyDataModelerDataModels||[] }, () => {
}); this.setFilterData();
}, });
error: () => { },
this.setState({ loadingTableData: false }); error: () => {
} 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 });
}
})
}
} else { } else {
dispatch({ dispatch({
type: 'datamodel.getCurrentDataModelStateCatalog', type: 'datamodel.searchModel',
payload: { payload: {
easyDataModelerStateCatalogId: catalogId term: keyword,
}, },
callback: data => { callback: data => {
this.setState({ loadingTableData: false, tableData: data.easyDataModelerDataModels||[] }, () => { this.setState({ loadingTableData: false, tableData: data||[] }, () => {
this.setFilterData(); this.setFilterData();
}); });
}, },
...@@ -150,8 +167,10 @@ class Model extends React.Component { ...@@ -150,8 +167,10 @@ class Model extends React.Component {
} }
onSearchInputChange = (e) => { onSearchInputChange = (e) => {
this.setState({ keyword: e.target.value||'' }, () => { this.setState({ keyword: e.target.value||'', catalogId: '' }, () => {
this.setFilterData(); if (e.target.value !== '') {
this.onTableChange();
}
}); });
} }
...@@ -168,60 +187,33 @@ class Model extends React.Component { ...@@ -168,60 +187,33 @@ class Model extends React.Component {
} }
setFilterData = () => { setFilterData = () => {
const { keyword, tableData, currentModelState } = this.state; const { tableData, currentModelState } = this.state;
const _filterData = (tableData||[]).filter(item => (currentModelState===''||currentModelState===item.state?.id) && ((item.name||'').indexOf(keyword)!==-1||(item.cnName).indexOf(keyword)!==-1)); const _filterData = (tableData||[]).filter(item => (currentModelState===''||currentModelState===item.state?.id));
this.setState({ filterTableData: _filterData }); this.setState({ filterTableData: _filterData });
} }
onImportUnconditionBtnClick = () => { onImportUnconditionBtnClick = () => {
const { catalogId } = this.state; const { catalogId } = this.state;
if (!catalogId || catalogId==='') {
showMessage('info', '请先选择目录');
return;
}
window.open(`/data-govern/data-model-action?${Action}=add&${CatalogId}=${catalogId}`); window.open(`/data-govern/data-model-action?${Action}=add&${CatalogId}=${catalogId||''}`);
} }
onImportExcelBtnClick = () => { onImportExcelBtnClick = () => {
const { catalogId } = this.state;
if (!catalogId || catalogId==='') {
showMessage('info', '请先选择目录');
return;
}
this.setState({ importModalVisible: true, importModalAction: 'add', importModalAddMode: 'excel' }); this.setState({ importModalVisible: true, importModalAction: 'add', importModalAddMode: 'excel' });
} }
onImportExcelCopyBtnClick = () => { onImportExcelCopyBtnClick = () => {
const { catalogId } = this.state;
if (!catalogId || catalogId==='') {
showMessage('info', '请先选择目录');
return;
}
this.setState({ importModalVisible: true, importModalAction: 'add', importModalAddMode: 'excel-copy' }); this.setState({ importModalVisible: true, importModalAction: 'add', importModalAddMode: 'excel-copy' });
} }
onImportWordBtnClick = () => { onImportWordBtnClick = () => {
const { catalogId } = this.state;
if (!catalogId || catalogId==='') {
showMessage('info', '请先选择目录');
return;
}
this.setState({ importWordModalVisible: true }); this.setState({ importWordModalVisible: true });
} }
onImportModelBtnClick = () => { onImportModelBtnClick = () => {
const { catalogId, selectModelerIds } = this.state; const { catalogId, selectModelerIds } = this.state;
if (!catalogId || catalogId==='') {
showMessage('info', '请先选择目录');
return;
}
if ((selectModelerIds||[]).length === 0) { if ((selectModelerIds||[]).length === 0) {
showMessage('info', '请先选择一个模型'); showMessage('info', '请先选择一个模型');
...@@ -233,16 +225,10 @@ class Model extends React.Component { ...@@ -233,16 +225,10 @@ class Model extends React.Component {
return; return;
} }
window.open(`/data-govern/data-model-action?${Action}=add&${CatalogId}=${catalogId}&${ModelerId}=${selectModelerIds[0]}`); window.open(`/data-govern/data-model-action?${Action}=add&${CatalogId}=${catalogId||''}&${ModelerId}=${selectModelerIds[0]}`);
} }
onImportDDLBtnClick = () => { onImportDDLBtnClick = () => {
const { catalogId } = this.state;
if (!catalogId || catalogId==='') {
showMessage('info', '请先选择目录');
return;
}
this.setState({ importModalVisible: true, importModalAction: 'add', importModalAddMode: 'ddl' }); this.setState({ importModalVisible: true, importModalAction: 'add', importModalAddMode: 'ddl' });
} }
...@@ -516,7 +502,7 @@ class Model extends React.Component { ...@@ -516,7 +502,7 @@ class Model extends React.Component {
return ( return (
<div className='data-model'> <div className='data-model'>
<div className='left'> <div className='left'>
<ModelTree onViewChange={this.onViewChange} onSelect={this.onTreeSelect} importStockModel={this.importStockModel} {...this.props} /> <ModelTree onViewChange={this.onViewChange} onSelect={this.onTreeSelect} importStockModel={this.importStockModel} keyword={keyword} {...this.props} />
</div> </div>
<div className='right'> <div className='right'>
<div <div
...@@ -538,7 +524,7 @@ class Model extends React.Component { ...@@ -538,7 +524,7 @@ class Model extends React.Component {
<Space> <Space>
<Input <Input
placeholder="请输入模型名称或者中文名称" placeholder="请输入关键字"
allowClear allowClear
value={keyword} value={keyword}
onChange={(e) => { this.onSearchInputChange(e); }} onChange={(e) => { this.onSearchInputChange(e); }}
......
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