mirror of
https://gitlab.com/mbugroup/lti-web-client.git
synced 2026-05-20 13:32:00 +00:00
refactor(FE-316,317,438): Move Uniformity feature under production
namespace
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import UniformityForm from '@/components/pages/uniformity/form/UniformityForm';
|
||||
import UniformityForm from '@/components/pages/production/uniformity/form/UniformityForm';
|
||||
|
||||
const AddUniformity = () => {
|
||||
return <UniformityForm formType='add' />;
|
||||
@@ -1,6 +1,6 @@
|
||||
'use client';
|
||||
|
||||
import UniformityDetail from '@/components/pages/uniformity/detail/UniformityDetail';
|
||||
import UniformityDetail from '@/components/pages/production/uniformity/detail/UniformityDetail';
|
||||
import { isResponseError, isResponseSuccess } from '@/lib/api-helper';
|
||||
import { UniformityApi } from '@/services/api/uniformity';
|
||||
import { useRouter, useSearchParams } from 'next/navigation';
|
||||
@@ -1,5 +1,5 @@
|
||||
import { ReactNode } from 'react';
|
||||
import UniformityPageWrapper from '@/components/pages/uniformity/UniformityPageWrapper';
|
||||
import UniformityPageWrapper from '@/components/pages/production/uniformity/UniformityPageWrapper';
|
||||
|
||||
export default function UniformityLayout({
|
||||
children,
|
||||
@@ -1,4 +1,4 @@
|
||||
import UniformityTable from '@/components/pages/uniformity/UniformityTable';
|
||||
import UniformityTable from '@/components/pages/production/uniformity/UniformityTable';
|
||||
|
||||
const Uniformity = () => {
|
||||
return <UniformityTable />;
|
||||
+4
-4
@@ -1,9 +1,9 @@
|
||||
import React from 'react';
|
||||
import Card from '@/components/Card';
|
||||
import UniformityBarChart from '@/components/pages/uniformity/chart/UniformityBarChart';
|
||||
import UniformityGaugeChart from '@/components/pages/uniformity/chart/UniformityGaugeChart';
|
||||
import UniformityBarChartSkeleton from '@/components/pages/uniformity/skeleton/UniformityBarChartSkeleton';
|
||||
import UniformityGaugeChartSkeleton from '@/components/pages/uniformity/skeleton/UniformityGaugeChartSkeleton';
|
||||
import UniformityBarChart from '@/components/pages/production/uniformity/chart/UniformityBarChart';
|
||||
import UniformityGaugeChart from '@/components/pages/production/uniformity/chart/UniformityGaugeChart';
|
||||
import UniformityBarChartSkeleton from '@/components/pages/production/uniformity/skeleton/UniformityBarChartSkeleton';
|
||||
import UniformityGaugeChartSkeleton from '@/components/pages/production/uniformity/skeleton/UniformityGaugeChartSkeleton';
|
||||
|
||||
interface BarChartData {
|
||||
name: string;
|
||||
+4
-4
@@ -3,7 +3,7 @@
|
||||
import { usePathname, useRouter } from 'next/navigation';
|
||||
import Drawer from '@/components/Drawer';
|
||||
import React, { ReactNode } from 'react';
|
||||
import UniformityTable from '@/components/pages/uniformity/UniformityTable';
|
||||
import UniformityTable from '@/components/pages/production/uniformity/UniformityTable';
|
||||
import { useUiStore } from '@/stores/ui/ui.store';
|
||||
|
||||
export default function UniformityPageWrapper({
|
||||
@@ -27,7 +27,7 @@ export default function UniformityPageWrapper({
|
||||
const handleBackdropClick = () => {
|
||||
const unsub = useUiStore.getState().subscribeIsValid((isValid) => {
|
||||
if (isValid) {
|
||||
router.push('/uniformity');
|
||||
router.push('/production/uniformity');
|
||||
unsub?.();
|
||||
setExpandedDrawerOpen(false);
|
||||
} else {
|
||||
@@ -42,7 +42,7 @@ export default function UniformityPageWrapper({
|
||||
<>
|
||||
<div className='w-full p-4'>
|
||||
<UniformityTable
|
||||
refresh={() => !isOpen && router.push('/uniformity')}
|
||||
refresh={() => !isOpen && router.push('/production/uniformity')}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -50,7 +50,7 @@ export default function UniformityPageWrapper({
|
||||
open={isOpen}
|
||||
setOpen={(v) => {
|
||||
if (!v) {
|
||||
router.push('/uniformity');
|
||||
router.push('/production/uniformity');
|
||||
setExpandedDrawerOpen(false);
|
||||
}
|
||||
}}
|
||||
+19
-25
@@ -7,10 +7,10 @@ import { Icon } from '@iconify/react';
|
||||
import { ColumnDef, SortingState } from '@tanstack/react-table';
|
||||
import { cn, formatDate } from '@/lib/helper';
|
||||
import Button from '@/components/Button';
|
||||
import UniformityChart from '@/components/pages/uniformity/UniformityChart';
|
||||
import UniformityChart from '@/components/pages/production/uniformity/UniformityChart';
|
||||
import { useTableFilter } from '@/services/hooks/useTableFilter';
|
||||
import { UniformityApi } from '@/services/api/uniformity';
|
||||
import { type Uniformity } from '@/types/api/uniformity/uniformity';
|
||||
import { type Uniformity } from '@/types/api/production/uniformity';
|
||||
import { isResponseSuccess } from '@/lib/api-helper';
|
||||
import { type BaseApiResponse } from '@/types/api/api-general';
|
||||
import Table from '@/components/Table';
|
||||
@@ -20,7 +20,7 @@ import { useModal } from '@/components/Modal';
|
||||
import ConfirmationModal from '@/components/modal/ConfirmationModal';
|
||||
import toast from 'react-hot-toast';
|
||||
import Card from '@/components/Card';
|
||||
import UniformityTableSkeleton from '@/components/pages/uniformity/skeleton/UniformityTableSkeleton';
|
||||
import UniformityTableSkeleton from '@/components/pages/production/uniformity/skeleton/UniformityTableSkeleton';
|
||||
import RequirePermission from '@/components/helper/RequirePermission';
|
||||
import { useUniformityStore } from '@/stores/uniformity/uniformity.store';
|
||||
import FloatingActionsButton from '@/components/FloatingActionsButton';
|
||||
@@ -38,20 +38,20 @@ import {
|
||||
getStatusColor,
|
||||
getStatusIndicatorColor,
|
||||
getStatusText,
|
||||
} from '@/components/pages/uniformity/uniformity-utils';
|
||||
import { generateUniformityPDF } from '@/components/pages/uniformity/export/UniformityExportPDF';
|
||||
import { generateUniformityExcel } from '@/components/pages/uniformity/export/UniformityExportExcel';
|
||||
} from '@/components/pages/production/uniformity/uniformity-utils';
|
||||
import { generateUniformityPDF } from '@/components/pages/production/uniformity/export/UniformityExportPDF';
|
||||
import { generateUniformityExcel } from '@/components/pages/production/uniformity/export/UniformityExportExcel';
|
||||
import Dropdown from '@/components/Dropdown';
|
||||
import Menu from '@/components/menu/Menu';
|
||||
import MenuItem from '@/components/menu/MenuItem';
|
||||
|
||||
const isUniformityLocked = (uniformity: Uniformity): boolean => {
|
||||
return (
|
||||
uniformity.status === 'Disetujui' ||
|
||||
uniformity.status === 'Ditolak' ||
|
||||
uniformity.status === 'APPROVED' ||
|
||||
uniformity.status === 'REJECTED'
|
||||
);
|
||||
// Uniformity data is never locked - checkbox is always enabled
|
||||
return false;
|
||||
};
|
||||
|
||||
const canApproveRejectUniformity = (uniformity: Uniformity): boolean => {
|
||||
return uniformity.status === 'CREATED' || uniformity.status === 'Pengajuan';
|
||||
};
|
||||
|
||||
interface UniformityPreviewData {
|
||||
@@ -430,7 +430,7 @@ const UniformityTable = ({ refresh }: { refresh?: () => void }) => {
|
||||
singleRejectModal.openModal();
|
||||
}
|
||||
|
||||
router.replace('/uniformity', { scroll: false });
|
||||
router.replace('/production/uniformity', { scroll: false });
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -671,7 +671,7 @@ const UniformityTable = ({ refresh }: { refresh?: () => void }) => {
|
||||
const uniformity = uniformities.data.find(
|
||||
(r) => r.id === parseInt(rowId)
|
||||
);
|
||||
if (uniformity && !isUniformityLocked(uniformity)) {
|
||||
if (uniformity) {
|
||||
newSelection[rowId] = true;
|
||||
}
|
||||
}
|
||||
@@ -692,10 +692,7 @@ const UniformityTable = ({ refresh }: { refresh?: () => void }) => {
|
||||
id: 'select',
|
||||
header: ({ table }) => {
|
||||
const allRows = table.getRowModel().rows;
|
||||
const selectableRows = allRows.filter((row) => {
|
||||
const uniformity = row.original;
|
||||
return !isUniformityLocked(uniformity);
|
||||
});
|
||||
const selectableRows = allRows;
|
||||
|
||||
const hasNoSelectableRows = selectableRows.length === 0;
|
||||
|
||||
@@ -730,17 +727,14 @@ const UniformityTable = ({ refresh }: { refresh?: () => void }) => {
|
||||
);
|
||||
},
|
||||
cell: ({ row }) => {
|
||||
const uniformity = row.original;
|
||||
const isDisabled = isUniformityLocked(uniformity);
|
||||
|
||||
return (
|
||||
<div className={cn({ 'opacity-50': isDisabled })}>
|
||||
<div>
|
||||
<CheckboxInput
|
||||
name='row'
|
||||
checked={row.getIsSelected()}
|
||||
indeterminate={row.getIsSomeSelected()}
|
||||
onChange={row.getToggleSelectedHandler()}
|
||||
disabled={isDisabled}
|
||||
disabled={false}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
@@ -805,7 +799,7 @@ 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'>
|
||||
<div className='w-full sm:w-fit flex flex-col sm:flex-row self-start gap-2'>
|
||||
<RequirePermission permissions='lti.production.uniformity.create'>
|
||||
<Button color='primary' href='/uniformity/add'>
|
||||
<Button color='primary' href='/production/uniformity/add'>
|
||||
<Icon icon='ic:round-plus' width={18} height={18} />
|
||||
Add Uniformity
|
||||
</Button>
|
||||
@@ -1196,7 +1190,7 @@ const UniformityTable = ({ refresh }: { refresh?: () => void }) => {
|
||||
hidden: selectedRowIds.length !== 1,
|
||||
onClick() {
|
||||
router.push(
|
||||
`/uniformity/detail?uniformityId=${selectedRowIds[0]}`
|
||||
`/production/uniformity/detail?uniformityId=${selectedRowIds[0]}`
|
||||
);
|
||||
setRowSelection({});
|
||||
},
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
import Badge from '@/components/Badge';
|
||||
import Badge from '../../../../Badge';
|
||||
import Card from '@/components/Card';
|
||||
import { Icon } from '@iconify/react';
|
||||
import { formatNumber } from '@/lib/helper';
|
||||
+7
-7
@@ -10,16 +10,16 @@ import Table from '@/components/Table';
|
||||
import Badge from '@/components/Badge';
|
||||
import Tooltip from '@/components/Tooltip';
|
||||
import RequirePermission from '@/components/helper/RequirePermission';
|
||||
import { UniformityDetail as UniformityDetailType } from '@/types/api/uniformity/uniformity';
|
||||
import { UniformityDetail as UniformityDetailType } from '@/types/api/production/uniformity';
|
||||
import { formatDate } from '@/lib/helper';
|
||||
import { useUiStore } from '@/stores/ui/ui.store';
|
||||
import UniformityDetailsPreview from '@/components/pages/uniformity/detail/UniformityDetailsPreview';
|
||||
import UniformityDetailsPreview from '@/components/pages/production/uniformity/detail/UniformityDetailsPreview';
|
||||
import {
|
||||
getStatusColor,
|
||||
getStatusIndicatorColor,
|
||||
getStatusText,
|
||||
} from '@/components/pages/uniformity/uniformity-utils';
|
||||
import { DetailOptionType } from '@/types/api/uniformity/uniformity';
|
||||
} from '@/components/pages/production/uniformity/uniformity-utils';
|
||||
import { DetailOptionType } from '@/types/api/production/uniformity';
|
||||
|
||||
interface UniformityDetailProps {
|
||||
initialValues: UniformityDetailType;
|
||||
@@ -35,11 +35,11 @@ const UniformityDetail: React.FC<UniformityDetailProps> = ({
|
||||
);
|
||||
|
||||
const handleApprove = () => {
|
||||
router.push(`/uniformity?action=approve&id=${initialValues.id}`);
|
||||
router.push(`/production/uniformity?action=approve&id=${initialValues.id}`);
|
||||
};
|
||||
|
||||
const handleReject = () => {
|
||||
router.push(`/uniformity?action=reject&id=${initialValues.id}`);
|
||||
router.push(`/production/uniformity?action=reject&id=${initialValues.id}`);
|
||||
};
|
||||
|
||||
const handleViewUniformityDetails = () => {
|
||||
@@ -175,7 +175,7 @@ const UniformityDetail: React.FC<UniformityDetailProps> = ({
|
||||
<section className='w-full h-full bg-white border-l border-gray-200'>
|
||||
{/* Header */}
|
||||
<DrawerHeader
|
||||
leftIconHref='/uniformity'
|
||||
leftIconHref='/production/uniformity'
|
||||
subtitle={`Details`}
|
||||
subtitleClassName='text-sm text-neutral'
|
||||
showDivider
|
||||
+4
-4
@@ -10,17 +10,17 @@ import {
|
||||
UniformitySampling,
|
||||
UniformityResult,
|
||||
UniformityInfoUmum,
|
||||
} from '@/types/api/uniformity/uniformity';
|
||||
} from '@/types/api/production/uniformity';
|
||||
import Table from '@/components/Table';
|
||||
import Badge from '@/components/Badge';
|
||||
import { formatNumber } from '@/lib/helper';
|
||||
import { DetailOptionType } from '@/types/api/uniformity/uniformity';
|
||||
import { DetailOptionType } from '@/types/api/production/uniformity';
|
||||
import {
|
||||
getWeightStatusColor,
|
||||
getWeightStatusIndicatorColor,
|
||||
getWeightStatusText,
|
||||
} from '@/components/pages/uniformity/uniformity-utils';
|
||||
import { BodyWeightData } from '@/types/api/uniformity/uniformity';
|
||||
} from '@/components/pages/production/uniformity/uniformity-utils';
|
||||
import { BodyWeightData } from '@/types/api/production/uniformity';
|
||||
import Button from '@/components/Button';
|
||||
import { UniformityApi } from '@/services/api/uniformity';
|
||||
import useSWR from 'swr';
|
||||
+1
-1
@@ -1,7 +1,7 @@
|
||||
'use client';
|
||||
|
||||
import * as XLSX from 'xlsx';
|
||||
import type { Uniformity } from '@/types/api/uniformity/uniformity';
|
||||
import type { Uniformity } from '@/types/api/production/uniformity';
|
||||
import { formatDate, formatNumber } from '@/lib/helper';
|
||||
|
||||
interface UniformityExportExcelParams {
|
||||
+1
-1
@@ -11,7 +11,7 @@ import {
|
||||
} from '@react-pdf/renderer';
|
||||
|
||||
import { formatDate, formatNumber } from '@/lib/helper';
|
||||
import type { Uniformity } from '@/types/api/uniformity/uniformity';
|
||||
import type { Uniformity } from '@/types/api/production/uniformity';
|
||||
|
||||
Font.register({
|
||||
family: 'Helvetica',
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
import * as Yup from 'yup';
|
||||
import { Uniformity } from '@/types/api/uniformity/uniformity';
|
||||
import { Uniformity } from '@/types/api/production/uniformity';
|
||||
|
||||
type UniformityFormSchemaType = {
|
||||
date: string;
|
||||
+9
-7
@@ -23,7 +23,7 @@ import {
|
||||
UniformityFormSchema,
|
||||
UniformityFormValues,
|
||||
getUniformityFormInitialValues,
|
||||
} from '@/components/pages/uniformity/form/UniformityForm.schema';
|
||||
} from '@/components/pages/production/uniformity/form/UniformityForm.schema';
|
||||
import { LocationApi } from '@/services/api/master-data';
|
||||
import {
|
||||
ProjectFlockApi,
|
||||
@@ -34,13 +34,13 @@ import { isResponseError, isResponseSuccess } from '@/lib/api-helper';
|
||||
import {
|
||||
Uniformity,
|
||||
VerifyUniformityPayload,
|
||||
} from '@/types/api/uniformity/uniformity';
|
||||
} from '@/types/api/production/uniformity';
|
||||
import { type BaseApiResponse } from '@/types/api/api-general';
|
||||
import { ProjectFlockKandangLookup } from '@/types/api/production/project-flock';
|
||||
import { Kandang } from '@/types/api/master-data/kandang';
|
||||
import UniformityPreviewForm from '@/components/pages/uniformity/form/UniformityPreviewForm';
|
||||
import UniformityResultForm from '@/components/pages/uniformity/form/UniformityResultForm';
|
||||
import { generateUniformityTemplate } from '@/components/pages/uniformity/export/UniformityTemplate';
|
||||
import UniformityPreviewForm from '@/components/pages/production/uniformity/form/UniformityPreviewForm';
|
||||
import UniformityResultForm from '@/components/pages/production/uniformity/form/UniformityResultForm';
|
||||
import { generateUniformityTemplate } from '@/components/pages/production/uniformity/export/UniformityTemplate';
|
||||
import useSWR from 'swr';
|
||||
import { cn, formatNumber } from '@/lib/helper';
|
||||
import Tooltip from '@/components/Tooltip';
|
||||
@@ -272,7 +272,7 @@ const UniformityForm = ({
|
||||
setExpandedDrawerOpen(true);
|
||||
setUniformityStep('preview');
|
||||
} else {
|
||||
router.push('/uniformity');
|
||||
router.push('/production/uniformity');
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -435,7 +435,9 @@ const UniformityForm = ({
|
||||
leftIcon={formType == 'add' ? 'mdi:close' : 'mdi:arrow-left'}
|
||||
leftIconSize={24}
|
||||
leftIconHref={
|
||||
formType == 'add' ? '/uniformity' : `/uniformity/detail`
|
||||
formType == 'add'
|
||||
? '/production/uniformity'
|
||||
: `/production/uniformity/detail`
|
||||
}
|
||||
leftIconClassName='hover:text-gray-400'
|
||||
subtitle={formType == 'add' ? 'Add Uniformity' : 'Update Uniformity'}
|
||||
+1
-1
@@ -13,7 +13,7 @@ import Table from '@/components/Table';
|
||||
import {
|
||||
BodyWeightData,
|
||||
UniformityDetailItem,
|
||||
} from '@/types/api/uniformity/uniformity';
|
||||
} from '@/types/api/production/uniformity';
|
||||
|
||||
const UniformityPreviewForm = () => {
|
||||
const setExpandedDrawerOpen = useUiStore((s) => s.setExpandedDrawerOpen);
|
||||
+4
-4
@@ -20,12 +20,12 @@ import {
|
||||
getWeightStatusColor,
|
||||
getWeightStatusIndicatorColor,
|
||||
getWeightStatusText,
|
||||
} from '@/components/pages/uniformity/uniformity-utils';
|
||||
import { DetailOptionType } from '@/types/api/uniformity/uniformity';
|
||||
} from '@/components/pages/production/uniformity/uniformity-utils';
|
||||
import { DetailOptionType } from '@/types/api/production/uniformity';
|
||||
import {
|
||||
BodyWeightData,
|
||||
UniformityDetailItem,
|
||||
} from '@/types/api/uniformity/uniformity';
|
||||
} from '@/types/api/production/uniformity';
|
||||
|
||||
const UniformityResultForm = () => {
|
||||
const router = useRouter();
|
||||
@@ -82,7 +82,7 @@ const UniformityResultForm = () => {
|
||||
setIsNextStep(false);
|
||||
setUniformityStep('preview');
|
||||
setVerifyUniformityResult(null);
|
||||
router.push('/uniformity');
|
||||
router.push('/production/uniformity');
|
||||
} finally {
|
||||
setIsSubmitting(false);
|
||||
}
|
||||
@@ -29,6 +29,11 @@ export const MAIN_DRAWER_LINKS: SidebarMenuItem[] = [
|
||||
text: 'Transfer to Laying',
|
||||
link: '/production/transfer-to-laying',
|
||||
},
|
||||
{
|
||||
text: 'Uniformity',
|
||||
link: '/production/uniformity',
|
||||
permission: ['lti.production.uniformity.list'],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
@@ -42,12 +47,6 @@ export const MAIN_DRAWER_LINKS: SidebarMenuItem[] = [
|
||||
link: '/marketing',
|
||||
icon: 'heroicons-outline:currency-dollar',
|
||||
},
|
||||
{
|
||||
text: 'Uniformity',
|
||||
link: '/uniformity',
|
||||
icon: 'heroicons-outline:scale',
|
||||
permission: ['lti.production.uniformity.list'],
|
||||
},
|
||||
{
|
||||
text: 'Keuangan',
|
||||
link: '/finance',
|
||||
|
||||
@@ -46,10 +46,10 @@ export const ROUTE_PERMISSIONS: Record<string, string[]> = {
|
||||
],
|
||||
|
||||
// Production - 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'],
|
||||
'/production/uniformity/': ['lti.production.uniformity.list'],
|
||||
'/production/uniformity/add/': ['lti.production.uniformity.create'],
|
||||
'/production/uniformity/detail/': ['lti.production.uniformity.detail'],
|
||||
'/production/uniformity/detail/edit/': ['lti.production.uniformity.update'],
|
||||
|
||||
// Purchase
|
||||
'/purchase/': ['lti.purchase.list'],
|
||||
|
||||
@@ -6,7 +6,7 @@ import {
|
||||
VerifyUniformityPayload,
|
||||
VerifyUniformityResponse,
|
||||
CreateUniformityPayload,
|
||||
} from '@/types/api/uniformity/uniformity';
|
||||
} from '@/types/api/production/uniformity';
|
||||
|
||||
export class UniformityApiService extends BaseApiService<
|
||||
Uniformity,
|
||||
|
||||
Vendored
+1
-1
@@ -3,7 +3,7 @@ import type {
|
||||
UniformityFormData,
|
||||
UniformityDetail,
|
||||
VerifyUniformityResponse,
|
||||
} from '@/types/api/uniformity/uniformity';
|
||||
} from '@/types/api/production/uniformity';
|
||||
|
||||
type MainUiSlice = {
|
||||
mainDrawerOpen: boolean;
|
||||
|
||||
Reference in New Issue
Block a user