"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 (
);
}