diff --git a/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php b/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php index 8acfb802..cd505ec8 100644 --- a/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php +++ b/Modules/Internal/Http/Controllers/Api/CorporateMemberController.php @@ -141,11 +141,29 @@ class CorporateMemberController extends Controller * @param int $id * @return Renderable */ - public function update(Request $request, $id) + public function update(Request $request) { - // + $member = Member::where('member_id', $request->member_id)->first(); + + if ($member) { + $member->update([ + 'birth_date' => $request->birth_date, + 'gender' => $request->gender, + ]); + + return response()->json([ + 'member' => $member, + 'message' => 'Status by member id Updated Successfully' + ]); + } else { + return response()->json([ + 'member' => null, + 'message' => 'Gagal update, member tidak ditemukan' + ]); + } } + /** * Remove the specified resource from storage. * @param int $id diff --git a/Modules/Internal/Routes/api.php b/Modules/Internal/Routes/api.php index 198715f9..b7800eb2 100644 --- a/Modules/Internal/Routes/api.php +++ b/Modules/Internal/Routes/api.php @@ -123,6 +123,7 @@ Route::prefix('internal')->group(function () { Route::get('corporates/{corporate_id}/members/list', [CorporateMemberController::class, 'generateMemberList']); Route::post('corporates/{corporate_id}/members/import', [CorporateMemberController::class, 'import']); Route::put('members/{member_id}/activation', [CorporateMemberController::class, 'activation']); + Route::post('members/update', [CorporateMemberController::class, 'update']); Route::get('corporates/{corporate_id}/diagnosis', [DiagnosisExclusionController::class, 'listDiagnosis']); diff --git a/frontend/dashboard/src/pages/Corporates/Member/List.tsx b/frontend/dashboard/src/pages/Corporates/Member/List.tsx index 86c13dbe..3e9ec04c 100644 --- a/frontend/dashboard/src/pages/Corporates/Member/List.tsx +++ b/frontend/dashboard/src/pages/Corporates/Member/List.tsx @@ -62,6 +62,8 @@ import CachedOutlinedIcon from '@mui/icons-material/CachedOutlined'; import { Dialog, DialogTitle, DialogContent, DialogActions } from '@mui/material'; import CloseIcon from '@mui/icons-material/Close'; import Label from '../../../components/Label'; +import DialogEditMember from './sections/DialogEditMember'; +import { Edit } from '@mui/icons-material'; export default function CorporatePlanList({handleSubmitSuccess}) { const navigate = useNavigate(); @@ -566,6 +568,10 @@ export default function CorporatePlanList({handleSubmitSuccess}) { Update Status + handleEditMember(row)}> + + Update Member + handleDownloadEcard(row.id)}> Download E-card @@ -747,6 +753,8 @@ export default function CorporatePlanList({handleSubmitSuccess}) { const [idUpdate, setIdUpdate] = useState(''); const [openDialogStatus, setOpenDialogStatus] = useState(false); + const [member, setMember] = useState(); + const handleCloseDialogUpdate = () => { setNameUpdate(''); @@ -790,6 +798,14 @@ export default function CorporatePlanList({handleSubmitSuccess}) { setIdUpdate(data.id); setOpenDialogStatus(true); } + + // Handle Update data member + const [openDialogEdit, setOpenDialogUpdate] = useState(false); + const handleEditMember = (member: any) => { + setOpenDialogUpdate(true) + setMember(member) + } + return ( @@ -899,6 +915,15 @@ export default function CorporatePlanList({handleSubmitSuccess}) { title={{ name: 'Reason For Update' }} /> )} + + {/* Dialog for update birthdate member */} + + + ); } diff --git a/frontend/dashboard/src/pages/Corporates/Member/sections/DialogEditMember.tsx b/frontend/dashboard/src/pages/Corporates/Member/sections/DialogEditMember.tsx new file mode 100644 index 00000000..5477fb88 --- /dev/null +++ b/frontend/dashboard/src/pages/Corporates/Member/sections/DialogEditMember.tsx @@ -0,0 +1,213 @@ +import MuiDialog from "@/components/MuiDialog"; +import { Button, Card, Checkbox, DialogActions, Grid, TextField, TextareaAutosize, Typography, Select } from "@mui/material"; +import { Paper } from "@mui/material"; +import { Stack } from '@mui/material'; +import React, { useEffect, useState } from 'react'; +import { fDateOnly, fDateTimesecond, toTitleCase } from "@/utils/formatTime"; +import axios from "@/utils/axios"; +import { enqueueSnackbar } from "notistack"; +import { useNavigate, useParams } from "react-router"; +import { RHFSelect, RHFTextField, RHFEditor } from "@/components/hook-form"; +import { Autocomplete } from "@mui/material"; +// import { RHFEditor } from "@/components/hook-form/v2"; + + +type DialogConfirmationType = { + openDialog: boolean; + setOpenDialog: any; + onSubmit?: void; + member: { + member_id:string, + birth_date:string, + gender:string, + reason:string + }; +} + +export default function DialogEditMember({member, setOpenDialog, openDialog, onSubmit} : DialogConfirmationType ) { + const navigate = useNavigate(); + const { corporate_id } = useParams(); + + const [formData, setFormData] = useState({ + member_id: member?.member_id, + gender: member?.gender, + birth_date: member?.birth_date, + reason: member?.reason, + }); + + const [isReasonSelected, setIsReasonSelected] = useState(true); + + useEffect(() => { + // Update formData setiap kali requestLog berubah + setFormData({ + member_id: member?.member_id || '', + gender: member?.gender || '', + birth_date: member?.birth_date || '', + reason: member?.reason || '', + + }); + }, [member]); + + const handleChange = (field, value) => { + setFormData((prevData) => ({ + ...prevData, + [field]: value, + })); + if (field === 'reason') { + setIsReasonSelected(!!value); + } + + }; + + const handleApprove = () => { + setFormData((prevData) => ({ + ...prevData, + })); + handleSubmit(); + }; + + + const handleSubmit = () => { + if (isReasonSelected && formData.reason !== '') { + axios + .post(`members/update`, formData) + .then((response) => { + enqueueSnackbar('Update Member Success', { variant: 'success' }); + setOpenDialog(false); + navigate(`/corporates/${corporate_id}/members`) + window.location.reload() + }) + .catch(({ response }) => { + enqueueSnackbar(response.data.message ?? 'Something went wrong!', { variant: 'error' }); + }); + } else { + setIsReasonSelected(false); + alert('Silakan pilih alasan sebelum mengirimkan data.'); + } + } + + const style1 = { + color: '#919EAB', + width: '30%' + } + const style2 = { + width: '70%' + } + const marginBottom1 = { + marginBottom: 1, + } + + const marginBottom2 = { + marginBottom: 2, + } + + const resetForm = () => { + setFormData({ + member_id: member?.member_id ?? '', + gender: member?.gender ?? '', + birth_date: member?.birth_date ?? '', + reason: member?.reason ?? '', + + }); + }; + + const handleCloseDialog = () => { + setOpenDialog(false); + resetForm(); + } + + const handleNumericInput = (input: any) => { + const numericInput = input.replace(/\D/g, ''); + return numericInput; + }; + + const reasons = [ + { value: 'agreement', label: 'Agreement changed' }, + { value: 'endorsement', label: 'Endorsement' }, + { value: 'renewal', label: 'Renewal' }, + { value: 'wrong_setting', label: 'Wrong Setting' }, + // Add more options as needed + ]; + + const gender = [ + { value: 'male', label: 'Male' }, + { value: 'female', label: 'Female' }, + { value: '-', label: 'Other' }, + // Add more options as needed + ]; + + const getContent = () => ( + + Are you sure to update this member ? + + + + Birth Date + handleChange('birth_date', e.target.value)} + /> + + + Gender + option.label} + fullWidth + value={gender.find((r) => r.value === formData.gender) || null} // Use find to match the default value + onChange={(e, newValue) => handleChange('gender', newValue?.value)} + renderInput={(params) => ( + + )} + /> + + + Reason* + option.label} + fullWidth + value={reasons.find((r) => r.value === formData.reason) || null} // Use find to match the default value + onChange={(e, newValue) => handleChange('reason', newValue?.value)} + renderInput={(params) => ( + + )} + /> + + + + + + + + + ); + + + return ( + + ); +} \ No newline at end of file