Bổ sugn check admin navbar + view thông tin ticket management + delete note timekeeping

This commit is contained in:
Truong Vo 2024-08-09 14:02:34 +07:00
parent 9b8945aa21
commit 5703804e5c
6 changed files with 139 additions and 3 deletions

View File

@ -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]);
}
}

View File

@ -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');
});

View File

@ -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',

View File

@ -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,

View File

@ -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

View File

@ -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 = () => {
</div>
)
}
const handleDelete = async (id: number) => {
try {
await Xdelete(
deleteNote,
{ id: id, month: date.month, year: date.year },
getTimeSheet,
)
} catch (error) {
console.log(error)
}
}
return (
<div>
<div className={classes.title}>
@ -510,6 +562,50 @@ const Timekeeping = () => {
>
Save
</Button>
{customAddNotes.notes.map((item, index) => {
return (
<Box
key={index}
display="flex"
className="text-muted"
style={{
marginTop: '10px',
border: '1px solid #ccc',
borderRadius: '5px',
marginBottom: '10px',
padding: '10px',
justifyContent: 'space-around',
}}
>
<Box w={'90%'}>
<TextInput
readOnly
variant="unstyled"
type="text"
size="xs"
label={`${item.reasonName} - ${item.timeTypeName}`}
w={'100%'}
value={item.note}
/>
</Box>
<Box
className={classes.optionIcon}
style={{ alignItems: 'center' }}
>
<IconTrash
className={classes.deleteIcon}
onClick={async () => {
await handleDelete(item.id)
// handleUpdateCacheMonth()
// close2()
}}
width={20}
height={20}
/>
</Box>
</Box>
)
})}
</Drawer>
<Box display={'flex'}>
<Box style={{ display: 'flex', flexFlow: 'column' }} w={'30%'}>
@ -785,7 +881,11 @@ const Timekeeping = () => {
right={-3}
display={notes && notes.length > 0 ? 'block' : 'none'}
>
<IconPointFilled width={15} height={15} style={{color:"#2767e1"}} />
<IconPointFilled
width={15}
height={15}
style={{ color: '#2767e1' }}
/>
</Box>
{total / 60 / 60 < 7 &&
user.history.find(
@ -902,6 +1002,13 @@ const Timekeeping = () => {
id: user.user.id,
name: user.user.name,
},
notes:
user.history.find(
(h) =>
h.day === d &&
h.notes &&
h.notes.length > 0,
)?.notes ?? [],
})
}}
/>