diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-07-25 07:51:15 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-07-25 07:51:15 +0000 |
| commit | 2650b7c0bb0ea12b68a58c0439f72d61df04b2f1 (patch) | |
| tree | 17156183fd74b69d78178065388ac61a18ac07b4 /lib/techsales-rfq/table/rfq-filter-sheet.tsx | |
| parent | d32acea05915bd6c1ed4b95e56c41ef9204347bc (diff) | |
(대표님) 정기평가 대상, 미들웨어 수정, nextauth 토큰 처리 개선, GTC 등
(최겸) 기술영업
Diffstat (limited to 'lib/techsales-rfq/table/rfq-filter-sheet.tsx')
| -rw-r--r-- | lib/techsales-rfq/table/rfq-filter-sheet.tsx | 135 |
1 files changed, 65 insertions, 70 deletions
diff --git a/lib/techsales-rfq/table/rfq-filter-sheet.tsx b/lib/techsales-rfq/table/rfq-filter-sheet.tsx index a03e6167..7db8305d 100644 --- a/lib/techsales-rfq/table/rfq-filter-sheet.tsx +++ b/lib/techsales-rfq/table/rfq-filter-sheet.tsx @@ -48,7 +48,32 @@ const filterSchema = z.object({ from: z.date().optional(),
to: z.date().optional(),
}).optional(),
+ workTypes: z.array(z.string()).optional(),
})
+// 공종 옵션 정의 (tech-vendors와 동일)
+const workTypeOptions = [
+ // 조선 workTypes
+ { value: "기장", label: "기장" },
+ { value: "전장", label: "전장" },
+ { value: "선실", label: "선실" },
+ { value: "배관", label: "배관" },
+ { value: "철의", label: "철의" },
+ { value: "선체", label: "선체" },
+ // 해양TOP workTypes
+ { value: "TM", label: "TM" },
+ { value: "TS", label: "TS" },
+ { value: "TE", label: "TE" },
+ { value: "TP", label: "TP" },
+ { value: "TA", label: "TA" },
+ // 해양HULL workTypes
+ { value: "HA", label: "HA" },
+ { value: "HE", label: "HE" },
+ { value: "HH", label: "HH" },
+ { value: "HM", label: "HM" },
+ { value: "NC", label: "NC" },
+ { value: "HO", label: "HO" },
+ { value: "HP", label: "HP" },
+];
// 상태 옵션 정의 (TechSales RFQ 상태에 맞게 수정)
const statusOptions = [
@@ -89,13 +114,13 @@ export function RFQFilterSheet({ // nuqs로 URL 상태 관리 - 파라미터명을 'basicFilters'로 변경
const [filters, setFilters] = useQueryState(
- "basicFilters",
+ "filters",
getFiltersStateParser().withDefault([])
)
// joinOperator 설정
const [joinOperator, setJoinOperator] = useQueryState(
- "basicJoinOperator",
+ "joinOperator",
parseAsStringEnum(["and", "or"]).withDefault("and")
)
@@ -118,6 +143,7 @@ export function RFQFilterSheet({ from: undefined,
to: undefined,
},
+ workTypes: [],
},
})
@@ -274,6 +300,16 @@ export function RFQFilterSheet({ })
}
+ if (data.workTypes && data.workTypes.length > 0) {
+ newFilters.push({
+ id: "workTypes",
+ value: data.workTypes,
+ type: "multi-select" as const,
+ operator: "eq" as const,
+ rowId: generateId()
+ })
+ }
+
console.log("기본 필터 적용:", newFilters);
// 마지막 적용된 필터 업데이트
@@ -313,6 +349,7 @@ export function RFQFilterSheet({ createdByName: "",
status: "",
dateRange: { from: undefined, to: undefined },
+ workTypes: [],
});
// 필터와 조인 연산자를 초기화
@@ -446,6 +483,7 @@ export function RFQFilterSheet({ </FormItem>
)}
/>
+
{/* 자재명 */}
<FormField
@@ -561,44 +599,6 @@ export function RFQFilterSheet({ )}
/>
- {/* 선종명 */}
- <FormField
- control={form.control}
- name="ptypeNm"
- render={({ field }) => (
- <FormItem>
- <FormLabel>{t("선종명")}</FormLabel>
- <FormControl>
- <div className="relative">
- <Input
- placeholder={t("선종명 입력")}
- {...field}
- className={cn(field.value && "pr-8", "bg-white")}
- disabled={isInitializing}
- />
- {field.value && (
- <Button
- type="button"
- variant="ghost"
- size="icon"
- className="absolute right-0 top-0 h-full px-2"
- onClick={(e) => {
- e.stopPropagation();
- form.setValue("ptypeNm", "");
- }}
- disabled={isInitializing}
- >
- <X className="size-3.5" />
- <span className="sr-only">Clear</span>
- </Button>
- )}
- </div>
- </FormControl>
- <FormMessage />
- </FormItem>
- )}
- />
-
{/* 요청자 */}
<FormField
control={form.control}
@@ -685,43 +685,38 @@ export function RFQFilterSheet({ )}
/>
- {/* RFQ 전송일 */}
+ {/* 공종 */}
<FormField
control={form.control}
- name="dateRange"
+ name="workTypes"
render={({ field }) => (
<FormItem>
- <FormLabel>{t("RFQ 전송일")}</FormLabel>
- <FormControl>
- <div className="relative">
- <DateRangePicker
- triggerSize="default"
- triggerClassName="w-full bg-white"
- align="start"
- showClearButton={true}
- placeholder={t("RFQ 전송일 범위를 고르세요")}
- date={field.value || undefined}
- onDateChange={field.onChange}
- disabled={isInitializing}
- />
- {(field.value?.from || field.value?.to) && (
- <Button
- type="button"
- variant="ghost"
- size="icon"
- className="absolute right-10 top-0 h-full px-2"
- onClick={(e) => {
- e.stopPropagation();
- form.setValue("dateRange", { from: undefined, to: undefined });
+ <FormLabel>공종</FormLabel>
+ <div className="grid grid-cols-2 gap-2">
+ {workTypeOptions.map((option) => (
+ <div key={option.value} className="flex items-center space-x-2">
+ <input
+ type="checkbox"
+ id={`workType-${option.value}`}
+ checked={field.value?.includes(option.value) || false}
+ onChange={(e) => {
+ const checked = e.target.checked;
+ const updatedValue = checked
+ ? [...(field.value || []), option.value]
+ : (field.value || []).filter((value) => value !== option.value);
+ field.onChange(updatedValue);
}}
disabled={isInitializing}
+ />
+ <label
+ htmlFor={`workType-${option.value}`}
+ className="text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
>
- <X className="size-3.5" />
- <span className="sr-only">Clear</span>
- </Button>
- )}
- </div>
- </FormControl>
+ {option.label}
+ </label>
+ </div>
+ ))}
+ </div>
<FormMessage />
</FormItem>
)}
|
