Files
timeline-frontend/src/pages/story/index.tsx
jianghao 1e93920162
Some checks failed
test/timeline-frontend/pipeline/head There was a failure building this commit
story操作权限限制
2025-12-31 14:30:03 +08:00

268 lines
7.3 KiB
TypeScript

import { DownOutlined, PlusOutlined } from '@ant-design/icons';
import { PageContainer } from '@ant-design/pro-components';
import { history, useRequest } from '@umijs/max';
import { Avatar, Button, Card, Dropdown, Input, List, Modal } from 'antd';
import type { FC } from 'react';
import React, { useState } from 'react';
import OperationModal from './components/OperationModal';
import type { StoryType } from './data.d';
import { addStory, deleteStory, queryTimelineList, updateStory } from './service';
import useStyles from './style.style';
import AuthorizeStoryModal from './components/AuthorizeStoryModal';
import {judgePermission} from "@/pages/story/utils/utils";
const { Search } = Input;
const ListContent = ({
data: { storyTime, updateTime, updateName, ownerName, itemCount },
}: {
data: StoryType;
}) => {
const { styles } = useStyles();
return (
<div>
<div className={styles.listContentItem}>
<span></span>
<p>{ownerName}</p>
</div>
<div className={styles.listContentItem}>
<span></span>
<p>{updateName ?? ownerName}</p>
</div>
<div className={styles.listContentItem}>
<span></span>
<p>{itemCount}</p>
</div>
<div className={styles.listContentItem}>
<span></span>
<p>{storyTime}</p>
</div>
<div className={styles.listContentItem}>
<span></span>
<p>{updateTime}</p>
</div>
</div>
);
};
export const BasicList: FC = () => {
const { styles } = useStyles();
const [done, setDone] = useState<boolean>(false);
const [open, setVisible] = useState<boolean>(false);
const [authorizeModelOpen, setAuthorizeModelOpen] = useState<boolean>(false);
const [current, setCurrent] = useState<Partial<StoryType> | undefined>(undefined);
const {
data: listData,
loading,
run,
} = useRequest((storyName?: string) => {
return queryTimelineList({
count: 50,
storyName,
});
});
const { run: postRun } = useRequest(
(method, params) => {
if (method === 'remove') {
return deleteStory(params);
}
if (method === 'update') {
return updateStory(params);
}
return addStory(params);
},
{
manual: true,
onSuccess: () => {
run();
},
},
);
const list = listData || [];
const paginationProps = {
showSizeChanger: true,
showQuickJumper: true,
pageSize: 5,
total: list.length,
};
const showEditModal = (item: StoryType) => {
setVisible(true);
setCurrent(item);
};
const deleteItem = (id: string) => {
postRun('remove', {
instanceId: id,
});
};
const editAndDelete = (key: string | number, currentItem: StoryType) => {
console.log(currentItem);
if (key === 'edit') showEditModal(currentItem);
else if (key === 'delete') {
Modal.confirm({
title: '删除故事',
content: '确定删除该故事吗?',
okText: '确认',
cancelText: '取消',
onOk: () => deleteItem(currentItem.instanceId ?? ''),
});
}
};
const extraContent = (
<div>
<Button
type="dashed"
onClick={() => {
setVisible(true);
}}
style={{
marginBottom: 8,
float: 'left'
}}
>
<PlusOutlined />
</Button>
<Search
className={styles.extraContentSearch}
placeholder="请输入"
onSearch={(value) => {
run(value);
}}
/>
</div>
);
const MoreBtn: React.FC<{
item: StoryType;
}> = ({ item }) => (
<Dropdown
menu={{
onClick: ({ key }) => editAndDelete(key, item),
items: [
{
key: 'edit',
label: '编辑',
},
{
key: 'delete',
label: '删除',
},
],
}}
>
<a>
<DownOutlined />
</a>
</Dropdown>
);
const handleDone = () => {
setDone(false);
setVisible(false);
setCurrent({});
};
const handleSubmit = (values: StoryType) => {
setDone(true);
const method = current?.instanceId ? 'update' : 'add';
postRun(method, { ...current, ...values });
run();
};
return (
<div>
<PageContainer title={"Timeline"}>
<div className={styles.standardList}>
<Card
className={styles.listCard}
variant={undefined}
style={{
marginTop: 24,
}}
bodyStyle={{
padding: '0 32px 40px 32px',
}}
extra={extraContent}
>
<List
size="large"
rowKey="id"
loading={loading}
pagination={paginationProps}
dataSource={list}
renderItem={(item: StoryType) => (
<List.Item
actions={[
<a
key="edit"
disabled={judgePermission(item.permissionType as number, 'edit')}
onClick={(e) => {
e.preventDefault();
showEditModal(item);
}}
>
</a>,
// 增加授权操作,可以授权给其他用户
<a
key="authorize"
disabled={judgePermission(item.permissionType as number, 'auth')}
onClick={(e) => {
e.preventDefault();
setCurrent(item);
setAuthorizeModelOpen(true);
}}
>
</a>,
<a
key="delete"
disabled={judgePermission(item.permissionType as number, 'delete')}
onClick={(e) => {
e.preventDefault();
deleteItem(item.instanceId ?? '');
}}
>
</a>,
]}
>
<List.Item.Meta
avatar={<Avatar src={item.logo} shape="square" size="large" />}
title={
<a
onClick={() => {
history.push(`/timeline/${item.instanceId}`);
}}
>
{item.title}
</a>
}
description={item.description}
/>
<ListContent data={item} />
</List.Item>
)}
/>
</Card>
</div>
</PageContainer>
<OperationModal
done={done}
open={open}
current={current}
onDone={handleDone}
onSubmit={handleSubmit}
/>
<AuthorizeStoryModal
open={authorizeModelOpen}
current={current}
handleOk={(flag) => {
if(flag) {
run();
}
setAuthorizeModelOpen(false);
setCurrent({});
}}
/>
</div>
);
};
export default BasicList;