Commit 7818b2e9 authored by drigle's avatar drigle

fix: respect template shortTitle in record details

parent e207276e
......@@ -57,6 +57,7 @@ const RecordDetailDrawer = (props, ref) => {
preferredViewName,
disabledFields = EMPTY_ARRAY,
authorizationView = null,
templateView = authorizationView,
deriveFieldValues,
} = props;
......@@ -163,7 +164,14 @@ const RecordDetailDrawer = (props, ref) => {
[activeTabKey],
);
const activeView = detailViews.find((view) => view.name === activeTabKey) || detailViews[0];
const activeDetailView = detailViews.find((view) => view.name === activeTabKey) || detailViews[0];
const activeView = useMemo(() => ({
...activeDetailView,
settings: {
...activeDetailView?.settings,
shortTitle: shouldHideViewTitleColumn(activeDetailView, templateView),
},
}), [activeDetailView, templateView]);
const hideRecordTitle = shouldHideViewTitleColumn(activeView);
const isRecordLocked = remoteRecord?.metadata?.is_locked === true;
const effectiveReadonly = readonly || isRecordLocked;
......@@ -196,8 +204,13 @@ const RecordDetailDrawer = (props, ref) => {
!NON_EDITABLE_FIELD_TYPES.has(field.fieldDef?.type) &&
!isDrawerFieldDisabled(field.field, activeView),
);
const hasDirtyFields = Object.keys(dirtyFields).length > 0;
const hasValidationErrors = Object.values(validationErrors).some(Boolean);
const changesToSave = Object.values(dirtyFields).filter(
(change) => !hideRecordTitle || change.fieldPath !== 'title',
);
const hasDirtyFields = changesToSave.length > 0;
const hasValidationErrors = Object.entries(validationErrors).some(
([fieldPath, message]) => Boolean(message) && (!hideRecordTitle || fieldPath !== 'title'),
);
const displayedRecord = isEditing ? draftRecord || editableRecord : editableRecord;
const resetEditSession = () => {
......@@ -229,7 +242,11 @@ const RecordDetailDrawer = (props, ref) => {
};
const handleDraftFieldChange = (fieldPath, newValue, fieldDef, editSessionId) => {
if (!isEditing || editSessionId !== editSessionRef.current) return;
if (
!isEditing ||
editSessionId !== editSessionRef.current ||
(hideRecordTitle && fieldPath === 'title')
) return;
setDraftRecord((currentRecord) =>
setFieldValue(currentRecord || editableRecord, fieldPath, newValue),
......@@ -326,7 +343,7 @@ const RecordDetailDrawer = (props, ref) => {
}
}
await handleFieldsUpdate(Object.values(dirtyFields));
await handleFieldsUpdate(changesToSave);
setIsEditing(false);
setDirtyFields({});
setValidationErrors({});
......
......@@ -318,6 +318,7 @@ export default function ControlMeasureFormPage() {
open={open}
recordName={recordName}
subjectName={workspace?.subjectName}
templateView={workspace?.view}
onClose={onClose}
onDataChange={onDataChange}
readonly={!canEdit}
......
......@@ -35,9 +35,13 @@
6. 页面请求必须展示加载、成功和错误状态;删除与替换导入必须提供确认。删除确认弹窗
仅展示选中记录数量和软删除说明,不展示记录标题列表。
7. Grid View 的 `settings.shortTitle === true` 时隐藏列表 `title` 展示列及新建/编辑弹窗中的根级
“记录标题”输入框;此时不校验、不提交根级 `title`。Detail View 的同名配置同时隐藏详情
Header 的记录标题和字段区 `title`。`false` 或未配置时正常显示并保留标题必填逻辑。该配置
不删除已有标题数据,也不改变标题搜索、排序、筛选或详情身份。
“记录标题”输入框;此时不校验、不提交根级 `title`。从列表或填写表打开详情弹窗时,优先读取
当前 Detail View 的显式 `settings.shortTitle`;Detail 未配置或使用“基础信息”兜底视图时,
沿用入口当前模板的配置,与新建记录保持一致。最终配置为 `true` 时,同时隐藏详情 Header
的记录标题、字段区 `title` 及其编辑控件;编辑按钮只计算实际可编辑的业务字段,保存时跳过
标题校验和根级 `title` 提交。编辑中切换至隐藏标题的 Detail 时,暂存的标题修改不会提交,
标题校验错误也不会阻止其他字段保存。显式 `false` 覆盖入口模板的隐藏设置;两处都未配置
时正常显示标题。该配置不删除已有标题数据,也不改变标题搜索、排序、筛选或详情身份。
8. Subject 配置为多选的选择字段,在新建弹窗和详情编辑中使用可搜索的下拉勾选器;
已选项以标签展示并支持逐项移除或清空,保存值仍为 `settings.options` 中的 value 数组。
用户字段和引用字段进入详情编辑、弹窗编辑或筛选选择器时,若当前已保存 ID 不在首屏下拉
......
......@@ -469,8 +469,8 @@ export function normalizeRecordLabel(value) {
return normalizeText(value);
}
export function shouldHideViewTitleColumn(view) {
return view?.settings?.shortTitle === true;
export function shouldHideViewTitleColumn(view, fallbackView = null) {
return (view?.settings?.shortTitle ?? fallbackView?.settings?.shortTitle) === true;
}
export function buildViewColumns(view, subject, { includeHidden = false } = {}) {
......
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