import type { ObjectSourceKind, TreeNode, TreeNodeType } from "@/types/database"; import { matchesShortcut, type ShortcutLikeEvent } from "@/lib/keyboardShortcuts"; export type TreeNodeRowAction = "open-data" | "toggle" | "none"; export type TreeNodeRowDoubleClickAction = "open-data" | "open-object-browser" | "open-object-browser-and-expand" | "open-source" | "open-saved-sql" | "toggle" | "none"; export type SidebarSelectionCopyAction = "copy-name" | "none"; export type SidebarActivation = "single" | "double"; const dataNodeTypes = new Set(["table", "view", "materialized_view"]); const toggleLeafNodeTypes = new Set(["redis-db", "mq-tenant", "mongo-collection", "elasticsearch-index", "user-admin"]); const objectBrowserNodeTypes = new Set(["database", "schema", "object-browser"]); const sourceNodeTypes = new Set(["materialized_view", "procedure", "function", "sequence", "package", "package-body"]); const savedSqlNodeTypes = new Set(["saved-sql-file"]); const tableChildGroupNodeTypes = new Set(["group-columns", "group-indexes", "group-fkeys", "group-triggers", "group-partitions"]); const databaseChildGroupNodeTypes = new Set(["group-tables", "group-views", "group-materialized-views", "group-procedures", "group-functions", "group-sequences", "group-packages"]); export function objectSourceKindForTreeNode(type: TreeNodeType): ObjectSourceKind | null { if (type === "view") return "VIEW"; if (type === "materialized_view") return "MATERIALIZED_VIEW"; if (type === "procedure") return "PROCEDURE"; if (type === "function") return "FUNCTION"; if (type === "sequence") return "SEQUENCE"; if (type === "package") return "PACKAGE"; if (type === "package-body") return "PACKAGE_BODY"; return null; } export function treeNodeRowAction(type: TreeNodeType, canExpand: boolean, activation: SidebarActivation = "single"): TreeNodeRowAction { if (activation === "double") return "none"; if (dataNodeTypes.has(type)) return "open-data"; if (toggleLeafNodeTypes.has(type)) return "toggle"; if (canExpand) return "toggle"; return "none"; } export function treeNodeRowDoubleClickAction(type: TreeNodeType, canOpenObjectBrowser: boolean, activation: SidebarActivation = "single", canExpand = false): TreeNodeRowDoubleClickAction { if (activation === "double") { if (dataNodeTypes.has(type)) return "open-data"; if (sourceNodeTypes.has(type)) return "open-source"; if (savedSqlNodeTypes.has(type)) return "open-saved-sql"; if (toggleLeafNodeTypes.has(type)) return "toggle"; if (canOpenObjectBrowser && objectBrowserNodeTypes.has(type) && canExpand) return "open-object-browser-and-expand"; if (canOpenObjectBrowser && objectBrowserNodeTypes.has(type)) return "open-object-browser"; if (canExpand) return "toggle"; } if (canOpenObjectBrowser && objectBrowserNodeTypes.has(type)) return "open-object-browser"; return "none"; } export function sidebarSelectionCopyAction(event: ShortcutLikeEvent): SidebarSelectionCopyAction { return matchesShortcut(event, "Mod+C") ? "copy-name" : "none"; } export function copyNameForTreeNode(node: TreeNode): string { if (tableChildGroupNodeTypes.has(node.type) && node.tableName) return node.tableName; if (databaseChildGroupNodeTypes.has(node.type)) return node.schema || node.database || node.label; if (node.type === "column") { if (node.meta && "name" in node.meta) return node.meta.name; return node.label.replace(/\s+\(.+\)$/, ""); } return node.label; }