"use client"; import type { ReactNode } from "react"; import { IconDatabase, IconEdit, IconListDetails, IconShare3, IconSparkles, } from "@tabler/icons-react"; import { useTranslation } from "react-i18next"; import { Button } from "@kandev/ui/button"; import { DropdownMenuItem } from "@kandev/ui/dropdown-menu"; import { Tooltip, TooltipContent, TooltipTrigger } from "@kandev/ui/tooltip"; import { PanelHeaderOverflowMenu } from "@/components/task/panel-primitives"; import { canvasCanEnableWorkspaceData, type Canvas } from "@/lib/api/domains/canvas-api"; export function canvasLockHelp(canvas: Canvas, t: (key: string) => string): string { return canvas.status === "archived" ? t("canvases:archivedCanvasActionHelp") : t("canvases:disabledCanvasActionHelp"); } export function canvasPromotionHelp(canvas: Canvas, t: (key: string) => string): string { if (canvas.status === "archived" || canvas.status === "disabled") { return canvasLockHelp(canvas, t); } if (canvas.scope_kind === "task" && canvas.active_release_status === "valid") { return t("canvases:promoteCanvasHelp"); } return t("canvases:promoteCanvasUnavailable"); } function CanvasDesktopActionTooltip({ description, disabled, testId, children, }: { description: string; disabled: boolean; testId: string; children: ReactNode; }) { return ( {children} {description} ); } export function CanvasDesktopActions({ canvas, editing, onEdit, onPromote, onReleases, onShare, onEnableWorkspaceData, }: { canvas: Canvas; editing: boolean; onEdit: () => void; onPromote: () => void; onReleases: () => void; onShare: () => void; onEnableWorkspaceData?: () => void; }) { const { t } = useTranslation(); const lifecycleLocked = canvas.status === "archived" || canvas.status === "disabled"; const promoteAvailable = canvas.scope_kind === "task" && canvas.active_release_status === "valid"; const promoteDisabled = lifecycleLocked || !promoteAvailable; const promoteDescription = canvasPromotionHelp(canvas, t); return (
{canvas.scope_kind === "workspace" && ( )} {onEnableWorkspaceData && canvasCanEnableWorkspaceData(canvas) && ( )} {canvas.scope_kind === "task" && ( )}
); } type CanvasDesktopOverflowActionsProps = { canvas: Canvas; editing: boolean; onEdit: () => void; onPromote: () => void; onReleases: () => void; onShare: () => void; onEnableWorkspaceData?: () => void; omitPrimaryAction?: boolean; }; function CanvasWorkspaceDataMenuAction({ canvas, onEnableWorkspaceData, t, }: { canvas: Canvas; onEnableWorkspaceData?: () => void; t: (key: string) => string; }) { if (!onEnableWorkspaceData || !canvasCanEnableWorkspaceData(canvas)) return null; return ( {t("canvases:enableWorkspaceData")} ); } export function CanvasDesktopPrimaryAction({ canvas, editing, onEdit, onPromote, }: Pick) { const { t } = useTranslation(); const lifecycleLocked = canvas.status === "archived" || canvas.status === "disabled"; if (canvas.scope_kind === "workspace") { const editDisabled = editing || lifecycleLocked; return ( ); } const promoteAvailable = canvas.active_release_status === "valid"; const promoteDisabled = lifecycleLocked || !promoteAvailable; const promoteDescription = canvasPromotionHelp(canvas, t); return ( ); } function CanvasDesktopOverflowMenuItemsContent({ canvas, editing, onEdit, onPromote, onReleases, onShare, onEnableWorkspaceData, omitPrimaryAction, t, }: CanvasDesktopOverflowActionsProps & { t: (key: string) => string }) { const lifecycleLocked = canvas.status === "archived" || canvas.status === "disabled"; const promoteAvailable = canvas.scope_kind === "task" && canvas.active_release_status === "valid"; const promoteDisabled = lifecycleLocked || !promoteAvailable; const promoteDescription = canvasPromotionHelp(canvas, t); const editDescription = lifecycleLocked ? canvasLockHelp(canvas, t) : t("canvases:editCanvasHelp"); const editDisabled = editing || lifecycleLocked; const editHelpId = `canvas-edit-overflow-help-${canvas.id}`; const promoteHelpId = `canvas-promote-overflow-help-${canvas.id}`; return ( <> {canvas.scope_kind === "workspace" && !omitPrimaryAction && ( {t("canvases:editCanvas")} {editDisabled && ( {editDescription} )} )} {t("canvases:releasesAndPermissions")} {t("canvases:shareCanvas")} {canvas.scope_kind === "task" && !omitPrimaryAction && ( {t("canvases:promoteCanvas")} {promoteDisabled && ( {promoteDescription} )} )} ); } export function CanvasDesktopOverflowMenuItems(props: CanvasDesktopOverflowActionsProps) { const { t } = useTranslation(); return ; } export function CanvasDesktopOverflowActions(props: CanvasDesktopOverflowActionsProps) { const { t } = useTranslation(); return ( ); }