Commit 6c4d8a36 authored by drigle's avatar drigle

feat: submit workbench filters explicitly

parent 936e5fa0
......@@ -98,6 +98,7 @@ export default function SubjectRecordWorkbench({
const [success, setSuccess] = useState('');
const [activeViewName, setActiveViewName] = useState('');
const [filters, setFilters] = useState({});
const [pendingFilters, setPendingFilters] = useState({});
const [selectedIds, setSelectedIds] = useState([]);
const [page, setPage] = useState(0);
const [pageSize, setPageSize] = useState(DEFAULT_PAGE_SIZE);
......@@ -144,10 +145,8 @@ export default function SubjectRecordWorkbench({
}, [activeViewName, filters, page, pageSize, query, subjectName]);
useEffect(() => {
const delay = Object.values(filters).some((value) => String(value || '').trim()) ? 300 : 0;
const timer = window.setTimeout(() => reload(), delay);
return () => window.clearTimeout(timer);
}, [filters, reload]);
reload();
}, [reload]);
const handleViewChange = useCallback((viewName) => {
if (!viewName || viewName === activeViewName) {
......@@ -156,6 +155,7 @@ export default function SubjectRecordWorkbench({
setActiveViewName(viewName);
setFilters({});
setPendingFilters({});
setSelectedIds([]);
setPage(0);
}, [activeViewName]);
......@@ -344,10 +344,13 @@ export default function SubjectRecordWorkbench({
views={gridViews}
activeViewName={activeView?.name || ''}
onViewChange={handleViewChange}
filters={filters}
filters={pendingFilters}
filterSchema={filterSchema}
onFiltersChange={(key, value) => {
setFilters((current) => ({ ...current, [key]: value }));
setPendingFilters((current) => ({ ...current, [key]: value }));
}}
onQuery={() => {
setFilters(pendingFilters);
setPage(0);
setSelectedIds([]);
}}
......
......@@ -27,7 +27,7 @@
## 2. 项目列表与详情
1. 页面通过 `loadSubject`、`getSubjectView` 和 `POST /record/query` 读取字段、视图和记录。
2. 表格列、视图限制、排序、选择字段选项和字段分组来自服务端配置;字段分组读取当前 Grid View 的 `settings.groups`,按配置展示分组表头并支持展开或收起。当前 Grid View 的 `settings.shortTitle === true` 时只隐藏通用 `title` 展示列;`false` 或未配置时正常展示。`title` 数据参与排序、详情和保存,详情入口保留在项目名称和固定操作列。筛选清单根据当前 View 的字段配置和类型自动生成,文本类字段使用模糊匹配,选择/布尔字段使用枚举值,日期使用当天范围,数字使用精确值,引用/用户字段使用 ID;所有字段筛选与分页均通过 `POST /record/query` 远程执行,浏览器不再加载全部记录后本地过滤。
2. 表格列、视图限制、排序、选择字段选项和字段分组来自服务端配置;字段分组读取当前 Grid View 的 `settings.groups`,按配置展示分组表头并支持展开或收起。当前 Grid View 的 `settings.shortTitle === true` 时只隐藏通用 `title` 展示列;`false` 或未配置时正常展示。`title` 数据参与排序、详情和保存,详情入口保留在项目名称和固定操作列。筛选清单根据当前 View 的字段配置和类型自动生成,文本类字段使用模糊匹配,选择/布尔字段使用枚举值,日期使用当天范围,数字使用精确值,引用/用户字段使用 ID;用户填写或选择条件后点击“查询”才提交,所有字段筛选与分页均通过 `POST /record/query` 远程执行,浏览器不再加载全部记录后本地过滤。
切换 Grid View 时立即切换当前视图、清空跨视图选择并回到第一页,同时重新读取 Subject、视图配置和 `/record/query` 数据;不再额外写死项目状态筛选,当前视图配置包含该字段时才自动生成对应的选择筛选,视图标签仍用于切换服务端配置的视图限制;刷新期间不展示上一次请求的记录行,表格在当前可视区域中心显示加载状态,失败时保留错误反馈并清空不可确认的旧数据。
项目列表表格使用限定高度的内部滚动区域,支持纵向和横向滚动;表头在表格滚动区域内吸顶,分页位于滚动区域外,避免页面因记录行过多持续向下延伸。
View 中兼容历史字段 `metadata.project_finish_time` 时按数据定义显示为“项目完成时间”;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment