Files
dbx/apps/desktop/src/lib/sidebar/sidebarTableSearchControl.ts
T

69 lines
2.5 KiB
TypeScript

import { appendFlatTreeRenderKey, type FlatTreeNode } from "@/composables/useFlatTree";
import type { TreeNode, TreeNodeType } from "@/types/database";
const simpleObjectParentTypes = new Set<TreeNodeType>(["database", "schema", "linked-server-schema"]);
const tableSearchableChildTypes = new Set<TreeNodeType>(["table", "view", "materialized_view", "load-more"]);
export function isSidebarTableSearchControlNode(node: TreeNode): boolean {
return node.type === "table-search-control";
}
function tableSearchControlId(parentId: string): string {
return `${parentId}:__table_search`;
}
function parentHasSearchableTableList(node: TreeNode): boolean {
// Routine-only schemas should not show a table-specific search box.
return !!node.children?.some((child) => tableSearchableChildTypes.has(child.type));
}
function shouldInsertTableSearchControl(item: FlatTreeNode, sidebarObjectDisplay: "simple" | "grouped", activeQueries: Readonly<Record<string, string | undefined>>): boolean {
const node = item.node;
if (!node.isExpanded) return false;
if (sidebarObjectDisplay === "grouped") {
return node.type === "group-tables" && (parentHasSearchableTableList(node) || !!activeQueries[node.id]?.trim());
}
if (!simpleObjectParentTypes.has(node.type)) return false;
return parentHasSearchableTableList(node) || !!activeQueries[node.id]?.trim();
}
function buildTableSearchControlNode(parent: TreeNode): TreeNode {
return {
id: tableSearchControlId(parent.id),
label: "sidebar.searchTablesInCurrentScope",
type: "table-search-control",
connectionId: parent.connectionId,
database: parent.database,
schema: parent.schema,
tableSearchParentId: parent.id,
};
}
export function insertSidebarTableSearchControls(
flatNodes: readonly FlatTreeNode[],
options: {
enabled: boolean;
sidebarObjectDisplay: "simple" | "grouped";
activeQueries: Readonly<Record<string, string | undefined>>;
},
): FlatTreeNode[] {
if (!options.enabled) return [...flatNodes];
const result: FlatTreeNode[] = [];
for (const item of flatNodes) {
result.push(item);
if (!shouldInsertTableSearchControl(item, options.sidebarObjectDisplay, options.activeQueries)) continue;
const node = buildTableSearchControlNode(item.node);
result.push({
node,
depth: item.depth + 1,
id: node.id,
renderKey: appendFlatTreeRenderKey(item.renderKey, node),
type: node.type,
poolType: `${node.type}:${node.id}`,
});
}
return result;
}