diff --git a/Website/components/datamodelview/Attributes.tsx b/Website/components/datamodelview/Attributes.tsx
index 390f734..3aa8a86 100644
--- a/Website/components/datamodelview/Attributes.tsx
+++ b/Website/components/datamodelview/Attributes.tsx
@@ -18,6 +18,7 @@ import { highlightMatch } from "../datamodelview/List";
import { Box, Button, FormControl, InputAdornment, InputLabel, MenuItem, Select, Table, TableBody, TableCell, TableHead, TableRow, TextField, Tooltip, Typography, useTheme } from "@mui/material"
import { ClearRounded, SearchRounded, Visibility, VisibilityOff, ArrowUpwardRounded, ArrowDownwardRounded } from "@mui/icons-material"
import { useEntityFiltersDispatch } from "@/contexts/EntityFiltersContext"
+import { useDatamodelData } from "@/contexts/DatamodelDataContext"
type SortDirection = 'asc' | 'desc' | null
type SortColumn = 'displayName' | 'schemaName' | 'type' | 'description' | null
@@ -37,6 +38,7 @@ export const Attributes = ({ entity, search = "", onVisibleCountChange }: IAttri
const theme = useTheme();
const entityFiltersDispatch = useEntityFiltersDispatch();
+ const { searchScope } = useDatamodelData();
// Report filter state changes to context
useEffect(() => {
@@ -144,7 +146,10 @@ export const Attributes = ({ entity, search = "", onVisibleCountChange }: IAttri
}
const sortedAttributes = getSortedAttributes();
- const highlightTerm = searchQuery || search; // Use internal search or parent search for highlighting
+ // Only highlight if search scope includes columns
+ // Use internal search query first, or parent search if column scopes are enabled
+ const highlightTerm = searchQuery ||
+ (search && (searchScope.columnNames || searchScope.columnDescriptions || searchScope.columnDataTypes) ? search : "");
// Notify parent of visible count changes
useEffect(() => {
@@ -432,9 +437,9 @@ function getAttributeComponent(entity: EntityType, attribute: AttributeType, hig
case 'ChoiceAttribute':
return ;
case 'DateTimeAttribute':
- return ;
+ return ;
case 'GenericAttribute':
- return ;
+ return ;
case 'IntegerAttribute':
return ;
case 'LookupAttribute':
@@ -442,11 +447,11 @@ function getAttributeComponent(entity: EntityType, attribute: AttributeType, hig
case 'DecimalAttribute':
return ;
case 'StatusAttribute':
- return ;
+ return ;
case 'StringAttribute':
- return ;
+ return ;
case 'BooleanAttribute':
- return ;
+ return ;
case 'FileAttribute':
return ;
default:
diff --git a/Website/components/datamodelview/DatamodelView.tsx b/Website/components/datamodelview/DatamodelView.tsx
index cd26e2a..a8b8e18 100644
--- a/Website/components/datamodelview/DatamodelView.tsx
+++ b/Website/components/datamodelview/DatamodelView.tsx
@@ -4,19 +4,20 @@ import { useSidebar } from "@/contexts/SidebarContext";
import { SidebarDatamodelView } from "./SidebarDatamodelView";
import { useDatamodelView, useDatamodelViewDispatch } from "@/contexts/DatamodelViewContext";
import { List } from "./List";
-import { TimeSlicedSearch } from "./TimeSlicedSearch";
+import { TimeSlicedSearch, SearchScope } from "./TimeSlicedSearch";
import React, { useState, useEffect, useRef, useCallback, useMemo } from "react";
import { useDatamodelData, useDatamodelDataDispatch } from "@/contexts/DatamodelDataContext";
import { updateURL } from "@/lib/url-utils";
import { useSearchParams } from "next/navigation";
-import { AttributeType, EntityType, GroupType } from "@/lib/Types";
+import { AttributeType, EntityType, GroupType, RelationshipType } from "@/lib/Types";
import { useEntityFilters } from "@/contexts/EntityFiltersContext";
// Type for search results
type SearchResultItem =
| { type: 'group'; group: GroupType }
| { type: 'entity'; group: GroupType; entity: EntityType }
- | { type: 'attribute'; group: GroupType; entity: EntityType; attribute: AttributeType };
+ | { type: 'attribute'; group: GroupType; entity: EntityType; attribute: AttributeType }
+ | { type: 'relationship'; group: GroupType; entity: EntityType; relationship: RelationshipType };
export function DatamodelView() {
const { setElement, expand } = useSidebar();
@@ -32,22 +33,67 @@ export function DatamodelView() {
}
function DatamodelViewContent() {
- const { scrollToSection, scrollToAttribute, restoreSection } = useDatamodelView();
+ const { scrollToSection, scrollToAttribute, scrollToRelationship, restoreSection } = useDatamodelView();
const datamodelDispatch = useDatamodelViewDispatch();
- const { groups, filtered } = useDatamodelData();
+ const { groups, filtered, search } = useDatamodelData();
const datamodelDataDispatch = useDatamodelDataDispatch();
- const { filters: entityFilters } = useEntityFilters();
+ const { filters: entityFilters, selectedSecurityRoles } = useEntityFilters();
const workerRef = useRef(null);
const [currentSearchIndex, setCurrentSearchIndex] = useState(0);
const accumulatedResultsRef = useRef([]); // Track all results during search
+ const searchRequestIdRef = useRef(0); // Track search requests to ignore stale results
+ const [searchScope, setSearchScope] = useState({
+ columnNames: true,
+ columnDescriptions: true,
+ columnDataTypes: false,
+ tableDescriptions: false,
+ relationships: false,
+ });
+ // Track which tab should be active for each entity during search navigation
+ const [entityActiveTabs, setEntityActiveTabs] = useState