diff --git a/apps/cm/.env.production b/apps/cm/.env.production index 9f786831b..ec8b584b7 100644 --- a/apps/cm/.env.production +++ b/apps/cm/.env.production @@ -1,7 +1,7 @@ # apps/cs/src/shared/config/env.ts 참고 -NEXT_PUBLIC_PORT=3000 -NEXT_PUBLIC_PROXY_HOST=http://localhost:3000 +NEXT_PUBLIC_PORT=3001 +NEXT_PUBLIC_PROXY_HOST=http://localhost:3001 NEXT_PUBLIC_SITE_ID=CS -NEXT_PUBLIC_SUB_DOMAIN=http://localhost:3000 +NEXT_PUBLIC_SUB_DOMAIN=http://localhost:13000 NEXT_PUBLIC_SERVER_API_URL=http://192.168.0.102:8000 NEXT_PUBLIC_TINY_API_KEY=t9nc4z6inquvvd5pq1vea8wcp7lb01qmqseh6egms9vpaju2 \ No newline at end of file diff --git a/apps/cm/src/pages/dashboard/api/support.ts b/apps/cm/src/pages/dashboard/api/support.ts new file mode 100644 index 000000000..c4a8b138c --- /dev/null +++ b/apps/cm/src/pages/dashboard/api/support.ts @@ -0,0 +1,42 @@ +import { client } from "@/shared/api"; +import { ENDPOINT } from "@/shared/config"; + +export interface Support { + total: number; + ongoing: number; + han: number; + youngsang: number; + geum: number; + nakdong: number; + type: string; +} + +export const getSupportList = async () => { + const url = `/api/proxy${ENDPOINT.IC_SERVICE.GROUPING_STATISTICS}`; + console.log("[getSupportList] API 호출 시작 (프록시, 인증 없음):", url); + try { + const response = await fetch(url, { + method: "GET", + headers: { + "Content-Type": "application/json", + accept: "application/json", + }, + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const data = await response.json(); + console.log("[getSupportList] API 응답 성공:", data); + return data; + } catch (error: any) { + console.error("[getSupportList] API 호출 실패:", { + url, + error, + status: error?.status, + message: error?.message, + }); + throw error; + } +}; diff --git a/apps/cm/src/pages/dashboard/model/support-columns.tsx b/apps/cm/src/pages/dashboard/model/support-columns.tsx new file mode 100644 index 000000000..813b09051 --- /dev/null +++ b/apps/cm/src/pages/dashboard/model/support-columns.tsx @@ -0,0 +1,49 @@ +import type { ColumnDef } from "@tanstack/react-table"; +import type { Support } from "../api/support"; + +const typeLabelMap: Record = { + waterQuality: "수질", + flood: "침수", + technical: "기술지원", +}; + +const supportTableColumns: ColumnDef[] = [ + { + accessorKey: "type", + header: "구분", + cell: ({ getValue }) => { + const value = getValue() as string; + return typeLabelMap[value] || value; + }, + }, + { + accessorKey: "total", + header: "합계", + }, + { + accessorKey: "han", + header: "한강", + }, + { + accessorKey: "nakdong", + header: "낙동강", + }, + { + accessorKey: "geum", + header: "금강", + }, + { + accessorKey: "youngsang", + header: "영산강", + }, + { + accessorKey: "ongoing", + header: "진행중", + }, + { + accessorKey: "completed", + header: "환료", + }, +]; + +export { supportTableColumns }; diff --git a/apps/cm/src/pages/dashboard/ui/banner-list.tsx b/apps/cm/src/pages/dashboard/ui/banner-list.tsx index d3ab33f74..04d0cdd92 100644 --- a/apps/cm/src/pages/dashboard/ui/banner-list.tsx +++ b/apps/cm/src/pages/dashboard/ui/banner-list.tsx @@ -3,7 +3,7 @@ import { useRef } from "react"; import { useQuery } from "@tanstack/react-query"; import { ENDPOINT } from "@/shared/config"; -import { getImageUrlByAtflCd, getBannerList } from "../api/banner"; +import { getImageUrlByAtflCd, getBannerList, type Banner } from "../api/banner"; import { getCookie } from "@/shared/lib"; import { @@ -63,7 +63,7 @@ const BannerList: React.FC = () => { ); }; - const { data: bannerList, error: bannerError, isLoading: isLoadingBanners } = useQuery({ + const { data: bannerList, error: bannerError, isLoading: isLoadingBanners } = useQuery({ queryKey: [ENDPOINT.CMS_SERVICE.BANNERS, siteId], queryFn: () => getBannerList(siteId), enabled: !!siteId, diff --git a/apps/cm/src/pages/dashboard/ui/dashboard-page.tsx b/apps/cm/src/pages/dashboard/ui/dashboard-page.tsx index e83f81c7e..51ced1cbb 100644 --- a/apps/cm/src/pages/dashboard/ui/dashboard-page.tsx +++ b/apps/cm/src/pages/dashboard/ui/dashboard-page.tsx @@ -26,6 +26,7 @@ import ReuseChart from "./reuse-chart"; import ReuseStatus from "./reuse-status"; import NoticeList from "./notice-list"; import BannerList from "./banner-list"; +import SupportList from "./support-list"; // Chart.js 등록 ChartJS.register( @@ -183,13 +184,8 @@ function DashboardPage() { {/* 두번째 라인 */}
-
-
-

지원현황

-
-
- -
+
+
diff --git a/apps/cm/src/pages/dashboard/ui/support-list.tsx b/apps/cm/src/pages/dashboard/ui/support-list.tsx new file mode 100644 index 000000000..59eb15067 --- /dev/null +++ b/apps/cm/src/pages/dashboard/ui/support-list.tsx @@ -0,0 +1,43 @@ +"use client"; + +import { useRouter } from "next/navigation"; +import { useQuery } from "@tanstack/react-query"; +import { getCoreRowModel } from "@tanstack/react-table"; +import { ENDPOINT } from "@/shared/config"; +import { useDataTable } from "@/shared/lib"; +import { + supportTableColumns, +} from "../model/support-columns"; +import { getSupportList } from "../api/support"; + + +const SupportList: React.FC = () => { + const router = useRouter(); + const supportQuery = useQuery({ + queryKey: [ENDPOINT.BOARD_SERVICE.POSTS], + queryFn: () => + getSupportList(), + }); + + const { tableComponent: supportTableComponent } = useDataTable({ + query: supportQuery, + tableOptions: { + columns: supportTableColumns, + getCoreRowModel: getCoreRowModel(), + }, + dataTableOptions: { + variant: "line", + }, + }); + + return ( +
+
+

지원현황

+
+ {supportTableComponent} +
+ ); +}; + +export default SupportList; \ No newline at end of file diff --git a/apps/cm/src/shared/config/api.ts b/apps/cm/src/shared/config/api.ts index 9fe06eacb..241188bee 100644 --- a/apps/cm/src/shared/config/api.ts +++ b/apps/cm/src/shared/config/api.ts @@ -82,7 +82,7 @@ export const ENDPOINT = { REUSE_STATUS: "/operation-service/api/v1/dashBoard/main/reuse/status", }, IC_SERVICE: { - GROUPING_STATISTICS: "/ic-service/api/v1/nti/grouping-statistics", + GROUPING_STATISTICS: "/ic-service/api/v1/support-status-summary", }, DC_SERVICE: { DATA_STATUS: "/dc-service/api/v1/dataStatus", diff --git a/apps/dc/package.json b/apps/dc/package.json index ba2b422ed..747cdf91e 100644 --- a/apps/dc/package.json +++ b/apps/dc/package.json @@ -24,6 +24,7 @@ "js-cookie": "^3.0.5", "lucide-react": "^0.474.0", "next": "15.3.8", + "picocolors": "^1.1.1", "react-chartjs-2": "^5.3.0", "react-dnd": "^16.0.1", "react-dropzone": "^14.3.8", diff --git a/package.json b/package.json index 0b5f5fe9a..cc043dd86 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,10 @@ "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", "react": "^19.2.1", - "react-dom": "^19.2.1" + "react-dom": "^19.2.1", + + "lodash.isequal": "^4.5.0", + "source-map": "^0.7.4" }, "onlyBuiltDependencies": [ "esbuild", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0de14d33e..3545c8ca1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,6 +9,8 @@ overrides: '@types/react-dom': ^19.2.3 react: ^19.2.1 react-dom: ^19.2.1 + lodash.isequal: ^4.5.0 + source-map: ^0.7.4 importers: @@ -168,10 +170,10 @@ importers: version: 5.28.5 eslint: specifier: ^9.0.0 - version: 9.39.1(jiti@2.6.1) + version: 9.39.1(jiti@1.21.7) eslint-config-next: specifier: 15.4.0 - version: 15.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + version: 15.4.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) postcss: specifier: ^8.4.49 version: 8.5.6 @@ -298,10 +300,10 @@ importers: version: 5.28.5 eslint: specifier: ^9 - version: 9.39.1(jiti@1.21.7) + version: 9.39.1(jiti@2.6.1) eslint-config-next: specifier: 15.1.7 - version: 15.1.7(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + version: 15.1.7(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) postcss: specifier: ^8 version: 8.5.6 @@ -516,6 +518,9 @@ importers: next: specifier: 15.3.8 version: 15.3.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + picocolors: + specifier: ^1.1.1 + version: 1.1.1 react-chartjs-2: specifier: ^5.3.0 version: 5.3.1(chart.js@4.5.1)(react@19.2.3) @@ -4644,8 +4649,8 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-equals@5.3.3: - resolution: {integrity: sha512-/boTcHZeIAQ2r/tL11voclBHDeP9WPxLt+tyAbVSyyXuUFyh0Tne7gJZTqGbxnvj79TjLdCXLOY7UIPhyG5MTw==} + fast-equals@5.3.4: + resolution: {integrity: sha512-d+yU9iNQbbC098NOuMlAIth/g+owbpX/uuOkH/DQcC2fMMyjOlX292Op29DrUKq388m4UUyOdWakUH/msGypOg==} engines: {node: '>=6.0.0'} fast-glob@3.3.1: @@ -5336,9 +5341,6 @@ packages: lodash.size@4.2.0: resolution: {integrity: sha512-wbu3SF1XC5ijqm0piNxw59yCbuUf2kaShumYBLWUrcCvwh6C8odz6SY/wGVzCWTQTFL/1Ygbvqg2eLtspUVVAQ==} - lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - lodash.throttle@4.1.1: resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} @@ -6276,14 +6278,9 @@ packages: source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - deprecated: The work that was done in this beta branch won't be included in future versions + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} ssf@0.11.2: resolution: {integrity: sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==} @@ -6481,9 +6478,6 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} - tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -6778,9 +6772,6 @@ packages: web-worker@1.5.0: resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} - webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - webpack-sources@3.3.3: resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} engines: {node: '>=10.13.0'} @@ -6798,9 +6789,6 @@ packages: webpack-cli: optional: true - whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -10090,27 +10078,7 @@ snapshots: estraverse: 5.3.0 esutils: 2.0.3 optionalDependencies: - source-map: 0.6.1 - - eslint-config-next@15.1.7(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3): - dependencies: - '@next/eslint-plugin-next': 15.1.7 - '@rushstack/eslint-patch': 1.15.0 - '@typescript-eslint/eslint-plugin': 8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/parser': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) - eslint: 9.39.1(jiti@1.21.7) - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@1.21.7)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@1.21.7)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.1(jiti@1.21.7)) - eslint-plugin-react: 7.37.5(eslint@9.39.1(jiti@1.21.7)) - eslint-plugin-react-hooks: 5.2.0(eslint@9.39.1(jiti@1.21.7)) - optionalDependencies: - typescript: 5.9.3 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - eslint-plugin-import-x - - supports-color + source-map: 0.7.6 eslint-config-next@15.1.7(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: @@ -10132,6 +10100,26 @@ snapshots: - eslint-plugin-import-x - supports-color + eslint-config-next@15.4.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3): + dependencies: + '@next/eslint-plugin-next': 15.4.0 + '@rushstack/eslint-patch': 1.15.0 + '@typescript-eslint/eslint-plugin': 8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/parser': 8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3) + eslint: 9.39.1(jiti@1.21.7) + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@1.21.7)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@1.21.7))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@1.21.7)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.1(jiti@1.21.7)) + eslint-plugin-react: 7.37.5(eslint@9.39.1(jiti@1.21.7)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.39.1(jiti@1.21.7)) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + eslint-config-next@15.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: '@next/eslint-plugin-next': 15.4.0 @@ -10504,7 +10492,7 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-equals@5.3.3: {} + fast-equals@5.3.4: {} fast-glob@3.3.1: dependencies: @@ -11133,8 +11121,6 @@ snapshots: lodash.size@4.2.0: {} - lodash.sortby@4.7.0: {} - lodash.throttle@4.1.1: {} lodash.uniqby@4.5.0: @@ -11734,7 +11720,7 @@ snapshots: react-smooth@4.0.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: - fast-equals: 5.3.3 + fast-equals: 5.3.4 prop-types: 15.8.1 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -11789,7 +11775,7 @@ snapshots: dependencies: ast-types: 0.16.1 esprima: 4.0.1 - source-map: 0.6.1 + source-map: 0.7.6 tiny-invariant: 1.3.3 tslib: 2.8.1 @@ -12070,13 +12056,9 @@ snapshots: source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 - source-map: 0.6.1 + source-map: 0.7.6 - source-map@0.6.1: {} - - source-map@0.8.0-beta.0: - dependencies: - whatwg-url: 7.1.0 + source-map@0.7.6: {} ssf@0.11.2: dependencies: @@ -12324,10 +12306,6 @@ snapshots: dependencies: is-number: 7.0.0 - tr46@1.0.1: - dependencies: - punycode: 2.3.1 - tree-kill@1.2.2: {} ts-api-utils@2.1.0(typescript@5.6.3): @@ -12378,7 +12356,7 @@ snapshots: postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6) resolve-from: 5.0.0 rollup: 4.53.3 - source-map: 0.8.0-beta.0 + source-map: 0.7.6 sucrase: 3.35.1 tinyexec: 0.3.2 tinyglobby: 0.2.15 @@ -12405,7 +12383,7 @@ snapshots: postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6) resolve-from: 5.0.0 rollup: 4.53.3 - source-map: 0.8.0-beta.0 + source-map: 0.7.6 sucrase: 3.35.1 tinyexec: 0.3.2 tinyglobby: 0.2.15 @@ -12663,8 +12641,6 @@ snapshots: web-worker@1.5.0: {} - webidl-conversions@4.0.2: {} - webpack-sources@3.3.3: {} webpack-virtual-modules@0.6.2: {} @@ -12701,12 +12677,6 @@ snapshots: - esbuild - uglify-js - whatwg-url@7.1.0: - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0