问题描述
普通对象详情页会被其他对象的分栏状态污染。用户只在 company 对象上切换过分栏模式后,再次进入未启用分栏的 spaces 详情页时,URL 会被自动补全为带 side_object=spaces&side_listview_id=all 的三栏 URL,导致详情页错误进入分栏模式,中间栏渲染 spaces 列表。
重现步骤
访问 http://127.0.0.1:5100/app/admin/company,默认进入二栏列表。
点击工具栏切换为“分栏模式”,URL 变为类似:
http://127.0.0.1:5100/app/admin/company/view/none?side_object=company&side_listview_id=all&additionalFilters=
点击左侧菜单“公司”(spaces 对象),进入:
http://127.0.0.1:5100/app/admin/spaces/view/<recordId>,首次显示正常二栏详情。
点击左侧菜单“分部”(company 对象,仍为分栏模式列表)。
再次点击左侧菜单“公司”(spaces 对象)。
实际结果
第 5 步后 URL 被自动改写为类似:
/app/admin/spaces/view/<recordId>?side_object=spaces&side_listview_id=all&additionalFilters=
同时 sessionStorage.tab_spaces_display 被写入 split,spaces 详情页错误进入分栏模式,中间栏显示 spaces 列表。
期望结果
spaces 对象未配置 enable_split: true,且用户没有明确要求 spaces 使用分栏模式。因此无论 company 对象是否切过分栏,spaces 菜单都应稳定显示普通二栏详情页,不应自动追加 side_object 参数,也不应写入 tab_spaces_display=split。
初步根因
本问题由两个行为叠加触发:
Steedos.Page.getDisplay(objectName) 会把 URL 上的 display 状态写入 sessionStorage.tab_${objectName}_display,需要避免在渲染其他对象/内嵌对象时把当前页面分栏状态写到错误对象。
ObjectDetail 在 split 状态且 URL 缺少 side_object 时会自动补全三栏 URL。该逻辑如果只依据 Steedos.Page.getDisplay(objectName),就会被已污染的 sessionStorage 触发,把未启用分栏的对象详情页强制改写为分栏 URL。
引入提交与关联问题
本次现象中的“详情页自动补全三栏 URL”由以下提交引入:
该提交的目标是修复审批中心三栏模式下,ObjectDetail 缺少 side_object / side_listview_id / additionalFilters 时导致跨对象切换异常的问题。因此修复当前 bug 时必须把 #8335 作为回归场景。
回归测试清单
当前 bug:按上述步骤从 company 分栏切到未启用分栏的 spaces 详情页,URL 不应自动追加 side_object=spaces,页面保持二栏详情。
当前 bug:sessionStorage.getItem('tab_spaces_display') 不应因 company 分栏页面被写成 split。
ObjectDetail 组件在三栏模式下缺少 URL 参数时未做自动补全,导致审批列表跨对象切换异常 #8335 回归:审批对象 instance_tasks / instances 配置了 enable_split: true,访问缺少三栏 query 的审批详情 URL 后,仍应自动补全 side_object / side_listview_id / additionalFilters,跨对象菜单切换正常发起数据请求。
ObjectDetail 组件在三栏模式下缺少 URL 参数时未做自动补全,导致审批列表跨对象切换异常 #8335 回归:审批中心从 instance_tasks 跨对象切到 instances 时,列表视图、宽度、隐藏视图下拉等定制行为保持正常。
普通对象回归:用户在某个对象上显式点击工具栏切换分栏后,该对象自身的分栏持久化仍正常;切换到其他对象时不污染其他对象的 display 状态。
问题描述
普通对象详情页会被其他对象的分栏状态污染。用户只在
company对象上切换过分栏模式后,再次进入未启用分栏的spaces详情页时,URL 会被自动补全为带side_object=spaces&side_listview_id=all的三栏 URL,导致详情页错误进入分栏模式,中间栏渲染spaces列表。重现步骤
http://127.0.0.1:5100/app/admin/company,默认进入二栏列表。http://127.0.0.1:5100/app/admin/company/view/none?side_object=company&side_listview_id=all&additionalFilters=spaces对象),进入:http://127.0.0.1:5100/app/admin/spaces/view/<recordId>,首次显示正常二栏详情。company对象,仍为分栏模式列表)。spaces对象)。实际结果
第 5 步后 URL 被自动改写为类似:
/app/admin/spaces/view/<recordId>?side_object=spaces&side_listview_id=all&additionalFilters=同时
sessionStorage.tab_spaces_display被写入split,spaces详情页错误进入分栏模式,中间栏显示spaces列表。期望结果
spaces对象未配置enable_split: true,且用户没有明确要求spaces使用分栏模式。因此无论company对象是否切过分栏,spaces菜单都应稳定显示普通二栏详情页,不应自动追加side_object参数,也不应写入tab_spaces_display=split。初步根因
本问题由两个行为叠加触发:
Steedos.Page.getDisplay(objectName)会把 URL 上的display状态写入sessionStorage.tab_${objectName}_display,需要避免在渲染其他对象/内嵌对象时把当前页面分栏状态写到错误对象。ObjectDetail在 split 状态且 URL 缺少side_object时会自动补全三栏 URL。该逻辑如果只依据Steedos.Page.getDisplay(objectName),就会被已污染的 sessionStorage 触发,把未启用分栏的对象详情页强制改写为分栏 URL。引入提交与关联问题
本次现象中的“详情页自动补全三栏 URL”由以下提交引入:
该提交的目标是修复审批中心三栏模式下,
ObjectDetail缺少side_object/side_listview_id/additionalFilters时导致跨对象切换异常的问题。因此修复当前 bug 时必须把 #8335 作为回归场景。回归测试清单
company分栏切到未启用分栏的spaces详情页,URL 不应自动追加side_object=spaces,页面保持二栏详情。sessionStorage.getItem('tab_spaces_display')不应因company分栏页面被写成split。instance_tasks/instances配置了enable_split: true,访问缺少三栏 query 的审批详情 URL 后,仍应自动补全side_object/side_listview_id/additionalFilters,跨对象菜单切换正常发起数据请求。instance_tasks跨对象切到instances时,列表视图、宽度、隐藏视图下拉等定制行为保持正常。