diff --git a/BACKEND/Modules/Admin/app/Http/Controllers/TimekeepingController.php b/BACKEND/Modules/Admin/app/Http/Controllers/TimekeepingController.php index c3c20e6..548ed8d 100644 --- a/BACKEND/Modules/Admin/app/Http/Controllers/TimekeepingController.php +++ b/BACKEND/Modules/Admin/app/Http/Controllers/TimekeepingController.php @@ -161,4 +161,27 @@ class TimekeepingController extends Controller return response()->json(['status' => true, 'message' => 'Update successfully']); } + public function deleteNote(Request $request) + { + $rules = [ + 'id' => 'required' + ]; + + // Validate the request + $request->validate($rules); + + $id = $request->input('id'); + + $month = $request->month; + $year = $request->year; + + $note = Notes::find($id); + if ($note) { + $note->delete(); + $this->createOrUpdateRecordForCurrentMonth($month, $year); + return response()->json(['message' => 'Delete success', 'status' => true]); + } + + return response()->json(['message' => 'Delete fail', 'status' => false]); + } } diff --git a/BACKEND/Modules/Admin/routes/api.php b/BACKEND/Modules/Admin/routes/api.php index 3c6bf25..dc549ed 100755 --- a/BACKEND/Modules/Admin/routes/api.php +++ b/BACKEND/Modules/Admin/routes/api.php @@ -111,6 +111,7 @@ Route::middleware('api') Route::get('/', [TimekeepingController::class, 'get'])->middleware('check.permission:admin.hr.staff'); Route::post('/addMutilple', [TimekeepingController::class, 'addWorkingTimeForMultipleUser'])->middleware('check.permission:admin.hr'); Route::post('/addNote', [TimekeepingController::class, 'addNoteForUser'])->middleware('check.permission:admin.hr'); + Route::get('/delete', [TimekeepingController::class, 'deleteNote'])->middleware('check.permission:admin.hr'); Route::post('/update-cache-month', [TimekeepingController::class, 'updateCacheMonth'])->middleware('check.permission:admin'); Route::post('/update-working-days', [TimekeepingController::class, 'saveWorkingDays'])->middleware('check.permission:admin.hr'); }); diff --git a/BACKEND/app/Models/Notes.php b/BACKEND/app/Models/Notes.php index 3a71461..57e4e49 100644 --- a/BACKEND/app/Models/Notes.php +++ b/BACKEND/app/Models/Notes.php @@ -34,6 +34,7 @@ class Notes extends Model ->where('n_month', $month) ->where('n_year', $year) ->select( + 'notes.id as n_id', 'n_user_id', 'n_day', 'n_month', diff --git a/BACKEND/app/Traits/AnalyzeData.php b/BACKEND/app/Traits/AnalyzeData.php index 8ad0533..3b86196 100644 --- a/BACKEND/app/Traits/AnalyzeData.php +++ b/BACKEND/app/Traits/AnalyzeData.php @@ -72,6 +72,7 @@ trait AnalyzeData if (count($hasNotes) > 0) { foreach ($hasNotes as $k_Note => $value_Note) { $notes[$k_Note] = [ + 'id' => $value_Note->n_id, 'timeType' => $value_Note->n_time_type, 'timeTypeName' => $value_Note->time_type_name, 'reason' => $value_Note->n_reason, @@ -86,6 +87,7 @@ trait AnalyzeData $notes = []; foreach ($hasNotes as $k_Note => $value_Note) { $notes[$k_Note] = [ + 'id' => $value_Note->n_id, 'timeType' => $value_Note->n_time_type, 'timeTypeName' => $value_Note->time_type_name, 'reason' => $value_Note->n_reason, diff --git a/FRONTEND/src/api/Admin.ts b/FRONTEND/src/api/Admin.ts index fd7581f..7235612 100755 --- a/FRONTEND/src/api/Admin.ts +++ b/FRONTEND/src/api/Admin.ts @@ -68,6 +68,8 @@ export const getAllUserWorklogs = API_URL + 'v1/admin/jira/worklogs' export const getTheTimesheet = API_URL + 'v1/admin/timekeeping' export const updateMultipleUserWorkingTime = API_URL + 'v1/admin/timekeeping/addMutilple' export const updateNote = API_URL + 'v1/admin/timekeeping/addNote' +export const deleteNote = API_URL + 'v1/admin/timekeeping/delete' +export const updateCacheMonth = API_URL + 'v1/admin/timekeeping/update-cache-month' export const updateWorkingDays = API_URL + 'v1/admin/timekeeping/update-working-days' //Category diff --git a/FRONTEND/src/pages/Timekeeping/Timekeeping.tsx b/FRONTEND/src/pages/Timekeeping/Timekeeping.tsx index d738ff1..6fc4045 100644 --- a/FRONTEND/src/pages/Timekeeping/Timekeeping.tsx +++ b/FRONTEND/src/pages/Timekeeping/Timekeeping.tsx @@ -1,13 +1,16 @@ import { + deleteNote, getListMaster, getTheTimesheet, + updateCacheMonth, updateMultipleUserWorkingTime, updateNote, updateWorkingDays, } from '@/api/Admin' -import { update } from '@/rtk/helpers/CRUD' +import { update, Xdelete } from '@/rtk/helpers/CRUD' import { get } from '@/rtk/helpers/apiService' import { + Avatar, Box, Button, Drawer, @@ -20,6 +23,7 @@ import { Textarea, TextInput, Tooltip, + TypographyStylesProvider, } from '@mantine/core' import { useDisclosure } from '@mantine/hooks' import { notifications } from '@mantine/notifications' @@ -27,7 +31,8 @@ import { IconCheck, IconExclamationMark, IconPointFilled, - IconX + IconTrash, + IconX, } from '@tabler/icons-react' import moment from 'moment' import { useEffect, useState } from 'react' @@ -69,6 +74,7 @@ interface HistoryValue { } interface NoteValue { + id: number note: string reason: string timeType: string @@ -113,6 +119,7 @@ const Timekeeping = () => { reason: string note: string day: number + notes: NoteValue[] }>({ user: { id: 0, @@ -122,6 +129,7 @@ const Timekeeping = () => { reason: '', note: '', day: 0, + notes: [], }) const [workingDays, setWorkingDays] = useState(30) @@ -175,6 +183,23 @@ const Timekeeping = () => { setData( res.data.filter((u: UserData) => u.user.permission.includes('staff')), ) + + if ( + res.data.find( + (item: UserData) => item.user.id === customAddNotes.user.id, + )?.user.id + ) { + setCustomAddNotes({ + ...customAddNotes, + notes: (res.data + .find((item: UserData) => item.user.id === customAddNotes.user.id) + ?.history?.find( + (itemHistory: History) => + itemHistory.day === customAddNotes.day, + )?.notes ?? []) as NoteValue[], + }) + } + setDaysInMonth( Array.from({ length: getDaysInMonth() }, (_, index) => index + 1), ) @@ -283,6 +308,20 @@ const Timekeeping = () => { console.log(error) } } + const handleUpdateCacheMonth = async () => { + try { + await update( + updateCacheMonth, + { + year: date.year, + month: date.month, + }, + getTimeSheet, + ) + } catch (error) { + console.log(error) + } + } useEffect(() => { getTimeSheet() @@ -369,6 +408,19 @@ const Timekeeping = () => { ) } + + const handleDelete = async (id: number) => { + try { + await Xdelete( + deleteNote, + { id: id, month: date.month, year: date.year }, + getTimeSheet, + ) + } catch (error) { + console.log(error) + } + } + return (