Browse Source

feature:
1.控制导出权限(包含 Dashboard/ShareDashboard)

WanRuixiang 10 months ago
parent
commit
44a7b2b2a0

+ 14 - 4
src/app/pages/DashBoardPage/components/Widgets/ExportBtnWidget/ExportBtnWidgetCore.tsx

@@ -1,25 +1,35 @@
 import React, { useContext } from 'react';
 import { WidgetContext } from '../../WidgetProvider/WidgetProvider';
-import { WidgetActionContext } from '../../ActionProvider/WidgetActionProvider';
 import { getWidgetBaseStyle, getWidgetTitle } from '../../WidgetManager/utils/utils';
 import styled from 'styled-components/macro';
 import { darken, getLuminance, lighten } from 'polished';
 import { BoardActionContext } from '../../ActionProvider/BoardActionProvider';
 import { DownloadFileType } from '../../../../../constants';
+import { useSelector } from 'react-redux';
+import { selectSharePermission } from '../../../../SharePage/slice/selectors';
+import { message } from 'antd';
+import useI18NPrefix from '../../../../../hooks/useI18NPrefix';
 
 export const ExportBtnWidgetCore: React.FC<{}> = () => {
   const widget = useContext(WidgetContext);
   const { onBoardToDownLoad } = useContext(BoardActionContext);
-  const onQuery = e => {
+  const t = useI18NPrefix('viz')
+  const sharePermission =  useSelector(selectSharePermission);
+  const allowDownload = !!sharePermission?.allowDownload;
+  const onExport = e => {
     e.stopPropagation();
-    onBoardToDownLoad?.(DownloadFileType.Excel);
+    if (allowDownload){
+      onBoardToDownLoad?.(DownloadFileType.Excel);
+    }else {
+      message.error(t('action.share.unDataPermission'))
+    }
   };
 
   const title = getWidgetTitle(widget.config.customConfig.props);
   title.title = widget.config.name;
   const { background } = getWidgetBaseStyle(widget.config.customConfig.props);
   return (
-    <Wrapper color={background.color} onClick={onQuery}>
+    <Wrapper color={background.color} onClick={onExport}>
       <span
         style={{
           color: title.font.color,

+ 1 - 1
src/app/pages/DashBoardPage/pages/Board/slice/asyncActions.ts

@@ -22,7 +22,7 @@ import { FilterSearchParamsWithMatch } from 'app/pages/MainPage/pages/VizPage/sl
 import { mainActions } from 'app/pages/MainPage/slice';
 import { ExecuteToken } from 'app/pages/SharePage/slice/types';
 import { ChartDataRequest } from 'app/types/ChartDataRequest';
-import { downloadFile, makeDownloadDataTask, makeShareDownloadDataTask } from 'app/utils/fetch';
+import { makeDownloadDataTask, makeShareDownloadDataTask } from 'app/utils/fetch';
 import { RootState } from 'types';
 import { UniqWith } from 'utils/object';
 import { boardActions } from '.';

+ 6 - 1
src/app/pages/SharePage/Dashboard/ShareDashboardPage.tsx

@@ -48,6 +48,7 @@ import {
   selectNeedVerify,
   selectShareExecuteTokenMap,
   selectSharePassword,
+  selectSharePermission,
   selectShareVizType,
 } from '../slice/selectors';
 import { fetchShareVizInfo } from '../slice/thunks';
@@ -73,6 +74,10 @@ function ShareDashboardPage() {
   const vizType = useSelector(selectShareVizType);
   const logged = !!getToken();
 
+  // 分享链接的用户权限
+  const sharePermission =  useSelector(selectSharePermission);
+  const allowDownload = !!sharePermission?.allowDownload;
+
   const shareType = useRouteQuery({
     key: 'type',
   });
@@ -241,7 +246,7 @@ function ShareDashboardPage() {
       {!Boolean(needVerify) && shareBoard && (
         <DashboardForShare
           dashboard={shareBoard}
-          allowDownload={true}
+          allowDownload={allowDownload}
           loadVizData={loadVizData}
           onMakeShareDownloadDataTask={onMakeShareDownloadDataTask}
           renderMode={renderMode}

+ 9 - 1
src/app/pages/SharePage/slice/index.ts

@@ -38,6 +38,7 @@ import {
   getOauth2Clients,
 } from './thunks';
 import { ExecuteToken, SharePageState, ShareVizInfo } from './types';
+import { PermissionLevels } from '../../MainPage/pages/PermissionPage/constants';
 
 export const initialState: SharePageState = {
   needVerify: false,
@@ -54,6 +55,7 @@ export const initialState: SharePageState = {
   oauth2Clients: [],
   availableSourceFunctions: [],
   selectedItems: [],
+  sharePermission: { allowDownload :false }
 };
 
 export const slice = createSlice({
@@ -204,8 +206,14 @@ export const slice = createSlice({
       .addCase(fetchShareVizInfo.pending, state => {
         state.loginLoading = true;
       })
-      .addCase(fetchShareVizInfo.fulfilled, state => {
+      .addCase(fetchShareVizInfo.fulfilled, (state,{ payload }) => {
         state.loginLoading = false;
+        const { data } = payload;
+        const { permission } = data;
+        const allowDownload = (PermissionLevels.Download & permission) === PermissionLevels.Download;
+        state.sharePermission = {
+          allowDownload
+        }
       })
       .addCase(fetchShareVizInfo.rejected, state => {
         state.loginLoading = false;

+ 5 - 0
src/app/pages/SharePage/slice/selectors.ts

@@ -22,6 +22,11 @@ import { RootState } from '../../../../types';
 
 const selectDomain = (state: RootState) => state.share || initialState;
 
+export const selectSharePermission = createSelector(
+  [selectDomain],
+  shareState => shareState.sharePermission,
+)
+
 export const selectShareVizType = createSelector(
   [selectDomain],
   shareState => shareState.vizType,

+ 1 - 0
src/app/pages/SharePage/slice/thunks.ts

@@ -36,6 +36,7 @@ import persistence from 'utils/persistence';
 import { request2 } from 'utils/request';
 import { shareActions } from '.';
 import { ShareVizInfo } from './types';
+import { PermissionLevels } from '../../MainPage/pages/PermissionPage/constants';
 
 export const fetchShareVizInfo = createAsyncThunk(
   'share/fetchShareVizInfo',

+ 6 - 0
src/app/pages/SharePage/slice/types.ts

@@ -41,6 +41,7 @@ export interface SharePageState {
   availableSourceFunctions?: string[];
   selectedItems: SelectedItem[];
   title?: string;
+  sharePermission?:SharePermission;
 }
 export interface ShareVizInfo {
   vizType: VizType | undefined;
@@ -49,6 +50,11 @@ export interface ShareVizInfo {
   executeToken: Record<string, ExecuteToken>;
   subVizToken: null | Record<string, ExecuteToken>;
   shareToken: Record<string, ExecuteToken>;
+  permission: number;
+}
+
+export interface SharePermission {
+  allowDownload : boolean;
 }
 
 export interface ShareExecuteParams {

+ 1 - 0
src/locales/en/translation.json

@@ -917,6 +917,7 @@
         "TOKEN": "SSO",
         "verificationMethod": "Verification method",
         "dataPermission": "Data permission",
+        "unDataPermission": "No Data permission",
         "loginUser": "User login",
         "shareUser": "User share",
         "userOrRole": "Assign roles/members",

+ 1 - 0
src/locales/zh/translation.json

@@ -919,6 +919,7 @@
         "TOKEN": "单点登录",
         "verificationMethod": "认证方式",
         "dataPermission": "数据权限",
+        "unDataPermission": "无数据权限",
         "loginUser": "登录者",
         "shareUser": "分享者",
         "userOrRole": "指定角色/成员",