diff --git a/packages/web/src/designer/Designer.js b/packages/web/src/designer/Designer.js index 3cd1d0f32..f79e9db4a 100644 --- a/packages/web/src/designer/Designer.js +++ b/packages/web/src/designer/Designer.js @@ -71,24 +71,55 @@ export default function Designer({ value, onChange }) { ); const handleCreateReference = (source, target) => { + const existingReference = (value.references || []).find( + (x) => + (x.sourceId == source.designerId && x.targetId == target.designerId) || + (x.sourceId == target.designerId && x.targetId == source.designerId) + ); const newValue = { ...value, - references: [ - ...(value.references || []), - { - designerId: uuidv1(), - source, - target, - }, - ], + references: existingReference + ? value.references.map((ref) => + ref == existingReference + ? { + ...existingReference, + columns: [ + ...existingReference.columns, + existingReference.sourceId == source.designerId + ? { + source: source.columnName, + target: target.columnName, + } + : { + source: target.columnName, + target: source.columnName, + }, + ], + } + : ref + ) + : [ + ...(value.references || []), + { + designerId: uuidv1(), + sourceId: source.designerId, + targetId: target.designerId, + columns: [ + { + source: source.columnName, + target: target.columnName, + }, + ], + }, + ], }; onChange(newValue); }; -// React.useEffect(() => { -// setTimeout(() => setChangeToken((x) => x + 1), 100); -// }, [value]); + // React.useEffect(() => { + // setTimeout(() => setChangeToken((x) => x + 1), 100); + // }, [value]); return ( e.preventDefault()} onDrop={handleDrop} theme={theme} ref={wrapperRef}> diff --git a/packages/web/src/designer/DesignerReference.js b/packages/web/src/designer/DesignerReference.js index 8c9b32e5e..0f39c7df2 100644 --- a/packages/web/src/designer/DesignerReference.js +++ b/packages/web/src/designer/DesignerReference.js @@ -2,6 +2,7 @@ import React from 'react'; import styled from 'styled-components'; import DomTableRef from './DomTableRef'; import _ from 'lodash'; +import useTheme from '../theme/useTheme'; const StyledSvg = styled.svg` position: absolute; @@ -13,77 +14,115 @@ const StyledSvg = styled.svg` height: 100%; `; -export default function DesignerReference({ domTablesRef, designerId, source, target, changeToken }) { +export default function DesignerReference({ domTablesRef, designerId, sourceId, targetId, columns, changeToken }) { + const theme = useTheme(); const domTables = domTablesRef.current; /** @type {DomTableRef} */ - const sourceTable = domTables[source.designerId]; + const sourceTable = domTables[sourceId]; /** @type {DomTableRef} */ - const targetTable = domTables[target.designerId]; + const targetTable = domTables[targetId]; if (!sourceTable || !targetTable) return null; const sourceRect = sourceTable.getRect(); const targetRect = targetTable.getRect(); if (!sourceRect || !targetRect) return null; - const sourceY = sourceTable.getColumnY(source.columnName); - const targetY = targetTable.getColumnY(target.columnName); + const sourceY = sourceTable.getColumnY(columns[0].source); + const targetY = targetTable.getColumnY(columns[0].target); if (sourceY == null || targetY == null) return null; -// const buswi = 10; -// const extwi = 25; + const buswi = 10; + const extwi = 25; -// const possibilities = []; -// possibilities.push({ xsrc: sourceRect.left - buswi, dirsrc: -1, xdst: targetRect.left - buswi, dirdst: -1 }); -// possibilities.push({ xsrc: sourceRect.left - buswi, dirsrc: -1, xdst: targetRect.right + buswi, dirdst: 1 }); -// possibilities.push({ xsrc: sourceRect.right + buswi, dirsrc: 1, xdst: targetRect.left - buswi, dirdst: -1 }); -// possibilities.push({ xsrc: sourceRect.right + buswi, dirsrc: 1, xdst: targetRect.right + buswi, dirdst: 1 }); + const possibilities = []; + possibilities.push({ xsrc: sourceRect.left - buswi, dirsrc: -1, xdst: targetRect.left - buswi, dirdst: -1 }); + possibilities.push({ xsrc: sourceRect.left - buswi, dirsrc: -1, xdst: targetRect.right + buswi, dirdst: 1 }); + possibilities.push({ xsrc: sourceRect.right + buswi, dirsrc: 1, xdst: targetRect.left - buswi, dirdst: -1 }); + possibilities.push({ xsrc: sourceRect.right + buswi, dirsrc: 1, xdst: targetRect.right + buswi, dirdst: 1 }); -// let minpos = _.minBy(possibilities, (p) => Math.abs(p.xsrc - p.xdst)); + let minpos = _.minBy(possibilities, (p) => Math.abs(p.xsrc - p.xdst)); -// let srcY = _.mean(sourceTable.table.columns.map((x) => sourceTable.getColumnY(source.columnName))); -// let dstY = _.mean(ref.columns.map((x) => table2.getColumnY(x.column2.name))); + let srcY = _.mean(columns.map((x) => sourceTable.getColumnY(x.source))); + let dstY = _.mean(columns.map((x) => targetTable.getColumnY(x.target))); -// if (ref.columns.length == 0) { -// srcY = table1.getColumnY(''); -// dstY = table2.getColumnY(''); -// } + // let srcY = _.mean(sourceTable.table.columns.map((x) => sourceTable.getColumnY(source.columnName))); + // let dstY = _.mean(ref.columns.map((x) => table2.getColumnY(x.column2.name))); -// let src = { x: minpos.xsrc - canvasOffset.left, y: srcY - canvasOffset.top }; -// let dst = { x: minpos.xdst - canvasOffset.left, y: dstY - canvasOffset.top }; + if (columns.length == 0) { + srcY = sourceTable.getColumnY(''); + dstY = targetTable.getColumnY(''); + } -// ctx.moveTo(src.x, src.y); -// ctx.lineTo(src.x + extwi * minpos.dirsrc, src.y); -// ctx.lineTo(dst.x + extwi * minpos.dirdst, dst.y); -// ctx.lineTo(dst.x, dst.y); -// ctx.stroke(); + const src = { x: minpos.xsrc, y: srcY }; + const dst = { x: minpos.xdst, y: dstY }; -// for (let col of ref.columns) { -// let y1 = table1.getColumnY(col.column1.name); -// let y2 = table2.getColumnY(col.column2.name); + // ctx.moveTo(src.x, src.y); + // ctx.lineTo(src.x + extwi * minpos.dirsrc, src.y); + // ctx.lineTo(dst.x + extwi * minpos.dirdst, dst.y); + // ctx.lineTo(dst.x, dst.y); + // ctx.stroke(); -// ctx.moveTo(src.x, src.y); -// ctx.lineTo(src.x, y1 - canvasOffset.top); -// ctx.lineTo(src.x - buswi * minpos.dirsrc, y1 - canvasOffset.top); -// ctx.stroke(); + // for (let col of ref.columns) { + // let y1 = table1.getColumnY(col.column1.name); + // let y2 = table2.getColumnY(col.column2.name); -// ctx.moveTo(dst.x, dst.y); -// ctx.lineTo(dst.x, y2 - canvasOffset.top); -// ctx.lineTo(dst.x - buswi * minpos.dirdst, y2 - canvasOffset.top); -// ctx.stroke(); -// } + // ctx.moveTo(src.x, src.y); + // ctx.lineTo(src.x, y1 - canvasOffset.top); + // ctx.lineTo(src.x - buswi * minpos.dirsrc, y1 - canvasOffset.top); + // ctx.stroke(); -// this.referencePositions[ref.uniqueName] = { -// x: (src.x + extwi * minpos.dirsrc + dst.x + extwi * minpos.dirdst) / 2, -// y: (src.y + dst.y) / 2, -// }; + // ctx.moveTo(dst.x, dst.y); + // ctx.lineTo(dst.x, y2 - canvasOffset.top); + // ctx.lineTo(dst.x - buswi * minpos.dirdst, y2 - canvasOffset.top); + // ctx.stroke(); + // } + + // this.referencePositions[ref.uniqueName] = { + // x: (src.x + extwi * minpos.dirsrc + dst.x + extwi * minpos.dirdst) / 2, + // y: (src.y + dst.y) / 2, + // }; + const lineStyle = { fill: 'none', stroke: theme.designer_line, strokeWidth: 2 }; return ( - */} + + {columns.map((col, colIndex) => { + let y1 = sourceTable.getColumnY(col.source); + let y2 = targetTable.getColumnY(col.target); + return ( + + + + + ); + })} ); // return
{source.columnName}
; diff --git a/packages/web/src/theme/dark.js b/packages/web/src/theme/dark.js index 48e3a0999..a39ba49e5 100644 --- a/packages/web/src/theme/dark.js +++ b/packages/web/src/theme/dark.js @@ -32,6 +32,7 @@ const theme = { designer_background: '#333', designtable_background: '#000', + designer_line: '#bbb', }; export default fillTheme(theme); diff --git a/packages/web/src/theme/light.js b/packages/web/src/theme/light.js index a9a6a8315..6324946ff 100644 --- a/packages/web/src/theme/light.js +++ b/packages/web/src/theme/light.js @@ -31,6 +31,7 @@ const theme = { designer_background: '#eee', designtable_background: '#fff', + designer_line: '#666', }; export default fillTheme(theme);