Commit 4a234509 by zhaochengxiang

模型改成服务

parent a9565736
......@@ -78,6 +78,6 @@
"last 1 safari version"
]
},
"proxy": "http://139.198.126.96:8089",
"proxy": "http://139.198.127.28:8089",
"homepage": "http://myhost/data-govern"
}
......@@ -11,9 +11,9 @@ import * as datamodel from './datamodel';
import * as assetmanage from './assetmanage';
import * as tag from './tag';
import * as msd from './msd';
import * as psd from './psd';
import * as pds from './pds';
const funcs = Connect({ user, datamodel, map, assetmanage, datasource, tag, msd, psd })
const funcs = Connect({ user, datamodel, map, assetmanage, datasource, tag, msd, pds })
function* request(args) {
const { type, payload, callback, error } = args.args;
......
import * as psd from '../service/psd';
import * as pds from '../service/pds';
import { call } from 'redux-saga/effects';
export function* refreshCatalog(payload) {
return yield call(psd.refreshCatalog, payload);
return yield call(pds.refreshCatalog, payload);
}
export function* loadStateCatalog(payload) {
return yield call(psd.loadStateCatalog, payload);
return yield call(pds.loadStateCatalog, payload);
}
export function* saveCatalog(payload) {
return yield call(psd.saveCatalog, payload);
return yield call(pds.saveCatalog, payload);
}
export function* deleteCatalog(payload) {
return yield call(psd.deleteCatalog, payload);
return yield call(pds.deleteCatalog, payload);
}
export function* upDownCatalog(payload) {
return yield call(psd.upDownCatalog, payload);
return yield call(pds.upDownCatalog, payload);
}
export function* getServices(payload) {
return yield call(psd.getServices, payload);
return yield call(pds.getServices, payload);
}
export function* getStateServices(payload) {
return yield call(pds.getStateServices, payload)
}
export function* searchService(payload) {
return yield call(pds.searchService, payload)
}
export function* deleteService(payload) {
return yield call(psd.deleteService, payload);
return yield call(pds.deleteService, payload);
}
export function* recatalogService(payload) {
return yield call(psd.recatalogService, payload);
return yield call(pds.recatalogService, payload);
}
export function* nextState(payload) {
return yield call(psd.nextState, payload);
return yield call(pds.nextState, payload);
}
export function* getCheckoutService(payload) {
return yield call(pds.getCheckoutService, payload)
}
export function* getServiceDigest(payload) {
return yield call(pds.getServiceDigest, payload)
}
\ No newline at end of file
......@@ -47,10 +47,6 @@ export const routes = [
name: 'msd-manage',
text: '主数据管理'
},
{
name: 'data-service',
text: '数据服务管理'
},
]
}
];
......
......@@ -24,6 +24,14 @@ export function getServices(payload) {
return GetJSON("/pdataservice/pdsCURD/getCurrentDataServiceCatalog", payload)
}
export function getStateServices(payload) {
}
export function searchService(payload) {
}
export function deleteService(payload) {
return PostJSON("/pdataservice/pdsCURD/deleteDataService", payload);
}
......@@ -36,6 +44,14 @@ export function nextState(payload) {
return GetJSON("/pdataservice/pdsCURD/nextState", payload);
}
export function getCheckoutService(payload) {
}
export function getServiceDigest(payload) {
}
......
......@@ -388,13 +388,13 @@ export function getTextWidth(text, font='14px tabular-nums') {
}
export function getDataModelerRole(user) {
if ((user?.roles||[]).indexOf('ROLE_dataModeler_admin') !== -1) {
return DataModelerRoleAdmin;
} else if ((user?.roles||[]).indexOf('ROLE_dataModeler_user') !== -1) {
return DataModelerRoleUser;
} else if ((user?.roles||[]).indexOf('ROLE_dataModeler_reader') !== -1) {
return DataModelerRoleReader;
}
// if ((user?.roles||[]).indexOf('ROLE_dataModeler_admin') !== -1) {
// return DataModelerRoleAdmin;
// } else if ((user?.roles||[]).indexOf('ROLE_dataModeler_user') !== -1) {
// return DataModelerRoleUser;
// } else if ((user?.roles||[]).indexOf('ROLE_dataModeler_reader') !== -1) {
// return DataModelerRoleReader;
// }
return DataModelerRoleAdmin;
}
import { useMemo, useState } from 'react';
import classNames from 'classnames';
import { ResizableBox } from 'react-resizable';
import { CaretLeftOutlined, CaretRightOutlined } from '@ant-design/icons';
import Tree from './tree'
import '../DataMaster/Define/index.less';
const FC = (props) => {
const [collapse, setCollapse] = useState(false);
const classes = useMemo(() => {
return classNames('data-master', {
'data-master-collapse': collapse,
});
}, [collapse]);
const onCollapseClick = () => {
setCollapse(!collapse);
}
return (
<div className={classes}>
<ResizableBox
className='left-wrap'
width={230}
height={Infinity}
axis='x'
minConstraints={[230, Infinity]} maxConstraints={[Infinity, Infinity]}
>
<Tree />
</ResizableBox>
<div className='left-collapse-wrap'>
<div className='left-collapse' onClick={onCollapseClick}>
{ collapse ? <CaretRightOutlined /> : <CaretLeftOutlined /> }
</div>
</div>
<div className='right-wrap'>
</div>
</div>
)
}
export default FC;
\ No newline at end of file
import React, { useState, useEffect, useContext } from "react";
import { Tooltip, Tree, Modal, Spin, Dropdown, Menu, Button, AutoComplete } from "antd";
import { PlusOutlined, SyncOutlined, ImportOutlined, UnorderedListOutlined, ReloadOutlined } from '@ant-design/icons';
import classnames from 'classnames';
import { useContextMenu, Menu as RcMenu, Item as RcItem } from "react-contexify";
import { dispatch } from '../../../model';
import { showMessage, getQueryParam, highlightSearchContentByTerms } from '../../../util';
import UpdateTreeItemModal from './update';
import '../Model/Component/ModelTree.less';
import 'react-contexify/dist/ReactContexify.css';
const { Option } = AutoComplete;
const MENU_ID = 'service-tree';
const viewModes = [
{ key: 'dir', name: '目录视角' },
{ key: 'state', name: '服务状态视角' }
];
const FC = (props) => {
const { refrence, onSelect, onViewChange } = props;
const { show } = useContextMenu({
id: MENU_ID,
});
const [ loading, setLoading ] = useState(false);
const [ treeData, setTreeData ] = useState(null);
const [ item, setItem ] = useState(null);
const [ rootId, setRootId ] = useState('');
const [ visible, setVisible ] = useState(false);
const [ type, setType ] = useState(null);
const [ expandedKeys, setExpandedKeys ] = useState([]);
const [ autoExpandParent, setAutoExpandParent ] = useState(false);
const [ viewSelectedKey, setViewSelectedKey ] = useState(viewModes[0].key);
const [ currentRightClickDir, setCurrentRightClickDir ] = useState({});
const [ searchKeyword, setSearchKeyword ] = useState('');
const [ dataList, setDataList ] = useState([]);
const [ options, setOptions ] = useState([]);
const [modal, contextHolder] = Modal.useModal();
useEffect(() => {
getDirTreeData();
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
const getDirTreeData = (defaultSelectedId='') => {
setLoading(true);
dispatch({
type: 'psd.refreshCatalog',
callback: data => {
data.key = data.id||'';
data.title = data.name||'';
data.children = data.subCatalogs||[];
let defaultItem = null;
function recursion(subCatalogs) {
if ((subCatalogs||[]).length===0) return;
(subCatalogs||[]).forEach(catalog=> {
catalog.key = catalog.id||'';
catalog.title = catalog.name||'';
catalog.children = catalog.subCatalogs||[];
if (catalog.id === defaultSelectedId) {
defaultItem = catalog;
}
recursion(catalog.subCatalogs);
})
}
recursion(data.subCatalogs);
setLoading(false);
setTreeData(data.subCatalogs||[]);
setRootId(data.id||'');
const _dataList = [];
generateList(data.subCatalogs||[], _dataList);
setDataList(_dataList);
if (defaultItem) {
const expandedKeys = _dataList
.map(item => {
if (item.key.indexOf(defaultSelectedId) > -1) {
return getParentKey(item.key, data.subCatalogs||[]);
}
return null;
})
.filter((item, i, self) => item && self.indexOf(item) === i);
setExpandedKeys([...expandedKeys, defaultSelectedId]);
setAutoExpandParent(true);
setItem(defaultItem);
onSelect && onSelect(defaultItem.key||'');
} else if (!refrence) {
const currentItem = (data.subCatalogs||[]).length>0?data.subCatalogs[0]: null;
setItem(currentItem);
if (currentItem && currentItem.key) {
setExpandedKeys([currentItem?.key]);
}
onSelect && onSelect(currentItem?(currentItem.key||''):'');
}
},
error: () => {
setLoading(false);
}
})
}
const getStateTreeData = () => {
setLoading(true);
dispatch({
type: 'psd.loadStateCatalog',
callback: data => {
setLoading(false);
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: () => {
setLoading(false);
}
});
}
const generateList = (treeData, list, path = null) => {
for (let i = 0; i < treeData.length; i++) {
const node = treeData[i];
const { id, name } = node;
const currentPath = path ? `${path}/${name}` : name;
list.push({ key: id , title: currentPath, value: currentPath });
if (node.children) {
generateList(node.children, list, currentPath);
}
}
};
const getParentKey = (key, tree) => {
let parentKey;
for (let i = 0; i < tree.length; i++) {
const node = tree[i];
if (node.children) {
if (node.children.some(item => item.id === key)) {
parentKey = node.id;
} else if (getParentKey(key, node.children)) {
parentKey = getParentKey(key, node.children);
}
}
}
return parentKey;
};
const onExpand = (expandedKeys) => {
setExpandedKeys(expandedKeys);
setAutoExpandParent(false);
};
const onViewClick = ({ key }) => {
if (viewSelectedKey && viewSelectedKey===key ) return;
setViewSelectedKey(key);
setSearchKeyword('');
onViewChange && onViewChange(key);
if (key === 'dir') {
getDirTreeData();
} else {
getStateTreeData();
}
}
const onTreeSelect = (keys,data) => {
if ((keys||[]).length === 0) {
return;
}
const _item = {...data.selectedNodes[0]||[]};
setItem(_item);
onSelect && onSelect(_item.key);
}
const add = () => {
setVisible(true);
setType('add');
}
const update = () => {
setVisible(true);
setType('update');
}
const refresh = () => {
if (viewSelectedKey==='dir') {
getDirTreeData(item?.key||'');
} else {
getStateTreeData(item?.key||'');
}
}
const sync = () => {
getDirTreeData(item?.key||'', null, 'load');
}
const moveNode = (steps) => {
setLoading(true);
dispatch({
type: 'psd.upDownCatalog',
payload: {
modelCatalogId: currentRightClickDir.id,
steps
},
callback: () => {
showMessage('success', (steps===-1)?'上移目录成功':'下移目录成功');
getDirTreeData(item.id);
},
error: () => {
setLoading(false);
}
});
}
const deleteNode = () => {
modal.confirm({
title: '提示!',
content: '删除目录会删除相关的模型,您确定删除吗?',
onOk: () => {
setLoading(true);
dispatch({
type: 'psd.deleteCatalog',
payload: {
params: {
easyDataModelerCatalogId: currentRightClickDir.id
}
},
callback: () => {
showMessage('success', '删除目录成功');
if (item && currentRightClickDir && item.id===currentRightClickDir.id) {
getDirTreeData();
} else {
getDirTreeData(item.id);
}
},
error: () => {
setLoading(false);
}
});
}
});
}
const onUpdateTreeItemModalOk = (id, updateItem) => {
setVisible(false);
getDirTreeData(id);
}
const onUpdateTreeItemModalCancel = () => {
setVisible(false);
}
const treeDirectoryChanged = (did) => {
let defaultItem = null;
function recursion(subCatalogs) {
if ((subCatalogs||[]).length===0) return;
(subCatalogs||[]).forEach(catalog=> {
catalog.key = catalog.id||'';
catalog.title = catalog.name||'';
catalog.children = catalog.subCatalogs||[];
if (catalog.id === did) {
defaultItem = catalog;
}
recursion(catalog.subCatalogs);
})
}
recursion(treeData||[]);
if (defaultItem) {
const expandedKeys = dataList
.map(item => {
if (item.key.indexOf(did) > -1) {
return getParentKey(item.key, treeData||[]);
}
return null;
})
.filter((item, i, self) => item && self.indexOf(item) === i);
setExpandedKeys([...expandedKeys, did]);
setAutoExpandParent(true);
setItem(defaultItem);
onSelect && onSelect(defaultItem.key||'');
}
}
const onAutoCompleteSearch = (searchText) => {
setOptions(
!searchText ? [] : (dataList||[]).filter(item => item.title.indexOf(searchText)!==-1),
);
};
const onAutoCompleteChange = (value) => {
setSearchKeyword(value);
}
const onAutoCompleteSelect = (value, option) => {
const paths = value.split('/');
setSearchKeyword(paths[paths.length-1]);
treeDirectoryChanged(option.key);
};
const displayMenu = (e) => {
show(e, {
position: {
x: e.clientX + 30,
y: e.clientY - 10
}
});
}
const exportMenu = (
<Menu selectedKeys={[viewSelectedKey]} onClick={onViewClick}>
{
viewModes && viewModes.map(item => {
return (
<Menu.Item key={item.key} value={item.key} >
<div style={{ textAlign: 'center' }}>
{item.name}
</div>
</Menu.Item>
)
})
}
</Menu>
);
const classes = classnames('model-tree', {
'model-tree-recatalog': (refrence === 'recatalog')
});
return (
<div className={classes}>
{
!refrence && <div
className='p-3'
style={{
display: 'flex',
borderBottom: "1px solid #EFEFEF",
height: 57,
alignItems: 'center',
}}
>
<Dropdown overlay={exportMenu} placement="bottomLeft">
<Tooltip title="视角">
<UnorderedListOutlined className='default' style={{ fontSize:16,cursor:'pointer' }} />
</Tooltip>
</Dropdown>
{
(viewSelectedKey==='dir') && (
<Tooltip title="新增目录" className='ml-6'>
<PlusOutlined className='default' onClick={add} style={{ fontSize:16,cursor:'pointer' }} />
</Tooltip>
)
}
<Tooltip title="刷新目录" className='ml-6'>
<Button type='text' icon={<ReloadOutlined className='default' />} size='small' onClick={refresh} />
</Tooltip>
</div>
}
<div className='p-3'>
<Spin spinning={loading} >
{
(viewSelectedKey==='dir') && <AutoComplete
allowClear
value={searchKeyword}
style={{ marginBottom: 10, width: '100%' }}
onSelect={onAutoCompleteSelect}
onSearch={onAutoCompleteSearch}
onChange={onAutoCompleteChange}
onClear={() => { setSearchKeyword(''); }}
>
{
(options||[]).map((item, index) => {
return (
<Option key={item.key} value={item.value}>
<div style={{ whiteSpace: 'normal' }}>
{highlightSearchContentByTerms(item.title, [searchKeyword])}
</div>
</Option>
);
})
}
</AutoComplete>
}
<Tree
onExpand={onExpand}
expandedKeys={expandedKeys}
autoExpandParent={autoExpandParent}
showLine
showIcon={false}
onSelect={onTreeSelect}
treeData={treeData}
selectedKeys={[item?item.key:'']}
titleRender={(nodeData) => {
return <span title={nodeData?.remark||''}>{nodeData?.name||''}</span>;
}}
onRightClick={({event, node}) => {
if (viewSelectedKey==='dir') {
setCurrentRightClickDir(node);
displayMenu(event);
}
}}
/>
</Spin>
</div>
<UpdateTreeItemModal
visible={visible}
type={type}
item={(type==='add')?item:currentRightClickDir}
rootId={rootId}
onOk={onUpdateTreeItemModalOk}
onCancel={onUpdateTreeItemModalCancel}
/>
{
(refrence!=='recatalog') && <RcMenu id={MENU_ID}>
<RcItem id="edit" onClick={update}>
修改目录
</RcItem>
<RcItem id="up" onClick={() => { moveNode(-1); }}>
上移目录
</RcItem>
<RcItem id="down" onClick={() => { moveNode(1); }}>
下移目录
</RcItem>
<RcItem id="delete" onClick={deleteNode}>
删除目录
</RcItem>
</RcMenu>
}
{contextHolder}
</div>
);
}
export default FC;
\ No newline at end of file
import React, { useState, useEffect } from 'react';
import { Modal, Form, Input, Radio } from 'antd';
import { dispatchLatest } from '../../../model';
class UpdateTreeItemForm extends React.Component {
constructor(props){
super(props);
this.state = {
radioDisable: false
}
}
componentDidMount() {
this.radioState();
}
componentDidUpdate(preProps, preState) {
const { item } = this.props;
if (item!==preProps.item) {
this.radioState();
}
}
radioState = () => {
const { item } = this.props;
this.setState({ radioDisable: item? false: true })
}
render() {
const { type, form } = this.props;
const { radioDisable } = this.state;
const formItemLayout = {
labelCol: {
xs: { span: 24 },
sm: { span: 6 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 18 },
},
};
return (
<Form
{...formItemLayout}
form={form}
>
{
type==='add'&&<Form.Item label="目录类型" name="action">
<Radio.Group disabled={radioDisable} >
<Radio value='root'>根目录</Radio>
<Radio value='sub'>子目录</Radio>
</Radio.Group>
</Form.Item>
}
<Form.Item
label="名称"
name="name"
rules={[{ required: true, message: '请输入名称!' }]}
>
<Input />
</Form.Item>
<Form.Item
label="描述"
name="remark"
rules={[{ required: true, message: '请输入描述!' }]}
>
<Input />
</Form.Item>
</Form>
);
}
}
const FC = (props) => {
const { onOk, type, item, onCancel, visible, rootId } = props;
const [ confirmLoading, setConfirmLoading ] = useState(false);
const [form] = Form.useForm();
useEffect(() => {
if (visible) {
let _action = '';
if (type === 'add') {
_action = item ? 'sub' : 'root';
}
form.setFields([{ name: 'name', errors: [] }, { name: 'remark', errors: [] }]);
if (type === 'add') {
form.setFieldsValue({ action: _action, name: '', remark: '' });
} else {
form.setFieldsValue({ action: '', name: item?item.name:'', remark: item?item.remark:'' });
}
}
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [visible])
const handleOk = async () => {
setConfirmLoading(true);
try {
const values = await form.validateFields();
let payload = null;
if (type === 'add' && values.action==='root') {
payload = {
name: values.name||'',
remark: values.remark||'',
parentId: rootId
};
} else if (type === 'add') {
payload = {
name: values.name||'',
remark: values.remark||'',
parentId: item.id
};
} else {
payload = {
...item,
name: values.name||'',
remark: values.remark||'',
}
}
dispatchLatest({
type: 'psd.saveCatalog',
payload: {
data: payload
},
callback: id => {
setConfirmLoading(false);
if (onOk) {
onOk(id, payload);
}
},
error: () => {
setConfirmLoading(false);
}
});
} catch (errInfo) {
setConfirmLoading(false);
}
}
return (
<Modal
forceRender
confirmLoading={confirmLoading}
visible={visible}
title={type==='add'?"新增目录":"更新目录"}
onOk={handleOk}
onCancel={() => {
setConfirmLoading(false);
onCancel && onCancel();
}}
>
<UpdateTreeItemForm form={form} item={item} type={type} />
</Modal>
);
}
export default FC;
\ No newline at end of file
import React, { useState, useEffect, useRef, useMemo } from "react";
import { Tooltip, Modal, Table, Typography } from 'antd';
import LocalStorage from 'local-storage';
import React, { useState, useEffect, useRef } from "react";
import { Tooltip, Modal, Pagination, Table, Typography } from 'antd';
import { DownOutlined, UpOutlined } from '@ant-design/icons';
import SmoothScroll from 'smooth-scroll';
import classnames from 'classnames';
import { Resizable } from 'react-resizable';
import { useContextMenu, Menu as RcMenu, Item as RcItem } from "react-contexify";
import ResizeObserver from 'rc-resize-observer';
import DataGrid, { defaultPageSize } from '../../VirtualTable';
import { dispatch } from '../../../../model';
import { showMessage, getQueryParam, isSzseEnv, formatDate, getDataModelerRole } from '../../../../util';
import { showMessage, getQueryParam, paginate, isSzseEnv, formatDate, getDataModelerRole } from '../../../../util';
import { AnchorId, AnchorTimestamp, Action, CatalogId, ModelerId, DataModelerRoleReader } from '../../../../util/constant';
import ExpandedModelTable from "./ExpandedModelTable";
// import Tag from "../../Tag";
import { useContextMenu, Menu as RcMenu, Item as RcItem } from "react-contexify";
import './ModelTable.less';
import 'react-contexify/dist/ReactContexify.css';
const { Paragraph, Text } = Typography;
const { Text } = Typography;
const { Column } = Table;
const ModelNameColumn = (props) => {
const { text, record, detailItem } = props;
......@@ -49,7 +52,6 @@ const ModelNameColumn = (props) => {
if (data.digest) {
_textComponent = <div style={{ width: 500, maxHeight: 300, overflow: 'auto' }}>
<Table
rowKey='name'
dataSource={data.digest.attributeDigests||[]}
columns={cols}
loading={false}
......@@ -73,7 +75,7 @@ const ModelNameColumn = (props) => {
onVisibleChange={(visible) => {
if (visible && !record.digest) {
dispatch({
type: 'datamodel.getDataModelDigest',
type: 'pds.getServiceDigest',
payload: {
id: record.id
},
......@@ -92,213 +94,382 @@ const ModelNameColumn = (props) => {
);
}
const ModelTable = (props) => {
const { data, onChange, onItemAction, onSelect, onHistory, catalogId, keyword, onAutoCreateTable, offset = null, view, modelState, user, selectModelerIds, visibleColNames } = props;
const ResizeableHeaderCell = props => {
const { onResize, width, onClick, ...restProps } = props;
const [ selectedRowKeys, setSelectedRowKeys ] = useState([]);
const [ expandedSelectedRowKeys, setExpandedSelectedRowKeys ] = useState([]);
const [ currentItem, setCurrentItem ] = useState(null);
const [ scrollRowIndex, setScrollRowIndex ] = useState();
if (!width) {
return <th {...restProps} />;
}
const expandedDataMapRef = useRef(new Map());
const shouldScrollRef = useRef(false);
return (
<Resizable
width={width}
height={0}
handle={
<span
className="react-resizable-handle"
onClick={(e) => {
e.stopPropagation();
}}
/>
}
onResize={onResize}
draggableOpts={{ enableUserSelectHack: false }}
>
<th
onClick={onClick}
{...restProps}
/>
</Resizable>
);
};
const anchorId = getQueryParam(AnchorId, props?.location?.search);
const anchorTimestamp = getQueryParam(AnchorTimestamp, props?.location?.search);
const gridRef = useRef();
const ModelTable = (props) => {
const [modal, contextHolder] = Modal.useModal();
const { data, onChange, onItemAction, onSelect, onHistory, catalogId, keyword, onAutoCreateTable, offset = null, modelId = null, modelPid = null, view, selectModelerIds, onSubSelect, modelState, user } = props;
const MENU_ID = (((modelId||'') !== '') ? `model-table-contextmenu-${modelId}` : 'model-table-contextmenu');
const MENU_ID = 'model-table-contextmenu';
const { show } = useContextMenu({
id: MENU_ID,
});
const [ tableWidth, setTableWidth ] = useState(0);
const [ selectedRowKeys, setSelectedRowKeys ] = useState([]);
const [ subSelectedRowKeys, setSubSelectedRowKeys ] = useState([]);
// const [ mouseEnterKey, setMouseEnterKey ] = useState(null);
const [ sortRule, setSortRule ] = useState(null);
const [ filterData, setFilterData ] = useState([]);
const [ subData, setSubData ] = useState([]);
const cols = [
{
name: '序号',
key: 'index',
title: '序号',
dataIndex: 'key',
render: (text, record, index) => {
return (index+1).toString();
},
width: 60,
sortable: false,
resizable: true,
ellipsis: true,
},
{
name: '模型名称',
key: 'name',
title: '服务名称',
dataIndex: 'name',
width: isSzseEnv?360:160,
sortable: true,
resizable: true,
formatter(props) {
return (<ModelNameColumn text={props.row.name} record={props.row} detailItem={detailItem} />);
ellipsis: true,
sorter: true,
sortDirections: ['ascend', 'descend'],
render: (text, record, index) => {
return (<ModelNameColumn text={text} record={record} detailItem={detailItem} />);
}
},
{
name: '中文名称',
key: 'cnName',
title: '中文名称',
dataIndex: 'cnName',
width: isSzseEnv?420:160,
sortable: true,
resizable: true,
formatter(props) {
return (
<Tooltip title={props.row.cnName||''}>
<Text ellipsis={true}>{props.row.cnName||''}</Text>
</Tooltip>
)
}
},
{
name: '路径',
key: 'path',
width: 120,
sortable: true,
resizable: true,
formatter(props) {
ellipsis: true,
sorter: true,
sortDirections: ['ascend', 'descend'],
render: (text, _, __) => {
return (
<Tooltip title={props.row.path||''}>
<Text ellipsis={true}>{props.row.path||''}</Text>
<Tooltip title={text||''}>
<Text ellipsis={true}>{text||''}</Text>
</Tooltip>
)
}
},
{
name: '状态',
key: 'state',
title: '状态',
dataIndex: 'state',
width: 100,
sortable: true,
resizable: true,
formatter(props) {
ellipsis: true,
sorter: true,
sortDirections: ['ascend', 'descend'],
render: (_, record) => {
let color = '';
if (props.row.state?.id === '1') {
if (record?.state?.id === '1') {
color = '#DE7777';
} else if (props.row.state?.id === '2') {
} else if (record?.state?.id === '2') {
color = '#779BDE';
} else if (props.row.state?.id === '4') {
} else if (record?.state?.id === '4') {
color = '#77DEBF';
}
return (
<span>
<span style={{ display: 'inline-block', width: 10, height: 10, borderRadius: 5, marginRight: 5, backgroundColor: color }}></span>
<span>{props.row.state?.cnName||''}</span>
<span>{record?.state?.cnName||''}</span>
</span>
);
}
},
{
name: '创建人',
key: 'editor',
title: '创建人',
dataIndex: 'editor',
width: 100,
sortable: true,
resizable: true,
ellipsis: true,
sorter: true,
sortDirections: ['ascend', 'descend'],
},
{
name: '版本号',
key: 'modifiedTs',
title: '版本号',
dataIndex: 'modifiedTs',
width: 170,
sortable: true,
resizable: true,
formatter(props) {
return `V_${formatDate(props.row.modifiedTs)}`;
ellipsis: true,
sorter: true,
sortDirections: ['ascend', 'descend'],
render: (_,record) => {
return `V_${formatDate(record.modifiedTs)}`;
}
},
// {
// title: '标签',
// dataIndex: 'tag',
// width: 200,
// onCell: (record) => ({
// onMouseEnter: event => {
// setMouseEnterKey(record.id);
// },
// onMouseLeave: event => {
// setMouseEnterKey(null);
// },
// }),
// render: (_,record) => {
// return (
// record.id===mouseEnterKey?<Tag styleType='complex' id={record.id} />:<Tag id={record.id} />
// );
// }
// },
{
name: '模型描述',
key: 'remark',
sortable: true,
resizable: true,
formatter(props) {
title: '服务描述',
dataIndex: 'remark',
ellipsis: true,
sorter: true,
sortDirections: ['ascend', 'descend'],
render: (text, _, __) => {
return (
<Tooltip title={props.row.remark||''} overlayClassName='tooltip-common'>
<Text ellipsis={true}>{props.row.remark||''}</Text>
<Tooltip title={text||''} overlayClassName='tooltip-common'>
<Text ellipsis={true}>{text||''}</Text>
</Tooltip>
)
);
}
},
];
const columns = useMemo(() => {
let newCols = [...cols];
if ((visibleColNames||[]).length > 0) {
newCols = newCols.filter(col => visibleColNames.indexOf(col.name)!==-1 || col.name==='序号');
if (visibleColNames.indexOf('模型描述') === -1) {
newCols[newCols.length-1].width = null;
}
const pathColumn = {
title: '路径',
dataIndex: 'path',
width: 120,
ellipsis: true,
sorter: true,
sortDirections: ['ascend', 'descend'],
render: (text, _, __) => {
return (
<Tooltip title={text||''}>
<Text ellipsis={true}>{text||''}</Text>
</Tooltip>
)
}
};
return newCols;
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [visibleColNames])
const summarySelectedCount = useMemo(() => {
let newSelectedRowKeys = Array.from(new Set([...selectedRowKeys, ...expandedSelectedRowKeys]));
const [ columns, setColumns ] = useState([]);
const [ includePathColumns, setIncludePathColumns ] = useState([]);
const [ pagination, setPagination ] = useState( { pageNum: 1, pageSize: 20 } );
const [ currentItem, setCurrentItem ] = useState(null);
const { pageNum, pageSize } = pagination;
const ids = [];
(data||[]).forEach(item => {
ids.push(item.id);
if (item.alreadyCheckedOut) {
ids.push(item.checkedOutId);
}
})
const [modal, contextHolder] = Modal.useModal();
newSelectedRowKeys = (newSelectedRowKeys||[]).filter(key => ids.indexOf(key) !== -1);
const anchorId = getQueryParam(AnchorId, props.location.search);
const anchorTimestamp = getQueryParam(AnchorTimestamp, props.location.search);
return (newSelectedRowKeys||[]).length;
}, [selectedRowKeys, expandedSelectedRowKeys, data])
const shouldScrollRef = useRef(false);
useEffect(() => {
if (data && gridRef.current) {
setTimeout(() => {
gridRef.current?.scrollToRow(0);
}, 100)
}
}, [data])
useEffect(() => {
if ((modelId||'') !== '') {
window?.addEventListener("storage", modelEventChange);
return () => {
window?.removeEventListener("storage", modelEventChange);
}
}
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
useEffect(() => {
setSelectedRowKeys([]);
setExpandedSelectedRowKeys([]);
if ((modelId||'') === '') {
onSelect && onSelect([]);
if ((keyword||'') === '') {
if (offset !== null) {
const _pageNum = parseInt(offset/pageSize + ((offset%pageSize===0)?0:1));
setPagination({...pagination, pageNum: _pageNum });
} else {
setPagination({...pagination, pageNum: 1 });
}
} else {
setPagination({...pagination, pageNum: 1 });
}
} else {
getCheckoutDataModel();
}
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [ catalogId, keyword, offset, modelState ]);
useEffect(() => {
if ((selectModelerIds||[]).length===0) {
if ((selectModelerIds||[]).length === 0) {
setSelectedRowKeys([]);
setExpandedSelectedRowKeys([]);
setSubSelectedRowKeys([]);
}
}, [selectModelerIds])
useEffect(() => {
if ((anchorId||'') !== '') {
shouldScrollRef.current = true;
}
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [anchorTimestamp])
useEffect(() => {
if (shouldScrollRef.current && gridRef.current && offset!==null && (data||[]).length>0) {
setScrollRowIndex(offset);
setTimeout(() => {
gridRef.current?.scrollToRow((offset-1)%defaultPageSize);
if (shouldScrollRef.current) {
SmoothScroll('a[href*="#"]');
const _id = getQueryParam(AnchorId, props.location.search);
var scroll = new SmoothScroll();
var anchor = document.querySelector(`#data-model-${_id}`);
if (anchor) {
scroll.animateScroll(anchor);
shouldScrollRef.current = false;
}, 300)
}
}
})
useEffect(() => {
const newData = [...data];
if (sortRule) {
if (sortRule.order === 'ascend') {
newData.sort((item1, item2) => {
if (sortRule.field === 'state') {
return (item1[sortRule.field]?.cnName||'').localeCompare(item2[sortRule.field]?.cnName||'');
} else if (sortRule.field === 'modifiedTs') {
return formatDate(item1[sortRule.field]).localeCompare(formatDate(item2[sortRule.field]));
}
return item1[sortRule.field].localeCompare(item2[sortRule.field]);
})
} else if (sortRule.order === 'descend') {
newData.sort((item1, item2) => {
if (sortRule.field === 'state') {
return (item2[sortRule.field]?.cnName||'').localeCompare(item1[sortRule.field]?.cnName||'');
} else if (sortRule.field === 'modifiedTs') {
return formatDate(item2[sortRule.field]).localeCompare(formatDate(item1[sortRule.field]));
}
return item2[sortRule.field].localeCompare(item1[sortRule.field]);
})
}
}
const _data = paginate(newData||[], pageNum, pageSize);
setFilterData(_data);
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [data, pagination, sortRule])
useEffect(() => {
if (tableWidth>0 && columns.length===0) {
let newColumns = [], newIncludePathColumns = [];
let excludePathCols = [...cols];
if ((modelId||'') !== '') {
excludePathCols = cols.filter(item => item.dataIndex!=='key');
}
excludePathCols.forEach((column, index) => {
const newColumn = {...column};
if (!newColumn.width) {
const rowWidth = (excludePathCols.reduce((preVal, col) => (col.width?col.width:0) + preVal, 0)) + 97; //展开50 勾选32 滚动条15
if (tableWidth - rowWidth > 200) {
newColumn.width = tableWidth - rowWidth;
} else {
newColumn.width = 200;
}
}
newColumns.push(newColumn);
});
const includePathCols = [...cols];
includePathCols.splice(3, 0, pathColumn);
includePathCols.forEach((column, index) => {
const newColumn = {...column};
if (!newColumn.width) {
const rowWidth = (includePathCols.reduce((preVal, col) => (col.width?col.width:0) + preVal, 0)) + 97;
if (tableWidth - rowWidth > 200) {
newColumn.width = tableWidth-rowWidth;
} else {
newColumn.width = 200;
}
}
newIncludePathColumns.push(newColumn);
});
setColumns([ ...newColumns, <Column key='auto' />]);
setIncludePathColumns([ ...newIncludePathColumns, <Column key='auto' />]);
}
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [ tableWidth ])
const modelEventChange = (e) => {
if (e.key === 'modelChange') {
expandedDataMapRef.current.delete(LocalStorage.get('modelId'));
getCheckoutDataModel();
}
}
const getCheckoutDataModel = () => {
dispatch({
type: 'pds.getCheckoutService',
payload: {
id: modelPid
},
callback: data => {
setSubData(data?[data]:[]);
},
error: () => {
}
})
}
// const getDataModel = () => {
// dispatch({
// type: 'datamodel.getDataModel',
// payload: {
// id: modelId
// },
// callback: data => {
// setSubData(data?[data]:[]);
// },
// error: () => {
// }
// })
// }
const editItem = (record) => {
onItemAction && onItemAction(record, 'edit');
}
......@@ -314,17 +485,18 @@ const ModelTable = (props) => {
const stateAction = (record, action) => {
modal.confirm({
title: '提示!',
content: `您确定要${action.cnName||''}模型吗?`,
content: `您确定要${action.cnName||''}服务吗?`,
onOk: () => {
dispatch({
type: 'datamodel.nextState',
type: 'pds.nextState',
payload: {
easyDataModelerDataModelId: record.id,
actionId: action.id
},
callback: () => {
showMessage('success', `模型${action.cnName||''}成功`);
showMessage('success', `服务${action.cnName||''}成功`);
if ((modelId||'') === '') {
onChange && onChange();
const index = selectedRowKeys.findIndex((rowKey) => rowKey === record.id);
......@@ -334,6 +506,14 @@ const ModelTable = (props) => {
setSelectedRowKeys(newSelectedRowKeys);
onSelect && onSelect(newSelectedRowKeys);
}
} else {
if (action.id === '2') {
onChange && onChange();
} else {
getCheckoutDataModel();
}
}
}
})
}
......@@ -341,21 +521,23 @@ const ModelTable = (props) => {
}
const deleteItem = (record) => {
modal.confirm({
title: '提示!',
content: '您确定要删除该模型吗?',
content: '您确定要删除该服务吗?',
onOk: () => {
dispatch({
type: 'datamodel.deleteDataModel',
type: 'pds.deleteService',
payload: {
params: {
id: record.id
}
},
callback: () => {
showMessage('success', '模型删除成功');
showMessage('success', '服务删除成功');
onChange && onChange();
if ((modelId||'') ==='') {
const index = selectedRowKeys.findIndex((rowKey) => rowKey === record.id);
if (index !== -1) {
const newSelectedRowKeys = [...selectedRowKeys];
......@@ -364,6 +546,8 @@ const ModelTable = (props) => {
onSelect && onSelect(newSelectedRowKeys);
}
}
}
})
}
});
......@@ -375,30 +559,66 @@ const ModelTable = (props) => {
const onSelectChange = keys => {
setSelectedRowKeys(keys);
onSelect && onSelect([...expandedSelectedRowKeys, ...keys]);
if ((modelId||'') !== '') {
onSubSelect && onSubSelect(keys, subData[0].id);
} else {
onSelect && onSelect([...subSelectedRowKeys, ...keys]);
}
};
const onExpandedTableSelectChange = (keys, id) => {
const onSubSelectChange = (keys, id) => {
if ((keys||[]).length === 0) {
const index = expandedSelectedRowKeys.findIndex((rowKey) => rowKey === id);
const newExpandedSelectedRowKeys = [...expandedSelectedRowKeys];
newExpandedSelectedRowKeys.splice(index, 1);
setExpandedSelectedRowKeys(newExpandedSelectedRowKeys);
onSelect && onSelect([...newExpandedSelectedRowKeys, ...selectedRowKeys]);
const index = subSelectedRowKeys.findIndex((rowKey) => rowKey === id);
const newSubSelectedRowKeys = [...subSelectedRowKeys];
newSubSelectedRowKeys.splice(index, 1);
setSubSelectedRowKeys(newSubSelectedRowKeys);
onSelect && onSelect([...newSubSelectedRowKeys, ...selectedRowKeys]);
} else {
const newExpandedSelectedRowKeys = [...expandedSelectedRowKeys, id];
setExpandedSelectedRowKeys(newExpandedSelectedRowKeys);
onSelect && onSelect([...newExpandedSelectedRowKeys, ...selectedRowKeys]);
const newSubSelectedRowKeys = [...subSelectedRowKeys, id];
onSelect && onSelect([...newSubSelectedRowKeys, ...selectedRowKeys]);
}
}
const onExpandedDataMapChange = (id, value) => {
expandedDataMapRef.current.set(id, value);
const handleResize = index => (e, { size }) => {
let nextColumns = [...columns];
if ((modelId||'')==='' && (view==='state'||(keyword||'')!=='')) {
nextColumns = [...includePathColumns];
}
nextColumns[index] = {
...nextColumns[index],
width: size.width,
};
if ((modelId||'')==='' && (view==='state'||(keyword||'')!=='')) {
setIncludePathColumns(nextColumns);
} else {
setColumns(nextColumns);
}
};
const onTableChange = (pagination, filters, sorter, extra) => {
if (sorter) {
setSortRule(sorter);
}
}
const rowSelection = {
selectedRowKeys,
onChange: onSelectChange,
hideSelectAll: (modelId||'') !=='',
};
const classes = classnames('model-table', {
'model-table-sub': modelId
});
let expandable = undefined;
if (!modelId) {
let needExpand = false;
(data||[]).forEach(record => {
(filterData||[]).forEach(record => {
if (record?.alreadyCheckedOut) {
needExpand = true;
}
......@@ -406,33 +626,32 @@ const ModelTable = (props) => {
if (needExpand) {
expandable = {
expandedRowHeight: 100,
rowExpandable: (row) => {
return row?.alreadyCheckedOut;
},
expandRowRender: (row) => {
return (
<div style={{ padding: 10 }}>
<ExpandedModelTable
id={row?.checkedOutId}
pid={row?.id}
checked={expandedSelectedRowKeys.indexOf(row?.checkedOutId)!==-1}
onContextMenu={onExpandedTableContextMenu}
dataMap={expandedDataMapRef.current}
visibleColNames={visibleColNames}
onExpandedSelect={onExpandedTableSelectChange}
onExpandedChange={onExpandedDataMapChange}
expandedRowRender: record => <ModelTable
modelId={record?.checkedOutId}
modelPid={record?.id}
onSubSelect={onSubSelectChange}
{...props}
/>
</div>
)
/>,
expandIcon: ({ expanded, onExpand, record }) => {
if (!record?.alreadyCheckedOut) return null;
return expanded ? <UpOutlined style={{ fontSize: 10 }} onClick={e => onExpand(record, e)} /> : <DownOutlined style={{ fontSize: 10 }} onClick={e => onExpand(record, e)} />
},
rowExpandable: record => {
return record?.alreadyCheckedOut;
}
};
}
} else {
expandable = {
expandedRowRender: record => <></>,
expandIcon: ({ expanded, onExpand, record }) => {
return null;
},
rowExpandable: record => {
return false;
}
}
const onExpandedTableContextMenu = (e, item) => {
setCurrentItem(item);
displayMenu(e);
}
const displayMenu = (e) => {
......@@ -459,13 +678,30 @@ const ModelTable = (props) => {
}
}
const mergedColumns = () => {
let newColumns = [...columns];
if ((modelId||'')==='' && (view==='state'||(keyword||'')!=='')) {
newColumns = [...includePathColumns];
}
return (
newColumns.map((col, index) => ({
...col,
onHeaderCell: column => ({
width: column.width,
onResize: handleResize(index),
}),
}))
);
}
let disableEdit = false, disableDelete = false, editTip = '', deleteTip = '', editMenuTitle = '编辑';
if (!currentItem?.editable && currentItem?.state?.id!=='4') {
disableEdit = true;
if (currentItem?.state?.id === '2') {
editTip = '待发布的模型不允许编辑';
editTip = '待发布的服务不允许编辑';
}
}
......@@ -479,51 +715,65 @@ const ModelTable = (props) => {
disableDelete = true;
if (currentItem?.state?.id === '2') {
deleteTip = '待发布的模型不允许删除';
deleteTip = '待发布的服务不允许删除';
} else if (currentItem?.state?.id === '4') {
deleteTip = '已发布的模型不允许删除';
deleteTip = '已发布的服务不允许删除';
}
}
return (
<div>
<div className='flex' style={{ height: 20, alignItems: 'center', marginBottom: 12 }}>
<Paragraph style={{ overflow: 'hidden' }}>
<Text className='title-color' ellipsis={true}>
总数:
<Text className='text-color'>{(data||[]).length}</Text>
</Text>
</Paragraph>
<Paragraph style={{ overflow: 'hidden', marginLeft: 20 }}>
<Text className='title-color' ellipsis={true}>
已选数:
<Text className='text-color'>{summarySelectedCount}</Text>
</Text>
</Paragraph>
</div>
<DataGrid
gridRef={gridRef}
style={{ blockSize: 'calc(100vh - 94px - 37px - 57px - 24px - 32px)' }}
checkable
columns={columns}
// rows={Array.from({ length: 10000 }).map((_, i) => ({
// name: `test${i}`,
// }))}
rows={data||[]}
rowHeight={51}
rowClassName={(row) => {
return (row.id === anchorId)?'anchor':''
<div className={classes}>
<ResizeObserver
onResize={({ width }) => {
setTableWidth(width);
}}
>
<Table
rowSelection={rowSelection}
components={{
header: {
cell: ResizeableHeaderCell,
}
}}
columns={mergedColumns()}
rowKey={'id'}
dataSource={modelId?(subData||[]):(filterData||[])}
pagination={false}
size={modelId?'small':'default'}
onRow={(record, index) => {
return {
id: `data-model-${record?.id}`,
style: { backgroundColor: (record?.id===anchorId)?'#e7f7ff':'transparent' },
onContextMenu: event => {
setCurrentItem(record);
displayMenu(event);
},
}
}}
scrollRowIndex={scrollRowIndex}
scroll={{ y: modelId?null:((filterData||[]).length===0?null:'calc(100vh - 121px - 57px - 24px - 38px - 44px)') }}
onChange={onTableChange}
expandable={expandable}
onContextMenu={(e, row) => {
setCurrentItem(row);
displayMenu(e);
/>
</ResizeObserver>
{
!modelId && (data||[]).length>0 && <Pagination
className="text-center mt-3"
showSizeChanger
showQuickJumper
onChange={(_pageNum, _pageSize) => {
setPagination({ pageNum: _pageNum, pageSize: _pageSize || 20 });
}}
onShowSizeChange={(_pageNum, _pageSize) => {
setPagination({ pageNum: 1, pageSize: _pageSize });
}}
selectedRows={selectedRowKeys}
onSelectedRowsChange={onSelectChange}
getComparator={getComparator}
current={pageNum}
pageSize={pageSize}
defaultCurrent={1}
total={(data||[]).length}
pageSizeOptions={[10,20,50]}
showTotal={total => `共 ${total} 条`}
/>
}
<RcMenu id={MENU_ID}>
{
(getDataModelerRole(user)!==DataModelerRoleReader) && <RcItem id="edit" disabled={disableEdit} onClick={handleItemClick}>
......@@ -542,11 +792,11 @@ const ModelTable = (props) => {
<RcItem id="history" onClick={handleItemClick}>
历史版本
</RcItem>
{
{/* {
(getDataModelerRole(user)!==DataModelerRoleReader) && <RcItem id="copy" onClick={handleItemClick}>
复制模型
复制服务
</RcItem>
}
} */}
{
getDataModelerRole(user)!==DataModelerRoleReader && (currentItem?.state?.supportedActions||[]).length>0 && currentItem?.state?.supportedActions.map((item, index) => {
return (
......@@ -569,26 +819,3 @@ const ModelTable = (props) => {
}
export default ModelTable;
\ No newline at end of file
function getComparator(sortColumn) {
switch (sortColumn) {
case 'name':
case 'cnName':
case 'editor':
case 'remark':
case 'path':
return (a, b) => {
return a[sortColumn].localeCompare(b[sortColumn]);
};
case 'state':
return (a, b) => {
return a[sortColumn].id.localeCompare(b[sortColumn].id);
};
case 'modifiedTs':
return (a, b) => {
return a[sortColumn] - b[sortColumn];
};
default:
throw new Error(`unsupported sortColumn: "${sortColumn}"`);
}
}
......@@ -22,7 +22,7 @@ const viewModes = [
},
{
key: 'state',
name: '模型状态视角'
name: '服务状态视角'
}
];
......@@ -62,10 +62,10 @@ const ModelTree = (props) => {
const id = getQueryParam(AnchorId, props.location?.search||'');
const did = getQueryParam(AnchorDirId, props.location?.search||'');
useEffect(() => {
getShowSyncAndDomains();
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
// useEffect(() => {
// getShowSyncAndDomains();
// //eslint-disable-next-line react-hooks/exhaustive-deps
// }, [])
useEffect(() => {
if (refrence === 'recatalog') {
......@@ -75,7 +75,7 @@ const ModelTree = (props) => {
onViewChange && onViewChange(viewModes[0].key);
if ((id||'') !== '') {
getDataModelLocationThenGetDirTreeData();
// getDataModelLocationThenGetDirTreeData();
} else if ((did||'') !== '') {
getDirTreeData(did);
} else {
......@@ -105,47 +105,47 @@ const ModelTree = (props) => {
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [ keyword ])
const getShowSyncAndDomains = () => {
dispatch({
type: 'datamodel.isSetRootDomainId',
callback: data => {
if (data === 'false') {
dispatch({
type: 'user.getDomains',
callback: _data => {
setDomains(_data||[]);
setIsSetRootId(false);
}
});
} else {
setIsSetRootId(true);
}
}
});
}
const getDataModelLocationThenGetDirTreeData = () => {
setLoading(true);
dispatch({
type: 'datamodel.getDataModelLocation',
payload: {
id
},
callback: data => {
getDirTreeData(data.easyDataModelerDataModelCatalogId||'', data.offset);
},
error: () => {
setLoading(false);
getDirTreeData();
}
});
}
// const getShowSyncAndDomains = () => {
// dispatch({
// type: 'datamodel.isSetRootDomainId',
// callback: data => {
// if (data === 'false') {
// dispatch({
// type: 'user.getDomains',
// callback: _data => {
// setDomains(_data||[]);
// setIsSetRootId(false);
// }
// });
// } else {
// setIsSetRootId(true);
// }
// }
// });
// }
// const getDataModelLocationThenGetDirTreeData = () => {
// setLoading(true);
// dispatch({
// type: 'datamodel.getDataModelLocation',
// payload: {
// id
// },
// callback: data => {
// getDirTreeData(data.easyDataModelerDataModelCatalogId||'', data.offset);
// },
// error: () => {
// setLoading(false);
// getDirTreeData();
// }
// });
// }
const getDirTreeData = (defaultSelectedId='', offset=null, type='refresh') => {
setLoading(true);
dispatch({
type: (type==='refresh')?'datamodel.refreshDataModelCatalog':'datamodel.loadDataModelCatalog',
type: (type==='refresh')?'pds.refreshCatalog':'datamodel.loadDataModelCatalog',
callback: data => {
data.key = data.id||'';
......@@ -218,7 +218,7 @@ const ModelTree = (props) => {
const getStateTreeData = () => {
setLoading(true);
dispatch({
type: 'datamodel.loadDataModelStateCatalog',
type: 'pds.loadStateCatalog',
callback: data => {
setLoading(false);
let _treeData = data?.subCatalogs||[];
......@@ -285,23 +285,23 @@ const ModelTree = (props) => {
}
}
const onSyncMenuClick = ({ key }) => {
// const onSyncMenuClick = ({ key }) => {
setDomainSelectedKey(key);
dispatch({
type: 'datamodel.setRootDomainId',
payload: {
params: {
domainId: key
}
},
callback: () => {
setIsSetRootId(true);
getDirTreeData('', null, 'load');
}
});
// setDomainSelectedKey(key);
// dispatch({
// type: 'datamodel.setRootDomainId',
// payload: {
// params: {
// domainId: key
// }
// },
// callback: () => {
// setIsSetRootId(true);
// getDirTreeData('', null, 'load');
// }
// });
}
// }
const onTreeSelect = (keys,data) => {
......@@ -340,7 +340,7 @@ const ModelTree = (props) => {
const moveNode = (steps) => {
setLoading(true);
dispatch({
type: 'datamodel.upDownModelCatalog',
type: 'pds.upDownCatalog',
payload: {
modelCatalogId: currentRightClickDir.id,
steps
......@@ -358,11 +358,11 @@ const ModelTree = (props) => {
const deleteNode = () => {
modal.confirm({
title: '提示!',
content: '删除目录会删除相关的模型,您确定删除吗?',
content: '删除目录会删除相关的服务,您确定删除吗?',
onOk: () => {
setLoading(true);
dispatch({
type: 'datamodel.deleteDataModelCatalog',
type: 'pds.deleteCatalog',
payload: {
params: {
easyDataModelerCatalogId: currentRightClickDir.id
......@@ -477,17 +477,17 @@ const ModelTree = (props) => {
</Menu>
);
const syncMenu = (
<Menu selectedKeys={[domainSelectedKey]} onClick={onSyncMenuClick}>
{
domains && domains.map(domain => {
return (
<Menu.Item key={domain.domainId} value={domain.domainId} >{domain.domainName}</Menu.Item>
)
})
}
</Menu>
);
// const syncMenu = (
// <Menu selectedKeys={[domainSelectedKey]} onClick={onSyncMenuClick}>
// {
// domains && domains.map(domain => {
// return (
// <Menu.Item key={domain.domainId} value={domain.domainId} >{domain.domainName}</Menu.Item>
// )
// })
// }
// </Menu>
// );
const classes = classnames('model-tree', {
'model-tree-recatalog': (refrence === 'recatalog')
......@@ -503,7 +503,7 @@ const ModelTree = (props) => {
borderBottom: "1px solid #EFEFEF",
height: 57,
alignItems: 'center',
justifyContent: (viewSelectedKey==='dir' && getDataModelerRole(user)===DataModelerRoleAdmin)?'space-between':'',
// justifyContent: (viewSelectedKey==='dir' && getDataModelerRole(user)===DataModelerRoleAdmin)?'space-between':'',
}}
>
<Dropdown overlay={exportMenu} placement="bottomLeft">
......@@ -514,24 +514,24 @@ const ModelTree = (props) => {
{
(viewSelectedKey==='dir' && getDataModelerRole(user)===DataModelerRoleAdmin) && (
<Tooltip title="新增目录" className='ml-2'>
<Tooltip title="新增目录" className='ml-6'>
<PlusOutlined className='default' onClick={add} style={{ fontSize:16,cursor:'pointer' }} />
</Tooltip>
)
}
{
{/* {
(viewSelectedKey==='dir' && getDataModelerRole(user)===DataModelerRoleAdmin) && (
<Tooltip title="存量模型导入" className='ml-2'>
<ImportOutlined className='default' onClick={() => { importStockModel && importStockModel() }} style={{ fontSize:16,cursor:'pointer' }} />
</Tooltip>
)
}
} */}
<Tooltip title="刷新目录" className='ml-2'>
<Tooltip title="刷新目录" className='ml-6'>
<Button type='text' icon={<ReloadOutlined className='default' />} size='small' onClick={refresh} />
</Tooltip>
{
{/* {
(viewSelectedKey==='dir' && getDataModelerRole(user)===DataModelerRoleAdmin) && !isSetRootId && (
<Dropdown overlay={syncMenu} placement="bottomLeft">
<Tooltip title="同步目录">
......@@ -539,15 +539,15 @@ const ModelTree = (props) => {
</Tooltip>
</Dropdown>
)
}
} */}
{
{/* {
(viewSelectedKey==='dir' && getDataModelerRole(user)===DataModelerRoleAdmin) && isSetRootId && (
<Tooltip title="同步目录" className='ml-2'>
<Button type='text' icon={<SyncOutlined className='default' />} size='small' onClick={sync} />
</Tooltip>
)
}
} */}
</div>
}
<div className='p-3'>
......
......@@ -129,7 +129,7 @@ const UpdateTreeItemModal = (props) => {
}
dispatchLatest({
type: 'datamodel.saveDataModelCatalog',
type: 'pds.saveCatalog',
payload: {
data: payload
},
......
......@@ -82,7 +82,7 @@ class Model extends React.Component {
getModelStates = () => {
this.setState({ loadingStates: true }, () => {
dispatch({
type: 'datamodel.loadDataModelStateCatalog',
type: 'pds.loadStateCatalog',
callback: data => {
this.setState({
loadingStates: false,
......@@ -139,7 +139,7 @@ class Model extends React.Component {
if (currentView === 'dir') {
const params = {
easyDataModelerCatalogId: catalogId,
pdsDataServiceCatalogId: catalogId,
};
if (currentModelState !== '') {
......@@ -147,10 +147,10 @@ class Model extends React.Component {
}
dispatchLatestHomepage({
type: 'datamodel.getCurrentDataModelCatalog',
type: 'pds.getServices',
payload: params,
callback: data => {
this.setState({ loadingTableData: false, tableData: data.easyDataModelerDataModels||[], filterTableData: data.easyDataModelerDataModels||[] });
this.setState({ loadingTableData: false, tableData: data.pdsdataServices||[], filterTableData: data.pdsdataServices||[] });
},
error: () => {
this.setState({ loadingTableData: false });
......@@ -158,12 +158,12 @@ class Model extends React.Component {
})
} else {
dispatchLatestHomepage({
type: 'datamodel.getCurrentDataModelStateCatalog',
type: 'pds.getStateServices',
payload: {
easyDataModelerStateCatalogId: catalogId
},
callback: data => {
this.setState({ loadingTableData: false, tableData: data.easyDataModelerDataModels||[], filterTableData: data.easyDataModelerDataModels||[] });
this.setState({ loadingTableData: false, tableData: data.pdsdataServices||[], filterTableData: data.pdsdataServices||[] });
},
error: () => {
this.setState({ loadingTableData: false });
......@@ -181,7 +181,7 @@ class Model extends React.Component {
}
dispatchLatestHomepage({
type: 'datamodel.searchModel',
type: 'pds.searchService',
payload: params,
callback: data => {
this.setState({ loadingTableData: false, tableData: data||[], filterTableData: data||[] });
......@@ -228,11 +228,11 @@ class Model extends React.Component {
onExportDDLBtnClick = () => {
const { selectModelerIds, tableData } = this.state;
if ((selectModelerIds||[]).length === 0) {
showMessage('info', '请先选择模型');
showMessage('info', '请先选择服务');
return;
}
//模型名称在导出ddl的时候有使用
//服务名称在导出ddl的时候有使用
const _selectModelerNames = [];
(selectModelerIds||[]).forEach(id => {
......@@ -255,7 +255,7 @@ class Model extends React.Component {
startFlow = () => {
const { selectModelerIds } = this.state;
if ((selectModelerIds||[]).length === 0) {
showMessage('info', '请先选择模型');
showMessage('info', '请先选择服务');
return;
}
......@@ -265,7 +265,7 @@ class Model extends React.Component {
onRecatalogBtnClick = () => {
const { selectModelerIds } = this.state;
if ((selectModelerIds||[]).length === 0) {
showMessage('info', '请先选择模型');
showMessage('info', '请先选择服务');
return;
}
......@@ -276,7 +276,7 @@ class Model extends React.Component {
const { selectModelerIds } = this.state;
if ((selectModelerIds||[]).length === 0) {
showMessage('info', '请先选择模型');
showMessage('info', '请先选择服务');
return;
}
......@@ -421,7 +421,7 @@ class Model extends React.Component {
const { catalogId } = this.state;
if ((catalogId||'') === '') {
showMessage('info', '请先选择模型目录');
showMessage('info', '请先选择服务目录');
return;
}
......@@ -473,10 +473,10 @@ class Model extends React.Component {
let disableStartFlow = false, startFlowTip = '';
if ((currentView==='dir'&&currentModelState==='2')||(currentView!=='dir'&&catalogId==='2')) {
disableStartFlow = true;
startFlowTip = '只有草稿状态下的模型才能送审';
startFlowTip = '只有草稿状态下的服务才能送审';
} else if ((selectModelerIds||[]).length===0) {
disableStartFlow = true;
startFlowTip = '请先选择模型';
startFlowTip = '请先选择服务';
}
return (
......@@ -510,35 +510,35 @@ class Model extends React.Component {
{
(getDataModelerRole(value?.user)!==DataModelerRoleReader) && <React.Fragment>
<Space>
<Button onClick={() => { this.setState({ importModalVisible: true }); }}>新建</Button>
<Button onClick={() => {}}>新建</Button>
</Space>
<Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择模型':''}>
{/* <Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择服务':''}>
<Button onClick={this.onExportOtherBtnClick} disabled={(selectModelerIds||[]).length===0}>导出</Button>
</Tooltip>
</Space>
</Space> */}
<Space>
{/* <Space>
<Tooltip title={startFlowTip}>
<Button onClick={this.startFlow} disabled={disableStartFlow}>送审</Button>
</Tooltip>
</Space>
</Space> */}
<Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择模型':''}>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择服务':''}>
<Button onClick={this.onRecatalogBtnClick} disabled={(selectModelerIds||[]).length===0}>变更目录</Button>
</Tooltip>
</Space>
<Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择模型':''}>
{/* <Space>
<Tooltip title={(selectModelerIds||[]).length===0?'请先选择服务':''}>
<Button onClick={this.onBatchDeleteBtnClick} disabled={(selectModelerIds||[]).length===0}>删除</Button>
</Tooltip>
</Space>
<Space>
</Space> */}
{/* <Space>
<Button onClick={this.onVisibleColSettingClick}>可见列设置</Button>
</Space>
</Space> */}
</React.Fragment>
}
</Space>
......@@ -564,15 +564,15 @@ class Model extends React.Component {
</Select>
</Space>
}
<Space>
{/* <Space>
<InputDebounce
placeholder="通过模型名称全文搜索"
placeholder="通过服务名称全文搜索"
allowClear
value={keyword}
onChange={(value) => { this.onSearchInputChange(value); }}
style={{ width: inputWidth, marginLeft: 'auto' }}
/>
</Space>
</Space> */}
</Space>
......@@ -600,35 +600,6 @@ class Model extends React.Component {
</div>
</div>
<ImportModal
view={currentView}
catalogId={catalogId}
visible={importModalVisible}
onCancel={this.onImportModalCancel}
onCancelByWord={this.onImportModalCancelByWord}
onCancelByDDL={this.onImportModalCancelByDDL}
/>
<ImportStockWordDrawer
visible={importStockWordDrawerVisible}
onCancel={this.onImportStockWordDrawerCancel}
catalogId={catalogId}
onSuccess={this.onImportStockWordSuccess}
/>
<ExportDDLModal
visible={exportDDLModalVisible}
reference={exportDDLModalReference}
ids={(exportDDLModalReference==='exportDDL')?selectModelerIds:[currentModel.id]}
names={selectModelerNames}
env={value?.env}
onCancel={this.onExportDDLModalCancel}
/>
<ExportOtherModal
visible={exportOtherModalVisible}
onCancel={this.onExportOtherModalCancel}
/>
<RecatalogModal
visible={recatalogModalVisible}
......@@ -641,23 +612,6 @@ class Model extends React.Component {
visible={historyAndVersionDrawerVisible}
onCancel={this.onHistoryAndVersionDrawerCancel}
/>
<StartFlowModal
ids={selectModelerIds}
visible={startFlowModalVisible}
onCancel={this.onStartFlowModalCancel}
/>
<DeleteTipModal
visible={showDeleteTip}
tip='您确定要删除这些模型吗?'
onCancel={this.onDeleteTipModalCancel}
/>
<ColSettingModal
visible={colSettingModalVisible}
onCancel={this.onColSettingModalCancel}
/>
</div>
}
</AppContext.Consumer>
......
......@@ -14,7 +14,6 @@ import AssetBrowse from './AssetBrowse';
import AssetRecycle from './AssetRecycle';
import DataMasterDefine from "./DataMaster/Define";
import DataMasterManage from "./DataMaster/Manage";
import DataServiceManage from './DataService';
class Manage extends Component {
......@@ -38,7 +37,6 @@ class Manage extends Component {
<Route path={`${match.path}/asset-recycle`} component={AssetRecycle} />
<Route path={`${match.path}/msd-define`} component={DataMasterDefine} />
<Route path={`${match.path}/msd-manage`} component={DataMasterManage} />
<Route path={`${match.path}/data-service`} component={DataServiceManage} />
</Switch>
) : (
<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