feat(FE-64): refactor MovementTable with new TableToolbar and TableRowSizeSelector components

This commit is contained in:
rstubryan
2025-10-14 09:26:21 +07:00
parent a4ff4f7b2a
commit 44e07ddc50
4 changed files with 249 additions and 208 deletions
+62
View File
@@ -0,0 +1,62 @@
import { Icon } from '@iconify/react';
import Button from '../Button';
import { cn } from '@/lib/helper';
interface TableRowOptionsProps {
type?: 'dropdown' | 'collapse';
recordId: string | number;
basePath: string;
onDelete?: () => void;
}
export const TableRowOptions = ({
type = 'dropdown',
recordId,
basePath,
onDelete,
}: TableRowOptionsProps) => (
<div
tabIndex={type === 'dropdown' ? 0 : undefined}
className={cn(
{
'dropdown-content': type === 'dropdown',
'mt-2': type === 'collapse',
},
'p-2.5 mr-2 flex flex-col gap-1 bg-base-100 rounded-box z-10 border border-black/10 shadow'
)}
>
<Button
href={`${basePath}/detail/?id=${recordId}`}
variant='ghost'
color='primary'
className='justify-start text-sm'
>
<Icon icon='mdi:eye-outline' width={16} height={16} />
Detail
</Button>
<Button
href={`${basePath}/detail/edit/?id=${recordId}`}
variant='ghost'
color='warning'
className='justify-start text-sm'
>
<Icon icon='material-symbols:edit-outline' width={16} height={16} />
Edit
</Button>
{onDelete && (
<Button
onClick={onDelete}
variant='ghost'
color='error'
className='text-error hover:text-inherit justify-start text-sm'
>
<Icon
icon='material-symbols:delete-outline-rounded'
width={16}
height={16}
/>
Delete
</Button>
)}
</div>
);
@@ -0,0 +1,33 @@
import SelectInput from '../input/SelectInput';
export interface OptionType {
label: string;
value: string | number;
}
interface TableRowSizeSelectorProps {
value: number;
onChange: (val: OptionType | OptionType[] | null) => void;
options: OptionType[];
}
export const TableRowSizeSelector = ({
value,
onChange,
options,
}: TableRowSizeSelectorProps) => {
return (
<div className='flex flex-row justify-end'>
<SelectInput
label='Baris'
options={options}
value={{
label: String(value),
value: value,
}}
onChange={onChange}
className={{ wrapper: 'max-w-28' }}
/>
</div>
);
};
+37
View File
@@ -0,0 +1,37 @@
import { Icon } from '@iconify/react';
import Button from '../Button';
import DebouncedTextInput from '../input/DebouncedTextInput';
interface TableToolbarProps {
addButton?: {
href: string;
label: string;
};
search: {
value: string;
onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
placeholder?: string;
};
}
export const TableToolbar = ({ addButton, search }: TableToolbarProps) => {
return (
<div className='w-full flex flex-col sm:flex-row justify-between items-end sm:items-center gap-2'>
{addButton && (
<div className='flex flex-row'>
<Button href={addButton.href} color='primary'>
<Icon icon='ic:round-plus' width={24} height={24} />
{addButton.label}
</Button>
</div>
)}
<DebouncedTextInput
name='search'
placeholder={search.placeholder || 'Cari...'}
value={search.value}
onChange={search.onChange}
className={{ wrapper: 'sm:max-w-3xs' }}
/>
</div>
);
};