Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
66ac8a9
Add form component
AndyRae Jul 13, 2025
481140e
First urn
AndyRae Jul 13, 2025
56b903d
Fixes
AndyRae Jul 13, 2025
0615b4a
Update edit
AndyRae Jul 13, 2025
6122872
Update update
AndyRae Jul 13, 2025
b3cb37c
Add edit scan report
AndyRae Jul 13, 2025
c243cd5
Add field edit form
AndyRae Jul 13, 2025
6dda5aa
Update create scan report
AndyRae Jul 13, 2025
8f28e04
Fix create
AndyRae Jul 13, 2025
76b9f47
Change gap
AndyRae Jul 13, 2025
c82f0b1
Update react select css
AndyRae Jul 13, 2025
bede4aa
Refactor input color variables in CSS for improved consistency
AndyRae Jul 14, 2025
857ccbf
Fix underline
AndyRae Jul 14, 2025
b141f3a
Fix colours
AndyRae Jul 14, 2025
2f0c1b5
Fix buttons
AndyRae Jul 14, 2025
305635c
Temp store
AndyRae Jul 14, 2025
b2c9367
Migrate tailwind 4.0
AndyRae Jul 14, 2025
1c04bc6
Fix colours
AndyRae Jul 14, 2025
992aa42
Fixing styles
AndyRae Jul 14, 2025
5d2a9cf
Undo duplicate styles
AndyRae Jul 15, 2025
353d4d0
Fix overflow
AndyRae Jul 15, 2025
83f7a71
Improve breadcrumbs
AndyRae Jul 15, 2025
b1ed1b3
Fix highlighting
AndyRae Jul 15, 2025
ec1de0d
Fix breadcrumbs
AndyRae Jul 15, 2025
f09fa1e
Move to component
AndyRae Jul 15, 2025
77cd1ed
Remove imports
AndyRae Jul 15, 2025
cb6b572
Working dropdown
AndyRae Jul 15, 2025
78129d9
Move link outside dropdown
AndyRae Jul 15, 2025
baa7a77
Add dropdown fields
AndyRae Jul 15, 2025
5bae810
Add root breadcrumb
AndyRae Jul 15, 2025
fe3516e
Move to component
AndyRae Jul 15, 2025
92d30f9
Fix links
AndyRae Jul 15, 2025
027ca34
Merge branch 'master' into feat/1075/forms/dataset
AndyRae Jul 31, 2025
aa2c8d3
Merge branch 'feat/1075/forms/dataset' into feat/1075/colours
AndyRae Jul 31, 2025
dce31c9
Merge branch 'feat/1075/colours' into feat/breadcrumbs
AndyRae Jul 31, 2025
0d198b3
Fix alerts
AndyRae Jul 31, 2025
e469d96
Update CreateScanReportForm to display maximum file size for uploads
AndyRae Jul 31, 2025
fc1b20c
Refactor ScanReports page and update error alert styling in CreateSca…
AndyRae Jul 31, 2025
62de4c1
Fix text on visbility
AndyRae Jul 31, 2025
c62890a
Merge branch 'feat/1075/forms/dataset' into feat/1075/colours
AndyRae Jul 31, 2025
4bc98a6
Update DataTable component to enable horizontal overflow scrolling
AndyRae Jul 31, 2025
8b9a6f7
Remove unused safelist entries from Tailwind CSS configuration
AndyRae Jul 31, 2025
0bf6dc9
Merge branch 'feat/1075/colours' into feat/breadcrumbs
AndyRae Jul 31, 2025
e743740
Merge branch 'master' into feat/breadcrumbs
AndyRae Aug 1, 2025
52b5fe5
Merge branch 'master' into feat/breadcrumbs
AndyRae Aug 1, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 3 additions & 8 deletions app/next-client-app/app/(protected)/scanreports/[id]/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ export default async function ScanReportLayout(
const items = [
{
name: "Tables",
iconName: "TableProperties"
iconName: "TableProperties",
matchPrefixes: ["tables"]
},
{ name: "Rules", slug: "mapping_rules", iconName: "Waypoints" },
{ name: "Review Rules", slug: "review_rules", iconName: "SearchCheck" },
Expand Down Expand Up @@ -153,13 +154,7 @@ export default async function ScanReportLayout(
<div>
<NavGroup
path={`/scanreports/${params.id}`}
items={[
...items.map((x) => ({
text: x.name,
slug: x.slug,
iconName: x.iconName
}))
]}
items={items.map(x => ({ ...x, text: x.name }))}
/>
</div>

Expand Down
22 changes: 14 additions & 8 deletions app/next-client-app/app/(protected)/scanreports/[id]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { objToQuery } from "@/lib/client-utils";
import { FilterParameters } from "@/types/filter";
import ScanReportsTableClient from "@/components/scanreports/ScanReportsTableClient";
import { DataTableFilter } from "@/components/data-table/DataTableFilter";
import { Breadcrumb, BreadcrumbItem, BreadcrumbList, BreadcrumbPage } from "@/components/ui/breadcrumb";

interface ScanReportsTableProps {
params: Promise<{
Expand Down Expand Up @@ -43,14 +44,19 @@ export default async function ScanReportsTable(props: ScanReportsTableProps) {

return (
<div>
<div>
<ScanReportsTableClient
scanReportId={id}
Filter={filter}
initialScanReportsResult={scanReportsResult}
count={scanReportsTables.count}
/>
</div>
<Breadcrumb className="mb-3">
<BreadcrumbList>
<BreadcrumbPage>
Tables
</BreadcrumbPage>
</BreadcrumbList>
</Breadcrumb>
<ScanReportsTableClient
scanReportId={id}
Filter={filter}
initialScanReportsResult={scanReportsResult}
count={scanReportsTables.count}
/>
</div>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ import {
} from "@/api/concepts";
import { ConceptDataTable } from "@/components/concepts/ConceptDataTable";
import { columns } from "./columns";
import { Button } from "@/components/ui/button";
import Link from "next/link";
import { TableBreadcrumbs } from "@/components/scanreports/TableBreadcrumbs";

interface ScanReportsValueProps {
params: Promise<{
Expand Down Expand Up @@ -66,17 +65,14 @@ export default async function ScanReportsValue(props: ScanReportsValueProps) {
: [];
return (
<div>
<div className="gap-2 flex">
{" "}
<Link href={`/scanreports/${id}/tables/${tableId}`}>
<Button variant="secondary" className="mb-3">
Table: {table.name}
</Button>
</Link>
<Button variant="secondary" className="mb-3">
Field: {field.name}
</Button>
</div>
<TableBreadcrumbs
id={id}
tableId={tableId}
fieldId={fieldId}
tableName={table.name}
fieldName={field.name}
variant="field"
/>
<div>
<ConceptDataTable
count={scanReportsValues.count}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,8 @@ import {
getScanReportTable,
} from "@/api/scanreports";
import { ScanReportFieldEditForm } from "@/components/scanreports/ScanReportFieldEditForm";
import Link from "next/link";
import { Button } from "@/components/ui/button";
import { notFound } from "next/navigation";
import { TableBreadcrumbs } from "@/components/scanreports/TableBreadcrumbs";

interface ScanReportsEditFieldProps {
params: Promise<{
Expand Down Expand Up @@ -37,17 +36,14 @@ export default async function ScanReportsEditField(props: ScanReportsEditFieldPr

return (
<div>
<div className="gap-2 flex">
{" "}
<Link href={`/scanreports/${id}/tables/${tableId}`}>
<Button variant={"secondary"} className="mb-3">
Table: {table.name}
</Button>
</Link>
<Button variant={"secondary"} className="mb-3">
Update Field: {field.name}
</Button>
</div>
<TableBreadcrumbs
id={id}
tableId={tableId}
fieldId={fieldId}
tableName={table.name}
fieldName={field.name}
variant="fieldUpdate"
/>
<div className="mt-2">
<ScanReportFieldEditForm
scanreportId={scanReport.id}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import {
getAllScanReportConcepts,
} from "@/api/concepts";
import { ConceptDataTable } from "@/components/concepts/ConceptDataTable";
import { Button } from "@/components/ui/button";
import { TableBreadcrumbs } from "@/components/scanreports/TableBreadcrumbs";

interface ScanReportsFieldProps {
params: Promise<{
Expand Down Expand Up @@ -58,9 +58,12 @@ export default async function ScanReportsField(props: ScanReportsFieldProps) {

return (
<div>
<Button variant={"secondary"} className="mb-3">
Table: {tableName.name}
</Button>
<TableBreadcrumbs
id={id}
tableId={tableId}
tableName={tableName.name}
variant="table"
/>
<div>
<ConceptDataTable
count={scanReportsFields.count}
Expand Down
20 changes: 12 additions & 8 deletions app/next-client-app/components/core/nav-button.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"use client";

import Link from "next/link";
import { useSelectedLayoutSegment } from "next/navigation";
import { usePathname } from "next/navigation";
import { Item } from "./nav-group";
import { Button } from "../ui/button";
import { cn } from "@/lib/utils";
Expand All @@ -26,14 +26,18 @@ export const NavButton = ({
parallelRoutesKey?: string;
item: Item;
}) => {
const segment = useSelectedLayoutSegment(parallelRoutesKey);
const pathname = usePathname();
const href = item.slug ? path + "/" + item.slug : path;
const isActive =
// Example home pages e.g. `/layouts`
(!item.slug && segment === null) ||
segment === item.segment ||
// Nested pages e.g. `/layouts/electronics`
segment === item.slug;
const isActive = item.slug
? pathname === href || pathname.startsWith(href + "/")
: (
pathname === path ||
pathname === path + "/" ||
(item.matchPrefixes &&
item.matchPrefixes.some(prefix =>
pathname.startsWith(path + "/" + prefix)
))
);
const iconMap: { [key: string]: LucideIcon } = {
SearchCheck,
Waypoints,
Expand Down
1 change: 1 addition & 0 deletions app/next-client-app/components/core/nav-group.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export type Item = {
segment?: string;
parallelRoutesKey?: string;
iconName?: string;
matchPrefixes?: string[];
};

export const NavGroup = ({
Expand Down
122 changes: 122 additions & 0 deletions app/next-client-app/components/scanreports/TableBreadcrumbs.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
import { Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbSeparator, BreadcrumbPage } from "@/components/ui/breadcrumb";
import Link from "next/link";
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
import { ChevronDownIcon } from "lucide-react";
import { getScanReportFields, getScanReportTables } from "@/api/scanreports";

interface TableBreadcrumbsProps {
id: string;
tableId?: string;
fieldId?: string;
tableName?: string;
fieldName?: string;
variant: "table" | "field" | "fieldUpdate";
}

// Helper: Table breadcrumb with dropdown
function TableBreadcrumbWithDropdown({ id, tableId, tableName, tables }: { id: string, tableId: string, tableName: string, tables: any }) {
return (
<span className="flex items-center gap-1">
<Link href={`/scanreports/${id}/tables/${tableId}`}>Table: {tableName}</Link>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<span tabIndex={0} role="button" aria-label="Show table list">
<ChevronDownIcon size={16} />
</span>
</DropdownMenuTrigger>
<DropdownMenuContent align="start">
{tables.results.map((table: any) => (
<DropdownMenuItem asChild key={table.id}>
<Link href={`/scanreports/${id}/tables/${table.id}`}>{table.name}</Link>
</DropdownMenuItem>
))}
</DropdownMenuContent>
</DropdownMenu>
</span>
);
}

// Helper: Field breadcrumb with dropdown
function FieldBreadcrumbWithDropdown({ id, tableId, fieldId, fieldName, fields }: { id: string, tableId: string, fieldId: string, fieldName: string, fields: any }) {
return (
<span className="flex items-center gap-1">
<Link href={`/scanreports/${id}/tables/${tableId}/fields/${fieldId}`}>Field: {fieldName}</Link>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<span tabIndex={0} role="button" aria-label="Show field list">
<ChevronDownIcon size={16} />
</span>
</DropdownMenuTrigger>
<DropdownMenuContent align="start">
{fields.results.map((field: any) => (
<DropdownMenuItem asChild key={field.id}>
<Link href={`/scanreports/${id}/tables/${tableId}/fields/${field.id}`}>{field.name}</Link>
</DropdownMenuItem>
))}
</DropdownMenuContent>
</DropdownMenu>
</span>
);
}

export async function TableBreadcrumbs({
id,
tableId,
fieldId,
tableName,
fieldName,
variant,
}: TableBreadcrumbsProps) {
const tables = await getScanReportTables(id, undefined);
let fields: any = { count: 0, next: null, previous: null, results: [] };
if (tableId) {
fields = await getScanReportFields(id, tableId, undefined);
}

return (
<Breadcrumb className="mb-3">
<BreadcrumbList>
<BreadcrumbItem>
<Link href={`/scanreports/${id}`}>Tables</Link>
</BreadcrumbItem>
{variant === "table" && tableId && tableName && (
<>
<BreadcrumbSeparator />
<BreadcrumbPage>
<TableBreadcrumbWithDropdown id={id} tableId={tableId} tableName={tableName} tables={tables} />
</BreadcrumbPage>
</>
)}
{variant === "field" && tableId && tableName && fieldId && fieldName && (
<>
<BreadcrumbSeparator />
<BreadcrumbItem>
<TableBreadcrumbWithDropdown id={id} tableId={tableId} tableName={tableName} tables={tables} />
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbPage>
<FieldBreadcrumbWithDropdown id={id} tableId={tableId} fieldId={fieldId} fieldName={fieldName} fields={fields} />
</BreadcrumbPage>
</>
)}
{variant === "fieldUpdate" && tableId && tableName && fieldId && fieldName && (
<>
<BreadcrumbSeparator />
<BreadcrumbItem>
<TableBreadcrumbWithDropdown id={id} tableId={tableId} tableName={tableName} tables={tables} />
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbPage>
<Link href={`/scanreports/${id}/tables/${tableId}/fields/${fieldId}/update`}>Update Field: {fieldName}</Link>
</BreadcrumbPage>
</>
)}
</BreadcrumbList>
</Breadcrumb>
);
}
Loading