diff options
Diffstat (limited to 'lib/vendor-document-list/ship/enhanced-documents-table.tsx')
| -rw-r--r-- | lib/vendor-document-list/ship/enhanced-documents-table.tsx | 87 |
1 files changed, 36 insertions, 51 deletions
diff --git a/lib/vendor-document-list/ship/enhanced-documents-table.tsx b/lib/vendor-document-list/ship/enhanced-documents-table.tsx index dabb05bb..663caeeb 100644 --- a/lib/vendor-document-list/ship/enhanced-documents-table.tsx +++ b/lib/vendor-document-list/ship/enhanced-documents-table.tsx @@ -18,6 +18,7 @@ import { DataTable } from "@/components/data-table/data-table" import { SimplifiedDocumentsView } from "@/db/schema" import { getSimplifiedDocumentColumns } from "./enhanced-doc-table-columns" import { EnhancedDocTableToolbarActions } from "./enhanced-doc-table-toolbar-actions" +import { useQueryStates, parseAsString, parseAsStringEnum, parseAsInteger } from "nuqs" // ๐ฅ Project Code ํํฐ๋ฅผ ์ํ Select ์ปดํฌ๋ํธ import ์ถ๊ฐ import { @@ -70,19 +71,31 @@ export function SimplifiedDocumentsTable({ const { data, pageCount, drawingKind } = documentData const { primaryDrawingKind, b4Stats: serverB4Stats } = statsData - // ๐ฅ B4 ํํฐ ์ํ ์ถ๊ฐ - const [b4FilterType, setB4FilterType] = React.useState<'all' | 'gtt_deliverable' | 'shi_input'>('all') - - // ๐ฅ Project Code ํํฐ ์ํ ์ถ๊ฐ - const [selectedProjectCode, setSelectedProjectCode] = React.useState<string>('all') + // ๐ฅ URL searchParams๋ฅผ ํตํ ํํฐ ์ํ ๊ด๋ฆฌ + const [{ b4FilterType, projectCode, page }, setQueryStates] = useQueryStates( + { + b4FilterType: parseAsStringEnum<'all' | 'gtt_deliverable' | 'shi_input'>(['all', 'gtt_deliverable', 'shi_input']).withDefault('all'), + projectCode: parseAsString.withDefault('all'), + page: parseAsInteger.withDefault(1), + }, + { + history: "push", + shallow: false, + } + ) + + // page ๋ณ์๋ ํ์ฌ ์ฌ์ฉํ์ง ์์ง๋ง, setQueryStates์์ page๋ฅผ ์
๋ฐ์ดํธํ๊ธฐ ์ํด ํ์ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const _ensurePageIsInState = page - // ๐ฅ ๊ณ ์ ํ Project Code ๋ชฉ๋ก ์ถ์ถ ๋ฐ ์นด์ดํธ ๋ฉ๋ชจ์ด์ ์ด์
+ // ๐ฅ ํต๊ณ ๋ฐ์ดํฐ๋ฅผ ์ํ ์ ์ฒด ๋ฐ์ดํฐ ์กฐํ (ํํฐ๋ง ์์ด) const projectCodeStats = React.useMemo(() => { + // statsData์์ ์ ์ฒด ํ๋ก์ ํธ ์ฝ๋ ๋ชฉ๋ก์ ๊ฐ์ ธ์ด (ํฅํ ๊ฐ์ ๊ฐ๋ฅ) const projectMap = new Map<string, number>() data.forEach(doc => { - const projectCode = doc.projectCode || 'Unknown' - projectMap.set(projectCode, (projectMap.get(projectCode) || 0) + 1) + const code = doc.projectCode || 'Unknown' + projectMap.set(code, (projectMap.get(code) || 0) + 1) }) // ์ ๋ ฌ๋ ๋ฐฐ์ด๋ก ๋ณํ (ํ๋ก์ ํธ ์ฝ๋ ์ํ๋ฒณ์) @@ -91,40 +104,12 @@ export function SimplifiedDocumentsTable({ .map(([code, count]) => ({ code, count })) }, [data]) - // ๐ฅ ๋ฐ์ดํฐ ๋ก๋ ์ฝ๋ฐฑ์ useCallback์ผ๋ก ์ต์ ํ - const handleDataLoaded = React.useCallback((loadedData: SimplifiedDocumentsView[]) => { - onDataLoaded?.(loadedData) - }, [onDataLoaded]) - - // ๐ฅ B4 ๋ฐ Project Code ํํฐ๋ง๋ ๋ฐ์ดํฐ ๋ฉ๋ชจ์ด์ ์ด์
- const filteredData = React.useMemo(() => { - let result: SimplifiedDocumentsView[] = data - - // B4 ํํฐ ์ ์ฉ - if (b4FilterType !== 'all') { - if (b4FilterType === 'gtt_deliverable') { - result = result.filter(doc => doc.drawingMoveGbn === '๋๋ฉด์
์') - } else if (b4FilterType === 'shi_input') { - result = result.filter(doc => doc.drawingMoveGbn === '๋๋ฉด์ ์ถ') - } - } - - // Project Code ํํฐ ์ ์ฉ - if (selectedProjectCode !== 'all') { - result = result.filter(doc => - (doc.projectCode || 'Unknown') === selectedProjectCode - ) - } - - return result - }, [data, b4FilterType, selectedProjectCode]) - - // ๐ฅ ๋ฐ์ดํฐ๊ฐ ๋ก๋๋๋ฉด ์ฝ๋ฐฑ ํธ์ถ (ํํฐ๋ง๋ ๋ฐ์ดํฐ ์ฌ์ฉ) + // ๐ฅ ๋ฐ์ดํฐ ๋ก๋ ์ฝ๋ฐฑ (์๋ฒ์์ ์ด๋ฏธ ํํฐ๋ง๋์ด ์ด) React.useEffect(() => { - if (filteredData && handleDataLoaded) { - handleDataLoaded(filteredData) + if (data && onDataLoaded) { + onDataLoaded(data) } - }, [filteredData, handleDataLoaded]) + }, [data, onDataLoaded]) // ๐ฅ ์ปฌ๋ผ ๋ฉ๋ชจ์ด์ ์ด์
์ต์ ํ const columns = React.useMemo( @@ -268,7 +253,7 @@ export function SimplifiedDocumentsTable({ // ๐ฅ B4 ๋ฌธ์ ์กด์ฌ ์ฌ๋ถ ์ฒดํฌ ๋ฉ๋ชจ์ด์ ์ด์
const hasB4Documents = React.useMemo(() => { - return data.some(doc => doc.drawingKind === 'B4') + return data.some((doc: SimplifiedDocumentsView) => doc.drawingKind === 'B4') }, [data]) // ๐ฅ ์ต์ข
ํํฐ ํ๋ ๋ฉ๋ชจ์ด์ ์ด์
@@ -286,7 +271,7 @@ export function SimplifiedDocumentsTable({ const getRowId = React.useCallback((originalRow: SimplifiedDocumentsView) => String(originalRow.documentId), []) const { table } = useDataTable({ - data: filteredData, + data, // ์๋ฒ์์ ์ด๋ฏธ ํํฐ๋ง๋ ๋ฐ์ดํฐ ์ฌ์ฉ columns, pageCount, enablePinning: true, @@ -324,7 +309,7 @@ export function SimplifiedDocumentsTable({ </div> <div className="flex items-center gap-2"> <Badge variant="outline"> - {filteredData.length} documents + {data.length} documents </Badge> </div> </div> @@ -339,8 +324,8 @@ export function SimplifiedDocumentsTable({ <Label className="text-sm font-medium">Project:</Label> </div> <Select - value={selectedProjectCode} - onValueChange={setSelectedProjectCode} + value={projectCode} + onValueChange={(value) => setQueryStates({ projectCode: value, page: 1 })} > <SelectTrigger className="w-[200px]"> <SelectValue placeholder="Select a project" /> @@ -367,11 +352,11 @@ export function SimplifiedDocumentsTable({ </SelectContent> </Select> - {selectedProjectCode !== 'all' && ( + {projectCode !== 'all' && ( <Button variant="ghost" size="sm" - onClick={() => setSelectedProjectCode('all')} + onClick={() => setQueryStates({ projectCode: 'all', page: 1 })} className="h-8" > Clear filter @@ -379,7 +364,7 @@ export function SimplifiedDocumentsTable({ )} </div> - {/* B4 ํํฐ ๋ฒํผ - ๊ธฐ์กด ์ฝ๋ ์ ์ง */} + {/* B4 ํํฐ ๋ฒํผ - URL searchParams ์
๋ฐ์ดํธ๋ก ๋ณ๊ฒฝ */} {hasB4Documents && b4Stats && ( <div className="flex items-center gap-2 p-4 bg-muted/50 rounded-lg"> <Label className="text-sm font-medium">Document Type:</Label> @@ -387,7 +372,7 @@ export function SimplifiedDocumentsTable({ <Button variant={b4FilterType === 'all' ? 'default' : 'outline'} size="sm" - onClick={() => setB4FilterType('all')} + onClick={() => setQueryStates({ b4FilterType: 'all', page: 1 })} className="gap-2" > <FileText className="h-4 w-4" /> @@ -399,7 +384,7 @@ export function SimplifiedDocumentsTable({ <Button variant={b4FilterType === 'gtt_deliverable' ? 'default' : 'outline'} size="sm" - onClick={() => setB4FilterType('gtt_deliverable')} + onClick={() => setQueryStates({ b4FilterType: 'gtt_deliverable', page: 1 })} className="gap-2" > <FileInput className="h-4 w-4" /> @@ -411,7 +396,7 @@ export function SimplifiedDocumentsTable({ <Button variant={b4FilterType === 'shi_input' ? 'default' : 'outline'} size="sm" - onClick={() => setB4FilterType('shi_input')} + onClick={() => setQueryStates({ b4FilterType: 'shi_input', page: 1 })} className="gap-2" > <FileOutput className="h-4 w-4" /> |
