mirror of
https://github.com/chartdb/chartdb.git
synced 2025-11-15 19:31:48 +00:00
remove tables from canvas
This commit is contained in:
@@ -21,6 +21,9 @@ export interface ChartDBContext {
|
|||||||
removeTable: (id: string) => void;
|
removeTable: (id: string) => void;
|
||||||
updateTable: (id: string, table: Partial<DBTable>) => void;
|
updateTable: (id: string, table: Partial<DBTable>) => void;
|
||||||
updateTables: (tables: PartialExcept<DBTable, 'id'>[]) => void;
|
updateTables: (tables: PartialExcept<DBTable, 'id'>[]) => void;
|
||||||
|
updateTablesState: (
|
||||||
|
updateFn: (tables: DBTable[]) => PartialExcept<DBTable, 'id'>[]
|
||||||
|
) => void;
|
||||||
|
|
||||||
// Field operations
|
// Field operations
|
||||||
getField: (tableId: string, fieldId: string) => DBField | null;
|
getField: (tableId: string, fieldId: string) => DBField | null;
|
||||||
@@ -75,6 +78,7 @@ export const chartDBContext = createContext<ChartDBContext>({
|
|||||||
addTable: emptyFn,
|
addTable: emptyFn,
|
||||||
removeTable: emptyFn,
|
removeTable: emptyFn,
|
||||||
updateTable: emptyFn,
|
updateTable: emptyFn,
|
||||||
|
updateTablesState: emptyFn,
|
||||||
|
|
||||||
// Field operations
|
// Field operations
|
||||||
updateField: emptyFn,
|
updateField: emptyFn,
|
||||||
|
|||||||
@@ -70,6 +70,26 @@ export const ChartDBProvider: React.FC<React.PropsWithChildren> = ({
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const updateTablesState = (
|
||||||
|
updateFn: (tables: DBTable[]) => PartialExcept<DBTable, 'id'>[]
|
||||||
|
) => {
|
||||||
|
setTables((prevTables) => {
|
||||||
|
const updatedTables = updateFn(prevTables);
|
||||||
|
return prevTables
|
||||||
|
.map((prevTable) => {
|
||||||
|
const updatedTable = updatedTables.find(
|
||||||
|
(t) => t.id === prevTable.id
|
||||||
|
);
|
||||||
|
return updatedTable
|
||||||
|
? { ...prevTable, ...updatedTable }
|
||||||
|
: prevTable;
|
||||||
|
})
|
||||||
|
.filter((prevTable) =>
|
||||||
|
updatedTables.some((t) => t.id === prevTable.id)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
const updateField = (
|
const updateField = (
|
||||||
tableId: string,
|
tableId: string,
|
||||||
fieldId: string,
|
fieldId: string,
|
||||||
@@ -261,6 +281,7 @@ export const ChartDBProvider: React.FC<React.PropsWithChildren> = ({
|
|||||||
removeTable,
|
removeTable,
|
||||||
updateTable,
|
updateTable,
|
||||||
updateTables,
|
updateTables,
|
||||||
|
updateTablesState,
|
||||||
updateField,
|
updateField,
|
||||||
removeField,
|
removeField,
|
||||||
createField,
|
createField,
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import {
|
|||||||
MiniMap,
|
MiniMap,
|
||||||
Controls,
|
Controls,
|
||||||
NodePositionChange,
|
NodePositionChange,
|
||||||
|
NodeRemoveChange,
|
||||||
} from '@xyflow/react';
|
} from '@xyflow/react';
|
||||||
import '@xyflow/react/dist/style.css';
|
import '@xyflow/react/dist/style.css';
|
||||||
import { TableNode, TableNodeType } from './table-node';
|
import { TableNode, TableNodeType } from './table-node';
|
||||||
@@ -23,7 +24,7 @@ const initialEdges: TableEdgeType[] = [];
|
|||||||
export interface CanvasProps {}
|
export interface CanvasProps {}
|
||||||
|
|
||||||
export const Canvas: React.FC<CanvasProps> = () => {
|
export const Canvas: React.FC<CanvasProps> = () => {
|
||||||
const { tables, updateTables, createRelationship } = useChartDB();
|
const { tables, createRelationship, updateTablesState } = useChartDB();
|
||||||
const nodeTypes = useMemo(() => ({ table: TableNode }), []);
|
const nodeTypes = useMemo(() => ({ table: TableNode }), []);
|
||||||
const edgeTypes = useMemo(() => ({ 'table-edge': TableEdge }), []);
|
const edgeTypes = useMemo(() => ({ 'table-edge': TableEdge }), []);
|
||||||
|
|
||||||
@@ -71,14 +72,36 @@ export const Canvas: React.FC<CanvasProps> = () => {
|
|||||||
(change) =>
|
(change) =>
|
||||||
change.type === 'position' && !change.dragging
|
change.type === 'position' && !change.dragging
|
||||||
) as NodePositionChange[];
|
) as NodePositionChange[];
|
||||||
|
const removeChanges: NodeRemoveChange[] = changes.filter(
|
||||||
|
(change) => change.type === 'remove'
|
||||||
|
) as NodeRemoveChange[];
|
||||||
|
|
||||||
if (positionChanges.length > 0) {
|
if (
|
||||||
updateTables(
|
positionChanges.length > 0 ||
|
||||||
positionChanges.map((change) => ({
|
removeChanges.length > 0
|
||||||
id: change.id,
|
) {
|
||||||
x: change.position?.x,
|
updateTablesState((currentTables) =>
|
||||||
y: change.position?.y,
|
currentTables
|
||||||
}))
|
.map((currentTable) => {
|
||||||
|
const positionChange = positionChanges.find(
|
||||||
|
(change) =>
|
||||||
|
change.id === currentTable.id
|
||||||
|
);
|
||||||
|
if (positionChange) {
|
||||||
|
return {
|
||||||
|
id: currentTable.id,
|
||||||
|
x: positionChange.position?.x,
|
||||||
|
y: positionChange.position?.y,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return currentTable;
|
||||||
|
})
|
||||||
|
.filter(
|
||||||
|
(table) =>
|
||||||
|
!removeChanges.some(
|
||||||
|
(change) => change.id === table.id
|
||||||
|
)
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user