From 879702d31d3c3c9bdd8170b0d9f43f28ed42ba5a Mon Sep 17 00:00:00 2001 From: rstubryan Date: Wed, 24 Dec 2025 17:53:14 +0700 Subject: [PATCH] refactor(FE-316): Add expandable secondary drawer panel --- src/components/Drawer.tsx | 35 ++++++++++++++++--- .../uniformity/UniformityPageWrapper.tsx | 9 +++-- .../uniformity/form/ExpandedDrawerForm.tsx | 33 +++++++++++++++++ .../pages/uniformity/form/UniformityForm.tsx | 28 +++++++++++++-- src/stores/ui/slices/drawer.slice.ts | 7 ++++ src/types/stores.d.ts | 3 ++ 6 files changed, 106 insertions(+), 9 deletions(-) create mode 100644 src/components/pages/uniformity/form/ExpandedDrawerForm.tsx diff --git a/src/components/Drawer.tsx b/src/components/Drawer.tsx index 17b8a56f..3e2a71a2 100644 --- a/src/components/Drawer.tsx +++ b/src/components/Drawer.tsx @@ -15,6 +15,8 @@ interface DrawerProps { className?: DrawerClassName; onBackdropClick?: () => void; closeOnBackdropClick?: boolean; + expandedContent?: ReactNode; + expandedWidth?: string; } type DrawerClassName = { @@ -36,6 +38,8 @@ const Drawer = ({ className, onBackdropClick, closeOnBackdropClick = true, + expandedContent, + expandedWidth = 'w-[400px]', }: DrawerProps) => { const getDrawerClassNames = (): DrawerClassName => { const baseClassNames = { @@ -138,14 +142,37 @@ const Drawer = ({ onClick={closeDrawer} /> - {/* Sidebar Content */} + {/* Sidebar Content - Full height container */}
- {sidebarContent} + {/* Primary Sidebar Content */} +
+ {sidebarContent} +
+ + {/* Expanded Drawer (Right side, side-by-side) */} + {expandedContent && ( +
+
+ {expandedContent} +
+
+ )}
diff --git a/src/components/pages/uniformity/UniformityPageWrapper.tsx b/src/components/pages/uniformity/UniformityPageWrapper.tsx index 4141d094..3871e487 100644 --- a/src/components/pages/uniformity/UniformityPageWrapper.tsx +++ b/src/components/pages/uniformity/UniformityPageWrapper.tsx @@ -14,6 +14,7 @@ export default function UniformityPageWrapper({ const pathname = usePathname(); const router = useRouter(); const toggleValidate = useUiStore((s) => s.toggleValidate); + const setExpandedDrawerOpen = useUiStore((s) => s.setExpandedDrawerOpen); const isAdd = pathname.includes('/add'); const isEdit = pathname.includes('/detail/edit'); @@ -25,6 +26,7 @@ export default function UniformityPageWrapper({ const unsub = useUiStore.getState().subscribeIsValid((isValid) => { if (isValid) { router.push('/uniformity'); + setExpandedDrawerOpen(false); } }); @@ -46,13 +48,16 @@ export default function UniformityPageWrapper({ { - if (!v) router.push('/uniformity'); + if (!v) { + router.push('/uniformity'); + setExpandedDrawerOpen(false); + } }} closeOnBackdropClick={isDetail ? true : false} onBackdropClick={handleBackdropClick} variant='right' zIndex='99999' - sidebarContent={isOpen &&
{children}
} + sidebarContent={isOpen ?
{children}
: null} /> ); diff --git a/src/components/pages/uniformity/form/ExpandedDrawerForm.tsx b/src/components/pages/uniformity/form/ExpandedDrawerForm.tsx new file mode 100644 index 00000000..cd27a45d --- /dev/null +++ b/src/components/pages/uniformity/form/ExpandedDrawerForm.tsx @@ -0,0 +1,33 @@ +'use client'; + +import DrawerHeader from '@/components/helper/drawer/DrawerHeader'; +import { useUiStore } from '@/stores/ui/ui.store'; + +const ExpandedDrawerForm = () => { + const setExpandedDrawerOpen = useUiStore((s) => s.setExpandedDrawerOpen); + + const handleClose = () => { + setExpandedDrawerOpen(false); + }; + + return ( +
+ {/* Header */} + + + {/* Form Section */} +
+
+
+ ); +}; + +export default ExpandedDrawerForm; diff --git a/src/components/pages/uniformity/form/UniformityForm.tsx b/src/components/pages/uniformity/form/UniformityForm.tsx index 02fa4207..74138b5b 100644 --- a/src/components/pages/uniformity/form/UniformityForm.tsx +++ b/src/components/pages/uniformity/form/UniformityForm.tsx @@ -3,6 +3,9 @@ import { useEffect } from 'react'; import DrawerHeader from '@/components/helper/drawer/DrawerHeader'; import { useUiStore } from '@/stores/ui/ui.store'; +import Button from '@/components/Button'; +import { Icon } from '@iconify/react'; +import ExpandedDrawerForm from '@/components/pages/uniformity/form/ExpandedDrawerForm'; interface UniformityFormProps { formType?: 'add' | 'edit'; @@ -11,6 +14,8 @@ interface UniformityFormProps { const UniformityForm = ({ formType = 'add' }: UniformityFormProps) => { const subscribeValidate = useUiStore((s) => s.subscribeValidate); const setIsValid = useUiStore((s) => s.setIsValid); + const expandedDrawerOpen = useUiStore((s) => s.expandedDrawerOpen); + const setExpandedDrawerOpen = useUiStore((s) => s.setExpandedDrawerOpen); useEffect(() => { const unsub = subscribeValidate(() => { @@ -20,8 +25,13 @@ const UniformityForm = ({ formType = 'add' }: UniformityFormProps) => { return unsub; }, []); + const handleOpenExpandedDrawer = () => { + setExpandedDrawerOpen(true); + }; + return ( - <> +
+ {/* Primary Drawer Content */}
{/* Header */} { onSubmit={(e) => { e.preventDefault(); }} - > + > + +
- + + {/* Expanded Drawer - shown when open */} + {expandedDrawerOpen && } +
); }; diff --git a/src/stores/ui/slices/drawer.slice.ts b/src/stores/ui/slices/drawer.slice.ts index b92b60c3..150eff4d 100644 --- a/src/stores/ui/slices/drawer.slice.ts +++ b/src/stores/ui/slices/drawer.slice.ts @@ -37,4 +37,11 @@ export const createDrawerUISlice: StateCreator< callback(Boolean(state.isValid)); }); }, + + expandedDrawerOpen: false, + setExpandedDrawerOpen: (open: boolean) => set({ expandedDrawerOpen: open }), + toggleExpandedDrawer: () => { + const current = get().expandedDrawerOpen; + set({ expandedDrawerOpen: !current }); + }, }); diff --git a/src/types/stores.d.ts b/src/types/stores.d.ts index 37b252fe..5b4c7c6a 100644 --- a/src/types/stores.d.ts +++ b/src/types/stores.d.ts @@ -10,6 +10,9 @@ type DrawerUISlice = { isValid: boolean; setIsValid: (v: boolean) => void; subscribeIsValid: (callback: (isValid: boolean) => void) => () => void; + expandedDrawerOpen: boolean; + setExpandedDrawerOpen: (open: boolean) => void; + toggleExpandedDrawer: () => void; }; export type UIStore = MainUiSlice & DrawerUISlice;