refactor(FE-316,438): Wrap Uniformity actions with permission checks

This commit is contained in:
rstubryan
2025-12-27 18:05:25 +07:00
parent 0a447f93c1
commit 5f68c05acc
5 changed files with 79 additions and 52 deletions
@@ -23,6 +23,7 @@ import ConfirmationModal from '@/components/modal/ConfirmationModal';
import toast from 'react-hot-toast'; import toast from 'react-hot-toast';
import Card from '@/components/Card'; import Card from '@/components/Card';
import UniformityTableSkeleton from './skeleton/UniformityTableSkeleton'; import UniformityTableSkeleton from './skeleton/UniformityTableSkeleton';
import RequirePermission from '@/components/helper/RequirePermission';
const statusColorMap: Record<string, string> = { const statusColorMap: Record<string, string> = {
APPROVED: 'bg-[#00D39033]', APPROVED: 'bg-[#00D39033]',
@@ -78,38 +79,44 @@ const RowOptionsMenu = ({
return ( return (
<RowOptionsMenuWrapper type={type}> <RowOptionsMenuWrapper type={type}>
<Button <RequirePermission permissions='lti.production.uniformity.detail'>
href={`/uniformity/detail/?uniformityId=${props.row.original.id}`} <Button
variant='ghost' href={`/uniformity/detail/?uniformityId=${props.row.original.id}`}
color='primary' variant='ghost'
className='justify-start text-sm' color='primary'
>
<Icon icon='mdi:eye-outline' width={16} height={16} />
Detail
</Button>
<Button
href={`/uniformity/edit/?uniformityId=${props.row.original.id}`}
variant='ghost'
color='warning'
className='justify-start text-sm'
>
<Icon icon='mdi:pencil-outline' width={16} height={16} />
Edit
</Button>
<Button
onClick={handleDeleteClick}
variant='ghost'
color='error'
className='justify-start text-sm text-error focus-visible:text-error-content hover:text-error-content'
>
<Icon
icon='mdi:delete-outline'
width={16}
height={16}
className='justify-start text-sm' className='justify-start text-sm'
/> >
Delete <Icon icon='mdi:eye-outline' width={16} height={16} />
</Button> Detail
</Button>
</RequirePermission>
<RequirePermission permissions='lti.production.uniformity.update'>
<Button
href={`/uniformity/edit/?uniformityId=${props.row.original.id}`}
variant='ghost'
color='warning'
className='justify-start text-sm'
>
<Icon icon='mdi:pencil-outline' width={16} height={16} />
Edit
</Button>
</RequirePermission>
<RequirePermission permissions='lti.production.uniformity.delete'>
<Button
onClick={handleDeleteClick}
variant='ghost'
color='error'
className='justify-start text-sm text-error focus-visible:text-error-content hover:text-error-content'
>
<Icon
icon='mdi:delete-outline'
width={16}
height={16}
className='justify-start text-sm'
/>
Delete
</Button>
</RequirePermission>
</RowOptionsMenuWrapper> </RowOptionsMenuWrapper>
); );
}; };
@@ -348,10 +355,12 @@ const UniformityTable = ({ refresh }: { refresh?: () => void }) => {
<> <>
<section className='[&_button]:w-full [&_button]:sm:w-fit [&_button]:last:mt-2 [&_button]:last:sm:mt-0 sm:flex sm:justify-between grid grid-cols-1 sm:gap-0 gap-2'> <section className='[&_button]:w-full [&_button]:sm:w-fit [&_button]:last:mt-2 [&_button]:last:sm:mt-0 sm:flex sm:justify-between grid grid-cols-1 sm:gap-0 gap-2'>
<div className='w-full sm:w-fit flex flex-col sm:flex-row self-start gap-2'> <div className='w-full sm:w-fit flex flex-col sm:flex-row self-start gap-2'>
<Button color='primary' href='/uniformity/add'> <RequirePermission permissions='lti.production.uniformity.create'>
<Icon icon='ic:round-plus' width={18} height={18} /> <Button color='primary' href='/uniformity/add'>
Add Uniformity <Icon icon='ic:round-plus' width={18} height={18} />
</Button> Add Uniformity
</Button>
</RequirePermission>
</div> </div>
<div className='sm:flex gap-2'> <div className='sm:flex gap-2'>
@@ -15,6 +15,8 @@ import SelectInput, {
useSelect, useSelect,
} from '@/components/input/SelectInput'; } from '@/components/input/SelectInput';
import RequirePermission from '@/components/helper/RequirePermission';
import { import {
UniformityFormSchema, UniformityFormSchema,
UniformityFormValues, UniformityFormValues,
@@ -578,18 +580,20 @@ const UniformityForm = ({
</div> </div>
{!isNextStep && ( {!isNextStep && (
<Button <RequirePermission permissions='lti.production.uniformity.create'>
type='submit' <Button
color='primary' type='submit'
className='w-full' color='primary'
disabled={!formik.isValid || formik.isSubmitting} className='w-full'
> disabled={!formik.isValid || formik.isSubmitting}
{formik.isSubmitting ? ( >
<span className='loading loading-spinner'></span> {formik.isSubmitting ? (
) : ( <span className='loading loading-spinner'></span>
'Next' ) : (
)} 'Next'
</Button> )}
</Button>
</RequirePermission>
)} )}
</form> </form>
</section> </section>
@@ -5,6 +5,7 @@ import Button from '@/components/Button';
import Tooltip from '@/components/Tooltip'; import Tooltip from '@/components/Tooltip';
import DrawerHeader from '@/components/helper/drawer/DrawerHeader'; import DrawerHeader from '@/components/helper/drawer/DrawerHeader';
import { useUiStore } from '@/stores/ui/ui.store'; import { useUiStore } from '@/stores/ui/ui.store';
import RequirePermission from '@/components/helper/RequirePermission';
const UniformityPreviewForm = () => { const UniformityPreviewForm = () => {
const setExpandedDrawerOpen = useUiStore((s) => s.setExpandedDrawerOpen); const setExpandedDrawerOpen = useUiStore((s) => s.setExpandedDrawerOpen);
@@ -27,11 +28,17 @@ const UniformityPreviewForm = () => {
subtitleClassName='text-sm text-neutral' subtitleClassName='text-sm text-neutral'
showDivider showDivider
> >
<Button variant='link' className='p-0 text-error' onClick={handleClose}> <RequirePermission permissions='lti.production.uniformity.delete'>
<Tooltip content='Hapus' position='bottom'> <Button
<Icon icon='mdi:trash-can-outline' width={20} height={20} /> variant='link'
</Tooltip> className='p-0 text-error'
</Button> onClick={handleClose}
>
<Tooltip content='Hapus' position='bottom'>
<Icon icon='mdi:trash-can-outline' width={20} height={20} />
</Tooltip>
</Button>
</RequirePermission>
</DrawerHeader> </DrawerHeader>
{/* Form Section */} {/* Form Section */}
+1
View File
@@ -46,6 +46,7 @@ export const MAIN_DRAWER_LINKS: SidebarMenuItem[] = [
text: 'Uniformity', text: 'Uniformity',
link: '/uniformity', link: '/uniformity',
icon: 'heroicons-outline:scale', icon: 'heroicons-outline:scale',
permission: ['lti.production.uniformity.list'],
}, },
{ {
text: 'Biaya', text: 'Biaya',
+6
View File
@@ -152,4 +152,10 @@ export const ROUTE_PERMISSIONS: Record<string, string[]> = {
'/master-data/flock/add/': ['lti.master.flocks.create'], '/master-data/flock/add/': ['lti.master.flocks.create'],
'/master-data/flock/detail/': ['lti.master.flocks.detail'], '/master-data/flock/detail/': ['lti.master.flocks.detail'],
'/master-data/flock/detail/edit/': ['lti.master.flocks.update'], '/master-data/flock/detail/edit/': ['lti.master.flocks.update'],
// Uniformity
'/uniformity/': ['lti.production.uniformity.list'],
'/uniformity/add/': ['lti.production.uniformity.create'],
'/uniformity/detail/': ['lti.production.uniformity.detail'],
'/uniformity/detail/edit/': ['lti.production.uniformity.update'],
}; };