Browse Source

报表固定到首页

zhuth 6 years ago
parent
commit
ae8ec6ac22

+ 12 - 3
src/components/dashboardDesigner/chooseChartBox.jsx

@@ -5,6 +5,7 @@ import { connect } from 'dva'
 import moment from 'moment'
 import moment from 'moment'
 import 'braft-editor/dist/braft.css'
 import 'braft-editor/dist/braft.css'
 import ListFilter from '../common/listFilter/index'
 import ListFilter from '../common/listFilter/index'
+import EllipsisTooltip from '../common/ellipsisTooltip/index'
 import './chooseChartBox.less'
 import './chooseChartBox.less'
 import CHART_TYPE from '../chartDesigner/sections/chartType'
 import CHART_TYPE from '../chartDesigner/sections/chartType'
 
 
@@ -196,8 +197,16 @@ class ChooseChartBox extends React.Component {
             title: '备注',
             title: '备注',
             dataIndex: 'description',
             dataIndex: 'description',
             key: 'description',
             key: 'description',
-            render: (text, record) => {
-                return (
+            onCell: () => {
+                return {
+                    style: {
+                        whiteSpace: 'nowrap',
+                        maxWidth: 150,
+                    }
+                }
+            },
+            render: text => {
+                return <EllipsisTooltip title={text}>
                     <span>
                     <span>
                         { filterLabel && filterItem.name === 'description' ?
                         { filterLabel && filterItem.name === 'description' ?
                             ((text || '').split(new RegExp(`(${filterLabel})`, 'i')).map((fragment, i) => {
                             ((text || '').split(new RegExp(`(${filterLabel})`, 'i')).map((fragment, i) => {
@@ -210,7 +219,7 @@ class ChooseChartBox extends React.Component {
                             )) : text
                             )) : text
                         }
                         }
                     </span>
                     </span>
-                )
+                </EllipsisTooltip>
             }
             }
         }]
         }]
         return (
         return (

+ 19 - 9
src/components/homePage/index.jsx

@@ -12,6 +12,15 @@ const TabPane = Tabs.TabPane
 
 
 class Home extends React.Component {
 class Home extends React.Component {
 
 
+    componentDidMount() {
+        const { home, dispatch } = this.props;
+        dispatch({ type: 'home/getFixedDashboard' }).then(data => {
+            if(data && home.tabs.length === 0) {
+                dispatch({ type: 'home/openTab', tab: data })
+            }
+        });
+    }
+
     // componentWillUnmount() {
     // componentWillUnmount() {
     //     const { home, dispatch } = this.props;
     //     const { home, dispatch } = this.props;
     //     const { tabs } = home;
     //     const { tabs } = home;
@@ -24,11 +33,11 @@ class Home extends React.Component {
 
 
     generateTabs() {
     generateTabs() {
         const { home } = this.props;
         const { home } = this.props;
-        const { tabs } = home;
+        const { tabs, fixedDashboard } = home;
 
 
         return tabs.map(t => (
         return tabs.map(t => (
             // TODO 右键关闭菜单,会报错,先不启用
             // TODO 右键关闭菜单,会报错,先不启用
-            <TabPane tab={this.generateTabTitle(t.name, t.code)} key={t.code}>
+            <TabPane tab={this.generateTabTitle(t.name, t.code)} key={t.code} closable={!fixedDashboard || t.code !== fixedDashboard.code}>
             {/* <TabPane tab={<span><CusIcon type='bi-dashboard'/>{t.name}</span>} key={t.code}> */}
             {/* <TabPane tab={<span><CusIcon type='bi-dashboard'/>{t.name}</span>} key={t.code}> */}
                 <DashboardViewToolbar />
                 <DashboardViewToolbar />
                 <DashboardView code={t.code} config={t.config}/>
                 <DashboardView code={t.code} config={t.config}/>
@@ -42,9 +51,10 @@ class Home extends React.Component {
         </Dropdown>
         </Dropdown>
     )
     )
 
 
-    generateMenu = (tabKey) => (
-        <Menu>
-            <Menu.Item key="1" onClick={e => {
+    generateMenu = (tabKey) => {
+        const { fixedDashboard } = this.props.home
+        return <Menu>
+            <Menu.Item disabled={fixedDashboard && tabKey === fixedDashboard.code} key="1" onClick={e => {
                 // 点击菜单项后触发tab的切换事件,这里将其事件阻断
                 // 点击菜单项后触发tab的切换事件,这里将其事件阻断
                 e.domEvent.stopPropagation();
                 e.domEvent.stopPropagation();
                 this.remove(tabKey);
                 this.remove(tabKey);
@@ -60,7 +70,7 @@ class Home extends React.Component {
                 this.removeAll();
                 this.removeAll();
             }}>关闭所有</Menu.Item>
             }}>关闭所有</Menu.Item>
         </Menu>
         </Menu>
-    )
+    }
 
 
     onChange = (activeKey) => {
     onChange = (activeKey) => {
         const { dispatch, home } = this.props;
         const { dispatch, home } = this.props;
@@ -83,8 +93,8 @@ class Home extends React.Component {
 
 
     removeOther = (targetKey) => {
     removeOther = (targetKey) => {
         const { dispatch, home } =  this.props;
         const { dispatch, home } =  this.props;
-        const { tabs: allTabs } = home;
-        let tabs = allTabs.filter(t => t.code !== targetKey);
+        const { tabs: allTabs, fixedDashboard } = home;
+        let tabs = allTabs.filter(t => (t.code !== targetKey && (!fixedDashboard || t.code !== fixedDashboard.code) ));
         let tab = allTabs.find(t => t.code === targetKey);
         let tab = allTabs.find(t => t.code === targetKey);
         dispatch({ type: 'home/closeTabs', tabs });
         dispatch({ type: 'home/closeTabs', tabs });
         dispatch({ type: 'home/changeTab', tab });
         dispatch({ type: 'home/changeTab', tab });
@@ -124,4 +134,4 @@ class Home extends React.Component {
     }
     }
 }
 }
 
 
-export default connect(({ present: { home } }) => ({ home }))(Home)
+export default connect(({ present: { home, dashboard } }) => ({ home, dashboard }))(Home)

+ 18 - 1
src/components/homePage/toolbar.jsx

@@ -34,13 +34,25 @@ class Toolbar extends React.Component {
         dispatch({ type: 'home/uncollect', data: selectedTab });
         dispatch({ type: 'home/uncollect', data: selectedTab });
     }
     }
     
     
+    onFixed = (code) => {
+        const { dispatch, home } = this.props;
+        const { selectedTab } = home;
+        dispatch({ type: 'home/onFixedDashboard', tab: selectedTab });
+    }
+
+    onCancelFixed = (code) => {
+        const { dispatch, home } = this.props;
+        const { selectedTab } = home;
+        dispatch({ type: 'home/onCancelFixedDashboard', tab: selectedTab });
+    }
+
     afterRefresh = () => {
     afterRefresh = () => {
         const { dispatch, home } = this.props;
         const { dispatch, home } = this.props;
         dispatch({ type: 'home/saveCurrentTabDashboardConfig', code: home.selectedTab.code });
         dispatch({ type: 'home/saveCurrentTabDashboardConfig', code: home.selectedTab.code });
     }
     }
     render() {
     render() {
         const { home } = this.props;
         const { home } = this.props;
-        const { tabs, selectedTab, collectionDashboards } = home;
+        const { tabs, selectedTab, collectionDashboards, fixedDashboard } = home;
         let { config } = tabs.find(t => t.code === selectedTab.code);
         let { config } = tabs.find(t => t.code === selectedTab.code);
         return <div className='dashboardview-toolbar'>
         return <div className='dashboardview-toolbar'>
             <div className='toos'>
             <div className='toos'>
@@ -51,6 +63,11 @@ class Toolbar extends React.Component {
                         <span onClick={this.uncollect}><Icon type="star" theme="filled" />取消收藏</span> :
                         <span onClick={this.uncollect}><Icon type="star" theme="filled" />取消收藏</span> :
                         <span onClick={this.collect}><Icon type="star" />收藏</span>
                         <span onClick={this.collect}><Icon type="star" />收藏</span>
                 }</div>
                 }</div>
+                <div className='tool'>{
+                    (!!fixedDashboard && fixedDashboard.code === selectedTab.code) ? 
+                        <span onClick={this.onCancelFixed}><Icon type="star" theme="filled" />取消固定到首页</span> :
+                        <span onClick={this.onFixed}><Icon type="star" />固定到首页</span>
+                }</div>
             </div>
             </div>
             {/** 全屏展示modal */}
             {/** 全屏展示modal */}
             {this.state.visibleFullscreenBox && <Modal
             {this.state.visibleFullscreenBox && <Modal

+ 4 - 0
src/constants/url.js

@@ -224,6 +224,10 @@ const URLS = {
 
 
     HOMEPAGE_ADD_RECENT_RECORD: BASE_URL + 'addRecord', //添加最近访问记录
     HOMEPAGE_ADD_RECENT_RECORD: BASE_URL + 'addRecord', //添加最近访问记录
 
 
+    HOMEPAGE_FIXED: BASE_URL + 'home/defaultDashboard/save', // 固定到首页
+    HOMEPAGE_CANCELFIXED: BASE_URL + 'home/defaultDashboard/delete', // 取消首页固定
+    HOMEPAGE_FIXED_GET: BASE_URL + 'home/defaultDashboard/read', // 查询用户设置的首页报表
+
     /***************************************操作日志***************************************/
     /***************************************操作日志***************************************/
 
 
     MESSAGELOG_LIST: BASE_URL + 'messageLog/list', // 获得操作日志列表
     MESSAGELOG_LIST: BASE_URL + 'messageLog/list', // 获得操作日志列表

+ 3 - 3
src/models/chart.js

@@ -24,7 +24,7 @@ export default {
                         method: 'GET',
                         method: 'GET',
                         body: {
                         body: {
                             pageNum: 1,
                             pageNum: 1,
-                            pageSize: 999
+                            pageSize: 999999999
                         }
                         }
                     }).then(res => {
                     }).then(res => {
                         if(!res.error && res.data.code > 0) {
                         if(!res.error && res.data.code > 0) {
@@ -45,7 +45,7 @@ export default {
                         method: 'GET',
                         method: 'GET',
                         body: {
                         body: {
                             pageNum: 1,
                             pageNum: 1,
-                            pageSize: 999
+                            pageSize: 999999999
                         }
                         }
                     }).then(res => {
                     }).then(res => {
                         if(!res.error && res.data.code > 0) {
                         if(!res.error && res.data.code > 0) {
@@ -183,7 +183,7 @@ export default {
             const { pageNum, pageSize } = action;
             const { pageNum, pageSize } = action;
             const body = {
             const body = {
                 pageNum: pageNum || 1,
                 pageNum: pageNum || 1,
-                pageSize: pageSize || 999
+                pageSize: pageSize || 999999999
             }
             }
             try{
             try{
                 const chart = yield select(state => state.present.chart);
                 const chart = yield select(state => state.present.chart);

+ 1 - 1
src/models/chartDesigner.js

@@ -534,7 +534,7 @@ export default {
                     filters: getBodyFilters(filters),
                     filters: getBodyFilters(filters),
                     testPage: {
                     testPage: {
                         pageNum: 1,
                         pageNum: 1,
-                        pageSize: 999,
+                        pageSize: 999999999,
                     }
                     }
                 };
                 };
 
 

+ 2 - 2
src/models/dashboard.js

@@ -71,7 +71,7 @@ export default {
             const { pageNum, pageSize } = action;
             const { pageNum, pageSize } = action;
             const body = {
             const body = {
                 pageNum: pageNum || 1,
                 pageNum: pageNum || 1,
-                pageSize: pageSize || 999
+                pageSize: pageSize || 999999999
             }
             }
             try {
             try {
                 const dashboard = yield select(state => state.present.dashboard);
                 const dashboard = yield select(state => state.present.dashboard);
@@ -421,7 +421,7 @@ export default {
                 yield put({ type: 'remoteMenuTree', mandatory: true });
                 yield put({ type: 'remoteMenuTree', mandatory: true });
                 return true;
                 return true;
             }else {
             }else {
-                message.error('添加报表目录失败: ' + (res.err || res.data.msg));
+                message.error('删除报表目录失败: ' + (res.err || res.data.msg));
                 return false;
                 return false;
             }
             }
         },
         },

+ 1 - 1
src/models/dataConnect.js

@@ -143,7 +143,7 @@ export default {
             const { pageNum, pageSize } = action;
             const { pageNum, pageSize } = action;
             const body = {
             const body = {
                 pageNum: pageNum || 1,
                 pageNum: pageNum || 1,
-                pageSize: pageSize || 999
+                pageSize: pageSize || 999999999
             }
             }
             try {
             try {
                 const dataConnect = yield select(state => state.present.dataConnect);
                 const dataConnect = yield select(state => state.present.dataConnect);

+ 2 - 2
src/models/dataSource.js

@@ -22,7 +22,7 @@ export default {
                         method: 'GET',
                         method: 'GET',
                         body: {
                         body: {
                             pageNum: 1,
                             pageNum: 1,
-                            pageSize: 999
+                            pageSize: 999999999
                         }
                         }
                     }).then(res => {
                     }).then(res => {
                         if(!res.error && res.data.code > 0) {
                         if(!res.error && res.data.code > 0) {
@@ -163,7 +163,7 @@ export default {
             const { pageNum, pageSize } = action;
             const { pageNum, pageSize } = action;
             const body = {
             const body = {
                 pageNum: pageNum || 1,
                 pageNum: pageNum || 1,
-                pageSize: pageSize || 999
+                pageSize: pageSize || 999999999
             }
             }
             try {
             try {
                 const dataSource = yield select(state => state.present.dataSource);
                 const dataSource = yield select(state => state.present.dataSource);

+ 80 - 4
src/models/home.js

@@ -20,6 +20,7 @@ export default {
             tabs: [],
             tabs: [],
             selectedTab: null,
             selectedTab: null,
             collectionDashboards: [], // 已收藏报表
             collectionDashboards: [], // 已收藏报表
+            fixedDashboard: null, // 固定到首页的报表
         }
         }
     },
     },
     reducers: {
     reducers: {
@@ -115,8 +116,20 @@ export default {
             yield put({ type: 'removeTabs', tabs });
             yield put({ type: 'removeTabs', tabs });
         },
         },
         *closeAllTabs(action, { select, call, put }) {
         *closeAllTabs(action, { select, call, put }) {
-            yield put({ type: 'removeAllTabs' });
-            yield put({ type: 'dashboardDesigner/reset' });
+            const { home } = yield select(state => ({ home: state.present.home }));
+            const { tabs, fixedDashboard } = home;
+            let rmTabs = [];
+
+            for(let i = tabs.length - 1; i >= 0; i--) {
+                if(!fixedDashboard || (tabs[i].code !== fixedDashboard.code)) {
+                    rmTabs.push(tabs[i]);
+                }
+            }
+            yield put({ type: 'removeTabs', tabs: rmTabs });
+            if(fixedDashboard && rmTabs.length > 0) {
+                let sTab = tabs.find(t => t.code === fixedDashboard.code);
+                yield put({ type: 'changeTab', tab: sTab });
+            }
         },
         },
         *saveCurrentTabDashboardConfig(action, { select, call, put }) {
         *saveCurrentTabDashboardConfig(action, { select, call, put }) {
             const { home, dashboardDesigner } = yield select(state => ({ home: state.present.home, dashboardDesigner: state.present.dashboardDesigner }));
             const { home, dashboardDesigner } = yield select(state => ({ home: state.present.home, dashboardDesigner: state.present.dashboardDesigner }));
@@ -146,8 +159,8 @@ export default {
                 });
                 });
                 if(!res.err && res.data.code > 0) {
                 if(!res.err && res.data.code > 0) {
                     const list = res.data.data.map(d => ({
                     const list = res.data.data.map(d => ({
-                        code: d.ID + '',
-                        name: d.NAME
+                        code: d.id + '',
+                        name: d.name
                     }));
                     }));
                     yield put({ type: 'setField', name: 'collectionDashboards', value: list });
                     yield put({ type: 'setField', name: 'collectionDashboards', value: list });
                     return list;
                     return list;
@@ -198,6 +211,69 @@ export default {
                 message.error('添加收藏失败: ' + e.message);
                 message.error('添加收藏失败: ' + e.message);
             }
             }
         },
         },
+        *getFixedDashboard(action, { select, put, call }) {
+            const main = yield select (state => state.present.main);
+            const { currentUser } = main;
+            try{
+                const res = yield call(service.fetch, {
+                    url: URLS.HOMEPAGE_FIXED_GET + '/' + currentUser.code,
+                    method: 'GET'
+                });
+                if(!res.err && res.data.code > 0) {
+                    // let fixedDashboard = {
+                    //     code: res.data.data ? (res.data.data.code + '') : null,
+                    //     name: res.data.data ? (res.data.data.name + '') : null
+                    // }
+                    let fixedDashboard = res.data.data ? {
+                        code: res.data.data['id'] + '',
+                        name: res.data.data['name'],
+                    } : null;
+                    yield put({ type: 'setField', name: 'fixedDashboard', value: fixedDashboard });
+                    return fixedDashboard;
+                }else {
+                    message.error('请求默认报表失败: ' + (res.err || res.data.msg));
+                    return null;
+                }
+            }catch(e) {
+                message.error('请求默认报表失败: ' + e.message);
+            }
+        },
+        *onFixedDashboard(action, { select, put, call }) {
+            const main = yield select (state => state.present.main);
+            const { currentUser } = main;
+            const { tab } = action;
+            try{
+                const res = yield call(service.fetch, {
+                    url: URLS.HOMEPAGE_FIXED + '/' + currentUser.code + '/' + tab.code
+                });
+                if(!res.err && res.data.code > 0) {
+                    yield put({ type: 'setField', name: 'fixedDashboard', value: tab });
+                    message.success('已设为默认报表');
+                }else {
+                    message.error('设为默认报表失败: ' + (res.err || res.data.msg));
+                }
+            }catch(e) {
+                message.error('设为默认报表失败: ' + e.message);
+            }
+        },
+        *onCancelFixedDashboard(action, { select, put, call }) {
+            const main = yield select (state => state.present.main);
+            const { currentUser } = main;
+            const { tab } = action;
+            try{
+                const res = yield call(service.fetch, {
+                    url: URLS.HOMEPAGE_CANCELFIXED + '/' + currentUser.code + '/' + tab.code
+                });
+                if(!res.err && res.data.code > 0) {
+                    yield put({ type: 'setField', name: 'fixedDashboard', value: null });
+                    message.success('已取消默认报表');
+                }else {
+                    message.error('取消默认报表失败: ' + (res.err || res.data.msg));
+                }
+            }catch(e) {
+                message.error('取消默认报表失败: ' + e.message);
+            }
+        }
     },
     },
     subscriptions: {
     subscriptions: {
         setup({ dispatch, history }) {
         setup({ dispatch, history }) {