summaryrefslogtreecommitdiff
path: root/lib/vendor-document-list/ship/enhanced-documents-table.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'lib/vendor-document-list/ship/enhanced-documents-table.tsx')
-rw-r--r--lib/vendor-document-list/ship/enhanced-documents-table.tsx87
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" />