story操作权限限制
Some checks failed
test/timeline-frontend/pipeline/head There was a failure building this commit
Some checks failed
test/timeline-frontend/pipeline/head There was a failure building this commit
This commit is contained in:
@@ -27,7 +27,8 @@ const TimelineItem: React.FC<{
|
|||||||
item: StoryItem;
|
item: StoryItem;
|
||||||
handleOption: (item: StoryItem, option: 'add' | 'edit' | 'addSubItem' | 'editSubItem') => void;
|
handleOption: (item: StoryItem, option: 'add' | 'edit' | 'addSubItem' | 'editSubItem') => void;
|
||||||
refresh: () => void;
|
refresh: () => void;
|
||||||
}> = ({ item, handleOption, refresh }) => {
|
disableEdit?: boolean;
|
||||||
|
}> = ({ item, handleOption, refresh, disableEdit }) => {
|
||||||
const { styles } = useStyles();
|
const { styles } = useStyles();
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
const [expanded, setExpanded] = useState(false);
|
const [expanded, setExpanded] = useState(false);
|
||||||
@@ -97,7 +98,7 @@ const TimelineItem: React.FC<{
|
|||||||
}}
|
}}
|
||||||
extra={
|
extra={
|
||||||
<div className={styles.actions}>
|
<div className={styles.actions}>
|
||||||
{showActions && (
|
{showActions && !disableEdit && (
|
||||||
<>
|
<>
|
||||||
<Button
|
<Button
|
||||||
type="text"
|
type="text"
|
||||||
@@ -212,6 +213,7 @@ const TimelineItem: React.FC<{
|
|||||||
open={openDetail}
|
open={openDetail}
|
||||||
setOpen={setOpenDetail}
|
setOpen={setOpenDetail}
|
||||||
handleDelete={handleDelete}
|
handleDelete={handleDelete}
|
||||||
|
disableEdit={disableEdit}
|
||||||
handOption={handleOption}
|
handOption={handleOption}
|
||||||
/>
|
/>
|
||||||
</Card>
|
</Card>
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ interface Props {
|
|||||||
setOpen: React.Dispatch<React.SetStateAction<boolean>>;
|
setOpen: React.Dispatch<React.SetStateAction<boolean>>;
|
||||||
handleDelete: () => void;
|
handleDelete: () => void;
|
||||||
handOption: (item: StoryItem, option: 'add' | 'edit' | 'addSubItem' | 'editSubItem') => void;
|
handOption: (item: StoryItem, option: 'add' | 'edit' | 'addSubItem' | 'editSubItem') => void;
|
||||||
|
disableEdit?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
const TimelineItemDrawer: React.FC<Props> = (props) => {
|
const TimelineItemDrawer: React.FC<Props> = (props) => {
|
||||||
@@ -99,7 +100,7 @@ const TimelineItemDrawer: React.FC<Props> = (props) => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
footer={
|
footer={ {disableEdit ??
|
||||||
<div style={{ textAlign: 'right' }}>
|
<div style={{ textAlign: 'right' }}>
|
||||||
<Space>
|
<Space>
|
||||||
<Button
|
<Button
|
||||||
@@ -132,8 +133,7 @@ const TimelineItemDrawer: React.FC<Props> = (props) => {
|
|||||||
<Button onClick={closeDrawer}>关闭</Button>
|
<Button onClick={closeDrawer}>关闭</Button>
|
||||||
</Space>
|
</Space>
|
||||||
</div>
|
</div>
|
||||||
}
|
>}}
|
||||||
>
|
|
||||||
<div style={{ padding: '0 24px' }}>
|
<div style={{ padding: '0 24px' }}>
|
||||||
<div style={{ marginBottom: '24px' }}>
|
<div style={{ marginBottom: '24px' }}>
|
||||||
<h3>描述</h3>
|
<h3>描述</h3>
|
||||||
|
|||||||
1
src/pages/story/data.d.ts
vendored
1
src/pages/story/data.d.ts
vendored
@@ -40,6 +40,7 @@ export interface StoryType {
|
|||||||
itemCount: number,
|
itemCount: number,
|
||||||
updatedId?: string;
|
updatedId?: string;
|
||||||
updateTime?: string;
|
updateTime?: string;
|
||||||
|
storyTime: string;
|
||||||
logo?: string;
|
logo?: string;
|
||||||
}
|
}
|
||||||
export interface BaseResponse {
|
export interface BaseResponse {
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import { useParams } from 'react-router';
|
|||||||
import AutoSizer from 'react-virtualized-auto-sizer';
|
import AutoSizer from 'react-virtualized-auto-sizer';
|
||||||
import { VariableSizeList as List } from 'react-window';
|
import { VariableSizeList as List } from 'react-window';
|
||||||
import './index.css';
|
import './index.css';
|
||||||
|
import {judgePermission} from "@/pages/story/utils/utils";
|
||||||
|
|
||||||
// 格式化时间数组为易读格式
|
// 格式化时间数组为易读格式
|
||||||
const formatTimeArray = (time: string | number[] | undefined): string => {
|
const formatTimeArray = (time: string | number[] | undefined): string => {
|
||||||
@@ -274,6 +275,7 @@ const Index = () => {
|
|||||||
setCurrentOption(option);
|
setCurrentOption(option);
|
||||||
setOpenAddItemModal(true);
|
setOpenAddItemModal(true);
|
||||||
}}
|
}}
|
||||||
|
disableEdit={!judgePermission(detail.permissionType, 'edit')}
|
||||||
refresh={() => {
|
refresh={() => {
|
||||||
// 刷新当前页数据
|
// 刷新当前页数据
|
||||||
setPagination((prev) => ({ ...prev, current: 1 }));
|
setPagination((prev) => ({ ...prev, current: 1 }));
|
||||||
@@ -480,6 +482,7 @@ const Index = () => {
|
|||||||
<Button
|
<Button
|
||||||
type="primary"
|
type="primary"
|
||||||
size="large"
|
size="large"
|
||||||
|
disabled={!judgePermission(detail.permissionType, 'edit')}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setCurrentOption('add');
|
setCurrentOption('add');
|
||||||
setCurrentItem(undefined);
|
setCurrentItem(undefined);
|
||||||
@@ -500,6 +503,7 @@ const Index = () => {
|
|||||||
setOpenAddItemModal(true);
|
setOpenAddItemModal(true);
|
||||||
}}
|
}}
|
||||||
icon={<PlusOutlined />}
|
icon={<PlusOutlined />}
|
||||||
|
disabled={!judgePermission(detail.permissionType, 'edit')}
|
||||||
type="primary"
|
type="primary"
|
||||||
style={{
|
style={{
|
||||||
right: 24,
|
right: 24,
|
||||||
|
|||||||
@@ -9,12 +9,13 @@ import type { StoryType } from './data.d';
|
|||||||
import { addStory, deleteStory, queryTimelineList, updateStory } from './service';
|
import { addStory, deleteStory, queryTimelineList, updateStory } from './service';
|
||||||
import useStyles from './style.style';
|
import useStyles from './style.style';
|
||||||
import AuthorizeStoryModal from './components/AuthorizeStoryModal';
|
import AuthorizeStoryModal from './components/AuthorizeStoryModal';
|
||||||
|
import {judgePermission} from "@/pages/story/utils/utils";
|
||||||
|
|
||||||
|
|
||||||
const { Search } = Input;
|
const { Search } = Input;
|
||||||
|
|
||||||
const ListContent = ({
|
const ListContent = ({
|
||||||
data: { createTime, updateTime, updateName, ownerName, itemCount },
|
data: { storyTime, updateTime, updateName, ownerName, itemCount },
|
||||||
}: {
|
}: {
|
||||||
data: StoryType;
|
data: StoryType;
|
||||||
}) => {
|
}) => {
|
||||||
@@ -27,15 +28,15 @@ const ListContent = ({
|
|||||||
</div>
|
</div>
|
||||||
<div className={styles.listContentItem}>
|
<div className={styles.listContentItem}>
|
||||||
<span>最近更新人</span>
|
<span>最近更新人</span>
|
||||||
<p>{updateName}</p>
|
<p>{updateName ?? ownerName}</p>
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.listContentItem}>
|
<div className={styles.listContentItem}>
|
||||||
<span>节点数</span>
|
<span>节点数</span>
|
||||||
<p>{itemCount}</p>
|
<p>{itemCount}</p>
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.listContentItem}>
|
<div className={styles.listContentItem}>
|
||||||
<span>开始时间</span>
|
<span>故事时间</span>
|
||||||
<p>{createTime}</p>
|
<p>{storyTime}</p>
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.listContentItem}>
|
<div className={styles.listContentItem}>
|
||||||
<span>更新时间</span>
|
<span>更新时间</span>
|
||||||
@@ -190,6 +191,7 @@ export const BasicList: FC = () => {
|
|||||||
actions={[
|
actions={[
|
||||||
<a
|
<a
|
||||||
key="edit"
|
key="edit"
|
||||||
|
disabled={judgePermission(item.permissionType as number, 'edit')}
|
||||||
onClick={(e) => {
|
onClick={(e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
showEditModal(item);
|
showEditModal(item);
|
||||||
@@ -200,6 +202,7 @@ export const BasicList: FC = () => {
|
|||||||
// 增加授权操作,可以授权给其他用户
|
// 增加授权操作,可以授权给其他用户
|
||||||
<a
|
<a
|
||||||
key="authorize"
|
key="authorize"
|
||||||
|
disabled={judgePermission(item.permissionType as number, 'auth')}
|
||||||
onClick={(e) => {
|
onClick={(e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
setCurrent(item);
|
setCurrent(item);
|
||||||
@@ -210,6 +213,7 @@ export const BasicList: FC = () => {
|
|||||||
</a>,
|
</a>,
|
||||||
<a
|
<a
|
||||||
key="delete"
|
key="delete"
|
||||||
|
disabled={judgePermission(item.permissionType as number, 'delete')}
|
||||||
onClick={(e) => {
|
onClick={(e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
deleteItem(item.instanceId ?? '');
|
deleteItem(item.instanceId ?? '');
|
||||||
|
|||||||
18
src/pages/story/utils/utils.ts
Normal file
18
src/pages/story/utils/utils.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
// judge user permission
|
||||||
|
/**
|
||||||
|
* current permissionType: 1 - creator, 2 - admin, 3 - editor, 4 - viewer
|
||||||
|
* @param permissionType
|
||||||
|
* @param actionType
|
||||||
|
*/
|
||||||
|
export function judgePermission(permissionType: number | null, actionType: string): boolean {
|
||||||
|
switch (actionType) {
|
||||||
|
case 'delete':
|
||||||
|
return permissionType === 1;
|
||||||
|
case 'auth':
|
||||||
|
return permissionType === 1 || permissionType === 2;
|
||||||
|
case 'edit':
|
||||||
|
return permissionType === 1 || permissionType === 2 || permissionType === 3;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user