feat(ui): add loading transition and TreeSpinner to drill-down

- Show opacity transition on groups table when drilling down
- Use TreeSpinner with "Loading resources..." text in drill-down view
- Match provider wizard spinner style with button-primary color

Ref: PROWLER-881
This commit is contained in:
alejandrobailo
2026-03-18 14:35:06 +01:00
parent 8ec55b757f
commit 776a5a443e
2 changed files with 16 additions and 5 deletions

View File

@@ -7,7 +7,7 @@ import {
RowSelectionState,
useReactTable,
} from "@tanstack/react-table";
import { ChevronLeft, Loader2 } from "lucide-react";
import { ChevronLeft } from "lucide-react";
import { useRouter, useSearchParams } from "next/navigation";
import { useCallback, useMemo, useState } from "react";
@@ -20,6 +20,7 @@ import {
TableRow,
} from "@/components/ui/table";
import { SeverityBadge, StatusFindingBadge } from "@/components/ui/table";
import { TreeSpinner } from "@/components/shadcn/tree-view/tree-spinner";
import { useInfiniteResources } from "@/hooks/use-infinite-resources";
import { cn, hasDateOrScanFilter } from "@/lib";
import { FindingGroupRow, FindingResourceRow } from "@/types";
@@ -250,8 +251,11 @@ export function FindingsGroupDrillDown({
{/* Loading indicator */}
{isLoading && (
<div className="flex items-center justify-center py-8">
<Loader2 className="text-text-neutral-tertiary size-6 animate-spin" />
<div className="flex items-center justify-center gap-2 py-8">
<TreeSpinner className="size-6" />
<span className="text-text-neutral-tertiary text-sm">
Loading resources...
</span>
</div>
)}

View File

@@ -27,6 +27,7 @@ export function FindingsGroupTable({
const [expandedGroup, setExpandedGroup] = useState<FindingGroupRow | null>(
null,
);
const [isDrillingDown, setIsDrillingDown] = useState(false);
// Track finding group IDs to detect data changes (e.g., after muting)
const currentIds = (data ?? []).map((g) => g.id).join(",");
@@ -82,9 +83,14 @@ export function FindingsGroupTable({
};
const handleDrillDown = (checkId: string, group: FindingGroupRow) => {
setExpandedCheckId(checkId);
setExpandedGroup(group);
setIsDrillingDown(true);
setRowSelection({});
// Brief loading state before switching to drill-down view
setTimeout(() => {
setExpandedCheckId(checkId);
setExpandedGroup(group);
setIsDrillingDown(false);
}, 150);
};
const handleCollapse = () => {
@@ -128,6 +134,7 @@ export function FindingsGroupTable({
getRowCanSelect={getRowCanSelect}
showSearch
searchPlaceholder="Search by Check ID"
isLoading={isDrillingDown}
/>
{selectedFindingIds.length > 0 && (