From 4cde9b67c1d395f18e123b09e80489f643e7f107 Mon Sep 17 00:00:00 2001 From: ljpark Date: Wed, 2 Sep 2026 18:10:50 +0900 Subject: [PATCH] =?UTF-8?q?sn:=20util.ts=20=EC=B6=94=EA=B0=80=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ctyFldngPrvtnBiz/ui/CtyFldngPrvtnBizListPage.tsx | 10 +++------- apps/sn/src/features/obsltPpl/lib/obslt-ppl-excel.ts | 2 +- .../sn/src/features/obsltPpl/ui/ObsltPplFormPage.tsx | 2 +- .../sn/src/features/obsltPpl/ui/ObsltPplListPage.tsx | 10 +++------- apps/sn/src/{features/common => shared/util}/util.ts | 12 ++++++++++++ 5 files changed, 20 insertions(+), 16 deletions(-) rename apps/sn/src/{features/common => shared/util}/util.ts (60%) diff --git a/apps/sn/src/features/ctyFldngPrvtnBiz/ui/CtyFldngPrvtnBizListPage.tsx b/apps/sn/src/features/ctyFldngPrvtnBiz/ui/CtyFldngPrvtnBizListPage.tsx index 1068af5a1..12666c3be 100644 --- a/apps/sn/src/features/ctyFldngPrvtnBiz/ui/CtyFldngPrvtnBizListPage.tsx +++ b/apps/sn/src/features/ctyFldngPrvtnBiz/ui/CtyFldngPrvtnBizListPage.tsx @@ -26,7 +26,7 @@ import { type PaginationState, } from "@tanstack/react-table"; -import { formatDate } from "../../common/util"; +import { appendApiSearchParams, formatDate } from "@/shared/util/util"; import { getAllCtyFldngPrvtnBusinesses, getCtyFldngPrvtnBusinesses, @@ -454,9 +454,7 @@ export function CtyFldngPrvtnBizListPage() { ? `${nextSort.key},${nextSort.direction}` : "ctyFldngPrvtnBizSn,desc", }); - Object.entries(condition).forEach(([k, v]) => { - if (v.trim()) query.set(k, v.trim()); - }); + appendApiSearchParams(query, condition); setLoading(true); try { const result = await getCtyFldngPrvtnBusinesses(query); @@ -529,9 +527,7 @@ export function CtyFldngPrvtnBizListPage() { setLoading(true); try { const query = new URLSearchParams(); - Object.entries(applied).forEach(([k, v]) => { - if (v.trim()) query.set(k, v.trim()); - }); + appendApiSearchParams(query, applied); await downloadCtyFldngPrvtnExcel( await getAllCtyFldngPrvtnBusinesses( query, diff --git a/apps/sn/src/features/obsltPpl/lib/obslt-ppl-excel.ts b/apps/sn/src/features/obsltPpl/lib/obslt-ppl-excel.ts index 62ff0630b..6fef56b6d 100644 --- a/apps/sn/src/features/obsltPpl/lib/obslt-ppl-excel.ts +++ b/apps/sn/src/features/obsltPpl/lib/obslt-ppl-excel.ts @@ -1,7 +1,7 @@ import * as XLSX from "xlsx"; import XlsxPopulate from "xlsx-populate/browser/xlsx-populate"; -import { formatDate } from "../../common/util"; +import { formatDate } from "@/shared/util/util"; import type { ObsltPplBusiness, ObsltPplBusinessSaveRequest } from "../model/obslt-ppl-types"; type BusinessType = ObsltPplBusinessSaveRequest["bizSe"]; diff --git a/apps/sn/src/features/obsltPpl/ui/ObsltPplFormPage.tsx b/apps/sn/src/features/obsltPpl/ui/ObsltPplFormPage.tsx index 0cc4631f5..b005b9793 100644 --- a/apps/sn/src/features/obsltPpl/ui/ObsltPplFormPage.tsx +++ b/apps/sn/src/features/obsltPpl/ui/ObsltPplFormPage.tsx @@ -21,7 +21,7 @@ import { Textarea, } from "@common/components"; -import { formatDate } from "../../common/util"; +import { formatDate } from "@/shared/util/util"; import { createObsltPplBusiness, deleteObsltPplBusiness, diff --git a/apps/sn/src/features/obsltPpl/ui/ObsltPplListPage.tsx b/apps/sn/src/features/obsltPpl/ui/ObsltPplListPage.tsx index 541263d84..214eca881 100644 --- a/apps/sn/src/features/obsltPpl/ui/ObsltPplListPage.tsx +++ b/apps/sn/src/features/obsltPpl/ui/ObsltPplListPage.tsx @@ -34,7 +34,7 @@ import { getObsltPplBusinesses, uploadObsltPplExcel, } from "../api/obslt-ppl-api"; -import { formatDate } from "../../common/util"; +import { appendApiSearchParams, formatDate } from "@/shared/util/util"; import { downloadObsltPplExcel, parseObsltPplExcel, @@ -322,9 +322,7 @@ export function ObsltPplListPage() { ? `${nextSort.key},${nextSort.direction}` : "obsltSwagePplBizSn,desc", }); - Object.entries(targetSearch).forEach(([key, value]) => { - if (value.trim()) params.set(key, value.trim()); - }); + appendApiSearchParams(params, targetSearch); setLoading(true); try { @@ -423,9 +421,7 @@ export function ObsltPplListPage() { setLoading(true); try { const params = new URLSearchParams(); - Object.entries(appliedSearch).forEach(([key, value]) => { - if (value.trim()) params.set(key, value.trim()); - }); + appendApiSearchParams(params, appliedSearch); const exportRows = await getAllObsltPplBusinesses( params, sort ? `${sort.key},${sort.direction}` : undefined, diff --git a/apps/sn/src/features/common/util.ts b/apps/sn/src/shared/util/util.ts similarity index 60% rename from apps/sn/src/features/common/util.ts rename to apps/sn/src/shared/util/util.ts index 7686cafc1..3b4c4981e 100644 --- a/apps/sn/src/features/common/util.ts +++ b/apps/sn/src/shared/util/util.ts @@ -1,5 +1,17 @@ import moment from "moment"; +/** 빈 값과 화면의 전체 선택값 `0`을 제외하고 API 검색 파라미터를 추가한다. */ +export const appendApiSearchParams = ( + params: URLSearchParams, + search: Readonly>, +) => { + Object.entries(search).forEach(([key, value]) => { + const normalized = value.trim(); + if (!normalized || normalized === "0") return; + params.set(key, normalized); + }); +}; + /** 8자리 또는 구분자가 섞인 날짜 문자열을 YYYY-MM-DD 형식으로 정규화한다. */ export const formatDate = (value?: string | null) => { if (!value) return "";