Commit e983d847 by zhaochengxiang

增加tableau工作簿

parent cff7caf2
...@@ -72,7 +72,7 @@ ...@@ -72,7 +72,7 @@
"last 1 safari version" "last 1 safari version"
] ]
}, },
"proxy": "http://139.198.127.28:18762", "proxy": "http://139.198.127.28:17389",
"homepage": "http://myhost/data-govern", "homepage": "http://myhost/data-govern",
"devDependencies": { "devDependencies": {
"autoprefixer": "^9.8.6", "autoprefixer": "^9.8.6",
......
...@@ -171,4 +171,20 @@ export function* getResourceRelations(payload) { ...@@ -171,4 +171,20 @@ export function* getResourceRelations(payload) {
export function* updateResourceState(payload) { export function* updateResourceState(payload) {
return yield call(service.updateResourceState, payload); return yield call(service.updateResourceState, payload);
}
export function* saveWorkbook(payload) {
return yield call(service.saveWorkbook, payload);
}
export function* getWorkbookUrl(payload) {
return yield call(service.getWorkbookUrl, payload);
}
export function* listWorkbooks(payload) {
return yield call(service.listWorkbooks, payload);
}
export function* deleteWorkbooks(payload) {
return yield call(service.deleteWorkbooks, payload);
} }
\ No newline at end of file
import { PostJSON, GetJSON, PostFile } from "../util/axios" import { PostJSON, GetJSON, PostFile, Post, Get } from "../util/axios"
export function importElement(payload) { export function importElement(payload) {
return PostFile("/dataassetmanager/elementApi/import", payload); return PostFile("/dataassetmanager/elementApi/import", payload);
...@@ -178,4 +178,20 @@ export function getResourceRelations(payload) { ...@@ -178,4 +178,20 @@ export function getResourceRelations(payload) {
export function updateResourceState(payload) { export function updateResourceState(payload) {
return PostJSON("/dataassetmanager/resourceApi/updateResourceState", payload); return PostJSON("/dataassetmanager/resourceApi/updateResourceState", payload);
}
export function saveWorkbook(payload) {
return Post("/dataassetmanager/tableauApi/saveWorkbook", payload);
}
export function getWorkbookUrl(payload) {
return Get("/dataassetmanager/tableauApi/getWorkbookUrl", payload);
}
export function listWorkbooks(payload) {
return GetJSON("/dataassetmanager/tableauApi/listWorkbooks", payload);
}
export function deleteWorkbooks(payload) {
return Post("/dataassetmanager/tableauApi/deleteWorkbooks", payload);
} }
\ No newline at end of file
...@@ -17,6 +17,8 @@ import { showMessage, showNotifaction, getQueryParam, inputWidth, isSzseEnv } fr ...@@ -17,6 +17,8 @@ import { showMessage, showNotifaction, getQueryParam, inputWidth, isSzseEnv } fr
import { AnchorId, AnchorTimestamp, AssetBrowseReference, AssetManageReference, AssetRecycleReference, ResourceBrowseReference } from '../../../../util/constant'; import { AnchorId, AnchorTimestamp, AssetBrowseReference, AssetManageReference, AssetRecycleReference, ResourceBrowseReference } from '../../../../util/constant';
import { FullScreenSvg, CancelFullScreenSvg } from './AssetSvg'; import { FullScreenSvg, CancelFullScreenSvg } from './AssetSvg';
import { AppContext } from "../../../../App"; import { AppContext } from "../../../../App";
import WorksheetModal from "./WorksheetModal";
import WorkbookDrawer from "./WorkbookDrawer";
import "./AssetTable.less"; import "./AssetTable.less";
import 'react-contexify/dist/ReactContexify.css'; import 'react-contexify/dist/ReactContexify.css';
...@@ -147,6 +149,8 @@ const AssetTable = (props) => { ...@@ -147,6 +149,8 @@ const AssetTable = (props) => {
const [ recursive, setRecursive ] = useState(true); const [ recursive, setRecursive ] = useState(true);
const [ fullSearch, setFullSearch ] = useState(false); const [ fullSearch, setFullSearch ] = useState(false);
const [ compact, setCompact ] = useState(false); const [ compact, setCompact ] = useState(false);
const [ worksheetModalVisible, setWorksheetModalVisible ] = useState(false);
const [ workbookDrawerVisible, setWorkbookDrawerVisible ] = useState(false);
const [ modal, contextHolder ] = Modal.useModal(); const [ modal, contextHolder ] = Modal.useModal();
const anchorId = getQueryParam(AnchorId, props.location.search); const anchorId = getQueryParam(AnchorId, props.location.search);
...@@ -434,6 +438,28 @@ const AssetTable = (props) => { ...@@ -434,6 +438,28 @@ const AssetTable = (props) => {
setFilterElementVisible(true); setFilterElementVisible(true);
} }
const onTableauAnalyseClick = () => {
if ((checkedKeys||[]).length === 0) {
showMessage('warn', '请先选择一个资产');
} else if ((checkedKeys||[]).length > 1) {
showMessage('warn', '只能选择一个资产');
} else {
setWorksheetModalVisible(true);
}
}
const onWorksheetModalCancel = () => {
setWorksheetModalVisible(false);
}
const onWorkbookClick = () => {
setWorkbookDrawerVisible(true);
}
const onWorkbookDrawerCancel = () => {
setWorkbookDrawerVisible(false);
}
const onRecursiveChange = (e) => { const onRecursiveChange = (e) => {
setRecursive(!e.target.checked); setRecursive(!e.target.checked);
} }
...@@ -638,6 +664,22 @@ const AssetTable = (props) => { ...@@ -638,6 +664,22 @@ const AssetTable = (props) => {
可见列设置 可见列设置
</div> </div>
</Menu.Item> </Menu.Item>
{
(reference===AssetManageReference) && <Menu.Item disabled={(checkedKeys||[]).length===0}>
<div className='text-center' onClick={onTableauAnalyseClick}>
tableau自助分析
</div>
</Menu.Item>
}
{
(reference===AssetManageReference) && <Menu.Item>
<div className='text-center' onClick={onWorkbookClick}>
工作簿
</div>
</Menu.Item>
}
</Menu> </Menu>
); );
...@@ -700,6 +742,10 @@ const AssetTable = (props) => { ...@@ -700,6 +742,10 @@ const AssetTable = (props) => {
</React.Fragment> </React.Fragment>
} }
<Button onClick={onFilterElementClick}>可见列设置</Button> <Button onClick={onFilterElementClick}>可见列设置</Button>
<Tooltip title={(checkedKeys||[]).length===0?'请先选择资产':''}>
<Button onClick={onTableauAnalyseClick} disabled={(checkedKeys||[]).length===0} >tableau自助分析</Button>
</Tooltip>
<Button onClick={onWorkbookClick}>工作簿</Button>
</React.Fragment> </React.Fragment>
} }
{ {
...@@ -832,6 +878,17 @@ const AssetTable = (props) => { ...@@ -832,6 +878,17 @@ const AssetTable = (props) => {
visible={assetDetailDrawerVisible} visible={assetDetailDrawerVisible}
onCancel={onAssetDetailDrawerCancel} onCancel={onAssetDetailDrawerCancel}
/> />
<WorksheetModal
visible={ worksheetModalVisible }
id={ (checkedKeys||[]).length>0?checkedKeys[0]:'' }
onCancel={onWorksheetModalCancel}
/>
<WorkbookDrawer
visible={workbookDrawerVisible}
onCancel={onWorkbookDrawerCancel}
/>
<RcMenu id={MENU_ID}> <RcMenu id={MENU_ID}>
{ {
(contextMenuItem.resourceState==='notRelatedAsset') && <RcItem id="uncombed" onClick={handleItemClick}> (contextMenuItem.resourceState==='notRelatedAsset') && <RcItem id="uncombed" onClick={handleItemClick}>
......
import React, { useState, useEffect } from 'react';
import { Drawer, Pagination, List } from 'antd';
import { dispatch } from '../../../../model';
const WorkbookDrawer = (props) => {
const { onCancel, visible } = props;
const [ loading, setLoading ] = useState(false);
const [ workbooks, setWorkbooks ] = useState([]);
const [ pagination, setPagination ] = useState( { pageNum: 1, pageSize: 20 } );
const { pageNum, pageSize } = pagination;
const [ total, setTotal ] = useState(0);
useEffect(() => {
if (visible) {
setPagination({ pageNum: 1, pageSize: 20 });
getWorkbooks();
}
//eslint-disable-next-line react-hooks/exhaustive-deps
}, [visible])
const getWorkbooks = (p = 1, s = 20) => {
setLoading(true);
dispatch({
type: 'assetmanage.listWorkbooks',
payload: {
pageNum: p,
pageSize: s
},
callback: data => {
setLoading(false);
setTotal(data.total);
setWorkbooks(data.data||[]);
},
error: () => {
setLoading(false);
}
})
}
// const onDeleteClick = (id) => {
// dispatch({
// type: 'assetmanage.deleteWorkbooks',
// payload: {
// data: [id]
// },
// callback: () => {
// getWorkbooks();
// }
// })
// }
const onDevelopClick = (id) => {
dispatch({
type: 'assetmanage.getWorkbookUrl',
payload: {
workbookId: id,
},
callback: data => {
window.open(data||'');
}
})
}
return (
<Drawer
forceRender
visible={ visible }
title='工作簿'
width={900}
placement="right"
closable={ true }
onClose={() => {
onCancel && onCancel();
}}
>
<List
itemLayout="horizontal"
size="small"
loading={loading}
dataSource={workbooks}
renderItem={item => (
<List.Item
key={item.id}
actions={[<a key="develop" onClick={() => { onDevelopClick(item.id); }}>报表开发</a>]}
>
<List.Item.Meta
title={item.name}
/>
</List.Item>
)}
/>
<Pagination
className="text-center mt-3"
showSizeChanger
showQuickJumper
onChange={(_pageNum, _pageSize) => {
setPagination({ pageNum: _pageNum||1, pageSize: _pageSize || 20 });
getWorkbooks(_pageNum||1, _pageSize||20);
}}
onShowSizeChange={(_pageNum, _pageSize) => {
setPagination({ pageNum: _pageNum || 1, pageSize: _pageSize || 20 });
getWorkbooks(_pageNum||1, _pageSize||20);
}}
current={pageNum}
pageSize={pageSize}
defaultCurrent={1}
total={total}
pageSizeOptions={[10,20]}
showTotal={total => `共 ${total} 条`}
/>
</Drawer>
)
}
export default WorkbookDrawer;
\ No newline at end of file
import React, { useState } from 'react';
import { Modal, Form, Button, Space, Input } from 'antd';
import { dispatch } from '../../../../model';
import { showMessage } from '../../../../util';
const WorksheetModal = (props) => {
const { onCancel, visible, id } = props;
const [ confirmLoading, setConfirmLoading ] = useState(false);
const [ form ] = Form.useForm();
const onOk = async() => {
try {
const row = await form?.validateFields();
setConfirmLoading(true);
dispatch({
type: 'assetmanage.saveWorkbook',
payload: {
data: {
id,
name: row.name
}
},
callback: data => {
window.open(data);
reset();
setConfirmLoading(false);
showMessage("success","新增成功");
onCancel && onCancel(true);
},
error: () => {
setConfirmLoading(false);
}
})
} catch (errInfo) {
console.log('Validate Failed:', errInfo);
setConfirmLoading(false);
}
}
const reset = () => {
setConfirmLoading(false);
form?.resetFields();
}
return (
<Modal
forceRender
title='工作簿信息'
visible={ visible }
width={ 600 }
onCancel={() => {
reset();
onCancel && onCancel();
}}
footer={
<Space>
<Button onClick={() => {
reset();
onCancel && onCancel();
}}>取消</Button>
<Button type="primary" onClick={ onOk } loading={ confirmLoading }>确定</Button>
</Space>
}
>
<Form form={form}>
<Form.Item
label="名称"
name="name"
rules={[{ required: true, message: '请填写工作簿名称!' }]}
>
<Input />
</Form.Item>
</Form>
</Modal>
);
}
export default WorksheetModal;
\ No newline at end of file
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