From 16e71980967853eb9766ab8120034385ecca70f1 Mon Sep 17 00:00:00 2001 From: Mingyu Seong Date: Fri, 13 Feb 2026 14:00:47 +0900 Subject: [PATCH 01/17] =?UTF-8?q?chore:=20=EB=B9=88=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20fallback=20text=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/data-table/DataTable.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/data-table/DataTable.tsx b/frontend/src/components/data-table/DataTable.tsx index d83b1fbd3..5b4638f15 100644 --- a/frontend/src/components/data-table/DataTable.tsx +++ b/frontend/src/components/data-table/DataTable.tsx @@ -16,12 +16,14 @@ interface DataTableProps { groupBy?: (row: TData) => string; enableGroupSelection?: boolean; height?: number; + blankFallbackText?: string; } const DataTable = ({ groupBy, height, enableGroupSelection = true, + blankFallbackText, }: DataTableProps) => { const { table, dispatch } = useDataTable(); const rows = table.getRowModel().rows as Row[]; @@ -151,12 +153,14 @@ const DataTable = ({ ); }) ) : ( - + - No results. +

+ {blankFallbackText || '데이터가 없습니다'} +

)} From 949d03f404ffe30b28d5b06b923a80bcd17d0642 Mon Sep 17 00:00:00 2001 From: Mingyu Seong Date: Fri, 13 Feb 2026 14:01:07 +0900 Subject: [PATCH 02/17] =?UTF-8?q?chore:=20BottomSheet=20y=EC=B6=95=20?= =?UTF-8?q?=EC=8A=A4=ED=81=AC=EB=A1=A4=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/layout/BottomSheet.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/layout/BottomSheet.tsx b/frontend/src/components/layout/BottomSheet.tsx index 8ba48e98c..ea1ea5dac 100644 --- a/frontend/src/components/layout/BottomSheet.tsx +++ b/frontend/src/components/layout/BottomSheet.tsx @@ -36,10 +36,10 @@ const BottomSheet = ({ exit={{ y: '100%' }} transition={{ type: 'spring', damping: 25, stiffness: 200 }} className={cn( - `bg-background-normal fixed right-[12vh] bottom-0 left-[18vh] z-50 h-[80vh] rounded-t-2xl ${className}`, + `bg-background-normal scrollbar fixed right-[12vh] bottom-0 left-[18vh] z-50 h-[80vh] overflow-y-auto rounded-t-2xl px-2 ${className}`, )} > -
+
{children} From 849aef1bdf3be9d126d4f351402eb0f832ede73e Mon Sep 17 00:00:00 2001 From: Mingyu Seong Date: Fri, 13 Feb 2026 14:02:04 +0900 Subject: [PATCH 03/17] =?UTF-8?q?feat:=20=EC=97=AC=ED=96=89=20=EB=94=94?= =?UTF-8?q?=EB=8D=B0=EC=9D=BC=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EC=B6=94=EA=B0=80=20-=20=EC=97=AC=ED=96=89?= =?UTF-8?q?=EC=A7=80=20Title=20-=20=EC=A7=80=EC=B6=9C=20=EB=82=B4=EC=97=AD?= =?UTF-8?q?=20=EB=B6=88=EB=9F=AC=EC=98=A4=EA=B8=B0=20BottomSheet=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/TravelDetailPage.tsx | 96 +++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 frontend/src/pages/TravelDetailPage.tsx diff --git a/frontend/src/pages/TravelDetailPage.tsx b/frontend/src/pages/TravelDetailPage.tsx new file mode 100644 index 000000000..4bbac2d25 --- /dev/null +++ b/frontend/src/pages/TravelDetailPage.tsx @@ -0,0 +1,96 @@ +import { useState } from 'react'; + +import BottomSheet from '@/components/common/BottomSheet'; +import Button from '@/components/common/Button'; +import Divider from '@/components/common/Divider'; +import { DataTable } from '@/components/data-table/DataTable'; +import { DataTableFilterProvider } from '@/components/data-table/DataTableFilter'; +import DataTableProvider from '@/components/data-table/DataTableProvider'; +import CategoryFilter from '@/components/data-table/filters/CategoryFilter'; +import DateFilter from '@/components/data-table/filters/DateFilter'; +import MerchantFilter from '@/components/data-table/filters/MerchantFilter'; +import MethodFilter from '@/components/data-table/filters/MethodFilter'; +import SelectionActionProvider from '@/components/data-table/SelectionActionProvider'; +import { columns } from '@/components/home-page/columns'; +import ExpenseCard from '@/components/home-page/ExpenseCard'; +import { type Expense, getData } from '@/components/landing-page/dummy'; + +import { useAccountBookStore } from '@/stores/useAccountBookStore'; + +const TravelDetailPage = () => { + const title = useAccountBookStore((state) => state.accountBook?.title); + const [isBottomSheetOpen, setBottomSheetOpen] = useState(false); + + const data = getData(); + return ( +
+
+
+

뉴욕 보스턴

+
+ + 2026.01.21 - 2026.01.26 + + + 5박 6일 + +
+
+ + +
+ +
+ {/*
+ Widget area +
+ {title && `가계부 명: ${title}가계부`} +
*/} +
+ {/* */} + + + + + + +
+ + + + new Date(row.date).toLocaleDateString('ko-KR', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + }) + } + blankFallbackText={'여행 지출 내역을 추가해주세요'} + /> + +
+ setBottomSheetOpen(false)} + > +
Bottom Sheet Content
+
+
+ ); +}; + +export default TravelDetailPage; From 691999db298dc408d8ec2074bcf12ff157b98852 Mon Sep 17 00:00:00 2001 From: Mingyu Seong Date: Fri, 13 Feb 2026 18:21:20 +0900 Subject: [PATCH 04/17] =?UTF-8?q?chore:=20SelectionActionProvider=20->=20B?= =?UTF-8?q?ar=EB=A1=9C=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{SelectionActionProvider.tsx => SelectionActionBar.tsx} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename frontend/src/components/data-table/{SelectionActionProvider.tsx => SelectionActionBar.tsx} (95%) diff --git a/frontend/src/components/data-table/SelectionActionProvider.tsx b/frontend/src/components/data-table/SelectionActionBar.tsx similarity index 95% rename from frontend/src/components/data-table/SelectionActionProvider.tsx rename to frontend/src/components/data-table/SelectionActionBar.tsx index e198e7242..c1537ceb8 100644 --- a/frontend/src/components/data-table/SelectionActionProvider.tsx +++ b/frontend/src/components/data-table/SelectionActionBar.tsx @@ -19,7 +19,7 @@ const SelectionActionButton = ({ ); }; -const SelectionActionProvider = () => { +const SelectionActionBar = () => { const { table, tableState } = useDataTable(); const selectedRows = table.getFilteredSelectedRowModel().rows; @@ -57,4 +57,4 @@ const SelectionActionProvider = () => { ); }; -export default SelectionActionProvider; +export default SelectionActionBar; From 545b61bc3cf4340a0b7618cfb38a68bf8159dce6 Mon Sep 17 00:00:00 2001 From: Mingyu Seong Date: Fri, 13 Feb 2026 18:21:35 +0900 Subject: [PATCH 05/17] =?UTF-8?q?chore:=20ImportToFolderBar=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data-table/ImportToFolderBar.tsx | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 frontend/src/components/data-table/ImportToFolderBar.tsx diff --git a/frontend/src/components/data-table/ImportToFolderBar.tsx b/frontend/src/components/data-table/ImportToFolderBar.tsx new file mode 100644 index 000000000..bed82998c --- /dev/null +++ b/frontend/src/components/data-table/ImportToFolderBar.tsx @@ -0,0 +1,60 @@ +import React from 'react'; + +import { useDataTable } from '@/components/data-table/context'; + +import { Icons } from '@/assets'; +import { cn } from '@/lib/utils'; + +const Divider = () =>
; + +const SelectionActionButton = ({ + children, + onClick, + className, +}: React.ComponentProps<'button'>) => { + return ( + + ); +}; + +const SelectionActionProvider = () => { + const { table, tableState } = useDataTable(); + const selectedRows = table.getFilteredSelectedRowModel().rows; + + const actionButtons = [ + { label: '카테고리', onClick: () => console.log('카테고리 변경') }, + { label: '결제수단', onClick: () => console.log('결제수단 변경') }, + { label: '여행', onClick: () => console.log('여행 변경') }, + { + label: '삭제', + onClick: () => console.log('삭제 실행'), + className: 'text-status-negative', + }, + ]; + + if (!tableState.selectionMode) return null; + + return ( +
+
+ {selectedRows.length}개 선택됨 + {actionButtons.map((button, index) => ( + + + {button.label} + + {index < actionButtons.length - 1 && } + + ))} + +
+
+ ); +}; + +export default SelectionActionProvider; From ec95bcdafacfa3e808b7c3c254288137d3104ede Mon Sep 17 00:00:00 2001 From: Mingyu Seong Date: Fri, 13 Feb 2026 18:22:06 +0900 Subject: [PATCH 06/17] =?UTF-8?q?feat:=20=EC=97=AC=ED=96=89=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=B6=88=EB=9F=AC=EC=98=AC=20=EA=B0=80=EA=B3=84=EB=B6=80=20Bot?= =?UTF-8?q?tomSheet=EC=97=90=20=ED=85=8C=EC=9D=B4=EB=B8=94=20=EB=84=A3?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/TravelDetailPage.tsx | 25 +++++++++++++++++++++++-- frontend/src/styles/objectStyle.css | 7 +++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/frontend/src/pages/TravelDetailPage.tsx b/frontend/src/pages/TravelDetailPage.tsx index 4bbac2d25..18a674336 100644 --- a/frontend/src/pages/TravelDetailPage.tsx +++ b/frontend/src/pages/TravelDetailPage.tsx @@ -10,7 +10,8 @@ import CategoryFilter from '@/components/data-table/filters/CategoryFilter'; import DateFilter from '@/components/data-table/filters/DateFilter'; import MerchantFilter from '@/components/data-table/filters/MerchantFilter'; import MethodFilter from '@/components/data-table/filters/MethodFilter'; -import SelectionActionProvider from '@/components/data-table/SelectionActionProvider'; +import ImportToFolderBar from '@/components/data-table/ImportToFolderBar'; +import SelectionActionBar from '@/components/data-table/SelectionActionBar'; import { columns } from '@/components/home-page/columns'; import ExpenseCard from '@/components/home-page/ExpenseCard'; import { type Expense, getData } from '@/components/landing-page/dummy'; @@ -81,13 +82,33 @@ const TravelDetailPage = () => { } blankFallbackText={'여행 지출 내역을 추가해주세요'} /> +
setBottomSheetOpen(false)} > -
Bottom Sheet Content
+ + + + + + +
+ + + new Date(row.date).toLocaleDateString('ko-KR', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + }) + } + blankFallbackText={'여행 지출 내역을 추가해주세요'} + /> + +
); diff --git a/frontend/src/styles/objectStyle.css b/frontend/src/styles/objectStyle.css index 90f8b67e5..7440627e2 100644 --- a/frontend/src/styles/objectStyle.css +++ b/frontend/src/styles/objectStyle.css @@ -71,6 +71,13 @@ box-shadow: 0 1px 6px 0 rgba(0, 0, 0, 0.08); } +@utility shadow-semantic-strong { + box-shadow: + 0 6px 12px 0 rgba(0, 0, 0, 0.12), + 0 4px 8px 0 rgba(0, 0, 0, 0.08), + 0 0 4px 0 rgba(0, 0, 0, 0.08); +} + @utility shadow-popover { box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.06); } From da1b66ef0916cc326dc5995d7bf4792b8458990a Mon Sep 17 00:00:00 2001 From: Mingyu Seong Date: Fri, 13 Feb 2026 18:33:42 +0900 Subject: [PATCH 07/17] =?UTF-8?q?chore:=20=EC=97=AC=ED=96=89=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20route=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/TravelDetailPage.tsx | 5 +- frontend/src/pages/TravelPage.tsx | 24 ++++--- frontend/src/routeTree.gen.ts | 70 +++++++++++++------ frontend/src/routes/_app/travel/$id.tsx | 11 +++ .../_app/{travel.tsx => travel/index.tsx} | 2 +- 5 files changed, 76 insertions(+), 36 deletions(-) create mode 100644 frontend/src/routes/_app/travel/$id.tsx rename frontend/src/routes/_app/{travel.tsx => travel/index.tsx} (77%) diff --git a/frontend/src/pages/TravelDetailPage.tsx b/frontend/src/pages/TravelDetailPage.tsx index 18a674336..b1a8974ca 100644 --- a/frontend/src/pages/TravelDetailPage.tsx +++ b/frontend/src/pages/TravelDetailPage.tsx @@ -1,6 +1,5 @@ import { useState } from 'react'; -import BottomSheet from '@/components/common/BottomSheet'; import Button from '@/components/common/Button'; import Divider from '@/components/common/Divider'; import { DataTable } from '@/components/data-table/DataTable'; @@ -15,11 +14,9 @@ import SelectionActionBar from '@/components/data-table/SelectionActionBar'; import { columns } from '@/components/home-page/columns'; import ExpenseCard from '@/components/home-page/ExpenseCard'; import { type Expense, getData } from '@/components/landing-page/dummy'; - -import { useAccountBookStore } from '@/stores/useAccountBookStore'; +import BottomSheet from '@/components/layout/BottomSheet'; const TravelDetailPage = () => { - const title = useAccountBookStore((state) => state.accountBook?.title); const [isBottomSheetOpen, setBottomSheetOpen] = useState(false); const data = getData(); diff --git a/frontend/src/pages/TravelPage.tsx b/frontend/src/pages/TravelPage.tsx index 7985681b6..ff3a3c8c0 100644 --- a/frontend/src/pages/TravelPage.tsx +++ b/frontend/src/pages/TravelPage.tsx @@ -1,3 +1,5 @@ +import { Link } from '@tanstack/react-router'; + import Button from '@/components/common/Button'; import FolderCard from '@/components/travel-page/FolderCard'; @@ -42,16 +44,18 @@ const TravelPage = () => {
{folderMap.map((folder, index) => ( - + + + ))}
diff --git a/frontend/src/routeTree.gen.ts b/frontend/src/routeTree.gen.ts index e6c3ac0cb..ef5d0fef9 100644 --- a/frontend/src/routeTree.gen.ts +++ b/frontend/src/routeTree.gen.ts @@ -13,11 +13,12 @@ import { Route as AuthRouteImport } from './routes/_auth' import { Route as AppRouteImport } from './routes/_app' import { Route as AuthIndexRouteImport } from './routes/_auth/index' import { Route as AuthLoginRouteImport } from './routes/_auth/login' -import { Route as AppTravelRouteImport } from './routes/_app/travel' import { Route as AppSettingRouteImport } from './routes/_app/setting' import { Route as AppReportRouteImport } from './routes/_app/report' import { Route as AppInitRouteImport } from './routes/_app/init' import { Route as AppHomeRouteImport } from './routes/_app/home' +import { Route as AppTravelIndexRouteImport } from './routes/_app/travel/index' +import { Route as AppTravelIdRouteImport } from './routes/_app/travel/$id' const AuthRoute = AuthRouteImport.update({ id: '/_auth', @@ -37,11 +38,6 @@ const AuthLoginRoute = AuthLoginRouteImport.update({ path: '/login', getParentRoute: () => AuthRoute, } as any) -const AppTravelRoute = AppTravelRouteImport.update({ - id: '/travel', - path: '/travel', - getParentRoute: () => AppRoute, -} as any) const AppSettingRoute = AppSettingRouteImport.update({ id: '/setting', path: '/setting', @@ -62,6 +58,16 @@ const AppHomeRoute = AppHomeRouteImport.update({ path: '/home', getParentRoute: () => AppRoute, } as any) +const AppTravelIndexRoute = AppTravelIndexRouteImport.update({ + id: '/travel/', + path: '/travel/', + getParentRoute: () => AppRoute, +} as any) +const AppTravelIdRoute = AppTravelIdRouteImport.update({ + id: '/travel/$id', + path: '/travel/$id', + getParentRoute: () => AppRoute, +} as any) export interface FileRoutesByFullPath { '/': typeof AuthIndexRoute @@ -69,8 +75,9 @@ export interface FileRoutesByFullPath { '/init': typeof AppInitRoute '/report': typeof AppReportRoute '/setting': typeof AppSettingRoute - '/travel': typeof AppTravelRoute '/login': typeof AuthLoginRoute + '/travel/$id': typeof AppTravelIdRoute + '/travel/': typeof AppTravelIndexRoute } export interface FileRoutesByTo { '/': typeof AuthIndexRoute @@ -78,8 +85,9 @@ export interface FileRoutesByTo { '/init': typeof AppInitRoute '/report': typeof AppReportRoute '/setting': typeof AppSettingRoute - '/travel': typeof AppTravelRoute '/login': typeof AuthLoginRoute + '/travel/$id': typeof AppTravelIdRoute + '/travel': typeof AppTravelIndexRoute } export interface FileRoutesById { __root__: typeof rootRouteImport @@ -89,9 +97,10 @@ export interface FileRoutesById { '/_app/init': typeof AppInitRoute '/_app/report': typeof AppReportRoute '/_app/setting': typeof AppSettingRoute - '/_app/travel': typeof AppTravelRoute '/_auth/login': typeof AuthLoginRoute '/_auth/': typeof AuthIndexRoute + '/_app/travel/$id': typeof AppTravelIdRoute + '/_app/travel/': typeof AppTravelIndexRoute } export interface FileRouteTypes { fileRoutesByFullPath: FileRoutesByFullPath @@ -101,10 +110,19 @@ export interface FileRouteTypes { | '/init' | '/report' | '/setting' - | '/travel' | '/login' + | '/travel/$id' + | '/travel/' fileRoutesByTo: FileRoutesByTo - to: '/' | '/home' | '/init' | '/report' | '/setting' | '/travel' | '/login' + to: + | '/' + | '/home' + | '/init' + | '/report' + | '/setting' + | '/login' + | '/travel/$id' + | '/travel' id: | '__root__' | '/_app' @@ -113,9 +131,10 @@ export interface FileRouteTypes { | '/_app/init' | '/_app/report' | '/_app/setting' - | '/_app/travel' | '/_auth/login' | '/_auth/' + | '/_app/travel/$id' + | '/_app/travel/' fileRoutesById: FileRoutesById } export interface RootRouteChildren { @@ -153,13 +172,6 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof AuthLoginRouteImport parentRoute: typeof AuthRoute } - '/_app/travel': { - id: '/_app/travel' - path: '/travel' - fullPath: '/travel' - preLoaderRoute: typeof AppTravelRouteImport - parentRoute: typeof AppRoute - } '/_app/setting': { id: '/_app/setting' path: '/setting' @@ -188,6 +200,20 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof AppHomeRouteImport parentRoute: typeof AppRoute } + '/_app/travel/': { + id: '/_app/travel/' + path: '/travel' + fullPath: '/travel/' + preLoaderRoute: typeof AppTravelIndexRouteImport + parentRoute: typeof AppRoute + } + '/_app/travel/$id': { + id: '/_app/travel/$id' + path: '/travel/$id' + fullPath: '/travel/$id' + preLoaderRoute: typeof AppTravelIdRouteImport + parentRoute: typeof AppRoute + } } } @@ -196,7 +222,8 @@ interface AppRouteChildren { AppInitRoute: typeof AppInitRoute AppReportRoute: typeof AppReportRoute AppSettingRoute: typeof AppSettingRoute - AppTravelRoute: typeof AppTravelRoute + AppTravelIdRoute: typeof AppTravelIdRoute + AppTravelIndexRoute: typeof AppTravelIndexRoute } const AppRouteChildren: AppRouteChildren = { @@ -204,7 +231,8 @@ const AppRouteChildren: AppRouteChildren = { AppInitRoute: AppInitRoute, AppReportRoute: AppReportRoute, AppSettingRoute: AppSettingRoute, - AppTravelRoute: AppTravelRoute, + AppTravelIdRoute: AppTravelIdRoute, + AppTravelIndexRoute: AppTravelIndexRoute, } const AppRouteWithChildren = AppRoute._addFileChildren(AppRouteChildren) diff --git a/frontend/src/routes/_app/travel/$id.tsx b/frontend/src/routes/_app/travel/$id.tsx new file mode 100644 index 000000000..442396658 --- /dev/null +++ b/frontend/src/routes/_app/travel/$id.tsx @@ -0,0 +1,11 @@ +import { createFileRoute } from '@tanstack/react-router'; + +import TravelDetailPage from '@/pages/TravelDetailPage'; + +export const Route = createFileRoute('/_app/travel/$id')({ + component: RouteComponent, +}); + +function RouteComponent() { + return ; +} diff --git a/frontend/src/routes/_app/travel.tsx b/frontend/src/routes/_app/travel/index.tsx similarity index 77% rename from frontend/src/routes/_app/travel.tsx rename to frontend/src/routes/_app/travel/index.tsx index 2b71b33c0..7700d1188 100644 --- a/frontend/src/routes/_app/travel.tsx +++ b/frontend/src/routes/_app/travel/index.tsx @@ -2,7 +2,7 @@ import { createFileRoute } from '@tanstack/react-router'; import TravelPage from '@/pages/TravelPage'; -export const Route = createFileRoute('/_app/travel')({ +export const Route = createFileRoute('/_app/travel/')({ component: RouteComponent, }); From ad8fe8baac27ff57807c3fcffd139ff5b015edcc Mon Sep 17 00:00:00 2001 From: Mingyu Seong Date: Fri, 13 Feb 2026 18:47:28 +0900 Subject: [PATCH 08/17] =?UTF-8?q?chore:=20ImportToFolderBar=20=EB=94=94?= =?UTF-8?q?=EC=9E=90=EC=9D=B8=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data-table/ImportToFolderBar.tsx | 46 ++++--------------- 1 file changed, 9 insertions(+), 37 deletions(-) diff --git a/frontend/src/components/data-table/ImportToFolderBar.tsx b/frontend/src/components/data-table/ImportToFolderBar.tsx index bed82998c..f40ec001f 100644 --- a/frontend/src/components/data-table/ImportToFolderBar.tsx +++ b/frontend/src/components/data-table/ImportToFolderBar.tsx @@ -1,56 +1,28 @@ -import React from 'react'; - import { useDataTable } from '@/components/data-table/context'; import { Icons } from '@/assets'; -import { cn } from '@/lib/utils'; const Divider = () =>
; -const SelectionActionButton = ({ - children, - onClick, - className, -}: React.ComponentProps<'button'>) => { - return ( - - ); -}; - const SelectionActionProvider = () => { const { table, tableState } = useDataTable(); const selectedRows = table.getFilteredSelectedRowModel().rows; - const actionButtons = [ - { label: '카테고리', onClick: () => console.log('카테고리 변경') }, - { label: '결제수단', onClick: () => console.log('결제수단 변경') }, - { label: '여행', onClick: () => console.log('여행 변경') }, - { - label: '삭제', - onClick: () => console.log('삭제 실행'), - className: 'text-status-negative', - }, - ]; - if (!tableState.selectionMode) return null; + const handleImportToFolder = () => {}; + return (
{selectedRows.length}개 선택됨 - {actionButtons.map((button, index) => ( - - - {button.label} - - {index < actionButtons.length - 1 && } - - ))} + +
From b9f772d84d60aff573dead6d4bf66b97d7d5ab0b Mon Sep 17 00:00:00 2001 From: Mingyu Seong Date: Sun, 15 Feb 2026 16:53:38 +0900 Subject: [PATCH 09/17] =?UTF-8?q?chore:=20travel/$id=20->=20travel/$travel?= =?UTF-8?q?Id=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/routeTree.gen.ts | 34 +++++++++---------- .../_app/travel/{$id.tsx => $travelId.tsx} | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) rename frontend/src/routes/_app/travel/{$id.tsx => $travelId.tsx} (76%) diff --git a/frontend/src/routeTree.gen.ts b/frontend/src/routeTree.gen.ts index ef5d0fef9..361675018 100644 --- a/frontend/src/routeTree.gen.ts +++ b/frontend/src/routeTree.gen.ts @@ -18,7 +18,7 @@ import { Route as AppReportRouteImport } from './routes/_app/report' import { Route as AppInitRouteImport } from './routes/_app/init' import { Route as AppHomeRouteImport } from './routes/_app/home' import { Route as AppTravelIndexRouteImport } from './routes/_app/travel/index' -import { Route as AppTravelIdRouteImport } from './routes/_app/travel/$id' +import { Route as AppTravelTravelIdRouteImport } from './routes/_app/travel/$travelId' const AuthRoute = AuthRouteImport.update({ id: '/_auth', @@ -63,9 +63,9 @@ const AppTravelIndexRoute = AppTravelIndexRouteImport.update({ path: '/travel/', getParentRoute: () => AppRoute, } as any) -const AppTravelIdRoute = AppTravelIdRouteImport.update({ - id: '/travel/$id', - path: '/travel/$id', +const AppTravelTravelIdRoute = AppTravelTravelIdRouteImport.update({ + id: '/travel/$travelId', + path: '/travel/$travelId', getParentRoute: () => AppRoute, } as any) @@ -76,7 +76,7 @@ export interface FileRoutesByFullPath { '/report': typeof AppReportRoute '/setting': typeof AppSettingRoute '/login': typeof AuthLoginRoute - '/travel/$id': typeof AppTravelIdRoute + '/travel/$travelId': typeof AppTravelTravelIdRoute '/travel/': typeof AppTravelIndexRoute } export interface FileRoutesByTo { @@ -86,7 +86,7 @@ export interface FileRoutesByTo { '/report': typeof AppReportRoute '/setting': typeof AppSettingRoute '/login': typeof AuthLoginRoute - '/travel/$id': typeof AppTravelIdRoute + '/travel/$travelId': typeof AppTravelTravelIdRoute '/travel': typeof AppTravelIndexRoute } export interface FileRoutesById { @@ -99,7 +99,7 @@ export interface FileRoutesById { '/_app/setting': typeof AppSettingRoute '/_auth/login': typeof AuthLoginRoute '/_auth/': typeof AuthIndexRoute - '/_app/travel/$id': typeof AppTravelIdRoute + '/_app/travel/$travelId': typeof AppTravelTravelIdRoute '/_app/travel/': typeof AppTravelIndexRoute } export interface FileRouteTypes { @@ -111,7 +111,7 @@ export interface FileRouteTypes { | '/report' | '/setting' | '/login' - | '/travel/$id' + | '/travel/$travelId' | '/travel/' fileRoutesByTo: FileRoutesByTo to: @@ -121,7 +121,7 @@ export interface FileRouteTypes { | '/report' | '/setting' | '/login' - | '/travel/$id' + | '/travel/$travelId' | '/travel' id: | '__root__' @@ -133,7 +133,7 @@ export interface FileRouteTypes { | '/_app/setting' | '/_auth/login' | '/_auth/' - | '/_app/travel/$id' + | '/_app/travel/$travelId' | '/_app/travel/' fileRoutesById: FileRoutesById } @@ -207,11 +207,11 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof AppTravelIndexRouteImport parentRoute: typeof AppRoute } - '/_app/travel/$id': { - id: '/_app/travel/$id' - path: '/travel/$id' - fullPath: '/travel/$id' - preLoaderRoute: typeof AppTravelIdRouteImport + '/_app/travel/$travelId': { + id: '/_app/travel/$travelId' + path: '/travel/$travelId' + fullPath: '/travel/$travelId' + preLoaderRoute: typeof AppTravelTravelIdRouteImport parentRoute: typeof AppRoute } } @@ -222,7 +222,7 @@ interface AppRouteChildren { AppInitRoute: typeof AppInitRoute AppReportRoute: typeof AppReportRoute AppSettingRoute: typeof AppSettingRoute - AppTravelIdRoute: typeof AppTravelIdRoute + AppTravelTravelIdRoute: typeof AppTravelTravelIdRoute AppTravelIndexRoute: typeof AppTravelIndexRoute } @@ -231,7 +231,7 @@ const AppRouteChildren: AppRouteChildren = { AppInitRoute: AppInitRoute, AppReportRoute: AppReportRoute, AppSettingRoute: AppSettingRoute, - AppTravelIdRoute: AppTravelIdRoute, + AppTravelTravelIdRoute: AppTravelTravelIdRoute, AppTravelIndexRoute: AppTravelIndexRoute, } diff --git a/frontend/src/routes/_app/travel/$id.tsx b/frontend/src/routes/_app/travel/$travelId.tsx similarity index 76% rename from frontend/src/routes/_app/travel/$id.tsx rename to frontend/src/routes/_app/travel/$travelId.tsx index 442396658..7ea928105 100644 --- a/frontend/src/routes/_app/travel/$id.tsx +++ b/frontend/src/routes/_app/travel/$travelId.tsx @@ -2,7 +2,7 @@ import { createFileRoute } from '@tanstack/react-router'; import TravelDetailPage from '@/pages/TravelDetailPage'; -export const Route = createFileRoute('/_app/travel/$id')({ +export const Route = createFileRoute('/_app/travel/$travelId')({ component: RouteComponent, }); From d57e548d7a5489c5f7180b2c3d2ce861e29a45ef Mon Sep 17 00:00:00 2001 From: Mingyu Seong Date: Sun, 15 Feb 2026 16:54:06 +0900 Subject: [PATCH 10/17] =?UTF-8?q?chore:=20svg=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EB=84=88=EB=B9=84=20=EB=86=92=EC=9D=B4=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/assets/Icons/chevron-back.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/assets/Icons/chevron-back.svg b/frontend/src/assets/Icons/chevron-back.svg index 084d2b7a0..61faf93a4 100644 --- a/frontend/src/assets/Icons/chevron-back.svg +++ b/frontend/src/assets/Icons/chevron-back.svg @@ -1,3 +1,3 @@ - + From cabb76f77d432f07e21c0fc897ef0c7dea7b5cac Mon Sep 17 00:00:00 2001 From: Mingyu Seong Date: Sun, 15 Feb 2026 16:55:29 +0900 Subject: [PATCH 11/17] =?UTF-8?q?chore:=20=EC=97=AC=ED=96=89=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=EA=B2=BD=EB=A1=9C=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/TravelPage.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/frontend/src/pages/TravelPage.tsx b/frontend/src/pages/TravelPage.tsx index ff3a3c8c0..64a0cc8ee 100644 --- a/frontend/src/pages/TravelPage.tsx +++ b/frontend/src/pages/TravelPage.tsx @@ -8,6 +8,7 @@ import { COUNTRY_CODE } from '@/data/countryCode'; const folderMap = [ { + travelId: 0, label: '뉴욕 보스턴', dateRange: '2026.01.21 - 2026.01.26', localCountryCode: COUNTRY_CODE.US, @@ -17,6 +18,7 @@ const folderMap = [ imageUrl: SeoulImage, }, { + travelId: 1, label: '뉴욕 보스턴', dateRange: '2026.01.21 - 2026.01.26', localCountryCode: COUNTRY_CODE.KR, @@ -43,10 +45,13 @@ const TravelPage = () => {
- {folderMap.map((folder, index) => ( - + {folderMap.map((folder) => ( + Date: Sun, 15 Feb 2026 16:56:10 +0900 Subject: [PATCH 12/17] =?UTF-8?q?chore:=20=EC=97=AC=ED=96=89=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=92=A4=EB=A1=9C?= =?UTF-8?q?=EA=B0=80=EA=B8=B0=20=EC=95=84=EC=9D=B4=EC=BD=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=EC=BD=94=EB=93=9C=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/TravelDetailPage.tsx | 47 +++++++++++++++---------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/frontend/src/pages/TravelDetailPage.tsx b/frontend/src/pages/TravelDetailPage.tsx index b1a8974ca..2ea715a0e 100644 --- a/frontend/src/pages/TravelDetailPage.tsx +++ b/frontend/src/pages/TravelDetailPage.tsx @@ -1,4 +1,5 @@ import { useState } from 'react'; +import { Link } from '@tanstack/react-router'; import Button from '@/components/common/Button'; import Divider from '@/components/common/Divider'; @@ -16,24 +17,37 @@ import ExpenseCard from '@/components/home-page/ExpenseCard'; import { type Expense, getData } from '@/components/landing-page/dummy'; import BottomSheet from '@/components/layout/BottomSheet'; +import { Icons } from '@/assets'; + +const TripSummary = () => { + return ( +
+
+ + + + 뉴욕 보스턴 +
+
+ + 2026.01.21 - 2026.01.26 + + + 5박 6일 + +
+
+ ); +}; + const TravelDetailPage = () => { const [isBottomSheetOpen, setBottomSheetOpen] = useState(false); const data = getData(); return ( -
+
-
-

뉴욕 보스턴

-
- - 2026.01.21 - 2026.01.26 - - - 5박 6일 - -
-
+ { 위젯 편집하기
- {/*
- Widget area -
- {title && `가계부 명: ${title}가계부`} -
*/} -
- {/* */} + +
From f02b9c07fd6feb32d2ad0ceb6ba4080e7124bab1 Mon Sep 17 00:00:00 2001 From: Mingyu Seong Date: Sun, 15 Feb 2026 16:59:07 +0900 Subject: [PATCH 13/17] =?UTF-8?q?fix:=20table=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=95=84=EC=9B=83=20=EC=88=98=EC=A0=95=20-=20table=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=ED=83=9C=EA=B7=B8=EB=8A=94=20flex=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=EC=9D=84=20=EC=A0=81=EC=9A=A9=ED=95=98=EB=A9=B4=20?= =?UTF-8?q?=EC=9E=90=EC=B2=B4=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EB=84=88?= =?UTF-8?q?=EB=B9=84=EB=A5=BC=20=EC=84=A4=EC=A0=95=ED=95=B4=EC=A3=BC?= =?UTF-8?q?=EB=8A=94=20=EC=86=8D=EC=84=B1=EC=9D=B4=20=EB=AA=A8=EB=91=90=20?= =?UTF-8?q?=EB=AC=B4=EC=8B=9C=EB=90=98=EB=AF=80=EB=A1=9C=20wrapper=20div?= =?UTF-8?q?=EC=97=90=20=EC=9B=90=ED=95=98=EB=8A=94=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EA=B8=B0=EC=9E=85=20-=20header=EB=8A=94=20sticky=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/data-table/DataTable.tsx | 8 +++----- .../src/components/data-table/DataTableProvider.tsx | 2 +- frontend/src/components/ui/table.tsx | 11 +++-------- 3 files changed, 7 insertions(+), 14 deletions(-) diff --git a/frontend/src/components/data-table/DataTable.tsx b/frontend/src/components/data-table/DataTable.tsx index 5b4638f15..7ce574439 100644 --- a/frontend/src/components/data-table/DataTable.tsx +++ b/frontend/src/components/data-table/DataTable.tsx @@ -15,13 +15,11 @@ import { interface DataTableProps { groupBy?: (row: TData) => string; enableGroupSelection?: boolean; - height?: number; blankFallbackText?: string; } const DataTable = ({ groupBy, - height, enableGroupSelection = true, blankFallbackText, }: DataTableProps) => { @@ -62,8 +60,8 @@ const DataTable = ({ ); // dispatch가 바뀌지 않는 한 함수 재사용 return ( - - +
+ {table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( @@ -156,7 +154,7 @@ const DataTable = ({

{blankFallbackText || '데이터가 없습니다'} diff --git a/frontend/src/components/data-table/DataTableProvider.tsx b/frontend/src/components/data-table/DataTableProvider.tsx index 886fa87a4..efc952831 100644 --- a/frontend/src/components/data-table/DataTableProvider.tsx +++ b/frontend/src/components/data-table/DataTableProvider.tsx @@ -93,7 +93,7 @@ const DataTableProvider = ({ } as DataTableContextType } > - {children} +
{children}
); }; diff --git a/frontend/src/components/ui/table.tsx b/frontend/src/components/ui/table.tsx index 87bbe913c..d938f7b00 100644 --- a/frontend/src/components/ui/table.tsx +++ b/frontend/src/components/ui/table.tsx @@ -2,16 +2,11 @@ import * as React from 'react'; import { cn } from '@/lib/utils'; -function Table({ - className, - height, - ...props -}: React.ComponentProps<'table'> & { height?: number }) { +function Table({ ...props }: React.ComponentProps<'table'>) { return (

@@ -23,7 +18,7 @@ function TableHeader({ className, ...props }: React.ComponentProps<'thead'>) { Date: Sun, 15 Feb 2026 16:59:23 +0900 Subject: [PATCH 14/17] =?UTF-8?q?chore:=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=EB=AA=85=EA=B3=BC=20=ED=8C=8C=EC=9D=BC=EB=AA=85=20?= =?UTF-8?q?=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/data-table/ImportToFolderBar.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/data-table/ImportToFolderBar.tsx b/frontend/src/components/data-table/ImportToFolderBar.tsx index f40ec001f..7f2bccc76 100644 --- a/frontend/src/components/data-table/ImportToFolderBar.tsx +++ b/frontend/src/components/data-table/ImportToFolderBar.tsx @@ -4,7 +4,7 @@ import { Icons } from '@/assets'; const Divider = () =>
; -const SelectionActionProvider = () => { +const ImportToFolderBar = () => { const { table, tableState } = useDataTable(); const selectedRows = table.getFilteredSelectedRowModel().rows; @@ -29,4 +29,4 @@ const SelectionActionProvider = () => { ); }; -export default SelectionActionProvider; +export default ImportToFolderBar; From dc583e3c729c57f0c75dae837323cb33589213b2 Mon Sep 17 00:00:00 2001 From: Mingyu Seong Date: Sun, 15 Feb 2026 16:59:56 +0900 Subject: [PATCH 15/17] =?UTF-8?q?chore:=20BottomSheet=EB=8A=94=20=EC=8A=A4?= =?UTF-8?q?=ED=81=AC=EB=A1=A4=EB=90=98=EC=A7=80=20=EC=95=8A=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=84=A4=EC=A0=95=20-=20children=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EC=9E=90=EC=B2=B4=EC=A0=81=EC=9C=BC=EB=A1=9C=20scroll?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/layout/BottomSheet.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/layout/BottomSheet.tsx b/frontend/src/components/layout/BottomSheet.tsx index ea1ea5dac..57e8def7c 100644 --- a/frontend/src/components/layout/BottomSheet.tsx +++ b/frontend/src/components/layout/BottomSheet.tsx @@ -36,10 +36,10 @@ const BottomSheet = ({ exit={{ y: '100%' }} transition={{ type: 'spring', damping: 25, stiffness: 200 }} className={cn( - `bg-background-normal scrollbar fixed right-[12vh] bottom-0 left-[18vh] z-50 h-[80vh] overflow-y-auto rounded-t-2xl px-2 ${className}`, + `bg-background-normal fixed right-[12vh] bottom-0 left-[18vh] z-50 flex h-[80vh] flex-col rounded-t-2xl px-2 ${className}`, )} > -
+
{children} From 30f70dd90e4c75ad47cf3e621ed32a50e163df5c Mon Sep 17 00:00:00 2001 From: Mingyu Seong Date: Sun, 15 Feb 2026 17:06:36 +0900 Subject: [PATCH 16/17] =?UTF-8?q?chore:=20=EC=82=AC=EC=9A=A9=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20prop=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/LandingPage.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/frontend/src/pages/LandingPage.tsx b/frontend/src/pages/LandingPage.tsx index 44a7a20d1..4f568f9a1 100644 --- a/frontend/src/pages/LandingPage.tsx +++ b/frontend/src/pages/LandingPage.tsx @@ -186,7 +186,6 @@ const DemoSection = () => {
new Date(row.date).toLocaleDateString('ko-KR', { @@ -211,7 +210,6 @@ const DemoSection = () => {
new Date(row.date).toLocaleDateString('ko-KR', { From b73acdd723af70f48ba25ed74b3755fb7514835d Mon Sep 17 00:00:00 2001 From: Mingyu Seong Date: Sun, 15 Feb 2026 17:40:01 +0900 Subject: [PATCH 17/17] =?UTF-8?q?chore:=20=EC=A0=95=EB=A0=AC=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/pages/TravelDetailPage.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/pages/TravelDetailPage.tsx b/frontend/src/pages/TravelDetailPage.tsx index 2ea715a0e..36ff1bf65 100644 --- a/frontend/src/pages/TravelDetailPage.tsx +++ b/frontend/src/pages/TravelDetailPage.tsx @@ -10,6 +10,7 @@ import CategoryFilter from '@/components/data-table/filters/CategoryFilter'; import DateFilter from '@/components/data-table/filters/DateFilter'; import MerchantFilter from '@/components/data-table/filters/MerchantFilter'; import MethodFilter from '@/components/data-table/filters/MethodFilter'; +import SortDropdown from '@/components/data-table/filters/SortDropdown'; import ImportToFolderBar from '@/components/data-table/ImportToFolderBar'; import SelectionActionBar from '@/components/data-table/SelectionActionBar'; import { columns } from '@/components/home-page/columns'; @@ -70,12 +71,13 @@ const TravelDetailPage = () => {
+ {
+