diff --git a/src/components/pages/production/recording/RecordingTable.tsx b/src/components/pages/production/recording/RecordingTable.tsx
index 65cead2a..e5bd30cb 100644
--- a/src/components/pages/production/recording/RecordingTable.tsx
+++ b/src/components/pages/production/recording/RecordingTable.tsx
@@ -6,6 +6,7 @@ import useSWR from 'swr';
import { Icon } from '@iconify/react';
import { SortingState, CellContext } from '@tanstack/react-table';
import { cn, formatDate } from '@/lib/helper';
+import RequirePermission from '@/components/helper/RequirePermission';
import { useModal } from '@/components/Modal';
import Modal from '@/components/Modal';
import Button from '@/components/Button';
@@ -59,60 +60,70 @@ const RowOptionsMenu = ({
return (
-
+
+
+
{selectedRowIds.length > 0 && (
<>
-
+
+
+
-
+
+
+
>
)}
diff --git a/src/components/pages/production/recording/form/RecordingForm.tsx b/src/components/pages/production/recording/form/RecordingForm.tsx
index 4dca38dc..c8fa3ca0 100644
--- a/src/components/pages/production/recording/form/RecordingForm.tsx
+++ b/src/components/pages/production/recording/form/RecordingForm.tsx
@@ -8,6 +8,7 @@ import useSWR from 'swr';
import { Icon } from '@iconify/react';
import Button from '@/components/Button';
+import RequirePermission from '@/components/helper/RequirePermission';
import Card from '@/components/Card';
import Badge from '@/components/Badge';
import NumberInput from '@/components/input/NumberInput';
@@ -1492,41 +1493,45 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
!isRecordingApproved(initialValues) &&
!isRecordingRejected(initialValues) && (
-
+
+
+
-
+
+
+
)}
@@ -2696,36 +2701,40 @@ const RecordingForm = ({ type = 'add', initialValues }: RecordingFormProps) => {
{/* Left side - Detail & Edit actions */}
{type === 'detail' && deleteRecordingClickHandler && (
-
+
+
+
)}
{type === 'detail' && initialValues && (
-
+
+
+
)}
{/* Right side actions */}
diff --git a/src/components/pages/production/transfer-to-laying/TransferToLayingsTable.tsx b/src/components/pages/production/transfer-to-laying/TransferToLayingsTable.tsx
index 424cc3c2..18ce404d 100644
--- a/src/components/pages/production/transfer-to-laying/TransferToLayingsTable.tsx
+++ b/src/components/pages/production/transfer-to-laying/TransferToLayingsTable.tsx
@@ -26,6 +26,7 @@ import TextInput from '@/components/input/TextInput';
import CheckboxInput from '@/components/input/CheckboxInput';
import RowOptionsMenuWrapper from '@/components/table/RowOptionsMenuWrapper';
import ConfirmationModalWithNotes from '@/components/modal/ConfirmationModalWithNotes';
+import RequirePermission from '@/components/helper/RequirePermission';
import { TransferToLaying } from '@/types/api/production/transfer-to-laying';
import { TransferToLayingApi } from '@/services/api/production/transfer-to-laying';
@@ -56,72 +57,81 @@ const RowOptionsMenu = ({
const showDeleteButton = showEditButton;
- // TODO: apply RBAC
const showApproveButton = showEditButton;
const showRejectButton = showEditButton;
return (
-
-
- {showEditButton && (
+
+
+
+ {showEditButton && (
+
+
+
)}
{/* TODO: apply RBAC */}
{showApproveButton && (
-
+
+
+
)}
{showRejectButton && (
-
+
+
+
)}
{showDeleteButton && (
-
+
+
+
)}
);
@@ -502,47 +512,53 @@ const TransferToLayingsTable = () => {
-
+
+
+
{selectedRowIds.length > 0 && (
<>
-
+
+
+
-
+
+
+
>
)}
diff --git a/src/components/pages/production/transfer-to-laying/form/TransferToLayingForm.tsx b/src/components/pages/production/transfer-to-laying/form/TransferToLayingForm.tsx
index 16885062..4d60f69a 100644
--- a/src/components/pages/production/transfer-to-laying/form/TransferToLayingForm.tsx
+++ b/src/components/pages/production/transfer-to-laying/form/TransferToLayingForm.tsx
@@ -8,6 +8,7 @@ import useSWR from 'swr';
import { Icon } from '@iconify/react';
import Button from '@/components/Button';
+import RequirePermission from '@/components/helper/RequirePermission';
import SelectInput, {
OptionType,
useSelect,
@@ -500,34 +501,37 @@ const TransferToLayingForm = ({
<>
{isShowApproveRejectButton && (
- {/* TODO: apply RBAC */}
-
+
+
+
-
+
+
+
)}
>
@@ -788,37 +792,41 @@ const TransferToLayingForm = ({
{type !== 'add' && (
{isShowDeleteButton && (
-
+
+
+
)}
{type !== 'edit' && isShowEditButton && (
-
+
+
+
)}
)}
@@ -833,15 +841,23 @@ const TransferToLayingForm = ({
Reset
-
+
+
)}
diff --git a/src/components/pages/purchase/PurchaseTable.tsx b/src/components/pages/purchase/PurchaseTable.tsx
index a77e1158..81f45cc9 100644
--- a/src/components/pages/purchase/PurchaseTable.tsx
+++ b/src/components/pages/purchase/PurchaseTable.tsx
@@ -15,6 +15,7 @@ import SelectInput, { OptionType } from '@/components/input/SelectInput';
import RowDropdownOptions from '@/components/table/RowDropdownOptions';
import RowCollapseOptions from '@/components/table/RowCollapseOptions';
import RowOptionsMenuWrapper from '@/components/table/RowOptionsMenuWrapper';
+import RequirePermission from '@/components/helper/RequirePermission';
import { cn, formatDate } from '@/lib/helper';
import { isResponseSuccess } from '@/lib/api-helper';
@@ -38,15 +39,17 @@ const RowOptionsMenu = ({
}: RowOptionsMenuProps) => {
return (
-
+
+
+
{/*
);
};
@@ -227,15 +232,17 @@ const PurchaseTable = () => {
-
-
- Tambah
-
+
+
+
+ Tambah
+
+
{canUpdatePurchaseItems &&
canShowDeleteAddButtons && (
-
- removePurchaseItem(formItemIndex)
- }
- title='Hapus item'
- >
-
-
+
+
+ removePurchaseItem(
+ formItemIndex
+ )
+ }
+ title='Hapus item'
+ >
+
+
+
)}
diff --git a/src/components/pages/purchase/order/PurchaseOrderDetail.tsx b/src/components/pages/purchase/order/PurchaseOrderDetail.tsx
index 35d9e104..de07ee52 100644
--- a/src/components/pages/purchase/order/PurchaseOrderDetail.tsx
+++ b/src/components/pages/purchase/order/PurchaseOrderDetail.tsx
@@ -39,19 +39,22 @@ import { toast } from 'react-hot-toast';
import { useSearchParams } from 'next/navigation';
import { formatCurrency, formatNumber, formatDate } from '@/lib/helper';
import { PURCHASE_ORDER_APPROVAL_LINE } from '@/config/approval-line';
+import RequirePermission from '@/components/helper/RequirePermission';
const ItemPembelianDropdown = ({ onEdit }: { onEdit: () => void }) => {
return (
-
-
- Edit
-
+
+
+
+ Edit
+
+
);
};
@@ -59,15 +62,17 @@ const ItemPembelianDropdown = ({ onEdit }: { onEdit: () => void }) => {
const PenerimaanBarangDropdown = ({ onEdit }: { onEdit: () => void }) => {
return (
-
-
- Edit
-
+
+
+
+ Edit
+
+
);
};
@@ -496,14 +501,16 @@ const PurchaseOrderDetail = ({
};
return (
-
-
-
+
+
+
+
+
);
},
},
@@ -632,25 +639,45 @@ const PurchaseOrderDetail = ({
{showApprovalButton && (
-
-
- Approve
-
+
+
+ Approve
+
+
-
-
- Reject
-
+
+
+ Reject
+
+
)}
diff --git a/src/config/constant.ts b/src/config/constant.ts
index 954d21a4..fb293c52 100644
--- a/src/config/constant.ts
+++ b/src/config/constant.ts
@@ -10,14 +10,20 @@ export const MAIN_DRAWER_LINKS: SidebarMenuItem[] = [
text: 'Produksi',
link: '/production',
icon: 'heroicons-outline:wrench-screwdriver',
+ permission: [
+ 'lti.production.project_flocks.list',
+ 'lti.production.recording.list',
+ ],
submenu: [
{
text: 'Daftar Flock',
link: '/production/project-flock',
+ permission: ['lti.production.project_flocks.list'],
},
{
text: 'Recording',
link: '/production/recording',
+ permission: ['lti.production.recording.list'],
},
{
text: 'Transfer to Laying',
@@ -29,6 +35,7 @@ export const MAIN_DRAWER_LINKS: SidebarMenuItem[] = [
text: 'Pembelian',
link: '/purchase',
icon: 'heroicons-outline:shopping-cart',
+ permission: ['lti.purchase.list'],
},
{
text: 'Penjualan',
@@ -41,14 +48,16 @@ export const MAIN_DRAWER_LINKS: SidebarMenuItem[] = [
icon: 'heroicons-outline:scale',
},
{
- text: 'Biaya Operasional',
+ text: 'Biaya',
link: '/expense',
icon: 'heroicons:wallet',
+ permission: ['lti.expense.list'],
},
{
text: 'Closing',
link: '/closing',
icon: 'heroicons-outline:presentation-chart-bar',
+ permission: ['lti.closing.list'],
},
{
text: 'Laporan',
@@ -73,18 +82,26 @@ export const MAIN_DRAWER_LINKS: SidebarMenuItem[] = [
text: 'Persediaan',
link: '/inventory',
icon: 'heroicons-outline:folder',
+ permission: [
+ 'lti.inventory.product_stock.list',
+ 'lti.inventory.product_warehouses.list',
+ 'lti.inventory.transfer.list',
+ ],
submenu: [
{
text: 'Stok Produk',
link: '/inventory/product',
+ permission: ['lti.inventory.product_stock.list'],
},
{
text: 'Penyesuaian Stok',
link: '/inventory/adjustment',
+ permission: ['lti.inventory.product_stock.list'],
},
{
text: 'Transfer Stok',
link: '/inventory/movement',
+ permission: ['lti.inventory.transfer.list'],
},
],
},
@@ -92,58 +109,86 @@ export const MAIN_DRAWER_LINKS: SidebarMenuItem[] = [
text: 'Master Data',
link: '/master-data',
icon: 'heroicons-outline:circle-stack',
+ permission: [
+ 'lti.master.area.list',
+ 'lti.master.banks.list',
+ 'lti.master.customer.list',
+ 'lti.master.fcr.list',
+ 'lti.master.flocks.list',
+ 'lti.master.kandangs.list',
+ 'lti.master.locations.list',
+ 'lti.master.nonstocks.list',
+ 'lti.master.product_categories.list',
+ 'lti.master.products.list',
+ 'lti.master.suppliers.list',
+ 'lti.master.uoms.list',
+ 'lti.master.warehouses.list',
+ ],
submenu: [
{
text: 'Produk',
link: '/master-data/product',
+ permission: ['lti.master.products.list'],
},
{
text: 'Kategori Produk',
link: '/master-data/product-category',
+ permission: ['lti.master.product_categories.list'],
},
{
text: 'Bank',
link: '/master-data/bank',
+ permission: ['lti.master.banks.list'],
},
{
text: 'Area',
link: '/master-data/area',
+ permission: ['lti.master.area.list'],
},
{
text: 'Lokasi',
link: '/master-data/location',
+ permission: ['lti.master.locations.list'],
},
{
text: 'Kandang',
link: '/master-data/kandang',
+ permission: ['lti.master.kandangs.list'],
},
{
text: 'Warehouse',
link: '/master-data/warehouse',
+ permission: ['lti.master.warehouses.list'],
},
{
text: 'Customer',
link: '/master-data/customer',
+ permission: ['lti.master.customer.list'],
},
{
text: 'UOM',
link: '/master-data/uom',
+ permission: ['lti.master.uoms.list'],
},
{
text: 'Non-Stock',
link: '/master-data/nonstock',
+ permission: ['lti.master.nonstocks.list'],
},
{
text: 'FCR',
link: '/master-data/fcr',
+ permission: ['lti.master.fcr.list'],
},
{
text: 'Supplier',
link: '/master-data/supplier',
+ permission: ['lti.master.suppliers.list'],
},
{
text: 'Flock',
link: '/master-data/flock',
+ permission: ['lti.master.flocks.list'],
},
],
},
diff --git a/src/config/route-permission.ts b/src/config/route-permission.ts
new file mode 100644
index 00000000..ed6d4771
--- /dev/null
+++ b/src/config/route-permission.ts
@@ -0,0 +1,155 @@
+export const ROUTE_PERMISSIONS: Record
= {
+ '/': ['lti.dashboard.list'],
+
+ // Dashboard
+ '/dashboard/': ['lti.dashboard.list'],
+
+ // Production
+ // Production - Project Flock
+ '/production/project-flock/': ['lti.production.project_flocks.list'],
+ '/production/project-flock/add/': ['lti.production.project_flocks.create'],
+ '/production/project-flock/detail/': ['lti.production.project_flocks.detail'],
+ '/production/project-flock/detail/edit/': [
+ 'lti.production.project_flocks.update',
+ ],
+ '/production/project-flock/chickin/add/kandang/': [
+ 'lti.production.chickins.create',
+ ],
+ '/production/project-flock/closing/': [
+ 'lti.production.project_flock_kandangs.closing',
+ ],
+
+ // Production - Recording
+ '/production/recording/': ['lti.production.recording.list'],
+ '/production/recording/add/': ['lti.production.recording.create'],
+ '/production/recording/detail/': ['lti.production.recording.detail'],
+ '/production/recording/detail/edit/': ['lti.production.recording.update'],
+
+ // Production - Transfer to Laying
+ '/production/transfer-to-laying/': ['lti.production.transfer_to_laying.list'],
+ '/production/transfer-to-laying/add/': [
+ 'lti.production.transfer_to_laying.create',
+ ],
+ '/production/transfer-to-laying/detail/': [
+ 'lti.production.transfer_to_laying.detail',
+ ],
+ '/production/transfer-to-laying/detail/edit/': [
+ 'lti.production.transfer_to_laying.update',
+ ],
+
+ // Purchase
+ '/purchase/': ['lti.purchase.list'],
+ '/purchase/add/': ['lti.purchase.create'],
+ '/purchase/detail/': ['lti.purchase.detail'],
+ '/purchase/detail/edit/': ['lti.purchase.update'],
+
+ // Marketing
+ '/marketing/': ['lti.marketing.delivery_order.list'],
+ '/marketing/add/delivery-orders/': ['lti.marketing.delivery_order.create'],
+ '/marketing/add/sales-orders/': ['lti.marketing.sales_order.create'],
+ '/marketing/detail/': ['lti.marketing.delivery_order.detail'],
+ '/marketing/detail/delivery-orders/edit/': [
+ 'lti.marketing.delivery_order.update',
+ ],
+ '/marketing/detail/sales-orders/edit/': ['lti.marketing.sales_order.update'],
+
+ // Expense
+ '/expense/': ['lti.expense.list'],
+ '/expense/add/': ['lti.expense.create'],
+ '/expense/detail/': ['lti.expense.detail'],
+ '/expense/detail/edit/': ['lti.expense.update'],
+ '/expense/realization/': ['lti.expense.create.realization'],
+ '/expense/realization/edit/': ['lti.expense.update.realization'],
+
+ // Closing
+ '/closing/': ['lti.closing.list'],
+ '/closing/detail/': ['lti.closing.detail'],
+
+ // Report
+ '/report/logistic-stock/': ['lti.repport.purchasesupplier.list'],
+ '/report/expense/': ['lti.repport.expense.list'],
+ '/report/marketing/': ['lti.repport.delivery.list'],
+
+ // Inventory
+ '/inventory/adjustment/': ['lti.inventory.list'],
+ '/inventory/adjustment/add/': ['lti.inventory.create'],
+ '/inventory/adjustment/detail/': ['lti.inventory.detail'],
+ '/inventory/movement/': ['lti.inventory.transfer.list'],
+ '/inventory/movement/add/': ['lti.inventory.transfer.create'],
+ '/inventory/movement/detail/': ['lti.inventory.transfer.detail'],
+ '/inventory/movement/detail/edit/': ['lti.inventory.transfer.update'],
+ '/inventory/product/': ['lti.inventory.product_stock.list'],
+ '/inventory/product/detail/': ['lti.inventory.product_stock.detail'],
+
+ // Master Data
+ '/master-data/product/': ['lti.master.products.list'],
+ '/master-data/product/add/': ['lti.master.products.create'],
+ '/master-data/product/detail/': ['lti.master.products.detail'],
+ '/master-data/product/detail/edit/': ['lti.master.products.update'],
+
+ '/master-data/product-category/': ['lti.master.product_categories.list'],
+ '/master-data/product-category/add/': [
+ 'lti.master.product_categories.create',
+ ],
+ '/master-data/product-category/detail/': [
+ 'lti.master.product_categories.detail',
+ ],
+ '/master-data/product-category/detail/edit/': [
+ 'lti.master.product_categories.update',
+ ],
+
+ '/master-data/bank/': ['lti.master.banks.list'],
+ '/master-data/bank/add/': ['lti.master.banks.create'],
+ '/master-data/bank/detail/': ['lti.master.banks.detail'],
+ '/master-data/bank/detail/edit/': ['lti.master.banks.update'],
+
+ '/master-data/area/': ['lti.master.area.list'],
+ '/master-data/area/add/': ['lti.master.area.create'],
+ '/master-data/area/detail/': ['lti.master.area.detail'],
+ '/master-data/area/detail/edit/': ['lti.master.area.update'],
+
+ '/master-data/location/': ['lti.master.locations.list'],
+ '/master-data/location/add/': ['lti.master.locations.create'],
+ '/master-data/location/detail/': ['lti.master.locations.detail'],
+ '/master-data/location/detail/edit/': ['lti.master.locations.update'],
+
+ '/master-data/kandang/': ['lti.master.kandangs.list'],
+ '/master-data/kandang/add/': ['lti.master.kandangs.create'],
+ '/master-data/kandang/detail/': ['lti.master.kandangs.detail'],
+ '/master-data/kandang/detail/edit/': ['lti.master.kandangs.update'],
+
+ '/master-data/warehouse/': ['lti.master.warehouses.list'],
+ '/master-data/warehouse/add/': ['lti.master.warehouses.create'],
+ '/master-data/warehouse/detail/': ['lti.master.warehouses.detail'],
+ '/master-data/warehouse/detail/edit/': ['lti.master.warehouses.update'],
+
+ '/master-data/customer/': ['lti.master.customer.list'],
+ '/master-data/customer/add/': ['lti.master.customer.create'],
+ '/master-data/customer/detail/': ['lti.master.customer.detail'],
+ '/master-data/customer/detail/edit/': ['lti.master.customer.update'],
+
+ '/master-data/uom/': ['lti.master.uoms.list'],
+ '/master-data/uom/add/': ['lti.master.uoms.create'],
+ '/master-data/uom/detail/': ['lti.master.uoms.detail'],
+ '/master-data/uom/detail/edit/': ['lti.master.uoms.update'],
+
+ '/master-data/nonstock/': ['lti.master.nonstocks.list'],
+ '/master-data/nonstock/add/': ['lti.master.nonstocks.create'],
+ '/master-data/nonstock/detail/': ['lti.master.nonstocks.detail'],
+ '/master-data/nonstock/detail/edit/': ['lti.master.nonstocks.update'],
+
+ '/master-data/fcr/': ['lti.master.fcr.list'],
+ '/master-data/fcr/add/': ['lti.master.fcr.create'],
+ '/master-data/fcr/detail/': ['lti.master.fcr.detail'],
+ '/master-data/fcr/detail/edit/': ['lti.master.fcr.update'],
+
+ '/master-data/supplier/': ['lti.master.suppliers.list'],
+ '/master-data/supplier/add/': ['lti.master.suppliers.create'],
+ '/master-data/supplier/detail/': ['lti.master.suppliers.detail'],
+ '/master-data/supplier/detail/edit/': ['lti.master.suppliers.update'],
+
+ '/master-data/flock/': ['lti.master.flocks.list'],
+ '/master-data/flock/add/': ['lti.master.flocks.create'],
+ '/master-data/flock/detail/': ['lti.master.flocks.detail'],
+ '/master-data/flock/detail/edit/': ['lti.master.flocks.update'],
+};