Skip to content

Commit 5e80db1

Browse files
committed
feat: add onSchemaSearch prop to TypeBadge and integrate schema search functionality in datasets
1 parent 605c5d7 commit 5e80db1

File tree

5 files changed

+87
-6
lines changed

5 files changed

+87
-6
lines changed

src/modules/datasets/dataset/buildDatasetDetails.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,26 @@ export function buildDatasetDetails({
1515
dataset,
1616
schema,
1717
isSchemaLoading,
18+
onSchemaSearch,
1819
}: {
1920
dataset: DatasetQuery['dataset'];
2021
schema?: NonNullable<
2122
NonNullable<DatasetSchemaQuery['protectedData']>['schema']
2223
>;
2324
isSchemaLoading: boolean;
25+
onSchemaSearch?: (
26+
schema: NonNullable<
27+
NonNullable<DatasetSchemaQuery['protectedData']>['schema']
28+
>
29+
) => void;
2430
}) {
2531
if (!dataset) {
2632
return {};
2733
}
2834

2935
const firstTransfer =
3036
Array.isArray(dataset?.transfers) && dataset?.transfers[0];
31-
const firstTimestamp = firstTransfer?.transaction?.timestamp;
37+
const firstTimestamp = firstTransfer && firstTransfer.transaction?.timestamp;
3238

3339
return {
3440
...(dataset.address && {
@@ -56,6 +62,7 @@ export function buildDatasetDetails({
5662
maxVisible={Infinity}
5763
direction="horizontal"
5864
overflowHidden={false}
65+
onSchemaSearch={onSchemaSearch}
5966
/>
6067
),
6168
}),

src/modules/datasets/dataset/schema/TypeBadge.tsx

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ export interface TypeBadgeProps {
2020
className?: string;
2121
overflowHidden?: boolean;
2222
enableTooltip?: boolean;
23+
onSchemaSearch?: (
24+
schema: NonNullable<
25+
NonNullable<DatasetSchemaQuery['protectedData']>['schema']
26+
>
27+
) => void;
2328
}
2429

2530
const getBorderColor = (type: string) => {
@@ -61,7 +66,8 @@ const renderBadge = (
6166
);
6267

6368
const renderTooltipContent = (
64-
schemaPaths: { path: string; type: string }[]
69+
schemaPaths: { path: string; type: string }[],
70+
onSchemaSearch?: (schema: any) => void
6571
) => (
6672
<div className="flex flex-col gap-1">
6773
{schemaPaths.map((schema) => (
@@ -76,6 +82,18 @@ const renderTooltipContent = (
7682
<span>: {schema.type}</span>
7783
</div>
7884
))}
85+
{onSchemaSearch && (
86+
<button
87+
className="text-xs hover:underline"
88+
onClick={(event) => {
89+
event.stopPropagation();
90+
event.preventDefault();
91+
onSchemaSearch(schemaPaths);
92+
}}
93+
>
94+
Search schemas
95+
</button>
96+
)}
7997
</div>
8098
);
8199

@@ -87,6 +105,7 @@ const TypeBadge: React.FC<TypeBadgeProps> = ({
87105
className,
88106
overflowHidden = true,
89107
enableTooltip = false,
108+
onSchemaSearch,
90109
}) => {
91110
if (isLoading && schemaPaths && schemaPaths.length === 0) {
92111
return (
@@ -137,6 +156,18 @@ const TypeBadge: React.FC<TypeBadgeProps> = ({
137156
)}
138157
>
139158
{badges}
159+
{!enableTooltip && onSchemaSearch && (
160+
<button
161+
className="text-xs hover:underline"
162+
onClick={(event) => {
163+
event.stopPropagation();
164+
event.preventDefault();
165+
onSchemaSearch(schemaPaths);
166+
}}
167+
>
168+
Search schemas
169+
</button>
170+
)}
140171
</div>
141172
);
142173

@@ -147,7 +178,7 @@ const TypeBadge: React.FC<TypeBadgeProps> = ({
147178
<Tooltip>
148179
<TooltipTrigger asChild>{content}</TooltipTrigger>
149180
<TooltipContent className="max-w-xs p-4">
150-
{renderTooltipContent(safeSchemaPaths)}
181+
{renderTooltipContent(safeSchemaPaths, onSchemaSearch)}
151182
</TooltipContent>
152183
</Tooltip>
153184
</TooltipProvider>

src/modules/datasets/datasetsTable/columns.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@ type Dataset = DatasetsQuery['datasets'][number] & {
99
schema?: Array<{ path?: string | null; type?: string | null }>;
1010
isSchemasLoading?: boolean;
1111
};
12-
export const columns: ColumnDef<Dataset>[] = [
12+
13+
export const createColumns = (
14+
onSchemaSearch?: (
15+
schema: Array<{ path?: string | null; type?: string | null }>
16+
) => void
17+
): ColumnDef<Dataset>[] => [
1318
{
1419
accessorKey: 'datasetAddress',
1520
header: 'Dataset',
@@ -54,6 +59,7 @@ export const columns: ColumnDef<Dataset>[] = [
5459
isLoading={isSchemasLoading}
5560
schemaPaths={datasetSchema}
5661
enableTooltip={true}
62+
onSchemaSearch={onSchemaSearch}
5763
/>
5864
);
5965
},
@@ -97,3 +103,5 @@ export const columns: ColumnDef<Dataset>[] = [
97103
},
98104
},
99105
];
106+
107+
export const columns = createColumns();

src/routes/$chainSlug/_layout/dataset/$datasetAddress.tsx

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ import { TABLE_LENGTH, TABLE_REFETCH_INTERVAL } from '@/config';
22
import { execute as dataprotectorExecute } from '@/graphql/dataprotector/execute';
33
import { execute } from '@/graphql/poco/execute';
44
import { useQuery } from '@tanstack/react-query';
5-
import { createFileRoute } from '@tanstack/react-router';
5+
import {
6+
createFileRoute,
7+
useNavigate,
8+
useSearch,
9+
} from '@tanstack/react-router';
610
import { LoaderCircle } from 'lucide-react';
711
import DatasetIcon from '@/components/icons/DatasetIcon';
812
import { BackButton } from '@/components/ui/BackButton';
@@ -13,10 +17,12 @@ import { DatasetDealsTable } from '@/modules/datasets/dataset/DatasetDealsTable'
1317
import { buildDatasetDetails } from '@/modules/datasets/dataset/buildDatasetDetails';
1418
import { datasetQuery } from '@/modules/datasets/dataset/datasetQuery';
1519
import { datasetSchemaQuery } from '@/modules/datasets/dataset/schema/datasetSchemaDpQuery';
20+
import { encodeSchemaFilters } from '@/modules/datasets/schemaFilters';
1621
import { SearcherBar } from '@/modules/search/SearcherBar';
1722
import useUserStore from '@/stores/useUser.store';
1823
import { NotFoundError } from '@/utils/NotFoundError';
1924
import { isValidAddress } from '@/utils/addressOrIdCheck';
25+
import { getChainFromId } from '@/utils/chain.utils';
2026
import { createPlaceholderDataFnForQueryKey } from '@/utils/createPlaceholderDataFnForQueryKey';
2127

2228
export const Route = createFileRoute(
@@ -87,16 +93,30 @@ function useDatasetData(datasetAddress: string, chainId: number) {
8793
function DatasetsRoute() {
8894
const { chainId } = useUserStore();
8995
const { datasetAddress } = Route.useParams();
96+
const navigate = useNavigate();
97+
const search = useSearch({ strict: false });
98+
9099
const { dataset, schema } = useDatasetData(
91100
(datasetAddress as string).toLowerCase(),
92101
chainId!
93102
);
94103

104+
const handleSchemaSearch = (schemaFilters: any) => {
105+
const encoded = encodeSchemaFilters(schemaFilters);
106+
navigate({
107+
to: `/${getChainFromId(chainId)?.slug}/datasets`,
108+
search: { ...search, schema: encoded },
109+
replace: false,
110+
resetScroll: true,
111+
});
112+
};
113+
95114
const datasetDetails = dataset.data
96115
? buildDatasetDetails({
97116
dataset: dataset.data,
98117
schema: schema.data,
99118
isSchemaLoading: schema.isLoading,
119+
onSchemaSearch: handleSchemaSearch,
100120
})
101121
: undefined;
102122

src/routes/$chainSlug/_layout/datasets.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { DatasetBreadcrumbsList } from '@/modules/datasets/DatasetBreadcrumbs';
2121
import { SchemaSearch } from '@/modules/datasets/SchemaSearch';
2222
import { schemaSearchPaginatedQuery } from '@/modules/datasets/dataset/schemaSearchPaginatedDpQuery';
2323
import { datasetsQuery } from '@/modules/datasets/datasetsQuery';
24-
import { columns } from '@/modules/datasets/datasetsTable/columns';
24+
import { createColumns } from '@/modules/datasets/datasetsTable/columns';
2525
import { useDatasetsSchemas } from '@/modules/datasets/hooks/useDatasetsSchemas';
2626
import {
2727
decodeSchemaFilters,
@@ -170,6 +170,19 @@ function DatasetsRoute() {
170170
});
171171
};
172172

173+
const handleSchemaSearch = (schemaFilters: any) => {
174+
navigate({
175+
search: { ...search, schema: encodeSchemaFilters(schemaFilters) },
176+
replace: false,
177+
resetScroll: true,
178+
});
179+
setCurrentPage(0);
180+
181+
if (!isSchemaSearchOpen) {
182+
setIsSchemaSearchOpen(true);
183+
}
184+
};
185+
173186
const { skip, nextSkip, nextNextSkip } = getPaginationSkips(
174187
currentPage,
175188
TABLE_LENGTH
@@ -243,6 +256,8 @@ function DatasetsRoute() {
243256
additionalPages: datasetsData.additionalPages,
244257
};
245258

259+
const columns = createColumns(handleSchemaSearch);
260+
246261
return (
247262
<div className="mt-8 grid gap-6">
248263
<SearcherBar className="py-6" />

0 commit comments

Comments
 (0)