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