Merge branch 'development' into 'staging'

Hotfixes flock

See merge request mbugroup/lti-web-client!201
This commit is contained in:
Adnan Zahir
2026-01-17 11:29:55 +07:00
5 changed files with 95 additions and 52 deletions
@@ -33,22 +33,6 @@ const RowsOptions = ({
}) => { }) => {
return ( return (
<RowOptionsMenuWrapper type={type}> <RowOptionsMenuWrapper type={type}>
<RequirePermission permissions='lti.master.flocks.update'>
<Button
href={`/master-data/flock/detail/edit/?flockId=${props.row.original.id}`}
variant='ghost'
color='warning'
className='justify-start text-sm'
>
<Icon
icon='material-symbols:edit-outline'
width={16}
height={16}
className='justify-start text-sm'
/>
Edit
</Button>
</RequirePermission>
<RequirePermission permissions='lti.master.flocks.detail'> <RequirePermission permissions='lti.master.flocks.detail'>
<Button <Button
href={`/master-data/flock/detail/?flockId=${props.row.original.id}`} href={`/master-data/flock/detail/?flockId=${props.row.original.id}`}
@@ -65,6 +49,22 @@ const RowsOptions = ({
Detail Detail
</Button> </Button>
</RequirePermission> </RequirePermission>
<RequirePermission permissions='lti.master.flocks.update'>
<Button
href={`/master-data/flock/detail/edit/?flockId=${props.row.original.id}`}
variant='ghost'
color='warning'
className='justify-start text-sm'
>
<Icon
icon='material-symbols:edit-outline'
width={16}
height={16}
className='justify-start text-sm'
/>
Edit
</Button>
</RequirePermission>
<RequirePermission permissions='lti.master.flocks.delete'> <RequirePermission permissions='lti.master.flocks.delete'>
<Button <Button
onClick={deleteClickHandler} onClick={deleteClickHandler}
@@ -19,6 +19,8 @@ import ConfirmationModal from '@/components/modal/ConfirmationModal';
import RequirePermission from '@/components/helper/RequirePermission'; import RequirePermission from '@/components/helper/RequirePermission';
import AlertErrorList from '@/components/helper/form/FormErrors'; import AlertErrorList from '@/components/helper/form/FormErrors';
import { useFormikErrorList } from '@/services/hooks/useFormikErrorList'; import { useFormikErrorList } from '@/services/hooks/useFormikErrorList';
import { toast } from 'react-hot-toast';
import Alert from '@/components/Alert';
interface FlockCustomProps { interface FlockCustomProps {
formType?: 'add' | 'edit' | 'detail'; formType?: 'add' | 'edit' | 'detail';
@@ -37,7 +39,13 @@ const FlockForm = ({ formType = 'add', initialValues }: FlockCustomProps) => {
const confirmationModalDeleteClickHandler = async () => { const confirmationModalDeleteClickHandler = async () => {
setIsDeleteLoading(true); setIsDeleteLoading(true);
await FlockApi.delete(initialValues?.id as number); const deleteFlockRes = await FlockApi.delete(initialValues?.id as number);
if (deleteFlockRes?.status === 'error') {
setFlockFormErrorMessage(deleteFlockRes.message);
return;
}
toast.success(deleteFlockRes?.message as string);
deleteModal.closeModal(); deleteModal.closeModal();
setIsDeleteLoading(false); setIsDeleteLoading(false);
@@ -68,12 +76,29 @@ const FlockForm = ({ formType = 'add', initialValues }: FlockCustomProps) => {
// cek type form yang disubmit // cek type form yang disubmit
switch (formType) { switch (formType) {
case 'add': case 'add': {
await FlockApi.create(payload); const createFlockRes = await FlockApi.create(payload);
if (createFlockRes?.status === 'error') {
setFlockFormErrorMessage(createFlockRes.message);
return;
}
toast.success(createFlockRes?.message as string);
break; break;
case 'edit': }
await FlockApi.update(initialValues?.id as number, payload); case 'edit': {
const updateFlockRes = await FlockApi.update(
initialValues?.id as number,
payload
);
if (updateFlockRes?.status === 'error') {
setFlockFormErrorMessage(updateFlockRes.message);
return;
}
toast.success(updateFlockRes?.message as string);
break; break;
}
default: default:
break; break;
} }
@@ -174,6 +199,24 @@ const FlockForm = ({ formType = 'add', initialValues }: FlockCustomProps) => {
)} )}
<AlertErrorList formErrorList={formErrorList} onClose={close} /> <AlertErrorList formErrorList={formErrorList} onClose={close} />
{flockFormErrorMessage && (
<Alert color='error' className='w-full'>
<Icon
icon='material-symbols:error-outline'
width={24}
height={24}
/>
{flockFormErrorMessage}
<Button
onClick={() => setFlockFormErrorMessage('')}
variant='link'
className='ml-auto p-0 w-fit text-white'
color='none'
>
<Icon icon='material-symbols:close' width={24} height={24} />
</Button>
</Alert>
)}
{formType !== 'detail' && ( {formType !== 'detail' && (
<div <div
@@ -197,17 +240,6 @@ const FlockForm = ({ formType = 'add', initialValues }: FlockCustomProps) => {
</div> </div>
)} )}
</div> </div>
{flockFormErrorMessage && (
<div role='alert' className='alert alert-error'>
<Icon
icon='material-symbols:error-outline'
width={24}
height={24}
/>
<span>{flockFormErrorMessage}</span>
</div>
)}
</form> </form>
</section> </section>
@@ -75,12 +75,12 @@ const ChickinFormKandang = ({
<div className='flex flex-row gap-2'> <div className='flex flex-row gap-2'>
<Badge <Badge
variant='soft' variant='soft'
color='success' color='primary'
className={{ className={{
badge: 'rounded-lg px-2', badge: 'rounded-lg px-2',
}} }}
> >
<Icon icon='mdi:circle' width={12} height={12} color='success' />{' '} <Icon icon='mdi:circle' width={12} height={12} color='primary' />{' '}
Aktif Aktif
</Badge> </Badge>
<div className='divider divider-horizontal p-0 m-0'></div> <div className='divider divider-horizontal p-0 m-0'></div>
@@ -15,7 +15,7 @@ import ConfirmationModalWithNotes from '@/components/modal/ConfirmationModalWith
import Table from '@/components/Table'; import Table from '@/components/Table';
import { ROWS_OPTIONS } from '@/config/constant'; import { ROWS_OPTIONS } from '@/config/constant';
import { isResponseError, isResponseSuccess } from '@/lib/api-helper'; import { isResponseError, isResponseSuccess } from '@/lib/api-helper';
import { cn, formatDate } from '@/lib/helper'; import { cn, formatDate, formatTitleCase } from '@/lib/helper';
import { AreaApi, KandangApi, LocationApi } from '@/services/api/master-data'; import { AreaApi, KandangApi, LocationApi } from '@/services/api/master-data';
import { ProjectFlockApi } from '@/services/api/production/project-flock'; import { ProjectFlockApi } from '@/services/api/production/project-flock';
import { useTableFilter } from '@/services/hooks/useTableFilter'; import { useTableFilter } from '@/services/hooks/useTableFilter';
@@ -254,7 +254,8 @@ const ProjectFlockTable = ({ refresh }: { refresh?: () => void }) => {
header: 'Status', header: 'Status',
cell: (props) => { cell: (props) => {
const approval = props.row.original.approval; const approval = props.row.original.approval;
const isRejected = approval?.action == 'REJECTED';
const isApproved = approval?.action == 'APPROVED';
return ( return (
<Badge <Badge
variant='soft' variant='soft'
@@ -262,11 +263,17 @@ const ProjectFlockTable = ({ refresh }: { refresh?: () => void }) => {
badge: 'rounded-lg px-2 w-full flex flex-row justify-start', badge: 'rounded-lg px-2 w-full flex flex-row justify-start',
}} }}
color={ color={
approval?.step_number == 1 isRejected
? 'neutral' ? 'error'
: approval?.step_number == 2 : isApproved
? 'success' ? approval?.step_number == 1
: 'error' ? 'neutral'
: approval?.step_number == 2
? 'primary'
: approval?.step_number == 3
? 'success'
: 'neutral'
: 'neutral'
} }
> >
<Icon <Icon
@@ -277,11 +284,15 @@ const ProjectFlockTable = ({ refresh }: { refresh?: () => void }) => {
approval?.step_number == 1 approval?.step_number == 1
? 'neutral' ? 'neutral'
: approval?.step_number == 2 : approval?.step_number == 2
? 'success' ? 'primary'
: 'error' : approval?.step_number == 3
? 'success'
: 'neutral'
} }
/> />
{approval?.step_name} {isRejected
? 'Ditolak'
: formatTitleCase(approval?.step_name || '')}
</Badge> </Badge>
); );
}, },
@@ -156,9 +156,9 @@ const ProjectFlockDetail = ({
projectFlock.approval?.step_number == 1 projectFlock.approval?.step_number == 1
? 'neutral' ? 'neutral'
: projectFlock.approval?.step_number == 2 : projectFlock.approval?.step_number == 2
? 'success' ? 'primary'
: projectFlock.approval?.step_number >= 3 : projectFlock.approval?.step_number == 3
? 'error' ? 'success'
: undefined : undefined
} }
className={{ className={{
@@ -173,9 +173,9 @@ const ProjectFlockDetail = ({
projectFlock.approval?.step_number == 1 projectFlock.approval?.step_number == 1
? 'neutral' ? 'neutral'
: projectFlock.approval?.step_number == 2 : projectFlock.approval?.step_number == 2
? 'success' ? 'primary'
: projectFlock.approval?.step_number >= 3 : projectFlock.approval?.step_number == 3
? 'error' ? 'success'
: undefined : undefined
} }
/>{' '} />{' '}
@@ -273,7 +273,7 @@ const ProjectFlockDetail = ({
<div className='flex flex-row gap-2'> <div className='flex flex-row gap-2'>
<Badge <Badge
variant='soft' variant='soft'
color={'success'} color={'primary'}
className={{ className={{
badge: 'rounded-lg px-2', badge: 'rounded-lg px-2',
}} }}
@@ -282,7 +282,7 @@ const ProjectFlockDetail = ({
icon='mdi:circle' icon='mdi:circle'
width={12} width={12}
height={12} height={12}
color={'success'} color={'primary'}
/>{' '} />{' '}
Kandang Aktif ({projectFlock.kandangs?.length}) Kandang Aktif ({projectFlock.kandangs?.length})
</Badge> </Badge>