Commit 1425776f authored by drigle's avatar drigle

fix: honor shortTitle in record dialog

parent 1b7e20fc
......@@ -23,6 +23,7 @@ import {
getViewRestrictionDefaults,
normalizeProjectYearDisplay,
normalizeValueForSubmit,
shouldHideViewTitleColumn,
toArray,
} from '@/utils/subjectView';
import { Delete } from '@/components/AppIcons';
......@@ -110,10 +111,13 @@ function getDialogColumns(subject, view) {
);
}
// shortTitle only controls the grid title presentation. Keep an explicitly configured
// title field available here so its requiredness can still follow the view config.
const hideTitleColumn = shouldHideViewTitleColumn(view);
const columns = buildViewColumns(view, subject, { includeHidden: true })
.filter((column) => column?.field && !column.hide)
.filter((column) => (
column?.field &&
!column.hide &&
(!hideTitleColumn || column.field !== 'title')
))
.map((column) => {
if (column.field !== 'title') return column;
return {
......@@ -590,6 +594,7 @@ export default function DynamicRecordDialog({
const [saving, setSaving] = useState(false);
const [error, setError] = useState('');
const editing = Boolean(record);
const hideTitle = shouldHideViewTitleColumn(view);
const dialogColumns = useMemo(
() => getDialogColumns(subject, view),
[subject, view],
......@@ -660,7 +665,7 @@ export default function DynamicRecordDialog({
};
if (titleColumn && title.trim()) {
payload.title = title.trim();
} else if (restrictionDefaults.title !== undefined) {
} else if (!hideTitle && restrictionDefaults.title !== undefined) {
payload.title = restrictionDefaults.title;
}
await createRecord(payload);
......
......@@ -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`,`title` 数据仍可参与排序、详情和其他保存流程,详情入口保留在项目名称和固定操作列。筛选清单根据当前 View 的字段配置和类型自动生成,文本类字段使用模糊匹配,选择/布尔字段使用枚举值,日期使用当天范围,数字使用精确值,引用/用户字段使用 ID;用户填写或选择条件后点击“查询”才提交,所有字段筛选与分页均通过 `POST /record/query` 远程执行,浏览器不再加载全部记录后本地过滤。
切换 Grid View 时立即切换当前视图、清空跨视图选择并回到第一页,同时重新读取 Subject、视图配置和 `/record/query` 数据;不再额外写死项目状态筛选,当前视图配置包含该字段时才自动生成对应的选择筛选,视图标签仍用于切换服务端配置的视图限制;刷新期间不展示上一次请求的记录行,表格在当前可视区域中心显示加载状态,失败时保留错误反馈并清空不可确认的旧数据。
项目列表表格使用限定高度的内部滚动区域,支持纵向和横向滚动;表头在表格滚动区域内吸顶,分页位于滚动区域外,避免页面因记录行过多持续向下延伸。
View 中兼容历史字段 `metadata.project_finish_time` 时按数据定义显示为“项目完成时间”;
......@@ -35,7 +35,7 @@
3. 新建和编辑时业务字段统一写入 `metadata`;引用和用户字段只提交 ID,日期提交 ISO 8601。
4. 编辑模式下主键字段禁用;必填字段按 Subject 配置校验。
5. 新建与编辑弹窗的空控件按可见字段标签显示输入、选择或搜索提示;提示仅用于界面引导,不参与校验,也不写入提交数据。
新建弹窗按当前 Grid View 的列配置决定字段可见性,并按 `settings.groups` 的子字段顺序排列;根记录标题仅在 View 配置了标题列时展示,是否必填由该列配置决定。创建时未填写的可选标题不写入空字符串。`form` 类型字段复用详情侧栏的动态表单编辑器,支持模板、分组和数据行维护,不再以 JSON 长文本输入。
新建弹窗按当前 Grid View 的列配置决定字段可见性,并按 `settings.groups` 的子字段顺序排列;根记录标题仅在 View 配置了标题列且 `settings.shortTitle !== true` 时展示,是否必填由该列配置决定。隐藏标题时创建不写入根级 `title`;创建时未填写的可选标题也不写入空字符串。`form` 类型字段复用详情侧栏的动态表单编辑器,支持模板、分组和数据行维护,不再以 JSON 长文本输入。
从当前 Grid View 新建记录时,系统同时读取 `settings.restrictions` 中的字段约束;对于 `$eq` 或单值 `$in` 约束,自动把唯一值写入新记录的 `metadata`(约束字段在创建过程中不可修改,即使未配置为弹窗列也会写入)。多值集合或否定比较无法确定唯一归属时阻止创建并提示调整视图配置;编辑已有记录时保留记录原值,不用视图约束覆盖。
6. 删除调用 `POST /record/batch/remove`,默认软删除;列表行内不提供编辑、复制或归档按钮,字段维护统一从详情侧栏进入。
7. 详情弹窗按符合条件的 detail 视图显示字段,并支持字段内联维护;当前 Detail View 的
......
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