diff --git a/packages/web/src/designer/Designer.js b/packages/web/src/designer/Designer.js index 9c198b9d6..19c716a10 100644 --- a/packages/web/src/designer/Designer.js +++ b/packages/web/src/designer/Designer.js @@ -16,6 +16,8 @@ export default function Designer({ value, onChange }) { const [sourceDragColumn, setSourceDragColumn] = React.useState(null); const [targetDragColumn, setTargetDragColumn] = React.useState(null); + const domTablesRef = React.useRef({}); + const wrapperRef = React.useRef(); const handleDrop = (e) => { var data = e.dataTransfer.getData('app_object_drag_data'); @@ -84,9 +86,9 @@ export default function Designer({ value, onChange }) { }; return ( - e.preventDefault()} onDrop={handleDrop} theme={theme}> + e.preventDefault()} onDrop={handleDrop} theme={theme} ref={wrapperRef}> {(references || []).map((ref) => ( - + ))} {(tables || []).map((table) => ( { + domTablesRef.current[table.designerId] = table; + }} /> ))} diff --git a/packages/web/src/designer/DesignerReference.js b/packages/web/src/designer/DesignerReference.js index 23f45ffc2..8a0ef1a49 100644 --- a/packages/web/src/designer/DesignerReference.js +++ b/packages/web/src/designer/DesignerReference.js @@ -1,5 +1,6 @@ import React from 'react'; import styled from 'styled-components'; +import DomTableRef from './DomTableRef'; const StyledSvg = styled.svg` position: absolute; @@ -11,18 +12,23 @@ const StyledSvg = styled.svg` height: 100%; `; -export default function DesignerReference({ tables, designerId, source, target }) { - const sourceTable = tables.find((x) => x.designerId == source.designerId); - const targetTable = tables.find((x) => x.designerId == target.designerId); +export default function DesignerReference({ domTables, designerId, source, target }) { + console.log('domTables', domTables); + /** @type {DomTableRef} */ + const sourceTable = domTables[source.designerId]; + /** @type {DomTableRef} */ + const targetTable = domTables[target.designerId]; if (!sourceTable || !targetTable) return null; - console.log('LINE', sourceTable.left, sourceTable.top, targetTable.left, targetTable.top); + const sourceRect = sourceTable.getRect(); + const targetRect = targetTable.getRect(); + console.log('LINE', sourceRect.left, sourceRect.top, targetRect.left, targetRect.top); return ( diff --git a/packages/web/src/designer/DesignerTable.js b/packages/web/src/designer/DesignerTable.js index 85010d816..a697d0917 100644 --- a/packages/web/src/designer/DesignerTable.js +++ b/packages/web/src/designer/DesignerTable.js @@ -3,6 +3,7 @@ import styled from 'styled-components'; import ColumnLabel from '../datagrid/ColumnLabel'; import { FontIcon } from '../icons'; import useTheme from '../theme/useTheme'; +import DomTableRef from './DomTableRef'; const Wrapper = styled.div` position: absolute; @@ -87,11 +88,14 @@ export default function DesignerTable({ setSourceDragColumn, targetDragColumn, setTargetDragColumn, + onChangeDomTable, + wrapperRef, }) { const { pureName, columns, left, top, designerId } = table; const [movingPosition, setMovingPosition] = React.useState(null); const movingPositionRef = React.useRef(null); const theme = useTheme(); + const domObjectsRef = React.useRef({}); const moveStartXRef = React.useRef(null); const moveStartYRef = React.useRef(null); @@ -160,6 +164,11 @@ export default function DesignerTable({ [handleMove, handleMoveEnd] ); + const dispatchDomColumn = (columnName, dom) => { + domObjectsRef.current[columnName] = dom; + onChangeDomTable(new DomTableRef(table, domObjectsRef.current, wrapperRef.current)); + }; + return ( onBringToFront(table)} + ref={(dom) => dispatchDomColumn('', dom)} >
{pureName} @@ -181,6 +191,7 @@ export default function DesignerTable({ key={column.columnName} theme={theme} draggable + ref={(dom) => dispatchDomColumn(column.columnName, dom)} // @ts-ignore isDragSource={ sourceDragColumn && diff --git a/packages/web/src/designer/DomTableRef.ts b/packages/web/src/designer/DomTableRef.ts new file mode 100644 index 000000000..4b8edc69f --- /dev/null +++ b/packages/web/src/designer/DomTableRef.ts @@ -0,0 +1,22 @@ +import { TableInfo } from 'dbgate-types'; + +type DesignerTableInfo = TableInfo & { desingerId: string }; + +export default class DomTableRef { + domTable: Element; + domWrapper: Element; + table: DesignerTableInfo; + constructor(table: DesignerTableInfo, domRefs, domWrapper: Element) { + this.domTable = domRefs['']; + this.domWrapper = domWrapper; + this.table = table; + } + + getRect() { + return this.domTable.getBoundingClientRect(); + } + + get designerId() { + return this.table.desingerId; + } +}