From af66dc6155947db2bd66d867d13c01c967d901b4 Mon Sep 17 00:00:00 2001 From: Noa Virellia Date: Sun, 28 Dec 2025 14:57:15 +0800 Subject: [PATCH] chore(client): remove unused files Signed-off-by: Noa Virellia --- client/src/components/Time.tsx | 17 - .../src/components/chart-area-interactive.tsx | 293 ------- client/src/components/data-table.tsx | 824 ------------------ client/src/components/nav-documents.tsx | 93 -- 4 files changed, 1227 deletions(-) delete mode 100644 client/src/components/Time.tsx delete mode 100644 client/src/components/chart-area-interactive.tsx delete mode 100644 client/src/components/data-table.tsx delete mode 100644 client/src/components/nav-documents.tsx diff --git a/client/src/components/Time.tsx b/client/src/components/Time.tsx deleted file mode 100644 index aa18c95..0000000 --- a/client/src/components/Time.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { useSuspenseQuery } from '@tanstack/react-query'; -import axios from 'axios'; - -export function Time() { - const { data: time } = useSuspenseQuery({ - queryKey: ['time'], - queryFn: async () => axios.get<{ datetime: string }>('https://worldtimeapi.org/api/timezone/Asia/Shanghai') - .then(res => res.data.datetime) - .then(isoString => new Date(isoString).toLocaleTimeString()), - }); - return ( -

- Current time: - {time} -

- ); -} diff --git a/client/src/components/chart-area-interactive.tsx b/client/src/components/chart-area-interactive.tsx deleted file mode 100644 index 262d32a..0000000 --- a/client/src/components/chart-area-interactive.tsx +++ /dev/null @@ -1,293 +0,0 @@ -'use client'; - -import type { ChartConfig } from '@/components/ui/chart'; -import * as React from 'react'; - -import { Area, AreaChart, CartesianGrid, XAxis } from 'recharts'; -import { - Card, - CardAction, - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from '@/components/ui/card'; -import { - - ChartContainer, - ChartTooltip, - ChartTooltipContent, -} from '@/components/ui/chart'; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from '@/components/ui/select'; -import { - ToggleGroup, - ToggleGroupItem, -} from '@/components/ui/toggle-group'; -import { useIsMobile } from '@/hooks/use-mobile'; - -export const description = 'An interactive area chart'; - -const chartData = [ - { date: '2024-04-01', desktop: 222, mobile: 150 }, - { date: '2024-04-02', desktop: 97, mobile: 180 }, - { date: '2024-04-03', desktop: 167, mobile: 120 }, - { date: '2024-04-04', desktop: 242, mobile: 260 }, - { date: '2024-04-05', desktop: 373, mobile: 290 }, - { date: '2024-04-06', desktop: 301, mobile: 340 }, - { date: '2024-04-07', desktop: 245, mobile: 180 }, - { date: '2024-04-08', desktop: 409, mobile: 320 }, - { date: '2024-04-09', desktop: 59, mobile: 110 }, - { date: '2024-04-10', desktop: 261, mobile: 190 }, - { date: '2024-04-11', desktop: 327, mobile: 350 }, - { date: '2024-04-12', desktop: 292, mobile: 210 }, - { date: '2024-04-13', desktop: 342, mobile: 380 }, - { date: '2024-04-14', desktop: 137, mobile: 220 }, - { date: '2024-04-15', desktop: 120, mobile: 170 }, - { date: '2024-04-16', desktop: 138, mobile: 190 }, - { date: '2024-04-17', desktop: 446, mobile: 360 }, - { date: '2024-04-18', desktop: 364, mobile: 410 }, - { date: '2024-04-19', desktop: 243, mobile: 180 }, - { date: '2024-04-20', desktop: 89, mobile: 150 }, - { date: '2024-04-21', desktop: 137, mobile: 200 }, - { date: '2024-04-22', desktop: 224, mobile: 170 }, - { date: '2024-04-23', desktop: 138, mobile: 230 }, - { date: '2024-04-24', desktop: 387, mobile: 290 }, - { date: '2024-04-25', desktop: 215, mobile: 250 }, - { date: '2024-04-26', desktop: 75, mobile: 130 }, - { date: '2024-04-27', desktop: 383, mobile: 420 }, - { date: '2024-04-28', desktop: 122, mobile: 180 }, - { date: '2024-04-29', desktop: 315, mobile: 240 }, - { date: '2024-04-30', desktop: 454, mobile: 380 }, - { date: '2024-05-01', desktop: 165, mobile: 220 }, - { date: '2024-05-02', desktop: 293, mobile: 310 }, - { date: '2024-05-03', desktop: 247, mobile: 190 }, - { date: '2024-05-04', desktop: 385, mobile: 420 }, - { date: '2024-05-05', desktop: 481, mobile: 390 }, - { date: '2024-05-06', desktop: 498, mobile: 520 }, - { date: '2024-05-07', desktop: 388, mobile: 300 }, - { date: '2024-05-08', desktop: 149, mobile: 210 }, - { date: '2024-05-09', desktop: 227, mobile: 180 }, - { date: '2024-05-10', desktop: 293, mobile: 330 }, - { date: '2024-05-11', desktop: 335, mobile: 270 }, - { date: '2024-05-12', desktop: 197, mobile: 240 }, - { date: '2024-05-13', desktop: 197, mobile: 160 }, - { date: '2024-05-14', desktop: 448, mobile: 490 }, - { date: '2024-05-15', desktop: 473, mobile: 380 }, - { date: '2024-05-16', desktop: 338, mobile: 400 }, - { date: '2024-05-17', desktop: 499, mobile: 420 }, - { date: '2024-05-18', desktop: 315, mobile: 350 }, - { date: '2024-05-19', desktop: 235, mobile: 180 }, - { date: '2024-05-20', desktop: 177, mobile: 230 }, - { date: '2024-05-21', desktop: 82, mobile: 140 }, - { date: '2024-05-22', desktop: 81, mobile: 120 }, - { date: '2024-05-23', desktop: 252, mobile: 290 }, - { date: '2024-05-24', desktop: 294, mobile: 220 }, - { date: '2024-05-25', desktop: 201, mobile: 250 }, - { date: '2024-05-26', desktop: 213, mobile: 170 }, - { date: '2024-05-27', desktop: 420, mobile: 460 }, - { date: '2024-05-28', desktop: 233, mobile: 190 }, - { date: '2024-05-29', desktop: 78, mobile: 130 }, - { date: '2024-05-30', desktop: 340, mobile: 280 }, - { date: '2024-05-31', desktop: 178, mobile: 230 }, - { date: '2024-06-01', desktop: 178, mobile: 200 }, - { date: '2024-06-02', desktop: 470, mobile: 410 }, - { date: '2024-06-03', desktop: 103, mobile: 160 }, - { date: '2024-06-04', desktop: 439, mobile: 380 }, - { date: '2024-06-05', desktop: 88, mobile: 140 }, - { date: '2024-06-06', desktop: 294, mobile: 250 }, - { date: '2024-06-07', desktop: 323, mobile: 370 }, - { date: '2024-06-08', desktop: 385, mobile: 320 }, - { date: '2024-06-09', desktop: 438, mobile: 480 }, - { date: '2024-06-10', desktop: 155, mobile: 200 }, - { date: '2024-06-11', desktop: 92, mobile: 150 }, - { date: '2024-06-12', desktop: 492, mobile: 420 }, - { date: '2024-06-13', desktop: 81, mobile: 130 }, - { date: '2024-06-14', desktop: 426, mobile: 380 }, - { date: '2024-06-15', desktop: 307, mobile: 350 }, - { date: '2024-06-16', desktop: 371, mobile: 310 }, - { date: '2024-06-17', desktop: 475, mobile: 520 }, - { date: '2024-06-18', desktop: 107, mobile: 170 }, - { date: '2024-06-19', desktop: 341, mobile: 290 }, - { date: '2024-06-20', desktop: 408, mobile: 450 }, - { date: '2024-06-21', desktop: 169, mobile: 210 }, - { date: '2024-06-22', desktop: 317, mobile: 270 }, - { date: '2024-06-23', desktop: 480, mobile: 530 }, - { date: '2024-06-24', desktop: 132, mobile: 180 }, - { date: '2024-06-25', desktop: 141, mobile: 190 }, - { date: '2024-06-26', desktop: 434, mobile: 380 }, - { date: '2024-06-27', desktop: 448, mobile: 490 }, - { date: '2024-06-28', desktop: 149, mobile: 200 }, - { date: '2024-06-29', desktop: 103, mobile: 160 }, - { date: '2024-06-30', desktop: 446, mobile: 400 }, -]; - -const chartConfig = { - visitors: { - label: 'Visitors', - }, - desktop: { - label: 'Desktop', - color: 'var(--primary)', - }, - mobile: { - label: 'Mobile', - color: 'var(--primary)', - }, -} satisfies ChartConfig; - -export function ChartAreaInteractive() { - const isMobile = useIsMobile(); - const [timeRange, setTimeRange] = React.useState('90d'); - - React.useEffect(() => { - if (isMobile) { - setTimeRange('7d'); - } - }, [isMobile]); - - const filteredData = chartData.filter((item) => { - const date = new Date(item.date); - const referenceDate = new Date('2024-06-30'); - let daysToSubtract = 90; - if (timeRange === '30d') { - daysToSubtract = 30; - } - else if (timeRange === '7d') { - daysToSubtract = 7; - } - const startDate = new Date(referenceDate); - startDate.setDate(startDate.getDate() - daysToSubtract); - return date >= startDate; - }); - - return ( - - - Total Visitors - - - Total for the last 3 months - - Last 3 months - - - - Last 3 months - Last 30 days - Last 7 days - - - - - - - - - - - - - - - - - - - { - const date = new Date(value); - return date.toLocaleDateString('en-US', { - month: 'short', - day: 'numeric', - }); - }} - /> - { - return new Date(value).toLocaleDateString('en-US', { - month: 'short', - day: 'numeric', - }); - }} - indicator="dot" - /> - )} - /> - - - - - - - ); -} diff --git a/client/src/components/data-table.tsx b/client/src/components/data-table.tsx deleted file mode 100644 index ea32f42..0000000 --- a/client/src/components/data-table.tsx +++ /dev/null @@ -1,824 +0,0 @@ -import type { DragEndEvent, UniqueIdentifier } from '@dnd-kit/core'; -import type { ColumnDef, ColumnFiltersState, Row, SortingState, VisibilityState } from '@tanstack/react-table'; -import type { ChartConfig } from '@/components/ui/chart'; -import { - closestCenter, - DndContext, - - KeyboardSensor, - MouseSensor, - TouchSensor, - - useSensor, - useSensors, -} from '@dnd-kit/core'; -import { restrictToVerticalAxis } from '@dnd-kit/modifiers'; -import { - arrayMove, - SortableContext, - useSortable, - verticalListSortingStrategy, -} from '@dnd-kit/sortable'; -import { CSS } from '@dnd-kit/utilities'; -import { - IconChevronDown, - IconChevronLeft, - IconChevronRight, - IconChevronsLeft, - IconChevronsRight, - IconCircleCheckFilled, - IconDotsVertical, - IconGripVertical, - IconLayoutColumns, - IconLoader, - IconPlus, - IconTrendingUp, -} from '@tabler/icons-react'; -import { - - flexRender, - getCoreRowModel, - getFacetedRowModel, - getFacetedUniqueValues, - getFilteredRowModel, - getPaginationRowModel, - getSortedRowModel, - - useReactTable, - -} from '@tanstack/react-table'; -import * as React from 'react'; -import { Area, AreaChart, CartesianGrid, XAxis } from 'recharts'; -import { toast } from 'sonner'; - -import { z } from 'zod'; -import { Badge } from '@/components/ui/badge'; -import { Button } from '@/components/ui/button'; -import { - - ChartContainer, - ChartTooltip, - ChartTooltipContent, -} from '@/components/ui/chart'; -import { Checkbox } from '@/components/ui/checkbox'; -import { - Drawer, - DrawerClose, - DrawerContent, - DrawerDescription, - DrawerFooter, - DrawerHeader, - DrawerTitle, - DrawerTrigger, -} from '@/components/ui/drawer'; -import { - DropdownMenu, - DropdownMenuCheckboxItem, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuSeparator, - DropdownMenuTrigger, -} from '@/components/ui/dropdown-menu'; -import { Input } from '@/components/ui/input'; -import { Label } from '@/components/ui/label'; -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, - SelectValue, -} from '@/components/ui/select'; -import { Separator } from '@/components/ui/separator'; -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from '@/components/ui/table'; -import { - Tabs, - TabsContent, - TabsList, - TabsTrigger, -} from '@/components/ui/tabs'; -import { useIsMobile } from '@/hooks/use-mobile'; - -export const schema = z.object({ - id: z.number(), - header: z.string(), - type: z.string(), - status: z.string(), - target: z.string(), - limit: z.string(), - reviewer: z.string(), -}); - -// Create a separate component for the drag handle -function DragHandle({ id }: { id: number }) { - const { attributes, listeners } = useSortable({ - id, - }); - - return ( - - ); -} - -const columns: ColumnDef>[] = [ - { - id: 'drag', - header: () => null, - cell: ({ row }) => , - }, - { - id: 'select', - header: ({ table }) => ( -
- table.toggleAllPageRowsSelected(!!value)} - aria-label="Select all" - /> -
- ), - cell: ({ row }) => ( -
- row.toggleSelected(!!value)} - aria-label="Select row" - /> -
- ), - enableSorting: false, - enableHiding: false, - }, - { - accessorKey: 'header', - header: 'Header', - cell: ({ row }) => { - return ; - }, - enableHiding: false, - }, - { - accessorKey: 'type', - header: 'Section Type', - cell: ({ row }) => ( -
- - {row.original.type} - -
- ), - }, - { - accessorKey: 'status', - header: 'Status', - cell: ({ row }) => ( - - {row.original.status === 'Done' - ? ( - - ) - : ( - - )} - {row.original.status} - - ), - }, - { - accessorKey: 'target', - header: () =>
Target
, - cell: ({ row }) => ( -
{ - e.preventDefault(); - toast.promise(new Promise(resolve => setTimeout(resolve, 1000)), { - loading: `Saving ${row.original.header}`, - success: 'Done', - error: 'Error', - }); - }} - > - - -
- ), - }, - { - accessorKey: 'limit', - header: () =>
Limit
, - cell: ({ row }) => ( -
{ - e.preventDefault(); - toast.promise(new Promise(resolve => setTimeout(resolve, 1000)), { - loading: `Saving ${row.original.header}`, - success: 'Done', - error: 'Error', - }); - }} - > - - -
- ), - }, - { - accessorKey: 'reviewer', - header: 'Reviewer', - cell: ({ row }) => { - const isAssigned = row.original.reviewer !== 'Assign reviewer'; - - if (isAssigned) { - return row.original.reviewer; - } - - return ( - <> - - - - ); - }, - }, - { - id: 'actions', - cell: () => ( - - - - - - Edit - Make a copy - Favorite - - Delete - - - ), - }, -]; - -function DraggableRow({ row }: { row: Row> }) { - const { transform, transition, setNodeRef, isDragging } = useSortable({ - id: row.original.id, - }); - - return ( - - {row.getVisibleCells().map(cell => ( - - {flexRender(cell.column.columnDef.cell, cell.getContext())} - - ))} - - ); -} - -export function DataTable({ - data: initialData, -}: { - data: z.infer[]; -}) { - const [data, setData] = React.useState(() => initialData); - const [rowSelection, setRowSelection] = React.useState({}); - const [columnVisibility, setColumnVisibility] - = React.useState({}); - const [columnFilters, setColumnFilters] = React.useState( - [], - ); - const [sorting, setSorting] = React.useState([]); - const [pagination, setPagination] = React.useState({ - pageIndex: 0, - pageSize: 10, - }); - const sortableId = React.useId(); - const sensors = useSensors( - useSensor(MouseSensor, {}), - useSensor(TouchSensor, {}), - useSensor(KeyboardSensor, {}), - ); - - const dataIds = React.useMemo( - () => data?.map(({ id }) => id) || [], - [data], - ); - - const table = useReactTable({ - data, - columns, - state: { - sorting, - columnVisibility, - rowSelection, - columnFilters, - pagination, - }, - getRowId: row => row.id.toString(), - enableRowSelection: true, - onRowSelectionChange: setRowSelection, - onSortingChange: setSorting, - onColumnFiltersChange: setColumnFilters, - onColumnVisibilityChange: setColumnVisibility, - onPaginationChange: setPagination, - getCoreRowModel: getCoreRowModel(), - getFilteredRowModel: getFilteredRowModel(), - getPaginationRowModel: getPaginationRowModel(), - getSortedRowModel: getSortedRowModel(), - getFacetedRowModel: getFacetedRowModel(), - getFacetedUniqueValues: getFacetedUniqueValues(), - }); - - function handleDragEnd(event: DragEndEvent) { - const { active, over } = event; - if (active && over && active.id !== over.id) { - setData((data) => { - const oldIndex = dataIds.indexOf(active.id); - const newIndex = dataIds.indexOf(over.id); - return arrayMove(data, oldIndex, newIndex); - }); - } - } - - return ( - -
- - - - Outline - - Past Performance - {' '} - 3 - - - Key Personnel - {' '} - 2 - - Focus Documents - -
- - - - - - {table - .getAllColumns() - .filter( - column => - typeof column.accessorFn !== 'undefined' - && column.getCanHide(), - ) - .map((column) => { - return ( - - column.toggleVisibility(!!value)} - > - {column.id} - - ); - })} - - - -
-
- -
- - - - {table.getHeaderGroups().map(headerGroup => ( - - {headerGroup.headers.map((header) => { - return ( - - {header.isPlaceholder - ? null - : flexRender( - header.column.columnDef.header, - header.getContext(), - )} - - ); - })} - - ))} - - - {table.getRowModel().rows?.length - ? ( - - {table.getRowModel().rows.map(row => ( - - ))} - - ) - : ( - - - No results. - - - )} - -
-
-
-
-
- {table.getFilteredSelectedRowModel().rows.length} - {' '} - of - {' '} - {table.getFilteredRowModel().rows.length} - {' '} - row(s) selected. -
-
-
- - -
-
- Page - {' '} - {table.getState().pagination.pageIndex + 1} - {' '} - of - {' '} - {table.getPageCount()} -
-
- - - - -
-
-
-
- -
-
- -
-
- -
-
-
- ); -} - -const chartData = [ - { month: 'January', desktop: 186, mobile: 80 }, - { month: 'February', desktop: 305, mobile: 200 }, - { month: 'March', desktop: 237, mobile: 120 }, - { month: 'April', desktop: 73, mobile: 190 }, - { month: 'May', desktop: 209, mobile: 130 }, - { month: 'June', desktop: 214, mobile: 140 }, -]; - -const chartConfig = { - desktop: { - label: 'Desktop', - color: 'var(--primary)', - }, - mobile: { - label: 'Mobile', - color: 'var(--primary)', - }, -} satisfies ChartConfig; - -function TableCellViewer({ item }: { item: z.infer }) { - const isMobile = useIsMobile(); - - return ( - - - - - - - {item.header} - - Showing total visitors for the last 6 months - - -
- {!isMobile && ( - <> - - - - value.slice(0, 3)} - hide - /> - } - /> - - - - - -
-
- Trending up by 5.2% this month - {' '} - -
-
- Showing total visitors for the last 6 months. This is just - some random text to test the layout. It spans multiple lines - and should wrap around. -
-
- - - )} -
-
- - -
-
-
- - -
-
- - -
-
-
-
- - -
-
- - -
-
-
- - -
-
-
- - - - - - -
-
- ); -} diff --git a/client/src/components/nav-documents.tsx b/client/src/components/nav-documents.tsx deleted file mode 100644 index dd2b2f8..0000000 --- a/client/src/components/nav-documents.tsx +++ /dev/null @@ -1,93 +0,0 @@ -'use client'; - -import type { Icon } from '@tabler/icons-react'; -import { - - IconDots, - IconFolder, - IconShare3, - IconTrash, -} from '@tabler/icons-react'; - -import { - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuSeparator, - DropdownMenuTrigger, -} from '@/components/ui/dropdown-menu'; -import { - SidebarGroup, - SidebarGroupLabel, - SidebarMenu, - SidebarMenuAction, - SidebarMenuButton, - SidebarMenuItem, - useSidebar, -} from '@/components/ui/sidebar'; - -export function NavDocuments({ - items, -}: { - items: { - name: string; - url: string; - icon: Icon; - }[]; -}) { - const { isMobile } = useSidebar(); - - return ( - - Documents - - {items.map(item => ( - - - - - {item.name} - - - - - - - More - - - - - - Open - - - - Share - - - - - Delete - - - - - ))} - - - - More - - - - - ); -}