From f9eee53ed023a5abe2cccbf3e601698cbf292986 Mon Sep 17 00:00:00 2001 From: Charity <81490612+charitea@users.noreply.github.com> Date: Fri, 6 Feb 2026 18:31:08 -0500 Subject: [PATCH] fix: board and workspace URL links and copy behavior (#357) - Use /boards/{id} for private board links so copied link works; keep pretty URL for public boards - Show matching path in board header (pretty path for public, boards/id for private) - Copy link button copies URL to clipboard instead of opening in new tab (opening a new tab seems redundant since we're already on it) - Edit workspace URL button links to /settings/workspace instead of account settings --- .../components/UpdateBoardSlugButton.tsx | 87 ++++++++++++------- .../board/components/UpdateBoardSlugForm.tsx | 2 +- apps/web/src/views/board/index.tsx | 2 + 3 files changed, 60 insertions(+), 31 deletions(-) diff --git a/apps/web/src/views/board/components/UpdateBoardSlugButton.tsx b/apps/web/src/views/board/components/UpdateBoardSlugButton.tsx index ce33768c..9b275551 100644 --- a/apps/web/src/views/board/components/UpdateBoardSlugButton.tsx +++ b/apps/web/src/views/board/components/UpdateBoardSlugButton.tsx @@ -1,24 +1,40 @@ -import Link from "next/link"; +import { Fragment } from "react"; import { t } from "@lingui/core/macro"; import { env } from "next-runtime-env"; import { HiLink } from "react-icons/hi"; import { Tooltip } from "~/components/Tooltip"; +import { usePopup } from "~/providers/popup"; + +const displayBaseUrl = + env("NEXT_PUBLIC_KAN_ENV") === "cloud" + ? "kan.bn" + : env("NEXT_PUBLIC_BASE_URL"); + +const linkBaseUrl = env("NEXT_PUBLIC_BASE_URL"); + +const pathSeparator = ( +
+); const UpdateBoardSlugButton = ({ handleOnClick, workspaceSlug, boardSlug, + boardPublicId, + visibility, isLoading, canEdit, }: { handleOnClick: () => void; workspaceSlug: string; boardSlug: string; + boardPublicId: string; + visibility: "public" | "private"; isLoading: boolean; canEdit: boolean; }) => { - if (!isLoading && (!workspaceSlug || !boardSlug)) return <>; + const { showPopup } = usePopup(); if (isLoading) { return ( @@ -26,44 +42,55 @@ const UpdateBoardSlugButton = ({ ); } + if (!workspaceSlug || !boardSlug || !boardPublicId) return <>; + + const isPublic = visibility === "public"; + const boardUrl = isPublic + ? `${linkBaseUrl}/${workspaceSlug}/${boardSlug}` + : `${linkBaseUrl}/boards/${boardPublicId}`; + + const pathSegments = isPublic + ? [displayBaseUrl, workspaceSlug, boardSlug] + : [displayBaseUrl, "boards", boardPublicId]; + return ( +
+ {pathSegments.map((segment, i) => ( + + {i > 0 && pathSeparator} + {segment} + + ))} +
+ +
); }; - export default UpdateBoardSlugButton; diff --git a/apps/web/src/views/board/components/UpdateBoardSlugForm.tsx b/apps/web/src/views/board/components/UpdateBoardSlugForm.tsx index 20b3ff5a..ddb72e44 100644 --- a/apps/web/src/views/board/components/UpdateBoardSlugForm.tsx +++ b/apps/web/src/views/board/components/UpdateBoardSlugForm.tsx @@ -156,7 +156,7 @@ export function UpdateBoardSlugForm({