mirror of
https://gitlab.com/mbugroup/lti-web-client.git
synced 2026-05-20 13:32:00 +00:00
refactor(FE-316,438): Wrap Uniformity actions with permission checks
This commit is contained in:
@@ -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 */}
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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'],
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user