@@ -4,11 +4,11 @@ import {
44 Text ,
55 Paper ,
66 Alert ,
7- Table ,
87 Group ,
98 Loader ,
109 Center ,
1110 Switch ,
11+ ScrollArea ,
1212} from '@mantine/core' ;
1313import { IconLock } from '@tabler/icons-react' ;
1414import { useGetLoggedUser } from '@internal/core/actions/get-logged-user/get-logged-user.hook' ;
@@ -19,6 +19,12 @@ import {
1919import { useToggleShortlinkSafe } from '@internal/core/actions/admin-shortlink-toggle-safe/admin-shortlink-toggle-safe.hook' ;
2020import { useQueryClient } from '@tanstack/react-query' ;
2121import type { Shortlink } from '@internal/core/types/Shortlink' ;
22+ import { useMemo } from 'react' ;
23+ import {
24+ type MRT_ColumnDef ,
25+ MRT_Table ,
26+ useMantineReactTable ,
27+ } from 'mantine-react-table' ;
2228
2329export const ssr = false ;
2430
@@ -41,6 +47,69 @@ export default function AdminShortlinksPage() {
4147 } ,
4248 } ) ;
4349
50+ const columns = useMemo < MRT_ColumnDef < Shortlink > [ ] > (
51+ ( ) => [
52+ {
53+ accessorKey : 'id' ,
54+ header : 'ID' ,
55+ } ,
56+ {
57+ accessorKey : 'title' ,
58+ header : 'Title' ,
59+ Cell : ( { row } ) => (
60+ < Text maw = { 300 } className = "truncate whitespace-pre-wrap break-words" >
61+ { row . original . title || row . original . original_url }
62+ </ Text >
63+ ) ,
64+ } ,
65+ {
66+ accessorKey : 'short_code' ,
67+ header : 'Short Code' ,
68+ } ,
69+ {
70+ accessorKey : 'events_count' ,
71+ header : 'Events' ,
72+ } ,
73+ {
74+ accessorKey : 'user.email' ,
75+ header : 'User Email' ,
76+ Cell : ( { row } ) => row . original . user ?. email ?? '' ,
77+ } ,
78+ {
79+ accessorKey : 'safe' ,
80+ header : 'Safe' ,
81+ enableSorting : false ,
82+ Cell : ( { row } ) => (
83+ < Group >
84+ < Switch
85+ checked = { Boolean ( row . original . safe ) }
86+ onChange = { ( ) => toggleMutation . mutate ( row . original . id ) }
87+ size = "sm"
88+ aria-label = { `toggle-safe-${ row . original . id } ` }
89+ />
90+ </ Group >
91+ ) ,
92+ } ,
93+ ] ,
94+ [ toggleMutation , shortlinksData ]
95+ ) ;
96+
97+ const table = useMantineReactTable ( {
98+ columns,
99+ data : shortlinksData ?. shortlink || [ ] ,
100+ enableColumnActions : false ,
101+ enableColumnFilters : true ,
102+ enablePagination : true ,
103+ enableSorting : true ,
104+ mantineTableProps : {
105+ highlightOnHover : false ,
106+ striped : 'odd' ,
107+ withColumnBorders : true ,
108+ withRowBorders : true ,
109+ withTableBorder : true ,
110+ } ,
111+ } ) ;
112+
44113 if ( data && ! data . user ?. admin ) {
45114 return (
46115 < Container size = "xl" py = "xl" >
@@ -72,25 +141,6 @@ export default function AdminShortlinksPage() {
72141 ) ;
73142 }
74143
75- const rows = ( shortlinksData ?. shortlink || [ ] ) . map ( ( s : Shortlink ) => (
76- < Table . Tr key = { s . id } >
77- < Table . Td > { s . id } </ Table . Td >
78- < Table . Td > { s . title || s . original_url } </ Table . Td >
79- < Table . Td > { s . short_code } </ Table . Td >
80- < Table . Td > { s . events_count } </ Table . Td >
81- < Table . Td >
82- < Group >
83- < Switch
84- checked = { Boolean ( s . safe ) }
85- onChange = { ( ) => toggleMutation . mutate ( s . id ) }
86- size = "sm"
87- aria-label = { `toggle-safe-${ s . id } ` }
88- />
89- </ Group >
90- </ Table . Td >
91- </ Table . Tr >
92- ) ) ;
93-
94144 return (
95145 < Container size = "xl" py = "xl" >
96146 < Paper shadow = "sm" p = "xl" radius = "md" withBorder >
@@ -106,30 +156,9 @@ export default function AdminShortlinksPage() {
106156 </ div >
107157 </ Group >
108158
109- < Table striped highlightOnHover >
110- < Table . Thead >
111- < Table . Tr >
112- < Table . Th > Id</ Table . Th >
113- < Table . Th > Title / URL</ Table . Th >
114- < Table . Th > Code</ Table . Th >
115- < Table . Th > Events</ Table . Th >
116- < Table . Th > Safe</ Table . Th >
117- </ Table . Tr >
118- </ Table . Thead >
119- < Table . Tbody >
120- { rows && rows . length > 0 ? (
121- rows
122- ) : (
123- < Table . Tr >
124- < Table . Td colSpan = { 5 } >
125- < Text ta = "center" c = "dimmed" >
126- No shortlinks found
127- </ Text >
128- </ Table . Td >
129- </ Table . Tr >
130- ) }
131- </ Table . Tbody >
132- </ Table >
159+ < ScrollArea >
160+ < MRT_Table table = { table } />
161+ </ ScrollArea >
133162 </ Paper >
134163 </ Container >
135164 ) ;
0 commit comments