Skip to content

Commit e5420be

Browse files
herzadinataBOCOVO
authored andcommitted
fix(dblm-ext): should highlight fields in relation ends only when line arrow clicked
1 parent 9b77c07 commit e5420be

File tree

8 files changed

+55
-22
lines changed

8 files changed

+55
-22
lines changed

packages/json-table-schema-visualizer/src/components/Column/ColumnWrapper.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const ColumnWrapper = ({
2222
highlightColor,
2323
columnName,
2424
}: ColumnWrapperProps) => {
25-
const { hoveredTableName, highlightedColumn } = useTablesInfo();
25+
const { hoveredTableName, highlightedColumns } = useTablesInfo();
2626
const [hovered, setHovered] = useState(false);
2727
const tablePreferredWidth = useTableWidth();
2828

@@ -38,7 +38,7 @@ const ColumnWrapper = ({
3838
hovered,
3939
tableName,
4040
hoveredTableName,
41-
highlightedColumn,
41+
highlightedColumns,
4242
columnName,
4343
relationalTables,
4444
);

packages/json-table-schema-visualizer/src/components/DiagramViewer/DiagramWrapper.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ const DiagramWrapper = ({ children }: DiagramWrapperProps) => {
3535
const {
3636
hoveredTableName,
3737
setHoveredTableName,
38-
highlightedColumn,
39-
setHighlightedColumn,
38+
highlightedColumns,
39+
setHighlightedColumns,
4040
} = useTablesInfo();
4141

4242
// repositioning the stage only once
@@ -110,10 +110,14 @@ const DiagramWrapper = ({ children }: DiagramWrapperProps) => {
110110
const handleStagePointerDown = (
111111
e: KonvaEventObject<MouseEvent | TouchEvent>,
112112
) => {
113-
if (hoveredTableName == null && highlightedColumn == null) return;
113+
if (
114+
hoveredTableName == null &&
115+
(highlightedColumns == null || highlightedColumns.length === 0)
116+
)
117+
return;
114118
if (nodeBelongsToTable(e.target)) return;
115119
setHoveredTableName(null);
116-
setHighlightedColumn(null);
120+
setHighlightedColumns([]);
117121
};
118122

119123
const fitToView = () => {

packages/json-table-schema-visualizer/src/components/RelationConnection/ConnectionPath.tsx

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ interface ConnectionPathProps {
2727
sourceTableName: string;
2828
targetTableName: string;
2929
relationOwner: string;
30+
sourceFieldNames: string[];
31+
targetFieldNames: string[];
3032
}
3133

3234
const ARROW_ANGLE_OFFSET = 90;
@@ -39,10 +41,13 @@ const ConnectionPath = ({
3941
sourceTableName,
4042
targetTableName,
4143
relationOwner,
44+
sourceFieldNames,
45+
targetFieldNames,
4246
}: ConnectionPathProps) => {
4347
const themeColors = useThemeColors();
4448
const tablesInfo = useTablesInfo();
45-
const { hoveredTableName, setHoveredTableName } = tablesInfo;
49+
const { hoveredTableName, setHoveredTableName, setHighlightedColumns } =
50+
tablesInfo;
4651
const sourceTableColors = useTableColor(relationOwner);
4752
const srcWidth = useTableWidthStoredValue(sourceTableName);
4853
const tgtWidth = useTableWidthStoredValue(targetTableName);
@@ -75,6 +80,23 @@ const ConnectionPath = ({
7580
const srcHeight = TABLE_HEADER_HEIGHT + COLUMN_HEIGHT * sourceFieldsCount;
7681
const tgtHeight = TABLE_HEADER_HEIGHT + COLUMN_HEIGHT * targetFieldsCount;
7782

83+
const relationColumnKeys = useMemo(() => {
84+
const keys = new Set<string>();
85+
const addKeys = (tableName: string, fields: string[]) => {
86+
fields
87+
.filter(
88+
(fieldName) =>
89+
typeof fieldName === "string" && fieldName.trim() !== "",
90+
)
91+
.forEach((fieldName) => {
92+
keys.add(`${tableName}.${fieldName}`);
93+
});
94+
};
95+
addKeys(sourceTableName, sourceFieldNames);
96+
addKeys(targetTableName, targetFieldNames);
97+
return Array.from(keys);
98+
}, [sourceFieldNames, targetFieldNames, sourceTableName, targetTableName]);
99+
78100
interface TableBounds {
79101
left: number;
80102
right: number;
@@ -270,6 +292,7 @@ const ConnectionPath = ({
270292
};
271293

272294
const handleBtnClick = () => {
295+
setHighlightedColumns(relationColumnKeys);
273296
// Recompute the intended target using the stored stage-position of the button
274297
const srcCoords = tableCoordsStore.getCoords(sourceTableName);
275298
const tgtCoords = tableCoordsStore.getCoords(targetTableName);
@@ -282,7 +305,7 @@ const ConnectionPath = ({
282305

283306
if (targetToUse == null || targetToUse.length === 0) return;
284307
try {
285-
setHoveredTableName(targetToUse);
308+
setHoveredTableName(null);
286309
} catch (e) {
287310
// Ignore
288311
}

packages/json-table-schema-visualizer/src/components/RelationConnection/RelationConnection.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ const RelationConnection = ({ source, target }: RelationConnectionProps) => {
4040
sourceTableName={source.tableName}
4141
targetTableName={target.tableName}
4242
relationOwner={relationOwner}
43+
sourceFieldNames={source.fieldNames ?? []}
44+
targetFieldNames={target.fieldNames ?? []}
4345
/>
4446
</>
4547
);

packages/json-table-schema-visualizer/src/components/Search/Search.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ interface SearchProps {
2121
const Search = ({ tables }: SearchProps) => {
2222
const [search, setSearch] = useState("");
2323
const [isOpen, setIsOpen] = useState(false);
24-
const { setHoveredTableName, setHighlightedColumn } = useTablesInfo();
24+
const { setHoveredTableName, setHighlightedColumns } = useTablesInfo();
2525
const dropdownRef = useRef<HTMLDivElement>(null);
2626

2727
const searchResults = useMemo(() => {
28-
if (search === "") return [];
28+
if (search.length < 2) return [];
2929

3030
const results: SearchResult[] = [];
3131
const searchLower = search.toLowerCase();
@@ -58,9 +58,9 @@ const Search = ({ tables }: SearchProps) => {
5858
const handleSelect = (result: SearchResult) => {
5959
setHoveredTableName(null);
6060
if (result.type === "column") {
61-
setHighlightedColumn(`${result.tableName}.${result.name}`);
61+
setHighlightedColumns([`${result.tableName}.${result.name}`]);
6262
} else {
63-
setHighlightedColumn(null);
63+
setHighlightedColumns([]);
6464
}
6565
// Center the diagram on the selected table and ask the table to highlight itself
6666
eventEmitter.emit("table:center", { tableName: result.tableName });

packages/json-table-schema-visualizer/src/providers/TablesInfoProvider.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,7 @@ interface TablesInfoProviderProps {
1717

1818
const TablesInfoProvider = ({ children, tables }: TablesInfoProviderProps) => {
1919
const [hoveredTableName, setHoveredTableName] = useState<string | null>(null);
20-
const [highlightedColumn, setHighlightedColumn] = useState<string | null>(
21-
null,
22-
);
20+
const [highlightedColumns, setHighlightedColumns] = useState<string[]>([]);
2321
const { detailLevel } = useTableDetailLevel();
2422
const colsIndexes = computeColIndexes(tables, detailLevel);
2523

@@ -29,8 +27,8 @@ const TablesInfoProvider = ({ children, tables }: TablesInfoProviderProps) => {
2927
colsIndexes,
3028
hoveredTableName,
3129
setHoveredTableName,
32-
highlightedColumn,
33-
setHighlightedColumn,
30+
highlightedColumns,
31+
setHighlightedColumns,
3432
}}
3533
>
3634
{children}

packages/json-table-schema-visualizer/src/types/tablesInfoProviderValue.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ export interface TablesInfoProviderValue {
44
colsIndexes: ColsIndexesMap;
55
hoveredTableName: string | null;
66
setHoveredTableName: (tableName: string | null) => void;
7-
highlightedColumn: string | null;
8-
setHighlightedColumn: (columnKey: string | null) => void;
7+
highlightedColumns: string[];
8+
setHighlightedColumns: (columnKeys: string[]) => void;
99
}

packages/json-table-schema-visualizer/src/utils/shouldHighLightCol.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ export const shouldHighLightCol = (
33
hovered: boolean,
44
tableName: string | null,
55
hoveredTable: string | null,
6-
highlightedColumn: string | null,
6+
highlightedColumns: string[],
77
columnName: string | null,
88
relationalTables?: string[] | null,
99
): boolean => {
@@ -17,13 +17,19 @@ export const shouldHighLightCol = (
1717
: null;
1818

1919
if (
20-
highlightedColumn != null &&
2120
columnKey != null &&
22-
highlightedColumn === columnKey
21+
highlightedColumns?.some((key) => key === columnKey)
2322
) {
2423
return true;
2524
}
2625

26+
const hasExplicitHighlights =
27+
Array.isArray(highlightedColumns) && highlightedColumns.length > 0;
28+
29+
if (hasExplicitHighlights && hoveredTable == null) {
30+
return false;
31+
}
32+
2733
if (hoveredTable === tableName && !!relationalTables) {
2834
return true;
2935
}

0 commit comments

Comments
 (0)