From 1b6892ffa0bc106bb3e27a65423f0622400a5fb6 Mon Sep 17 00:00:00 2001 From: Satya Patel Date: Tue, 29 Sep 2026 20:32:24 -0700 Subject: [PATCH] feat(desktop): give page links their own click tiers in Files & Editor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pages had a single "Pages" select under Browser that only the workspace Pages menu read. Page URLs clicked in terminals, chat, markdown, and page panes fell through to the URL links tier map, so there was no way to make pages open differently from ordinary URLs. - Replace pageOpenAction with a pageLinks tier map (defaults match URL links, so behavior is unchanged until edited). - Add "Opening pages → Page links" to Files & Editor; drop the Browser row. - useUrlLinkAction picks the page or URL map per clicked link; terminal click + hover label, page panes, TipTap markdown, and MarkdownEditor use it. - Pages menu resolves through the page map, falling back to a split pane when a tier is unbound; "external" opens the page URL in the system browser. --- .../MarkdownEditor/MarkdownEditor.tsx | 6 +- .../TipTapMarkdownRenderer.tsx | 14 +- .../resolveLinkClick.ts | 6 +- .../useV2UserPreferences.ts | 29 ++-- .../src/renderer/lib/clickPolicy/index.ts | 7 +- .../lib/clickPolicy/policies/policy.ts | 2 +- .../policies/useInlineUrlPolicy.ts | 5 - .../lib/clickPolicy/policies/usePagePolicy.ts | 6 + .../policies/useTerminalUrlPolicy.ts | 5 - .../clickPolicy/policies/useUrlLinkAction.ts | 22 ++++ .../WorkspacePagesMenu/WorkspacePagesMenu.tsx | 28 ++-- .../components/PagePane/PagePane.tsx | 6 +- .../components/TerminalPane/TerminalPane.tsx | 15 ++- .../useWorkspacePaneOpeners.ts | 14 +- .../v2-workspace/$workspaceId/page.tsx | 1 - .../dashboardSidebarLocal/schema.ts | 7 +- .../BrowserSettings/BrowserSettings.tsx | 10 +- .../BrowserLinkSettings.tsx | 124 ++++++------------ .../FilesSettings/FilesSettings.tsx | 38 +++++- .../utils/settings-search/settings-search.ts | 16 ++- packages/i18n/locales/cs/messages.po | 12 +- packages/i18n/locales/de/messages.po | 12 +- packages/i18n/locales/en/messages.po | 12 +- packages/i18n/locales/es/messages.po | 12 +- packages/i18n/locales/fr/messages.po | 12 +- packages/i18n/locales/id/messages.po | 12 +- packages/i18n/locales/it/messages.po | 12 +- packages/i18n/locales/ja/messages.po | 12 +- packages/i18n/locales/ko/messages.po | 12 +- packages/i18n/locales/nl/messages.po | 12 +- packages/i18n/locales/pl/messages.po | 12 +- packages/i18n/locales/pt-BR/messages.po | 12 +- packages/i18n/locales/ru/messages.po | 12 +- packages/i18n/locales/tr/messages.po | 12 +- packages/i18n/locales/vi/messages.po | 12 +- packages/i18n/locales/zh-CN/messages.po | 12 +- packages/i18n/locales/zh-TW/messages.po | 12 +- 37 files changed, 330 insertions(+), 235 deletions(-) delete mode 100644 apps/desktop/src/renderer/lib/clickPolicy/policies/useInlineUrlPolicy.ts create mode 100644 apps/desktop/src/renderer/lib/clickPolicy/policies/usePagePolicy.ts delete mode 100644 apps/desktop/src/renderer/lib/clickPolicy/policies/useTerminalUrlPolicy.ts create mode 100644 apps/desktop/src/renderer/lib/clickPolicy/policies/useUrlLinkAction.ts diff --git a/apps/desktop/src/renderer/components/MarkdownEditor/MarkdownEditor.tsx b/apps/desktop/src/renderer/components/MarkdownEditor/MarkdownEditor.tsx index acdbb0507c8..b3ff6adc488 100644 --- a/apps/desktop/src/renderer/components/MarkdownEditor/MarkdownEditor.tsx +++ b/apps/desktop/src/renderer/components/MarkdownEditor/MarkdownEditor.tsx @@ -40,7 +40,7 @@ import { BubbleMenu } from "@tiptap/react/menus"; import { common, createLowlight } from "lowlight"; import { type MutableRefObject, useEffect, useRef } from "react"; import { BubbleMenuToolbar } from "renderer/components/MarkdownRenderer/components/TipTapMarkdownRenderer/components/BubbleMenuToolbar"; -import { useInlineUrlPolicy } from "renderer/lib/clickPolicy"; +import { useUrlLinkAction } from "renderer/lib/clickPolicy"; import { SafeLink, verbatimStringAttributes, @@ -271,7 +271,7 @@ export function MarkdownEditor({ onEnterSubmitRef.current = onEnterSubmit; const editorRef = useRef(null); - const urlPolicy = useInlineUrlPolicy(); + const getUrlAction = useUrlLinkAction("2-tier"); const editor = useEditor({ editable, @@ -474,7 +474,7 @@ export function MarkdownEditor({ // No pane context here, so "pane" and "external" both route to the // system browser. Null means do nothing — fall through to ProseMirror // so the user can still click into the link to place a cursor. - if (urlPolicy.getAction(event) === null) return false; + if (getUrlAction(event, href) === null) return false; event.preventDefault(); electronTrpcClient.external.openUrl.mutate(href).catch((error) => { console.error("[MarkdownEditor] Failed to open URL:", href, error); diff --git a/apps/desktop/src/renderer/components/MarkdownRenderer/components/TipTapMarkdownRenderer/TipTapMarkdownRenderer.tsx b/apps/desktop/src/renderer/components/MarkdownRenderer/components/TipTapMarkdownRenderer/TipTapMarkdownRenderer.tsx index 9cfe325895b..736f7f5c495 100644 --- a/apps/desktop/src/renderer/components/MarkdownRenderer/components/TipTapMarkdownRenderer/TipTapMarkdownRenderer.tsx +++ b/apps/desktop/src/renderer/components/MarkdownRenderer/components/TipTapMarkdownRenderer/TipTapMarkdownRenderer.tsx @@ -6,11 +6,7 @@ import { EditorState } from "@tiptap/pm/state"; import { type Editor, EditorContent, useEditor } from "@tiptap/react"; import { BubbleMenu } from "@tiptap/react/menus"; import { type MutableRefObject, useEffect, useRef } from "react"; -import { - type LinkAction, - useInlineUrlPolicy, - useTerminalUrlPolicy, -} from "renderer/lib/clickPolicy"; +import { type LinkAction, useUrlLinkAction } from "renderer/lib/clickPolicy"; import { electronTrpcClient } from "renderer/lib/trpc-client"; import { useMarkdownStyle } from "renderer/stores"; import { defaultConfig } from "../../styles/default/config"; @@ -154,10 +150,10 @@ export function TipTapMarkdownRenderer({ const onSaveRef = useRef(onSave); const sourceTrackingRef = useRef(null); - const paneUrlPolicy = useTerminalUrlPolicy(); - const inlineUrlPolicy = useInlineUrlPolicy(); + const getPaneUrlAction = useUrlLinkAction("4-tier"); + const getInlineUrlAction = useUrlLinkAction("2-tier"); const linkClickRef = useRef({ - getAction: inlineUrlPolicy.getAction, + getAction: getInlineUrlAction, onOpenUrl, onUnboundLinkClick, }); @@ -165,7 +161,7 @@ export function TipTapMarkdownRenderer({ onChangeRef.current = onChange; onSaveRef.current = onSave; linkClickRef.current = { - getAction: (onOpenUrl ? paneUrlPolicy : inlineUrlPolicy).getAction, + getAction: onOpenUrl ? getPaneUrlAction : getInlineUrlAction, onOpenUrl, onUnboundLinkClick, }; diff --git a/apps/desktop/src/renderer/components/MarkdownRenderer/components/TipTapMarkdownRenderer/resolveLinkClick.ts b/apps/desktop/src/renderer/components/MarkdownRenderer/components/TipTapMarkdownRenderer/resolveLinkClick.ts index f53e8d73b35..f37ba427a3d 100644 --- a/apps/desktop/src/renderer/components/MarkdownRenderer/components/TipTapMarkdownRenderer/resolveLinkClick.ts +++ b/apps/desktop/src/renderer/components/MarkdownRenderer/components/TipTapMarkdownRenderer/resolveLinkClick.ts @@ -1,7 +1,7 @@ import type { - ClickPolicy, LinkAction, ModifierEvent, + UrlLinkAction, } from "renderer/lib/clickPolicy"; export interface LinkClickEvent extends ModifierEvent { @@ -18,13 +18,13 @@ const WEB_URL = /^https?:\/\//i; export function resolveLinkClick( event: LinkClickEvent, - getAction: ClickPolicy["getAction"], + getAction: UrlLinkAction, ): ResolvedLinkClick { if (event.button !== 0) return { kind: "none" }; const target = event.target as HTMLElement | null; const href = target?.closest?.("a")?.getAttribute("href"); if (!href || !WEB_URL.test(href)) return { kind: "none" }; - const action = getAction(event); + const action = getAction(event, href); if (action === null) return { kind: "unbound" }; return { kind: "open", url: href, action }; } diff --git a/apps/desktop/src/renderer/hooks/useV2UserPreferences/useV2UserPreferences.ts b/apps/desktop/src/renderer/hooks/useV2UserPreferences/useV2UserPreferences.ts index cd7179921b7..3fb12325a95 100644 --- a/apps/desktop/src/renderer/hooks/useV2UserPreferences/useV2UserPreferences.ts +++ b/apps/desktop/src/renderer/hooks/useV2UserPreferences/useV2UserPreferences.ts @@ -20,7 +20,7 @@ export interface V2UserPreferencesApi { setSidebarFileLinks: (next: LinkTierMap) => void; setFolderLinks: (next: FolderTierMap) => void; setPortOpenAction: (next: LinkAction) => void; - setPageOpenAction: (next: LinkAction) => void; + setPageLinks: (next: LinkTierMap) => void; setRightSidebarOpen: (next: boolean | ((prev: boolean) => boolean)) => void; setRightSidebarWidth: (next: number) => void; setDeleteLocalBranch: (next: boolean) => void; @@ -47,7 +47,10 @@ export function useV2UserPreferences(): V2UserPreferencesApi { const preferences = rows[0] ?? DEFAULT_V2_USER_PREFERENCES; const upsertTierMap = useCallback( - (key: "fileLinks" | "urlLinks" | "sidebarFileLinks", next: LinkTierMap) => { + ( + key: "fileLinks" | "urlLinks" | "sidebarFileLinks" | "pageLinks", + next: LinkTierMap, + ) => { const existing = collections.v2UserPreferences.get( V2_USER_PREFERENCES_ID, ); @@ -118,23 +121,9 @@ export function useV2UserPreferences(): V2UserPreferencesApi { [collections], ); - const setPageOpenAction = useCallback( - (next: LinkAction) => { - const existing = collections.v2UserPreferences.get( - V2_USER_PREFERENCES_ID, - ); - if (!existing) { - collections.v2UserPreferences.insert({ - ...DEFAULT_V2_USER_PREFERENCES, - pageOpenAction: next, - }); - return; - } - collections.v2UserPreferences.update(V2_USER_PREFERENCES_ID, (draft) => { - draft.pageOpenAction = next; - }); - }, - [collections], + const setPageLinks = useCallback( + (next: LinkTierMap) => upsertTierMap("pageLinks", next), + [upsertTierMap], ); const setRightSidebarOpen = useCallback( @@ -335,7 +324,7 @@ export function useV2UserPreferences(): V2UserPreferencesApi { setSidebarFileLinks, setFolderLinks, setPortOpenAction, - setPageOpenAction, + setPageLinks, setRightSidebarOpen, setRightSidebarWidth, setDeleteLocalBranch, diff --git a/apps/desktop/src/renderer/lib/clickPolicy/index.ts b/apps/desktop/src/renderer/lib/clickPolicy/index.ts index 5f603f8ab40..633ca690bea 100644 --- a/apps/desktop/src/renderer/lib/clickPolicy/index.ts +++ b/apps/desktop/src/renderer/lib/clickPolicy/index.ts @@ -25,14 +25,17 @@ export { export type { ClickPolicy } from "./policies/policy"; export { useChangesSidebarFilePolicy } from "./policies/useChangesSidebarFilePolicy"; export { useInlineFilePolicy } from "./policies/useInlineFilePolicy"; -export { useInlineUrlPolicy } from "./policies/useInlineUrlPolicy"; +export { usePagePolicy } from "./policies/usePagePolicy"; export { useSidebarFilePolicy } from "./policies/useSidebarFilePolicy"; export { useTerminalFilePolicy } from "./policies/useTerminalFilePolicy"; export { type FolderClickPolicy, useTerminalFolderPolicy, } from "./policies/useTerminalFolderPolicy"; -export { useTerminalUrlPolicy } from "./policies/useTerminalUrlPolicy"; +export { + type UrlLinkAction, + useUrlLinkAction, +} from "./policies/useUrlLinkAction"; export { tierFor } from "./tiers"; export type { LinkAction, diff --git a/apps/desktop/src/renderer/lib/clickPolicy/policies/policy.ts b/apps/desktop/src/renderer/lib/clickPolicy/policies/policy.ts index ead1ce3bcbc..925d40263c0 100644 --- a/apps/desktop/src/renderer/lib/clickPolicy/policies/policy.ts +++ b/apps/desktop/src/renderer/lib/clickPolicy/policies/policy.ts @@ -59,7 +59,7 @@ export function buildPolicy( }; } -type MapKey = "fileLinks" | "urlLinks" | "sidebarFileLinks"; +type MapKey = "fileLinks" | "urlLinks" | "sidebarFileLinks" | "pageLinks"; export function usePolicy( key: MapKey, diff --git a/apps/desktop/src/renderer/lib/clickPolicy/policies/useInlineUrlPolicy.ts b/apps/desktop/src/renderer/lib/clickPolicy/policies/useInlineUrlPolicy.ts deleted file mode 100644 index 98409dd9bdb..00000000000 --- a/apps/desktop/src/renderer/lib/clickPolicy/policies/useInlineUrlPolicy.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { type ClickPolicy, usePolicy } from "./policy"; - -export function useInlineUrlPolicy(): ClickPolicy { - return usePolicy("urlLinks", "url", "2-tier"); -} diff --git a/apps/desktop/src/renderer/lib/clickPolicy/policies/usePagePolicy.ts b/apps/desktop/src/renderer/lib/clickPolicy/policies/usePagePolicy.ts new file mode 100644 index 00000000000..9253fc26557 --- /dev/null +++ b/apps/desktop/src/renderer/lib/clickPolicy/policies/usePagePolicy.ts @@ -0,0 +1,6 @@ +import type { TierMode } from "../types"; +import { type ClickPolicy, usePolicy } from "./policy"; + +export function usePagePolicy(mode: TierMode): ClickPolicy { + return usePolicy("pageLinks", "url", mode); +} diff --git a/apps/desktop/src/renderer/lib/clickPolicy/policies/useTerminalUrlPolicy.ts b/apps/desktop/src/renderer/lib/clickPolicy/policies/useTerminalUrlPolicy.ts deleted file mode 100644 index 9d97f1519de..00000000000 --- a/apps/desktop/src/renderer/lib/clickPolicy/policies/useTerminalUrlPolicy.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { type ClickPolicy, usePolicy } from "./policy"; - -export function useTerminalUrlPolicy(): ClickPolicy { - return usePolicy("urlLinks", "url", "4-tier"); -} diff --git a/apps/desktop/src/renderer/lib/clickPolicy/policies/useUrlLinkAction.ts b/apps/desktop/src/renderer/lib/clickPolicy/policies/useUrlLinkAction.ts new file mode 100644 index 00000000000..ec74f7ce761 --- /dev/null +++ b/apps/desktop/src/renderer/lib/clickPolicy/policies/useUrlLinkAction.ts @@ -0,0 +1,22 @@ +import { useCallback } from "react"; +import { env } from "renderer/env.renderer"; +import { parseSupersetPageUrl } from "renderer/lib/parseSupersetPageUrl"; +import type { LinkAction, ModifierEvent, TierMode } from "../types"; +import { usePolicy } from "./policy"; + +export type UrlLinkAction = ( + event: ModifierEvent, + url: string, +) => LinkAction | null; + +export function useUrlLinkAction(mode: TierMode): UrlLinkAction { + const { getAction: getUrlAction } = usePolicy("urlLinks", "url", mode); + const { getAction: getPageAction } = usePolicy("pageLinks", "url", mode); + return useCallback( + (event, url) => + parseSupersetPageUrl(url, env.NEXT_PUBLIC_WEB_URL) === null + ? getUrlAction(event) + : getPageAction(event), + [getUrlAction, getPageAction], + ); +} diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspacePagesMenu/WorkspacePagesMenu.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspacePagesMenu/WorkspacePagesMenu.tsx index d5f427e88d4..d5f62d4436e 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspacePagesMenu/WorkspacePagesMenu.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/components/WorkspacePagesMenu/WorkspacePagesMenu.tsx @@ -5,9 +5,11 @@ import { cn } from "@superset/ui/utils"; import { useNavigate } from "@tanstack/react-router"; import { ArrowLeft, FileText, LayoutGrid, Plus } from "lucide-react"; import { type MouseEvent, useCallback, useMemo, useState } from "react"; +import { env } from "renderer/env.renderer"; import { useWorkspaceEvent } from "renderer/hooks/host-service/useWorkspaceEvent"; -import { useV2UserPreferences } from "renderer/hooks/useV2UserPreferences"; +import { usePagePolicy } from "renderer/lib/clickPolicy"; import { cloudTrpc } from "renderer/lib/cloud-trpc"; +import { electronTrpcClient } from "renderer/lib/trpc-client"; import { usePageFavorites } from "renderer/routes/_authenticated/_dashboard/hooks/usePageFavorites"; import { usePagesList } from "renderer/routes/_authenticated/_dashboard/hooks/usePagesList"; import { pagesListInput } from "renderer/routes/_authenticated/_dashboard/utils/pagesListInput"; @@ -25,7 +27,7 @@ const MENU_PAGE_LIMIT = 200; interface WorkspacePagesMenuProps { workspaceId: string; - onOpenPage: (page: PagePaneData) => void; + onOpenPage: (page: PagePaneData, placement: "split" | "tab") => void; onCreateNewAgentSession: CreateNewAgentSession; onFocusAgentTerminal: (terminalId: string) => void; } @@ -38,7 +40,7 @@ export function WorkspacePagesMenu({ }: WorkspacePagesMenuProps) { const { t } = useLingui(); const navigate = useNavigate(); - const { preferences } = useV2UserPreferences(); + const pagePolicy = usePagePolicy("4-tier"); const utils = cloudTrpc.useUtils(); const { favoritePageIds } = usePageFavorites(); const seenAt = usePagesMenuSeenAt(workspaceId); @@ -105,15 +107,21 @@ export function WorkspacePagesMenu({ const handleOpenPage = (page: MenuPage, event: MouseEvent) => { handleOpenChange(false); - const inPane = - event.metaKey || - event.ctrlKey || - preferences.pageOpenAction !== "external"; - if (inPane) { - onOpenPage({ pageId: page.id, slug: page.slug, title: page.title }); + const action = pagePolicy.getAction(event) ?? "pane"; + if (action === "external") { + const url = new URL( + `/page/${encodeURIComponent(page.slug)}`, + env.NEXT_PUBLIC_WEB_URL, + ).toString(); + electronTrpcClient.external.openUrl.mutate(url).catch((error) => { + console.error("[WorkspacePagesMenu] Failed to open page:", url, error); + }); return; } - void navigate({ to: "/pages/$slug", params: { slug: page.slug } }); + onOpenPage( + { pageId: page.id, slug: page.slug, title: page.title }, + action === "newTab" ? "tab" : "split", + ); }; return ( diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/usePaneRegistry/components/PagePane/PagePane.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/usePaneRegistry/components/PagePane/PagePane.tsx index b1be2ded2fb..63fd1c83557 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/usePaneRegistry/components/PagePane/PagePane.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/usePaneRegistry/components/PagePane/PagePane.tsx @@ -1,6 +1,6 @@ import type { RendererContext } from "@superset/panes"; import { useCallback, useRef } from "react"; -import { useTerminalUrlPolicy } from "renderer/lib/clickPolicy"; +import { useUrlLinkAction } from "renderer/lib/clickPolicy"; import { PageViewer } from "renderer/routes/_authenticated/_dashboard/components/PageViewer"; import type { PagePaneData, PaneViewerData } from "../../../../types"; import { usePagePaneUi } from "../../hooks/usePagePaneUi"; @@ -26,7 +26,7 @@ export function PagePane({ onDataChange, onFocus, }: PagePaneProps) { - const urlPolicy = useTerminalUrlPolicy(); + const getUrlAction = useUrlLinkAction("4-tier"); const { commentsEnabled, setCommentsEnabled, @@ -62,7 +62,7 @@ export function PagePane({ onLinkClick={(click) => { const action = /^(mailto:|tel:)/i.test(click.url) ? "external" - : (urlPolicy.getAction(click) ?? + : (getUrlAction(click, click.url) ?? (!click.metaKey && !click.ctrlKey && !click.shiftKey ? "pane" : null)); diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/usePaneRegistry/components/TerminalPane/TerminalPane.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/usePaneRegistry/components/TerminalPane/TerminalPane.tsx index 28f111d72a1..734b9bf6f41 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/usePaneRegistry/components/TerminalPane/TerminalPane.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/usePaneRegistry/components/TerminalPane/TerminalPane.tsx @@ -21,9 +21,10 @@ import { type FolderClickPolicy, folderIntentLabel, LinkHoverHint, + type UrlLinkAction, useTerminalFilePolicy, useTerminalFolderPolicy, - useTerminalUrlPolicy, + useUrlLinkAction, } from "renderer/lib/clickPolicy"; import { type ConnectionState, @@ -79,7 +80,7 @@ export function TerminalPane({ }: TerminalPaneProps) { const { t } = useLingui(); const filePolicy = useTerminalFilePolicy(); - const urlPolicy = useTerminalUrlPolicy(); + const getUrlAction = useUrlLinkAction("4-tier"); const folderPolicy = useTerminalFolderPolicy(); const { hoveredLink, @@ -340,7 +341,7 @@ export function TerminalPane({ ); }, onUrlClick: (event, url) => { - const action = urlPolicy.getAction(event); + const action = getUrlAction(event, url); if (action === null) { showHint(event.clientX, event.clientY); return; @@ -361,7 +362,7 @@ export function TerminalPane({ onLinkLeave, showHint, filePolicy, - urlPolicy, + getUrlAction, folderPolicy, ]); @@ -651,7 +652,7 @@ export function TerminalPane({ hoverLabel={resolveHoverLabel( hoveredLink, filePolicy, - urlPolicy, + getUrlAction, folderPolicy, worktreePath, )} @@ -670,7 +671,7 @@ export function TerminalPane({ function resolveHoverLabel( hovered: HoveredLink | null, filePolicy: ReturnType, - urlPolicy: ReturnType, + getUrlAction: UrlLinkAction, folderPolicy: FolderClickPolicy, worktreePath: string | undefined, ): string | null { @@ -681,7 +682,7 @@ function resolveHoverLabel( shiftKey: hovered.shift, }; if (hovered.info.kind === "url") { - const action = urlPolicy.getAction(event); + const action = getUrlAction(event, hovered.info.url); return action ? actionLabel(action, "url") : null; } if (hovered.info.isDirectory) { diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/useWorkspacePaneOpeners/useWorkspacePaneOpeners.ts b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/useWorkspacePaneOpeners/useWorkspacePaneOpeners.ts index 95bbc68803a..0b8a3afa8e2 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/useWorkspacePaneOpeners/useWorkspacePaneOpeners.ts +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/useWorkspacePaneOpeners/useWorkspacePaneOpeners.ts @@ -33,7 +33,6 @@ export function useWorkspacePaneOpeners({ newTabPresets, executePreset, setRightSidebarOpen, - pageOpenAction, }: { store: StoreApi>; launcher: TerminalLauncher; @@ -43,7 +42,6 @@ export function useWorkspacePaneOpeners({ options?: { target?: "new-tab" | "active-tab" }, ) => void | Promise; setRightSidebarOpen: V2UserPreferencesApi["setRightSidebarOpen"]; - pageOpenAction: V2UserPreferencesApi["preferences"]["pageOpenAction"]; }): { openDiffPane: ( filePath: string, @@ -59,7 +57,7 @@ export function useWorkspacePaneOpeners({ /** Close the visible Changes pane, or open/focus one when none is showing. */ toggleChangesPane: () => void; openCommentPane: (comment: CommentPaneData) => void; - openPagePane: (page: PagePaneData) => void; + openPagePane: (page: PagePaneData, placement: "split" | "tab") => void; /** Focus or open the pane showing the workspace's linked PR summary. */ openPullRequestPane: (ref: PullRequestRef) => void; } { @@ -229,14 +227,10 @@ export function useWorkspacePaneOpeners({ }, [store, openChangesPane]); const openPagePane = useCallback( - (page: PagePaneData) => { - openPagePaneInStore( - store, - page, - pageOpenAction === "newTab" ? "tab" : "split", - ); + (page: PagePaneData, placement: "split" | "tab") => { + openPagePaneInStore(store, page, placement); }, - [store, pageOpenAction], + [store], ); const openPullRequestPane = useCallback( diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/page.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/page.tsx index 3599401bcff..944458053f1 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/page.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/page.tsx @@ -264,7 +264,6 @@ function V2WorkspaceContent() { newTabPresets, executePreset, setRightSidebarOpen, - pageOpenAction: v2UserPreferences.pageOpenAction, }); const paneRegistry = usePaneRegistry({ onOpenDiff: openDiffPane, diff --git a/apps/desktop/src/renderer/routes/_authenticated/providers/CollectionsProvider/dashboardSidebarLocal/schema.ts b/apps/desktop/src/renderer/routes/_authenticated/providers/CollectionsProvider/dashboardSidebarLocal/schema.ts index a0756a02817..71426980261 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/providers/CollectionsProvider/dashboardSidebarLocal/schema.ts +++ b/apps/desktop/src/renderer/routes/_authenticated/providers/CollectionsProvider/dashboardSidebarLocal/schema.ts @@ -422,8 +422,6 @@ const DEFAULT_FOLDER_LINKS: FolderTierMap = { // in-app tab, "external" = system browser. const DEFAULT_PORT_OPEN_ACTION: LinkAction = "external"; -const DEFAULT_PAGE_OPEN_ACTION: LinkAction = "pane"; - function isSameLinkTierMap(a: LinkTierMap, b: LinkTierMap): boolean { return ( a.plain === b.plain && @@ -468,7 +466,7 @@ export const v2UserPreferencesSchema = z.object({ sidebarFileLinks: linkTierMapSchema.default(DEFAULT_SIDEBAR_FILE_LINKS), folderLinks: folderTierMapSchema.default(DEFAULT_FOLDER_LINKS), portOpenAction: linkActionSchema.default(DEFAULT_PORT_OPEN_ACTION), - pageOpenAction: linkActionSchema.default(DEFAULT_PAGE_OPEN_ACTION), + pageLinks: linkTierMapSchema.default(DEFAULT_URL_LINKS), terminalPresetsInitialized: z.boolean().default(false), rightSidebarOpen: z.boolean().default(true), rightSidebarTab: z.enum(["changes", "files"]).default("changes"), @@ -508,7 +506,7 @@ export const DEFAULT_V2_USER_PREFERENCES: V2UserPreferencesRow = { sidebarFileLinks: DEFAULT_SIDEBAR_FILE_LINKS, folderLinks: DEFAULT_FOLDER_LINKS, portOpenAction: DEFAULT_PORT_OPEN_ACTION, - pageOpenAction: DEFAULT_PAGE_OPEN_ACTION, + pageLinks: DEFAULT_URL_LINKS, terminalPresetsInitialized: false, rightSidebarOpen: true, rightSidebarTab: "changes", @@ -602,6 +600,7 @@ export function healV2UserPreferences(raw: unknown): V2UserPreferencesRow { sidebarFileLinks: shouldMigrateLegacySidebarFileLinks ? DEFAULT_V2_USER_PREFERENCES.sidebarFileLinks : sidebarFileLinks, + pageLinks: { ...DEFAULT_V2_USER_PREFERENCES.pageLinks, ...r.pageLinks }, folderLinks: { ...DEFAULT_V2_USER_PREFERENCES.folderLinks, ...r.folderLinks, diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/browser/components/BrowserSettings/BrowserSettings.tsx b/apps/desktop/src/renderer/routes/_authenticated/settings/browser/components/BrowserSettings/BrowserSettings.tsx index 6d6408d0faf..5c128e53600 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/browser/components/BrowserSettings/BrowserSettings.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/browser/components/BrowserSettings/BrowserSettings.tsx @@ -188,13 +188,9 @@ export function BrowserSettings({ visibleItems }: BrowserSettingsProps) { )} - {[ - SETTING_ITEM_ID.LINKS_URL, - SETTING_ITEM_ID.LINKS_PORT, - SETTING_ITEM_ID.LINKS_PAGE, - ].some((id) => isItemVisible(id, visibleItems)) && ( - - )} + {[SETTING_ITEM_ID.LINKS_URL, SETTING_ITEM_ID.LINKS_PORT].some((id) => + isItemVisible(id, visibleItems), + ) && } diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/browser/components/BrowserSettings/components/BrowserLinkSettings/BrowserLinkSettings.tsx b/apps/desktop/src/renderer/routes/_authenticated/settings/browser/components/BrowserSettings/components/BrowserLinkSettings/BrowserLinkSettings.tsx index dc5b6e45256..6fb264dccd5 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/browser/components/BrowserSettings/components/BrowserLinkSettings/BrowserLinkSettings.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/browser/components/BrowserSettings/components/BrowserLinkSettings/BrowserLinkSettings.tsx @@ -25,7 +25,6 @@ import { } from "../../../../../utils/settings-search"; const PORT_ACTIONS: LinkAction[] = ["pane", "newTab", "external"]; -const PAGE_ACTIONS: LinkAction[] = ["pane", "newTab", "external"]; interface BrowserLinkSettingsProps { visibleItems?: SettingItemId[] | null; @@ -36,11 +35,10 @@ export function BrowserLinkSettings({ }: BrowserLinkSettingsProps) { const { t } = useLingui(); const searchQuery = useSettingsSearchQuery(); - const { preferences, setUrlLinks, setPortOpenAction, setPageOpenAction } = + const { preferences, setUrlLinks, setPortOpenAction } = useV2UserPreferences(); const showUrl = isItemVisible(SETTING_ITEM_ID.LINKS_URL, visibleItems); const showPort = isItemVisible(SETTING_ITEM_ID.LINKS_PORT, visibleItems); - const showPage = isItemVisible(SETTING_ITEM_ID.LINKS_PAGE, visibleItems); const handleUrlChange = useCallback( (next: LinkTierMap) => { @@ -58,14 +56,6 @@ export function BrowserLinkSettings({ [setPortOpenAction, t], ); - const handlePageChange = useCallback( - (next: LinkAction) => { - setPageOpenAction(next); - toast.success(t({ message: "Changes saved" })); - }, - [setPageOpenAction, t], - ); - return ( <> {showUrl && ( @@ -83,85 +73,45 @@ export function BrowserLinkSettings({ surface="url" /> )} - {(showPort || showPage) && ( -
- {showPort && ( -
-
- -

- - Where detected-port badges in the sidebar open when clicked. - -

-
- + + +

+ + Where detected-port badges in the sidebar open when clicked. + +

- )} - - {showPage && ( -
-
- -

- Where pages open from a workspace's Pages menu. -

-
- handlePortChange(v as LinkAction)} + > + - - - - - {PAGE_ACTIONS.map((action) => ( - - {actionLabel(action, "url")} - - ))} - - -
- )} + + + + {PORT_ACTIONS.map((action) => ( + + {actionLabel(action, "url")} + + ))} + + +
)} diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/files/components/FilesSettings/FilesSettings.tsx b/apps/desktop/src/renderer/routes/_authenticated/settings/files/components/FilesSettings/FilesSettings.tsx index 316436d6c05..af040cabfdb 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/files/components/FilesSettings/FilesSettings.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/files/components/FilesSettings/FilesSettings.tsx @@ -29,8 +29,13 @@ interface FilesSettingsProps { export function FilesSettings({ visibleItems }: FilesSettingsProps) { const { t } = useLingui(); - const { preferences, setFileLinks, setSidebarFileLinks, setFolderLinks } = - useV2UserPreferences(); + const { + preferences, + setFileLinks, + setSidebarFileLinks, + setFolderLinks, + setPageLinks, + } = useV2UserPreferences(); const searchQuery = useSettingsSearchQuery(); const utils = electronTrpc.useUtils(); @@ -82,6 +87,7 @@ export function FilesSettings({ visibleItems }: FilesSettingsProps) { const showFile = isItemVisible(SETTING_ITEM_ID.LINKS_FILE, visibleItems); const showFolder = isItemVisible(SETTING_ITEM_ID.LINKS_FOLDER, visibleItems); + const showPage = isItemVisible(SETTING_ITEM_ID.LINKS_PAGE, visibleItems); const showSidebar = isItemVisible( SETTING_ITEM_ID.LINKS_SIDEBAR_FILE, visibleItems, @@ -111,6 +117,14 @@ export function FilesSettings({ visibleItems }: FilesSettingsProps) { [setSidebarFileLinks, t], ); + const handlePageChange = useCallback( + (next: LinkTierMap) => { + setPageLinks(next); + toast.success(t({ message: "Changes saved" })); + }, + [setPageLinks, t], + ); + return (
@@ -262,6 +276,26 @@ export function FilesSettings({ visibleItems }: FilesSettingsProps) { /> )} + {showPage && ( +
+

+ Opening pages +

+ +
+ )}
); diff --git a/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts b/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts index 9f8841ba1ac..d3e45fcb8e6 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts +++ b/apps/desktop/src/renderer/routes/_authenticated/settings/utils/settings-search/settings-search.ts @@ -1337,20 +1337,26 @@ export const SETTINGS_ITEMS: SettingsItem[] = [ }, { id: SETTING_ITEM_ID.LINKS_PAGE, - section: "browser", - title: "Pages", + section: "files", + title: "Page links", description: - "Whether pages from a workspace's Pages menu open inside Superset or the system browser", + "How pages open when clicked in the Pages menu, terminals, chat, and other pages", keywords: [ "links", "page", "pages", "click", + "cmd", + "ctrl", + "shift", + "meta", + "pane", + "new tab", "browser", - "in-app", - "system", "external", "open", + "terminal", + "chat", "behavior", ], }, diff --git a/packages/i18n/locales/cs/messages.po b/packages/i18n/locales/cs/messages.po index 3c68dee139a..dc1f4633e45 100644 --- a/packages/i18n/locales/cs/messages.po +++ b/packages/i18n/locales/cs/messages.po @@ -2255,6 +2255,9 @@ msgstr "Platí pro cesty ke složkám ve výstupu terminálu. Složky nejde otev msgid "Applies to the file tree, changes list, and diff header." msgstr "Platí pro strom souborů, seznam změn a hlavičku rozdílů." +msgid "Applies to the Pages menu and page links in terminals, chat, and other pages." +msgstr "Platí pro nabídku Stránky a odkazy na stránky v terminálech, chatu a jiných stránkách." + msgid "Applies to URLs in terminals, chat messages, and task browsers." msgstr "Platí pro URL v terminálech, zprávách chatu a prohlížečích úkolů." @@ -11114,6 +11117,9 @@ msgstr "Otevírání souborů" msgid "Opening folders" msgstr "Otevírání složek" +msgid "Opening pages" +msgstr "Otevírání stránek" + msgid "Opening worktree..." msgstr "Otevírám worktree..." @@ -11329,6 +11335,9 @@ msgstr "Stránka smazána" msgid "Page has no versions" msgstr "Stránka nemá žádné verze" +msgid "Page links" +msgstr "Odkazy na stránky" + msgid "Page Load Failed" msgstr "Načtení stránky selhalo" @@ -17427,9 +17436,6 @@ msgstr "Jak si stojíte?" msgid "Where does my code run?" msgstr "Kde běží můj kód?" -msgid "Where pages open from a workspace's Pages menu." -msgstr "Kde se otevřou stránky z nabídky Stránky v pracovním prostoru." - msgid "Where serious teams are" msgstr "Kde jsou seriózní týmy" diff --git a/packages/i18n/locales/de/messages.po b/packages/i18n/locales/de/messages.po index 0303b9afba8..895b660bc2c 100644 --- a/packages/i18n/locales/de/messages.po +++ b/packages/i18n/locales/de/messages.po @@ -2255,6 +2255,9 @@ msgstr "Gilt für Ordnerpfade in der Terminal-Ausgabe. Ordner lassen sich nicht msgid "Applies to the file tree, changes list, and diff header." msgstr "Gilt für Dateibaum, Änderungsliste und Diff-Kopfzeile." +msgid "Applies to the Pages menu and page links in terminals, chat, and other pages." +msgstr "Gilt für das Seiten-Menü und Seiten-Links in Terminals, Chat und anderen Seiten." + msgid "Applies to URLs in terminals, chat messages, and task browsers." msgstr "Gilt für URLs in Terminals, Chat-Nachrichten und Aufgaben-Browsern." @@ -11114,6 +11117,9 @@ msgstr "Dateien öffnen" msgid "Opening folders" msgstr "Ordner öffnen" +msgid "Opening pages" +msgstr "Seiten öffnen" + msgid "Opening worktree..." msgstr "Worktree wird geöffnet..." @@ -11329,6 +11335,9 @@ msgstr "Seite gelöscht" msgid "Page has no versions" msgstr "Die Seite hat keine Versionen" +msgid "Page links" +msgstr "Seiten-Links" + msgid "Page Load Failed" msgstr "Seite konnte nicht geladen werden" @@ -17427,9 +17436,6 @@ msgstr "Auf welchem Platz stehst du?" msgid "Where does my code run?" msgstr "Wo läuft mein Code?" -msgid "Where pages open from a workspace's Pages menu." -msgstr "Wo Seiten aus dem Seiten-Menü eines Arbeitsbereichs geöffnet werden." - msgid "Where serious teams are" msgstr "Wo ernsthafte Teams stehen" diff --git a/packages/i18n/locales/en/messages.po b/packages/i18n/locales/en/messages.po index ccd36cb8115..918e1e53ce9 100644 --- a/packages/i18n/locales/en/messages.po +++ b/packages/i18n/locales/en/messages.po @@ -2255,6 +2255,9 @@ msgstr "Applies to folder paths in terminal output. Folders can't open in the fi msgid "Applies to the file tree, changes list, and diff header." msgstr "Applies to the file tree, changes list, and diff header." +msgid "Applies to the Pages menu and page links in terminals, chat, and other pages." +msgstr "Applies to the Pages menu and page links in terminals, chat, and other pages." + msgid "Applies to URLs in terminals, chat messages, and task browsers." msgstr "Applies to URLs in terminals, chat messages, and task browsers." @@ -11114,6 +11117,9 @@ msgstr "Opening files" msgid "Opening folders" msgstr "Opening folders" +msgid "Opening pages" +msgstr "Opening pages" + msgid "Opening worktree..." msgstr "Opening worktree..." @@ -11329,6 +11335,9 @@ msgstr "Page deleted" msgid "Page has no versions" msgstr "Page has no versions" +msgid "Page links" +msgstr "Page links" + msgid "Page Load Failed" msgstr "Page Load Failed" @@ -17427,9 +17436,6 @@ msgstr "Where do you rank?" msgid "Where does my code run?" msgstr "Where does my code run?" -msgid "Where pages open from a workspace's Pages menu." -msgstr "Where pages open from a workspace's Pages menu." - msgid "Where serious teams are" msgstr "Where serious teams are" diff --git a/packages/i18n/locales/es/messages.po b/packages/i18n/locales/es/messages.po index 465553d3366..a5710aa212c 100644 --- a/packages/i18n/locales/es/messages.po +++ b/packages/i18n/locales/es/messages.po @@ -2255,6 +2255,9 @@ msgstr "Se aplica a las rutas de carpeta en la salida del terminal. Las carpetas msgid "Applies to the file tree, changes list, and diff header." msgstr "Se aplica al árbol de archivos, la lista de cambios y el encabezado del diff." +msgid "Applies to the Pages menu and page links in terminals, chat, and other pages." +msgstr "Se aplica al menú Páginas y a los enlaces a páginas en terminales, chat y otras páginas." + msgid "Applies to URLs in terminals, chat messages, and task browsers." msgstr "Se aplica a las URL en terminales, mensajes de chat y navegadores de tareas." @@ -11114,6 +11117,9 @@ msgstr "Abrir archivos" msgid "Opening folders" msgstr "Abrir carpetas" +msgid "Opening pages" +msgstr "Abrir páginas" + msgid "Opening worktree..." msgstr "Abriendo el worktree..." @@ -11329,6 +11335,9 @@ msgstr "Página eliminada" msgid "Page has no versions" msgstr "La página no tiene versiones" +msgid "Page links" +msgstr "Enlaces a páginas" + msgid "Page Load Failed" msgstr "No se pudo cargar la página" @@ -17427,9 +17436,6 @@ msgstr "¿En qué puesto estás?" msgid "Where does my code run?" msgstr "¿Dónde se ejecuta mi código?" -msgid "Where pages open from a workspace's Pages menu." -msgstr "Dónde se abren las páginas desde el menú Páginas de un espacio de trabajo." - msgid "Where serious teams are" msgstr "Donde están los equipos serios" diff --git a/packages/i18n/locales/fr/messages.po b/packages/i18n/locales/fr/messages.po index 83c02051cad..10a6d181ce5 100644 --- a/packages/i18n/locales/fr/messages.po +++ b/packages/i18n/locales/fr/messages.po @@ -2255,6 +2255,9 @@ msgstr "S'applique aux chemins de dossiers dans la sortie du terminal. Les dossi msgid "Applies to the file tree, changes list, and diff header." msgstr "S'applique à l'arborescence des fichiers, à la liste des modifications et à l'en-tête du diff." +msgid "Applies to the Pages menu and page links in terminals, chat, and other pages." +msgstr "S'applique au menu Pages et aux liens vers des pages dans les terminaux, le chat et d'autres pages." + msgid "Applies to URLs in terminals, chat messages, and task browsers." msgstr "S'applique aux URL dans les terminaux, les messages du chat et les navigateurs de tâches." @@ -11114,6 +11117,9 @@ msgstr "Ouverture des fichiers" msgid "Opening folders" msgstr "Ouverture des dossiers" +msgid "Opening pages" +msgstr "Ouverture des pages" + msgid "Opening worktree..." msgstr "Ouverture du worktree..." @@ -11329,6 +11335,9 @@ msgstr "Page supprimée" msgid "Page has no versions" msgstr "La page n'a aucune version" +msgid "Page links" +msgstr "Liens vers des pages" + msgid "Page Load Failed" msgstr "Échec du chargement de la page" @@ -17427,9 +17436,6 @@ msgstr "Quel est votre rang ?" msgid "Where does my code run?" msgstr "Où mon code s'exécute-t-il ?" -msgid "Where pages open from a workspace's Pages menu." -msgstr "Où s'ouvrent les pages depuis le menu Pages d'un espace de travail." - msgid "Where serious teams are" msgstr "Là où en sont les équipes sérieuses" diff --git a/packages/i18n/locales/id/messages.po b/packages/i18n/locales/id/messages.po index f76ac4d6373..f7ab7364ca6 100644 --- a/packages/i18n/locales/id/messages.po +++ b/packages/i18n/locales/id/messages.po @@ -2255,6 +2255,9 @@ msgstr "Berlaku untuk path folder di output terminal. Folder tidak bisa dibuka d msgid "Applies to the file tree, changes list, and diff header." msgstr "Berlaku untuk pohon file, daftar perubahan, dan header diff." +msgid "Applies to the Pages menu and page links in terminals, chat, and other pages." +msgstr "Berlaku untuk menu Halaman dan tautan halaman di terminal, chat, dan halaman lain." + msgid "Applies to URLs in terminals, chat messages, and task browsers." msgstr "Berlaku untuk URL di terminal, pesan chat, dan browser tugas." @@ -11114,6 +11117,9 @@ msgstr "Membuka file" msgid "Opening folders" msgstr "Membuka folder" +msgid "Opening pages" +msgstr "Membuka halaman" + msgid "Opening worktree..." msgstr "Membuka worktree..." @@ -11329,6 +11335,9 @@ msgstr "Halaman dihapus" msgid "Page has no versions" msgstr "Halaman tidak punya versi" +msgid "Page links" +msgstr "Tautan halaman" + msgid "Page Load Failed" msgstr "Halaman Gagal Dimuat" @@ -17427,9 +17436,6 @@ msgstr "Di peringkat berapa Anda?" msgid "Where does my code run?" msgstr "Di mana kode saya berjalan?" -msgid "Where pages open from a workspace's Pages menu." -msgstr "Ke mana halaman dari menu Halaman di workspace terbuka." - msgid "Where serious teams are" msgstr "Tempat tim serius berada" diff --git a/packages/i18n/locales/it/messages.po b/packages/i18n/locales/it/messages.po index d2066465dc5..65931b99f57 100644 --- a/packages/i18n/locales/it/messages.po +++ b/packages/i18n/locales/it/messages.po @@ -2255,6 +2255,9 @@ msgstr "Si applica ai percorsi delle cartelle nell'output del terminale. Le cart msgid "Applies to the file tree, changes list, and diff header." msgstr "Si applica all'albero dei file, all'elenco delle modifiche e all'intestazione del diff." +msgid "Applies to the Pages menu and page links in terminals, chat, and other pages." +msgstr "Si applica al menu Pagine e ai link alle pagine in terminali, chat e altre pagine." + msgid "Applies to URLs in terminals, chat messages, and task browsers." msgstr "Si applica agli URL nei terminali, nei messaggi di chat e nei browser dei task." @@ -11114,6 +11117,9 @@ msgstr "Apertura dei file" msgid "Opening folders" msgstr "Apertura delle cartelle" +msgid "Opening pages" +msgstr "Apertura delle pagine" + msgid "Opening worktree..." msgstr "Apertura del worktree..." @@ -11329,6 +11335,9 @@ msgstr "Pagina eliminata" msgid "Page has no versions" msgstr "La pagina non ha versioni" +msgid "Page links" +msgstr "Link alle pagine" + msgid "Page Load Failed" msgstr "Caricamento della pagina non riuscito" @@ -17427,9 +17436,6 @@ msgstr "In che posizione sei?" msgid "Where does my code run?" msgstr "Dove gira il mio codice?" -msgid "Where pages open from a workspace's Pages menu." -msgstr "Dove si aprono le pagine dal menu Pagine di un workspace." - msgid "Where serious teams are" msgstr "Dove sono i team seri" diff --git a/packages/i18n/locales/ja/messages.po b/packages/i18n/locales/ja/messages.po index 9a5f2591e4d..cab4c42670b 100644 --- a/packages/i18n/locales/ja/messages.po +++ b/packages/i18n/locales/ja/messages.po @@ -2255,6 +2255,9 @@ msgstr "ターミナル出力内のフォルダパスに適用されます。フ msgid "Applies to the file tree, changes list, and diff header." msgstr "ファイルツリー、変更一覧、差分ヘッダーに適用されます。" +msgid "Applies to the Pages menu and page links in terminals, chat, and other pages." +msgstr "ページメニューと、ターミナル・チャット・他のページ内のページリンクに適用されます。" + msgid "Applies to URLs in terminals, chat messages, and task browsers." msgstr "ターミナル、チャットメッセージ、タスクのブラウザ内のURLに適用されます。" @@ -11114,6 +11117,9 @@ msgstr "ファイルを開く" msgid "Opening folders" msgstr "フォルダーを開く" +msgid "Opening pages" +msgstr "ページを開く" + msgid "Opening worktree..." msgstr "ワークツリーを開いています..." @@ -11329,6 +11335,9 @@ msgstr "ページを削除しました" msgid "Page has no versions" msgstr "ページにバージョンがありません" +msgid "Page links" +msgstr "ページリンク" + msgid "Page Load Failed" msgstr "ページの読み込みに失敗しました" @@ -17427,9 +17436,6 @@ msgstr "あなたの順位は?" msgid "Where does my code run?" msgstr "コードはどこで実行されますか?" -msgid "Where pages open from a workspace's Pages menu." -msgstr "ワークスペースのページメニューからページを開く場所。" - msgid "Where serious teams are" msgstr "本気のチームの現在地" diff --git a/packages/i18n/locales/ko/messages.po b/packages/i18n/locales/ko/messages.po index 97543a94660..3ad56d88f8d 100644 --- a/packages/i18n/locales/ko/messages.po +++ b/packages/i18n/locales/ko/messages.po @@ -2255,6 +2255,9 @@ msgstr "터미널 출력의 폴더 경로에 적용됩니다. 폴더는 파일 msgid "Applies to the file tree, changes list, and diff header." msgstr "파일 트리, 변경 목록, 차이 헤더에 적용됩니다." +msgid "Applies to the Pages menu and page links in terminals, chat, and other pages." +msgstr "페이지 메뉴와 터미널, 채팅, 다른 페이지의 페이지 링크에 적용됩니다." + msgid "Applies to URLs in terminals, chat messages, and task browsers." msgstr "터미널, 채팅 메시지, 작업 브라우저의 URL에 적용됩니다." @@ -11114,6 +11117,9 @@ msgstr "파일 열기" msgid "Opening folders" msgstr "폴더 열기" +msgid "Opening pages" +msgstr "페이지 열기" + msgid "Opening worktree..." msgstr "worktree를 여는 중..." @@ -11329,6 +11335,9 @@ msgstr "페이지를 삭제했습니다" msgid "Page has no versions" msgstr "페이지에 버전이 없습니다" +msgid "Page links" +msgstr "페이지 링크" + msgid "Page Load Failed" msgstr "페이지 로드 실패" @@ -17427,9 +17436,6 @@ msgstr "내 순위는 몇 위일까요?" msgid "Where does my code run?" msgstr "제 코드는 어디에서 실행되나요?" -msgid "Where pages open from a workspace's Pages menu." -msgstr "워크스페이스의 페이지 메뉴에서 페이지가 열리는 위치입니다." - msgid "Where serious teams are" msgstr "진지한 팀들이 있는 곳" diff --git a/packages/i18n/locales/nl/messages.po b/packages/i18n/locales/nl/messages.po index a8ed1fb315b..e52cd25f77d 100644 --- a/packages/i18n/locales/nl/messages.po +++ b/packages/i18n/locales/nl/messages.po @@ -2255,6 +2255,9 @@ msgstr "Geldt voor mappaden in terminaluitvoer. Mappen kunnen niet in de bestand msgid "Applies to the file tree, changes list, and diff header." msgstr "Geldt voor de bestandsboom, de lijst met wijzigingen en de diff-header." +msgid "Applies to the Pages menu and page links in terminals, chat, and other pages." +msgstr "Geldt voor het Pagina's-menu en paginalinks in terminals, chat en andere pagina's." + msgid "Applies to URLs in terminals, chat messages, and task browsers." msgstr "Geldt voor URL's in terminals, chatberichten en taakbrowsers." @@ -11114,6 +11117,9 @@ msgstr "Bestanden openen" msgid "Opening folders" msgstr "Mappen openen" +msgid "Opening pages" +msgstr "Pagina's openen" + msgid "Opening worktree..." msgstr "Worktree openen..." @@ -11329,6 +11335,9 @@ msgstr "Pagina verwijderd" msgid "Page has no versions" msgstr "Pagina heeft geen versies" +msgid "Page links" +msgstr "Paginalinks" + msgid "Page Load Failed" msgstr "Pagina laden mislukt" @@ -17427,9 +17436,6 @@ msgstr "Waar sta jij?" msgid "Where does my code run?" msgstr "Waar draait mijn code?" -msgid "Where pages open from a workspace's Pages menu." -msgstr "Waar pagina's uit het Pagina's-menu van een werkruimte worden geopend." - msgid "Where serious teams are" msgstr "Waar serieuze teams staan" diff --git a/packages/i18n/locales/pl/messages.po b/packages/i18n/locales/pl/messages.po index e5a37e0639e..bebe4cebc9a 100644 --- a/packages/i18n/locales/pl/messages.po +++ b/packages/i18n/locales/pl/messages.po @@ -2255,6 +2255,9 @@ msgstr "Dotyczy ścieżek folderów w wyjściu terminala. Folderów nie da się msgid "Applies to the file tree, changes list, and diff header." msgstr "Dotyczy drzewa plików, listy zmian i nagłówka różnic." +msgid "Applies to the Pages menu and page links in terminals, chat, and other pages." +msgstr "Dotyczy menu Strony oraz linków do stron w terminalach, czacie i innych stronach." + msgid "Applies to URLs in terminals, chat messages, and task browsers." msgstr "Dotyczy adresów URL w terminalach, wiadomościach czatu i przeglądarkach zadań." @@ -11114,6 +11117,9 @@ msgstr "Otwieranie plików" msgid "Opening folders" msgstr "Otwieranie folderów" +msgid "Opening pages" +msgstr "Otwieranie stron" + msgid "Opening worktree..." msgstr "Otwieranie worktree..." @@ -11329,6 +11335,9 @@ msgstr "Strona usunięta" msgid "Page has no versions" msgstr "Strona nie ma wersji" +msgid "Page links" +msgstr "Linki do stron" + msgid "Page Load Failed" msgstr "Nie udało się wczytać strony" @@ -17427,9 +17436,6 @@ msgstr "Jaka jest twoja pozycja?" msgid "Where does my code run?" msgstr "Gdzie działa mój kod?" -msgid "Where pages open from a workspace's Pages menu." -msgstr "Gdzie otwierają się strony z menu Strony w obszarze roboczym." - msgid "Where serious teams are" msgstr "Tu są poważne zespoły" diff --git a/packages/i18n/locales/pt-BR/messages.po b/packages/i18n/locales/pt-BR/messages.po index a4c66eab810..5bf3ef9df54 100644 --- a/packages/i18n/locales/pt-BR/messages.po +++ b/packages/i18n/locales/pt-BR/messages.po @@ -2255,6 +2255,9 @@ msgstr "Vale para caminhos de pasta na saída do terminal. Pastas não abrem no msgid "Applies to the file tree, changes list, and diff header." msgstr "Vale para a árvore de arquivos, a lista de alterações e o cabeçalho do diff." +msgid "Applies to the Pages menu and page links in terminals, chat, and other pages." +msgstr "Aplica-se ao menu Páginas e a links de página em terminais, chat e outras páginas." + msgid "Applies to URLs in terminals, chat messages, and task browsers." msgstr "Vale para URLs em terminais, mensagens de chat e navegadores de tarefas." @@ -11114,6 +11117,9 @@ msgstr "Abertura de arquivos" msgid "Opening folders" msgstr "Abertura de pastas" +msgid "Opening pages" +msgstr "Abertura de páginas" + msgid "Opening worktree..." msgstr "Abrindo worktree..." @@ -11329,6 +11335,9 @@ msgstr "Página excluída" msgid "Page has no versions" msgstr "A página não tem versões" +msgid "Page links" +msgstr "Links de página" + msgid "Page Load Failed" msgstr "Falha ao carregar a página" @@ -17427,9 +17436,6 @@ msgstr "Qual é a sua posição?" msgid "Where does my code run?" msgstr "Onde o meu código roda?" -msgid "Where pages open from a workspace's Pages menu." -msgstr "Onde as páginas abrem a partir do menu Páginas de uma área de trabalho." - msgid "Where serious teams are" msgstr "Onde os times sérios estão" diff --git a/packages/i18n/locales/ru/messages.po b/packages/i18n/locales/ru/messages.po index 72ebf1ba01c..b9347d02e3d 100644 --- a/packages/i18n/locales/ru/messages.po +++ b/packages/i18n/locales/ru/messages.po @@ -2255,6 +2255,9 @@ msgstr "Применяется к путям папок в выводе терм msgid "Applies to the file tree, changes list, and diff header." msgstr "Применяется к дереву файлов, списку изменений и заголовку diff." +msgid "Applies to the Pages menu and page links in terminals, chat, and other pages." +msgstr "Применяется к меню «Страницы» и ссылкам на страницы в терминалах, чате и других страницах." + msgid "Applies to URLs in terminals, chat messages, and task browsers." msgstr "Применяется к URL в терминалах, сообщениях чата и браузерах задач." @@ -11114,6 +11117,9 @@ msgstr "Открытие файлов" msgid "Opening folders" msgstr "Открытие папок" +msgid "Opening pages" +msgstr "Открытие страниц" + msgid "Opening worktree..." msgstr "Открытие worktree..." @@ -11329,6 +11335,9 @@ msgstr "Страница удалена" msgid "Page has no versions" msgstr "У страницы нет версий" +msgid "Page links" +msgstr "Ссылки на страницы" + msgid "Page Load Failed" msgstr "Не удалось загрузить страницу" @@ -17427,9 +17436,6 @@ msgstr "Какое у вас место?" msgid "Where does my code run?" msgstr "Где выполняется мой код?" -msgid "Where pages open from a workspace's Pages menu." -msgstr "Где открываются страницы из меню «Страницы» рабочей области." - msgid "Where serious teams are" msgstr "Где сейчас серьёзные команды" diff --git a/packages/i18n/locales/tr/messages.po b/packages/i18n/locales/tr/messages.po index d74afe22edb..5572bca231e 100644 --- a/packages/i18n/locales/tr/messages.po +++ b/packages/i18n/locales/tr/messages.po @@ -2255,6 +2255,9 @@ msgstr "Terminal çıktısındaki klasör yolları için geçerlidir. Klasörler msgid "Applies to the file tree, changes list, and diff header." msgstr "Dosya ağacı, değişiklik listesi ve fark başlığı için geçerlidir." +msgid "Applies to the Pages menu and page links in terminals, chat, and other pages." +msgstr "Sayfalar menüsü ile terminallerdeki, sohbetteki ve diğer sayfalardaki sayfa bağlantıları için geçerlidir." + msgid "Applies to URLs in terminals, chat messages, and task browsers." msgstr "Terminallerdeki, sohbet mesajlarındaki ve görev tarayıcılarındaki URL'ler için geçerlidir." @@ -11114,6 +11117,9 @@ msgstr "Dosyaları açma" msgid "Opening folders" msgstr "Klasörleri açma" +msgid "Opening pages" +msgstr "Sayfaları açma" + msgid "Opening worktree..." msgstr "Worktree açılıyor..." @@ -11329,6 +11335,9 @@ msgstr "Sayfa silindi" msgid "Page has no versions" msgstr "Sayfanın sürümü yok" +msgid "Page links" +msgstr "Sayfa bağlantıları" + msgid "Page Load Failed" msgstr "Sayfa yüklenemedi" @@ -17427,9 +17436,6 @@ msgstr "Kaçıncı sıradasınız?" msgid "Where does my code run?" msgstr "Kodum nerede çalışıyor?" -msgid "Where pages open from a workspace's Pages menu." -msgstr "Bir çalışma alanının Sayfalar menüsündeki sayfaların nerede açılacağı." - msgid "Where serious teams are" msgstr "Ciddi takımların bulunduğu yer" diff --git a/packages/i18n/locales/vi/messages.po b/packages/i18n/locales/vi/messages.po index 1b5ac80c7fc..06e7c881d8e 100644 --- a/packages/i18n/locales/vi/messages.po +++ b/packages/i18n/locales/vi/messages.po @@ -2255,6 +2255,9 @@ msgstr "Áp dụng cho đường dẫn thư mục trong kết quả terminal. Th msgid "Applies to the file tree, changes list, and diff header." msgstr "Áp dụng cho cây tệp, danh sách thay đổi và tiêu đề diff." +msgid "Applies to the Pages menu and page links in terminals, chat, and other pages." +msgstr "Áp dụng cho menu Trang và liên kết trang trong terminal, chat và các trang khác." + msgid "Applies to URLs in terminals, chat messages, and task browsers." msgstr "Áp dụng cho URL trong terminal, tin nhắn chat và trình duyệt của tác vụ." @@ -11114,6 +11117,9 @@ msgstr "Mở tệp" msgid "Opening folders" msgstr "Mở thư mục" +msgid "Opening pages" +msgstr "Mở trang" + msgid "Opening worktree..." msgstr "Đang mở worktree..." @@ -11329,6 +11335,9 @@ msgstr "Đã xóa trang" msgid "Page has no versions" msgstr "Trang không có phiên bản nào" +msgid "Page links" +msgstr "Liên kết trang" + msgid "Page Load Failed" msgstr "Không tải được trang" @@ -17427,9 +17436,6 @@ msgstr "Bạn xếp hạng bao nhiêu?" msgid "Where does my code run?" msgstr "Code của tôi chạy ở đâu?" -msgid "Where pages open from a workspace's Pages menu." -msgstr "Nơi các trang từ menu Trang của workspace được mở." - msgid "Where serious teams are" msgstr "Nơi các đội nghiêm túc đang đứng" diff --git a/packages/i18n/locales/zh-CN/messages.po b/packages/i18n/locales/zh-CN/messages.po index d2b7ac80a29..6e1bc800868 100644 --- a/packages/i18n/locales/zh-CN/messages.po +++ b/packages/i18n/locales/zh-CN/messages.po @@ -2255,6 +2255,9 @@ msgstr "适用于终端输出中的文件夹路径。文件夹无法在文件查 msgid "Applies to the file tree, changes list, and diff header." msgstr "适用于文件树、更改列表和差异标题。" +msgid "Applies to the Pages menu and page links in terminals, chat, and other pages." +msgstr "适用于页面菜单,以及终端、聊天和其他页面中的页面链接。" + msgid "Applies to URLs in terminals, chat messages, and task browsers." msgstr "适用于终端、聊天消息和任务浏览器中的URL。" @@ -11114,6 +11117,9 @@ msgstr "打开文件" msgid "Opening folders" msgstr "打开文件夹" +msgid "Opening pages" +msgstr "打开页面" + msgid "Opening worktree..." msgstr "正在打开worktree..." @@ -11329,6 +11335,9 @@ msgstr "页面已删除" msgid "Page has no versions" msgstr "页面没有任何版本" +msgid "Page links" +msgstr "页面链接" + msgid "Page Load Failed" msgstr "页面加载失败" @@ -17427,9 +17436,6 @@ msgstr "你排第几?" msgid "Where does my code run?" msgstr "我的代码在哪里运行?" -msgid "Where pages open from a workspace's Pages menu." -msgstr "从工作区的页面菜单打开页面的位置。" - msgid "Where serious teams are" msgstr "认真的团队都在这里" diff --git a/packages/i18n/locales/zh-TW/messages.po b/packages/i18n/locales/zh-TW/messages.po index c575f86bf6a..7dead8c09b1 100644 --- a/packages/i18n/locales/zh-TW/messages.po +++ b/packages/i18n/locales/zh-TW/messages.po @@ -2255,6 +2255,9 @@ msgstr "適用於終端輸出中的資料夾路徑。資料夾無法在檔案檢 msgid "Applies to the file tree, changes list, and diff header." msgstr "適用於檔案樹、更改列表和差異標題。" +msgid "Applies to the Pages menu and page links in terminals, chat, and other pages." +msgstr "適用於頁面選單,以及終端機、聊天和其他頁面中的頁面連結。" + msgid "Applies to URLs in terminals, chat messages, and task browsers." msgstr "適用於終端、聊天訊息和任務瀏覽器中的URL。" @@ -11114,6 +11117,9 @@ msgstr "開啟檔案" msgid "Opening folders" msgstr "開啟資料夾" +msgid "Opening pages" +msgstr "開啟頁面" + msgid "Opening worktree..." msgstr "正在開啟worktree..." @@ -11329,6 +11335,9 @@ msgstr "頁面已刪除" msgid "Page has no versions" msgstr "頁面沒有任何版本" +msgid "Page links" +msgstr "頁面連結" + msgid "Page Load Failed" msgstr "頁面載入失敗" @@ -17427,9 +17436,6 @@ msgstr "你排第幾?" msgid "Where does my code run?" msgstr "我的程式碼在哪裡執行?" -msgid "Where pages open from a workspace's Pages menu." -msgstr "從工作區的頁面選單開啟頁面的位置。" - msgid "Where serious teams are" msgstr "認真的團隊都在這裡"