mirror of
https://github.com/chartdb/chartdb.git
synced 2025-11-02 04:53:27 +00:00
* refactor(filters): refactor diagram filters * replace old filters * fix storage * fix * fix * fix * fix * fix * fix * fix * fix * fix
107 lines
3.3 KiB
TypeScript
107 lines
3.3 KiB
TypeScript
import React, { type ReactNode, useCallback, useState } from 'react';
|
|
import { canvasContext } from './canvas-context';
|
|
import { useChartDB } from '@/hooks/use-chartdb';
|
|
import { adjustTablePositions } from '@/lib/domain/db-table';
|
|
import { useReactFlow } from '@xyflow/react';
|
|
import { findOverlappingTables } from '@/pages/editor-page/canvas/canvas-utils';
|
|
import type { Graph } from '@/lib/graph';
|
|
import { createGraph } from '@/lib/graph';
|
|
import { useDiagramFilter } from '../diagram-filter-context/use-diagram-filter';
|
|
import { filterTable } from '@/lib/domain/diagram-filter/filter';
|
|
import { defaultSchemas } from '@/lib/data/default-schemas';
|
|
|
|
interface CanvasProviderProps {
|
|
children: ReactNode;
|
|
}
|
|
|
|
export const CanvasProvider = ({ children }: CanvasProviderProps) => {
|
|
const { tables, relationships, updateTablesState, databaseType } =
|
|
useChartDB();
|
|
const { filter } = useDiagramFilter();
|
|
const { fitView } = useReactFlow();
|
|
const [overlapGraph, setOverlapGraph] =
|
|
useState<Graph<string>>(createGraph());
|
|
|
|
const [showFilter, setShowFilter] = useState(false);
|
|
|
|
const reorderTables = useCallback(
|
|
(
|
|
options: { updateHistory?: boolean } = {
|
|
updateHistory: true,
|
|
}
|
|
) => {
|
|
const newTables = adjustTablePositions({
|
|
relationships,
|
|
tables: tables.filter((table) =>
|
|
filterTable({
|
|
table: {
|
|
id: table.id,
|
|
schema: table.schema,
|
|
},
|
|
filter,
|
|
options: {
|
|
defaultSchema: defaultSchemas[databaseType],
|
|
},
|
|
})
|
|
),
|
|
mode: 'all',
|
|
});
|
|
|
|
const updatedOverlapGraph = findOverlappingTables({
|
|
tables: newTables,
|
|
});
|
|
|
|
updateTablesState(
|
|
(currentTables) =>
|
|
currentTables.map((table) => {
|
|
const newTable = newTables.find(
|
|
(t) => t.id === table.id
|
|
);
|
|
return {
|
|
id: table.id,
|
|
x: newTable?.x ?? table.x,
|
|
y: newTable?.y ?? table.y,
|
|
};
|
|
}),
|
|
{
|
|
updateHistory: options.updateHistory ?? true,
|
|
forceOverride: false,
|
|
}
|
|
);
|
|
|
|
setOverlapGraph(updatedOverlapGraph);
|
|
|
|
setTimeout(() => {
|
|
fitView({
|
|
duration: 500,
|
|
padding: 0.2,
|
|
maxZoom: 0.8,
|
|
});
|
|
}, 500);
|
|
},
|
|
[
|
|
filter,
|
|
relationships,
|
|
tables,
|
|
updateTablesState,
|
|
fitView,
|
|
databaseType,
|
|
]
|
|
);
|
|
|
|
return (
|
|
<canvasContext.Provider
|
|
value={{
|
|
reorderTables,
|
|
fitView,
|
|
setOverlapGraph,
|
|
overlapGraph,
|
|
setShowFilter,
|
|
showFilter,
|
|
}}
|
|
>
|
|
{children}
|
|
</canvasContext.Provider>
|
|
);
|
|
};
|