From 2dae7a77781f4ef123a673893a9a7ffb34285f8f Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期二, 03 二月 2026 14:34:13 +0800
Subject: [PATCH] #列浮动和路径流程页
---
rsf-admin/src/page/taskPathTemplate/TaskPathTemplateList.jsx | 203 ++++++++++++++++++++++++++++++++++++--------------
1 files changed, 144 insertions(+), 59 deletions(-)
diff --git a/rsf-admin/src/page/taskPathTemplate/TaskPathTemplateList.jsx b/rsf-admin/src/page/taskPathTemplate/TaskPathTemplateList.jsx
index 56117a7..7e3d17f 100644
--- a/rsf-admin/src/page/taskPathTemplate/TaskPathTemplateList.jsx
+++ b/rsf-admin/src/page/taskPathTemplate/TaskPathTemplateList.jsx
@@ -2,10 +2,11 @@
import { useNavigate } from 'react-router-dom';
import {
List,
+ DataTable,
DatagridConfigurable,
SearchInput,
TopToolbar,
- SelectColumnsButton,
+ ColumnsButton,
EditButton,
FilterButton,
CreateButton,
@@ -43,20 +44,11 @@
import MyField from "../components/MyField";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
+import StickyDataTable from "@/page/components/StickyDataTable";
+import useTableLayout from '@/utils/useTableLayout';
+import { Dialog, DialogContent, DialogActions, Button } from '@mui/material';
+import TaskTemplateFlowViewer from "./TaskTemplateFlowViewer";
-const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
- '& .css-1vooibu-MuiSvgIcon-root': {
- height: '.9em'
- },
- '& .RaDatagrid-row': {
- cursor: 'auto'
- },
- '& .column-name': {
- },
- '& .opt': {
- width: 200
- },
-}));
const filters = [
<SearchInput source="condition" alwaysOn />,
@@ -95,11 +87,54 @@
/>,
]
+const baseColumns = [
+ <NumberField source="id" />,
+ <TextField source="templateCode" label="table.field.taskPathTemplate.templateCode" />,
+ <TextField source="templateName" label="table.field.taskPathTemplate.templateName" />,
+ <TextField source="sourceType" label="table.field.taskPathTemplate.sourceType" />,
+ <TextField source="targetType" label="table.field.taskPathTemplate.targetType" />,
+ <TextField source="conditionExpression" label="table.field.taskPathTemplate.conditionExpression" />,
+ <TextField source="conditionDesc" label="table.field.taskPathTemplate.conditionDesc" />,
+ <NumberField source="version" label="table.field.taskPathTemplate.version" />,
+ <NumberField source="isCurrent" label="table.field.taskPathTemplate.isCurrent" />,
+ <DateField source="effectiveTime" label="table.field.taskPathTemplate.effectiveTime" showTime />,
+ <DateField source="expireTime" label="table.field.taskPathTemplate.expireTime" showTime />,
+ <NumberField source="priority" label="table.field.taskPathTemplate.priority" />,
+ <NumberField source="timeoutMinutes" label="table.field.taskPathTemplate.timeoutMinutes" />,
+ <NumberField source="maxRetryTimes" label="table.field.taskPathTemplate.maxRetryTimes" />,
+ <NumberField source="retryIntervalSeconds" label="table.field.taskPathTemplate.retryIntervalSeconds" />,
+ <TextField source="remark" label="table.field.taskPathTemplate.remark" />,
+ <TextField source="createdBy" label="table.field.taskPathTemplate.createdBy" />,
+ <TextField source="updatedBy" label="table.field.taskPathTemplate.updatedBy" />,
+ <DateField source="createdTime" label="table.field.taskPathTemplate.createdTime" showTime />,
+ <DateField source="updatedTime" label="table.field.taskPathTemplate.updatedTime" showTime />,
+
+ <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
+ <TextField source="nickname" />
+ </ReferenceField>,
+ <DateField source="updateTime" label="common.field.updateTime" showTime />,
+ <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
+ <TextField source="nickname" />
+ </ReferenceField>,
+ <DateField source="createTime" label="common.field.createTime" showTime />,
+ <BooleanField source="statusBool" label="common.field.status" sortable={false} />,
+ <TextField source="memo" label="common.field.memo" sortable={false} />,
+]
+
const TaskPathTemplateList = () => {
const translate = useTranslate();
const [createDialog, setCreateDialog] = useState(false);
const [drawerVal, setDrawerVal] = useState(false);
+ const [flowDialog, setFlowDialog] = useState(false);
+ const [currentRecord, setCurrentRecord] = useState(null);
+
+ const handleOpenFlow = (record) => {
+ setCurrentRecord(record);
+ setFlowDialog(true);
+ };
+
+ const { boxMaxWidth, boxMaxHeight } = useTableLayout(drawerVal);
return (
<Box display="flex">
@@ -120,61 +155,33 @@
<TopToolbar>
<FilterButton />
<MyCreateButton onClick={() => { setCreateDialog(true) }} />
- <SelectColumnsButton preferenceKey='taskPathTemplate' />
+ <ColumnsButton storeKey='taskPathTemplate' />
<MyExportButton />
</TopToolbar>
)}
perPage={DEFAULT_PAGE_SIZE}
>
- <StyledDatagrid
- preferenceKey='taskPathTemplate'
- bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
- rowClick={(id, resource, record) => false}
- expand={() => <TaskPathTemplatePanel />}
- expandSingle={true}
- omit={['id', 'createTime', 'createBy', 'memo']}
- >
- <NumberField source="id" />
- <TextField source="templateCode" label="table.field.taskPathTemplate.templateCode" />
- <TextField source="templateName" label="table.field.taskPathTemplate.templateName" />
- <TextField source="sourceType" label="table.field.taskPathTemplate.sourceType" />
- <TextField source="targetType" label="table.field.taskPathTemplate.targetType" />
- <TextField source="conditionExpression" label="table.field.taskPathTemplate.conditionExpression" />
- <TextField source="conditionDesc" label="table.field.taskPathTemplate.conditionDesc" />
- <NumberField source="version" label="table.field.taskPathTemplate.version" />
- <NumberField source="isCurrent" label="table.field.taskPathTemplate.isCurrent" />
- <DateField source="effectiveTime" label="table.field.taskPathTemplate.effectiveTime" showTime />
- <DateField source="expireTime" label="table.field.taskPathTemplate.expireTime" showTime />
- <NumberField source="priority" label="table.field.taskPathTemplate.priority" />
- <NumberField source="timeoutMinutes" label="table.field.taskPathTemplate.timeoutMinutes" />
- <NumberField source="maxRetryTimes" label="table.field.taskPathTemplate.maxRetryTimes" />
- <NumberField source="retryIntervalSeconds" label="table.field.taskPathTemplate.retryIntervalSeconds" />
- <TextField source="remark" label="table.field.taskPathTemplate.remark" />
- <TextField source="createdBy" label="table.field.taskPathTemplate.createdBy" />
- <TextField source="updatedBy" label="table.field.taskPathTemplate.updatedBy" />
- <DateField source="createdTime" label="table.field.taskPathTemplate.createdTime" showTime />
- <DateField source="updatedTime" label="table.field.taskPathTemplate.updatedTime" showTime />
-
- <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
- <TextField source="nickname" />
- </ReferenceField>
- <DateField source="updateTime" label="common.field.updateTime" showTime />
- <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
- <TextField source="nickname" />
- </ReferenceField>
- <DateField source="createTime" label="common.field.createTime" showTime />
- <BooleanField source="statusBool" label="common.field.status" sortable={false} />
- <TextField source="memo" label="common.field.memo" sortable={false} />
- <WrapperField cellClassName="opt" label="common.field.opt">
- <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
- <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
- </WrapperField>
- </StyledDatagrid>
+ <TableItems drawerVal={drawerVal} onOpenFlow={handleOpenFlow} />
</List>
<TaskPathTemplateCreate
open={createDialog}
setOpen={setCreateDialog}
/>
+ <Dialog
+ open={flowDialog}
+ onClose={() => setFlowDialog(false)}
+ fullWidth
+ maxWidth="xl"
+ >
+ <DialogContent>
+ <TaskTemplateFlowViewer record={currentRecord} />
+ </DialogContent>
+ <DialogActions>
+ <Button onClick={() => setFlowDialog(false)} color="primary">
+ {translate('ra.action.close')}
+ </Button>
+ </DialogActions>
+ </Dialog>
<PageDrawer
title='TaskPathTemplate Detail'
drawerVal={drawerVal}
@@ -185,4 +192,82 @@
)
}
+
+const TableItems = ({ drawerVal, onOpenFlow }) => {
+ const { isLoading } = useListContext();
+
+ const { boxMaxWidth, boxMaxHeight } = useTableLayout(drawerVal);
+
+ // Wait, the above simple Button won't work easily because it doesn't have access to the record of the row being rendered
+ // when defined in this scope. The `rowClick` works because the datagrid calls it with the record.
+ // The `EditButton` works because it uses `useRecordContext`.
+
+ // So I need a custom component for the button that uses `useRecordContext`.
+
+ return (
+ <Box sx={{
+ position: 'relative',
+ maxHeight: boxMaxHeight,
+ maxWidth: boxMaxWidth,
+ overflowX: 'auto',
+ overflowY: 'auto',
+ '& .MuiTableCell-root': {
+ whiteSpace: 'nowrap',
+ }
+ }}>
+ {baseColumns.length > 0 &&
+ <StickyDataTable
+ stickyRight={['opt']}
+ storeKey='taskPathTemplate'
+ bulkActionButtons={false}
+ rowClick={false}
+ hiddenColumns={['id', 'createTime', 'createBy', 'memo', 'statusBool']}
+ >
+ {baseColumns
+ .map((column) => (
+ <DataTable.Col
+ key={column.key || column.props.source}
+ source={column.props.source}
+ label={column.props.label}
+ sx={column.props.sx}
+ >
+ {column}
+ </DataTable.Col>
+ ))
+ }
+ <DataTable.Col
+ source="opt"
+ label="common.field.opt"
+ >
+ <WrapperField source="opt" cellClassName="opt" label="common.field.opt">
+ <ViewFlowButton onClick={onOpenFlow} />
+ <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
+ <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
+ </WrapperField>
+ </DataTable.Col>
+ </StickyDataTable>}
+ </Box>
+ )
+}
+
+import AccountTreeIcon from '@mui/icons-material/AccountTree';
+
+const ViewFlowButton = ({ onClick }) => {
+ const record = useRecordContext();
+ if (!record) return null;
+ return (
+ <Button
+ onClick={(e) => {
+ e.stopPropagation();
+ onClick && onClick(record);
+ }}
+ sx={{ padding: '1px', fontSize: '.75rem', minWidth: 'auto', marginRight: 0.5 }}
+ color="primary"
+ >
+ <AccountTreeIcon />
+ </Button>
+ )
+}
+
+
export default TaskPathTemplateList;
--
Gitblit v1.9.1