mirror of
https://gitlab.com/mbugroup/lti-web-client.git
synced 2026-05-20 21:41:57 +00:00
e64b55e527
component
196 lines
4.6 KiB
TypeScript
196 lines
4.6 KiB
TypeScript
'use client';
|
|
|
|
import { ReactNode } from 'react';
|
|
|
|
import { cn } from '@/lib/helper';
|
|
|
|
interface DrawerProps {
|
|
children?: ReactNode;
|
|
sidebarContent?: ReactNode;
|
|
open: boolean;
|
|
setOpen: (newOpenState: boolean) => void;
|
|
openOnLarge?: boolean;
|
|
variant?: 'sidebar' | 'left' | 'right';
|
|
zIndex?: string;
|
|
className?: DrawerClassName;
|
|
onBackdropClick?: () => void;
|
|
closeOnBackdropClick?: boolean;
|
|
expandedContent?: ReactNode;
|
|
}
|
|
|
|
type DrawerClassName = {
|
|
drawer?: string;
|
|
drawerContent?: string;
|
|
drawerSide?: string;
|
|
drawerOverlay?: string;
|
|
drawerSidebarContent?: string;
|
|
drawerExpandedContent?: string;
|
|
};
|
|
|
|
const Drawer = ({
|
|
children,
|
|
sidebarContent,
|
|
open,
|
|
setOpen,
|
|
openOnLarge,
|
|
variant = 'sidebar',
|
|
zIndex = '20',
|
|
className,
|
|
onBackdropClick,
|
|
closeOnBackdropClick = true,
|
|
expandedContent,
|
|
}: DrawerProps) => {
|
|
const getDrawerClassNames = (): DrawerClassName => {
|
|
const baseClassNames = {
|
|
drawer: 'drawer',
|
|
drawerContent: 'drawer-content',
|
|
drawerSide: 'drawer-side',
|
|
drawerOverlay: 'drawer-overlay',
|
|
drawerSidebarContent: 'min-h-full bg-base-100',
|
|
};
|
|
|
|
const getSidebarWidth = () => {
|
|
if (variant === 'sidebar') {
|
|
return expandedContent
|
|
? 'w-full lg:min-w-[600px] lg:max-w-[600px]'
|
|
: 'w-full max-w-[300px] lg:w-[300px]';
|
|
}
|
|
if (className?.drawerSidebarContent) {
|
|
return '';
|
|
}
|
|
return 'w-full sm:min-w-120 sm:w-fit';
|
|
};
|
|
|
|
if (variant === 'sidebar') {
|
|
return {
|
|
...baseClassNames,
|
|
drawerSidebarContent: cn(
|
|
baseClassNames.drawerSidebarContent,
|
|
getSidebarWidth()
|
|
),
|
|
};
|
|
} else if (variant === 'right') {
|
|
return {
|
|
...baseClassNames,
|
|
drawer: cn(baseClassNames.drawer, 'drawer-end'),
|
|
drawerSide: cn(
|
|
baseClassNames.drawerSide,
|
|
'border-l border-solid border-gray-200 sm:drawer-side w-screen top-0 right-0 fixed z-21'
|
|
),
|
|
drawerSidebarContent: cn(
|
|
baseClassNames.drawerSidebarContent,
|
|
getSidebarWidth()
|
|
),
|
|
};
|
|
} else if (variant === 'left') {
|
|
return {
|
|
...baseClassNames,
|
|
drawerSide: cn(
|
|
baseClassNames.drawerSide,
|
|
'border-l border-solid border-gray-200 drawer-side w-screen top-0 right-0 fixed z-21'
|
|
),
|
|
drawerSidebarContent: cn(
|
|
baseClassNames.drawerSidebarContent,
|
|
getSidebarWidth()
|
|
),
|
|
};
|
|
}
|
|
return baseClassNames; // Fallback for default or unknown variant
|
|
};
|
|
|
|
const varianClassName = getDrawerClassNames();
|
|
|
|
const toggleDrawer = () => {
|
|
setOpen(!open);
|
|
};
|
|
|
|
const closeDrawer = () => {
|
|
if (closeOnBackdropClick) {
|
|
setOpen(false);
|
|
}
|
|
if (onBackdropClick) {
|
|
onBackdropClick();
|
|
}
|
|
};
|
|
|
|
return (
|
|
<div
|
|
className={cn(
|
|
'drawer',
|
|
{
|
|
'lg:drawer-open': openOnLarge,
|
|
},
|
|
varianClassName?.drawer,
|
|
className?.drawer
|
|
)}
|
|
>
|
|
<input
|
|
type='checkbox'
|
|
checked={open}
|
|
onChange={toggleDrawer}
|
|
className='drawer-toggle'
|
|
/>
|
|
|
|
{/* Drawer Content */}
|
|
<div
|
|
className={cn(varianClassName?.drawerContent, className?.drawerContent)}
|
|
>
|
|
{children}
|
|
</div>
|
|
|
|
{/* Drawer Side */}
|
|
<div
|
|
className={cn(
|
|
varianClassName?.drawerSide,
|
|
className?.drawerSide,
|
|
zIndex
|
|
)}
|
|
>
|
|
<label
|
|
aria-label='close sidebar'
|
|
className={cn(
|
|
varianClassName?.drawerOverlay,
|
|
className?.drawerOverlay
|
|
)}
|
|
onClick={closeDrawer}
|
|
/>
|
|
|
|
{/* Sidebar Content - Full height container */}
|
|
<div
|
|
className={cn(
|
|
'flex h-screen bg-base-100 overflow-hidden',
|
|
variant === 'right' && 'flex-row'
|
|
)}
|
|
>
|
|
{/* Primary Sidebar Content */}
|
|
<div
|
|
className={cn(
|
|
varianClassName?.drawerSidebarContent,
|
|
className?.drawerSidebarContent,
|
|
'overflow-y-auto'
|
|
)}
|
|
>
|
|
{sidebarContent}
|
|
</div>
|
|
|
|
{/* Expanded Drawer (Right side, side-by-side) */}
|
|
{expandedContent && (
|
|
<div
|
|
className={cn(
|
|
'border-l border-gray-200 bg-white flex flex-col h-full',
|
|
className?.drawerExpandedContent
|
|
)}
|
|
>
|
|
<div className='overflow-y-auto flex-1 h-full'>
|
|
{expandedContent}
|
|
</div>
|
|
</div>
|
|
)}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default Drawer;
|