Compare commits

...

1 Commits

Author SHA1 Message Date
J
846b7d8823 fix(issues): replace nested "More" action submenu with "Relations" (MUL-3972)
The issue action menu (3-dot / right-click) nested a "More" submenu inside the
already-open menu, so opening the menu surfaced yet another "More" — the first
level told you nothing about what was inside.

Rename that submenu to the semantically explicit "Relations" (关系 / 関係 / 관계)
with a Network icon, matching the noun-labelled pattern of the sibling submenus
(Status, Priority, Start date, Due date). Its contents are unchanged — create/add
sub-issue and set/remove parent — and stay grouped so future relation types
(blocks, duplicates, related) have a home.

- Rename i18n key actions.more -> actions.relations across en/zh-Hans/ja/ko
- Swap MoreHorizontal icon for Network
- Update the shared menu test

Co-authored-by: multica-agent <github@multica.ai>
2026-07-02 16:00:03 +08:00
6 changed files with 16 additions and 14 deletions

View File

@@ -163,9 +163,9 @@ describe("IssueActionsDropdown", () => {
expect(screen.getByText("Assignee")).toBeInTheDocument();
expect(screen.getByText("Due date")).toBeInTheDocument();
expect(screen.getByText("Copy link")).toBeInTheDocument();
expect(screen.getByText("More")).toBeInTheDocument();
expect(screen.getByText("Relations")).toBeInTheDocument();
expect(screen.getByText("Delete issue")).toBeInTheDocument();
// Relationship actions are hidden inside the "More" submenu by default.
// Relationship actions are hidden inside the "Relations" submenu by default.
expect(screen.queryByText("Create sub-issue")).not.toBeInTheDocument();
expect(screen.queryByText("Set parent issue...")).not.toBeInTheDocument();
expect(screen.queryByText("Add sub-issue...")).not.toBeInTheDocument();
@@ -194,7 +194,7 @@ describe("IssueActionsDropdown", () => {
expect(await screen.findByText("Test User")).toBeInTheDocument();
});
it("shows 'Remove parent issue' in the More submenu only when the issue has a parent", async () => {
it("shows 'Remove parent issue' in the Relations submenu only when the issue has a parent", async () => {
const childIssue = { ...mockIssue, parent_issue_id: "parent-1" } as Issue;
render(
wrap(
@@ -206,7 +206,7 @@ describe("IssueActionsDropdown", () => {
);
fireEvent.click(screen.getByTestId("trigger"));
fireEvent.click(await screen.findByText("More"));
fireEvent.click(await screen.findByText("Relations"));
expect(await screen.findByText("Remove parent issue")).toBeInTheDocument();
});
@@ -222,7 +222,7 @@ describe("IssueActionsDropdown", () => {
);
fireEvent.click(screen.getByTestId("trigger"));
fireEvent.click(await screen.findByText("More"));
fireEvent.click(await screen.findByText("Relations"));
// The sibling "Set parent issue..." proves the submenu opened.
expect(await screen.findByText("Set parent issue...")).toBeInTheDocument();

View File

@@ -10,7 +10,7 @@ import {
CalendarClock,
FolderOpen,
Link2,
MoreHorizontal,
Network,
Pin,
PinOff,
Plus,
@@ -270,12 +270,14 @@ export function IssueActionsMenuItems({
<P.Separator />
{/* Relationship actions live under "More" — they're lower-frequency and
will grow (blocks, duplicates, related) as we add more relation types. */}
{/* Relationship actions live under "Relations" — a semantically explicit
label (unlike the old "More") so the first level tells you what the
submenu does. Holds parent/sub-issue links today, and will grow
(blocks, duplicates, related) as we add more relation types. */}
<P.Sub>
<P.SubTrigger>
<MoreHorizontal className="h-3.5 w-3.5" />
{t(($) => $.actions.more)}
<Network className="h-3.5 w-3.5" />
{t(($) => $.actions.relations)}
</P.SubTrigger>
<P.SubContent>
<P.Item onClick={openCreateSubIssue}>

View File

@@ -432,7 +432,7 @@
"unpin_from_sidebar": "Unpin from sidebar",
"copy_link": "Copy link",
"copy_workdir_path": "Copy local workdir path",
"more": "More",
"relations": "Relations",
"create_sub_issue": "Create sub-issue",
"set_parent_issue": "Set parent issue...",
"remove_parent_issue": "Remove parent issue",

View File

@@ -412,7 +412,7 @@
"unpin_from_sidebar": "サイドバーのピン留めを解除",
"copy_link": "リンクをコピー",
"copy_workdir_path": "ローカルの作業ディレクトリのパスをコピー",
"more": "その他",
"relations": "関係",
"create_sub_issue": "サブイシューを作成",
"set_parent_issue": "親イシューを設定...",
"remove_parent_issue": "親イシューを解除",

View File

@@ -412,7 +412,7 @@
"unpin_from_sidebar": "사이드바 고정 해제",
"copy_link": "링크 복사",
"copy_workdir_path": "로컬 작업 디렉터리 경로 복사",
"more": "더 보기",
"relations": "관계",
"create_sub_issue": "하위 이슈 만들기",
"set_parent_issue": "상위 이슈 설정...",
"remove_parent_issue": "상위 이슈 제거",

View File

@@ -412,7 +412,7 @@
"unpin_from_sidebar": "从侧边栏取消固定",
"copy_link": "复制链接",
"copy_workdir_path": "复制本地 workdir 路径",
"more": "更多",
"relations": "关系",
"create_sub_issue": "创建子 issue",
"set_parent_issue": "设置父 issue...",
"remove_parent_issue": "移除父 issue",