Skip to content

详情页被跨对象分栏状态污染后自动跳转为分栏模式 #8345

Description

@yinlianghui

问题描述

普通对象详情页会被其他对象的分栏状态污染。用户只在 company 对象上切换过分栏模式后,再次进入未启用分栏的 spaces 详情页时,URL 会被自动补全为带 side_object=spaces&side_listview_id=all 的三栏 URL,导致详情页错误进入分栏模式,中间栏渲染 spaces 列表。

重现步骤

  1. 访问 http://127.0.0.1:5100/app/admin/company,默认进入二栏列表。
  2. 点击工具栏切换为“分栏模式”,URL 变为类似:
    http://127.0.0.1:5100/app/admin/company/view/none?side_object=company&side_listview_id=all&additionalFilters=
  3. 点击左侧菜单“公司”(spaces 对象),进入:
    http://127.0.0.1:5100/app/admin/spaces/view/<recordId>,首次显示正常二栏详情。
  4. 点击左侧菜单“分部”(company 对象,仍为分栏模式列表)。
  5. 再次点击左侧菜单“公司”(spaces 对象)。

实际结果

第 5 步后 URL 被自动改写为类似:

/app/admin/spaces/view/<recordId>?side_object=spaces&side_listview_id=all&additionalFilters=

同时 sessionStorage.tab_spaces_display 被写入 splitspaces 详情页错误进入分栏模式,中间栏显示 spaces 列表。

期望结果

spaces 对象未配置 enable_split: true,且用户没有明确要求 spaces 使用分栏模式。因此无论 company 对象是否切过分栏,spaces 菜单都应稳定显示普通二栏详情页,不应自动追加 side_object 参数,也不应写入 tab_spaces_display=split

初步根因

本问题由两个行为叠加触发:

  1. Steedos.Page.getDisplay(objectName) 会把 URL 上的 display 状态写入 sessionStorage.tab_${objectName}_display,需要避免在渲染其他对象/内嵌对象时把当前页面分栏状态写到错误对象。
  2. ObjectDetail 在 split 状态且 URL 缺少 side_object 时会自动补全三栏 URL。该逻辑如果只依据 Steedos.Page.getDisplay(objectName),就会被已污染的 sessionStorage 触发,把未启用分栏的对象详情页强制改写为分栏 URL。

引入提交与关联问题

本次现象中的“详情页自动补全三栏 URL”由以下提交引入:

该提交的目标是修复审批中心三栏模式下,ObjectDetail 缺少 side_object / side_listview_id / additionalFilters 时导致跨对象切换异常的问题。因此修复当前 bug 时必须把 #8335 作为回归场景。

回归测试清单

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions