feat(前端): 优化页面布局和查询表单样式
- 在FlowList和FlowRunLogs页面添加PageHeader组件 - 统一ScheduleJobs页面的查询表单样式为内联布局 - 为表格分页添加showSizeChanger选项 - 新增Rust代码规范文档
This commit is contained in:
@ -4,6 +4,7 @@ import { PlusOutlined, ReloadOutlined, DeleteOutlined, EditOutlined, EyeOutlined
|
||||
import { useNavigate } from 'react-router-dom'
|
||||
import api, { type ApiResp } from '../utils/axios'
|
||||
import dayjs from 'dayjs'
|
||||
import PageHeader from '../components/PageHeader'
|
||||
|
||||
interface FlowSummary { id: string; name: string; code?: string; remark?: string; created_at: string; updated_at: string; last_modified_by?: string }
|
||||
// 新增:扩展 Doc 以便复用
|
||||
@ -206,7 +207,7 @@ export default function FlowList() {
|
||||
width: 720,
|
||||
content: (
|
||||
<pre style={{ maxHeight: 400, overflow: 'auto' }}>
|
||||
{data.data?.yaml}
|
||||
{data.data?.yaml}
|
||||
</pre>
|
||||
)
|
||||
})
|
||||
@ -219,6 +220,7 @@ export default function FlowList() {
|
||||
return (
|
||||
<div>
|
||||
<div style={{ marginBottom: 12 }}>
|
||||
<PageHeader items={["","流程管理"]} title="" />
|
||||
<Form
|
||||
form={searchForm}
|
||||
layout="inline"
|
||||
|
||||
@ -116,7 +116,7 @@ export default function FlowRunLogs() {
|
||||
|
||||
return (
|
||||
<div>
|
||||
<PageHeader items={["流程管理","运行日志"]} title="" />
|
||||
<PageHeader items={["","运行日志"]} title="" />
|
||||
<Form form={form} layout="inline" onFinish={() => fetchData(1, pageSize)} style={{ marginBottom: 12 }}>
|
||||
<Form.Item label="流程编码" name="flow_code">
|
||||
<Input placeholder="flow code" allowClear style={{ width: 280 }} />
|
||||
@ -141,7 +141,7 @@ export default function FlowRunLogs() {
|
||||
dataSource={data}
|
||||
columns={columns}
|
||||
scroll={{ x: 1600 }}
|
||||
pagination={{ current: page, pageSize, total, onChange: (p, ps) => fetchData(p, ps) }}
|
||||
pagination={{ current: page, pageSize, total, showSizeChanger: true, pageSizeOptions: [10, 20, 50, 100], onChange: (p, ps) => fetchData(p, ps) }}
|
||||
/>
|
||||
|
||||
<Drawer title="运行详情" width={820} open={detailOpen} onClose={closeDetail} destroyOnHidden placement="right">
|
||||
|
||||
@ -27,19 +27,22 @@ export default function ScheduleJobs() {
|
||||
const [total, setTotal] = useState(0)
|
||||
const [page, setPage] = useState(1)
|
||||
const [pageSize, setPageSize] = useState(10)
|
||||
const [keyword, setKeyword] = useState('')
|
||||
const [enabledFilter, setEnabledFilter] = useState<'all' | 'true' | 'false'>('all')
|
||||
// 使用与系统日志一致的查询表单样式:内联 Form + 查询/重置
|
||||
const [searchForm] = Form.useForm()
|
||||
|
||||
const [modalOpen, setModalOpen] = useState(false)
|
||||
const [editing, setEditing] = useState<ScheduleJobItem | null>(null)
|
||||
const [form] = Form.useForm()
|
||||
const [flowOptions, setFlowOptions] = useState<FlowOption[]>([])
|
||||
|
||||
const fetchJobs = async (p: number = page, ps: number = pageSize, kw: string = keyword, ef: 'all' | 'true' | 'false' = enabledFilter) => {
|
||||
const fetchJobs = async (p: number = page, ps: number = pageSize) => {
|
||||
const v = searchForm.getFieldsValue()
|
||||
setLoading(true)
|
||||
try {
|
||||
const params: any = { page: p, page_size: ps, keyword: kw }
|
||||
if (ef !== 'all') params.enabled = ef === 'true'
|
||||
const params: any = { page: p, page_size: ps }
|
||||
if (v.keyword) params.keyword = String(v.keyword).trim()
|
||||
// 按系统日志风格:下拉框 allowClear,不选择即为“全部”;选择 true/false 才加入过滤
|
||||
if (typeof v.enabled === 'boolean') params.enabled = v.enabled
|
||||
const { data } = await api.get('/schedule_jobs', { params })
|
||||
if (data?.code === 0) {
|
||||
const resp = data.data as PageResp<ScheduleJobItem>
|
||||
@ -67,7 +70,7 @@ export default function ScheduleJobs() {
|
||||
}
|
||||
}
|
||||
|
||||
useEffect(() => { fetchJobs(1, pageSize, keyword, enabledFilter) }, [])
|
||||
useEffect(() => { fetchJobs(1, pageSize) }, [])
|
||||
|
||||
const columns: ColumnsType<ScheduleJobItem> = useMemo(() => [
|
||||
{ title: '名称', dataIndex: 'name', key: 'name' },
|
||||
@ -144,7 +147,7 @@ export default function ScheduleJobs() {
|
||||
if (data?.code === 0) {
|
||||
message.success('创建成功')
|
||||
setModalOpen(false)
|
||||
fetchJobs(1, pageSize, keyword, enabledFilter)
|
||||
fetchJobs(1, pageSize)
|
||||
} else {
|
||||
throw new Error(data?.message || '创建失败')
|
||||
}
|
||||
@ -161,7 +164,7 @@ export default function ScheduleJobs() {
|
||||
if (data?.code === 0) {
|
||||
message.success('删除成功')
|
||||
const nextPage = data?.data?.deleted ? (data?.data?.remaining === 0 && page > 1 ? page - 1 : page) : page
|
||||
fetchJobs(nextPage, pageSize, keyword, enabledFilter)
|
||||
fetchJobs(nextPage, pageSize)
|
||||
} else {
|
||||
throw new Error(data?.message || '删除失败')
|
||||
}
|
||||
@ -201,52 +204,46 @@ export default function ScheduleJobs() {
|
||||
}
|
||||
}
|
||||
|
||||
const handleSearch = () => {
|
||||
fetchJobs(1, pageSize, keyword, enabledFilter)
|
||||
}
|
||||
|
||||
return (
|
||||
<div>
|
||||
<PageHeader items={["系统管理", "调度任务管理"]} title="" />
|
||||
<div style={{ background: '#fff', padding: 16, marginBottom: 12 }}>
|
||||
<Space wrap>
|
||||
<Input.Search allowClear placeholder="关键字" value={keyword} onChange={e => setKeyword(e.target.value)} onSearch={handleSearch} style={{ width: 280 }} />
|
||||
<Select
|
||||
value={enabledFilter}
|
||||
onChange={(v) => setEnabledFilter(v)}
|
||||
style={{ width: 160 }}
|
||||
options={[
|
||||
{ label: '全部状态', value: 'all' },
|
||||
{ label: '仅启用', value: 'true' },
|
||||
{ label: '仅禁用', value: 'false' },
|
||||
]}
|
||||
/>
|
||||
<Button type="primary" onClick={() => fetchJobs(1, pageSize, keyword, enabledFilter)}>查询</Button>
|
||||
<Button onClick={() => { setKeyword(''); setEnabledFilter('all'); fetchJobs(1, pageSize, '', 'all') }}>重置</Button>
|
||||
<PageHeader items={["系统管理", "定时任务"]} title="" />
|
||||
{/* 与系统日志一致的查询区:内联表单 */}
|
||||
<Form form={searchForm} layout="inline" onFinish={() => fetchJobs(1, pageSize)} style={{ marginBottom: 12 }}>
|
||||
<Form.Item label="关键字" name="keyword">
|
||||
<Input allowClear placeholder="关键字" style={{ width: 320 }} />
|
||||
</Form.Item>
|
||||
<Form.Item label="状态" name="enabled">
|
||||
<Select allowClear placeholder="全部" style={{ width: 140 }} options={[{ label: '启用', value: true }, { label: '禁用', value: false }]} />
|
||||
</Form.Item>
|
||||
<Form.Item>
|
||||
<Space>
|
||||
<Button type="primary" htmlType="submit">查询</Button>
|
||||
<Button onClick={() => { searchForm.resetFields(); fetchJobs(1, 10) }}>重置</Button>
|
||||
</Space>
|
||||
</Form.Item>
|
||||
</Form>
|
||||
|
||||
{/* 操作区保持与其他页面一致 */}
|
||||
<div style={{ marginBottom: 12 }}>
|
||||
<Space>
|
||||
<Button type="primary" icon={<PlusOutlined />} onClick={openCreate}>新增任务</Button>
|
||||
<Button icon={<ReloadOutlined />} onClick={() => fetchJobs(page, pageSize)}>刷新</Button>
|
||||
</Space>
|
||||
</div>
|
||||
|
||||
<div style={{ background: '#fff', padding: 16 }}>
|
||||
<div style={{ marginBottom: 12 }}>
|
||||
<Space>
|
||||
<Button type="primary" icon={<PlusOutlined />} onClick={openCreate}>新增任务</Button>
|
||||
<Button icon={<ReloadOutlined />} onClick={() => fetchJobs(page, pageSize, keyword, enabledFilter)}>刷新</Button>
|
||||
</Space>
|
||||
</div>
|
||||
<Table
|
||||
rowKey="id"
|
||||
loading={loading}
|
||||
dataSource={data}
|
||||
columns={columns}
|
||||
pagination={{
|
||||
current: page,
|
||||
pageSize,
|
||||
total,
|
||||
showSizeChanger: true,
|
||||
onChange: (p, ps) => fetchJobs(p, ps, keyword, enabledFilter),
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<Table
|
||||
rowKey="id"
|
||||
loading={loading}
|
||||
dataSource={data}
|
||||
columns={columns}
|
||||
pagination={{
|
||||
current: page,
|
||||
pageSize,
|
||||
total,
|
||||
showSizeChanger: true,
|
||||
onChange: (p, ps) => fetchJobs(p, ps),
|
||||
}}
|
||||
/>
|
||||
|
||||
<Modal
|
||||
open={modalOpen}
|
||||
|
||||
Reference in New Issue
Block a user