diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx
index acda888..23891c7 100644
--- a/src/renderer/App.tsx
+++ b/src/renderer/App.tsx
@@ -114,6 +114,7 @@ import {
projectAccountRows,
resolveHistoryRetentionSelection,
sortAccountRows,
+ formatAccountContextHeading,
type AccountAddOption,
type AccountRowSource,
type SettingsFormViewModel,
@@ -5982,8 +5983,7 @@ export function App(): ReactElement {
y={accountContextMenu.y}
>
- {activeAccountContextRow.hosterLabel}
- {activeAccountContextRow.modeLabel} · {activeAccountContextRow.username}
+ {formatAccountContextHeading(activeAccountContextRow.hosterLabel, activeAccountContextRow.modeLabel)}
+ onClick={(event) => {
+ event.stopPropagation();
+ const rect = event.currentTarget.getBoundingClientRect();
+ actions.onContextMenu(row.id, rect.right, rect.bottom);
+ }}
+ onDoubleClick={(event) => event.stopPropagation()}
+ type="button"
+ >⋯
);
diff --git a/src/renderer/views/settings/settings-model.ts b/src/renderer/views/settings/settings-model.ts
index 0c2b8a6..a410d21 100644
--- a/src/renderer/views/settings/settings-model.ts
+++ b/src/renderer/views/settings/settings-model.ts
@@ -72,6 +72,10 @@ export function getAccountTableMinWidth(widths: AccountTableColumnWidths): numbe
return 42 + 64 + ACCOUNT_TABLE_COLUMN_IDS.reduce((sum, id) => sum + widths[id], 0);
}
+export function formatAccountContextHeading(hoster: string, mode: string): string {
+ return `${hoster} | ${mode}`;
+}
+
export function getSettingsSaveLabel(state: SettingsSaveState): string {
switch (state) {
case "dirty":
diff --git a/tests/settings-view.test.tsx b/tests/settings-view.test.tsx
index a4c41b6..93aed37 100644
--- a/tests/settings-view.test.tsx
+++ b/tests/settings-view.test.tsx
@@ -794,6 +794,7 @@ describe("account workspace", () => {
checkbox.props.onChange();
row.props.onDoubleClick();
actionButton.props.onClick({ stopPropagation: () => {}, currentTarget: { getBoundingClientRect: () => ({ right: 20, bottom: 30 }) } });
+ actionButton.props.onDoubleClick({ stopPropagation: () => calls.push("action-double-click-stopped") });
expect(calls).toEqual([
`select:${rowId}:false`,
@@ -801,10 +802,21 @@ describe("account workspace", () => {
`select:${rowId}:false`,
`toggle:${rowId}`,
`edit:${rowId}`,
- `context:${rowId}`
+ `context:${rowId}`,
+ "action-double-click-stopped"
]);
});
+ it("formats the account action heading as hoster and access type without a dangling marker", () => {
+ const api = settingsModel as typeof settingsModel & {
+ formatAccountContextHeading?: (hoster: string, mode: string) => string;
+ };
+
+ expect(api.formatAccountContextHeading).toBeTypeOf("function");
+ expect(api.formatAccountContextHeading?.("Debrid-Link", "API")).toBe("Debrid-Link | API");
+ expect(api.formatAccountContextHeading?.("Mega-Debrid", "Web-Login")).toBe("Mega-Debrid | Web-Login");
+ });
+
it("shows the selected account count", () => {
const model = workspaceModel();
const tree = AccountWorkspace({