Merge branch 'master' of https://gitea.nswteam.net/joseph/ManagementSystem into Sprint-4/MS-36-FE-Technical

This commit is contained in:
dbdbd9 2024-09-25 07:33:13 +07:00
commit 885dd40dd9
8 changed files with 384 additions and 3498 deletions

View File

@ -119,6 +119,7 @@ class TechnicalController extends Controller
->where('user_id', $userId)
->where('point', '>', 0)
->orderBy('point', 'desc')
->orderBy('updated_at', 'desc')
->get();
if ($technicals->isEmpty()) {
return [];
@ -221,16 +222,25 @@ class TechnicalController extends Controller
'technicals.*.point' => 'required|integer|min:0|max:3', // Điểm trong khoảng [0-3]
]);
// Xóa hết các bản ghi hiện có của user trong bảng technical_users
TechnicalUser::where('user_id', $userInfo->id)->delete();
// Duyệt qua mảng technicals và thêm mới dữ liệu
$existingTechnicals = TechnicalUser::where('user_id', $userInfo->id)->get()->keyBy('technical_id');
foreach ($validatedData['technicals'] as $technical) {
TechnicalUser::create([
'user_id' => $userInfo->id,
'technical_id' => $technical['technical_id'],
'point' => $technical['point']
]);
$existingTechnical = $existingTechnicals->get($technical['technical_id']);
if ($existingTechnical) {
// Nếu technical_id đã tồn tại và point khác, thì update
if ($existingTechnical->point !== $technical['point']) {
$existingTechnical->update([
'point' => $technical['point']
]);
}
} else {
// Nếu technical_id chưa tồn tại, tạo mới
TechnicalUser::create([
'user_id' => $userInfo->id,
'technical_id' => $technical['technical_id'],
'point' => $technical['point']
]);
}
}
return AbstractController::ResultSuccess('Technicals for user updated successfully.');

View File

@ -107,8 +107,8 @@ Route::middleware('api')
Route::get('/fetch-issues', [JiraController::class, 'fetchAllIssues']);
Route::get('/all-project', [JiraController::class, 'getAllProject']);
Route::get('/get-detail-project-by-id', [JiraController::class, 'getDetailsProjectsById']);
Route::get('/get-all-board-by-id-project', [JiraController::class, 'getAllBoardByIdProjects']);
Route::get('/get-all-sprint-by-id-board', [JiraController::class, 'getAllSprintByIdBoard']);
Route::get('/get-all-board-by-id-project', [JiraController::class, 'getAllBoardByIdProjects'])->middleware('check.permission:admin.tester');
Route::get('/get-all-sprint-by-id-board', [JiraController::class, 'getAllSprintByIdBoard'])->middleware('check.permission:admin.tester');
Route::get('/get-all-issue-by-id-sprint', [JiraController::class, 'getAllIssueByIdSprint']);
Route::get('/all-issue-by-project', [JiraController::class, 'fetchIssuesByProject']);
@ -168,9 +168,9 @@ Route::middleware('api')
Route::get('/getAll', [CriteriasController::class, 'getAllCriterias'])->middleware('check.permission:admin');
Route::post('/sprints/{sprintId}', [CriteriasController::class, 'updateCriteriasForSprint'])->middleware('check.permission:admin');
Route::get('/test-cases/getAll/{sprintId}', [TestCaseForSprintController::class, 'getAllReportsForSprint'])->middleware('check.permission:admin,tester');
Route::post('/test-cases/{sprintId}', [TestCaseForSprintController::class, 'createTestReport'])->middleware('check.permission:admin,tester');
Route::get('/test-cases/delete', [TestCaseForSprintController::class, 'deleteTestReport'])->middleware('check.permission:admin,tester');
Route::get('/test-cases/getAll/{sprintId}', [TestCaseForSprintController::class, 'getAllReportsForSprint'])->middleware('check.permission:admin.tester');
Route::post('/test-cases/{sprintId}', [TestCaseForSprintController::class, 'createTestReport'])->middleware('check.permission:admin.tester');
Route::get('/test-cases/delete', [TestCaseForSprintController::class, 'deleteTestReport'])->middleware('check.permission:admin.tester');
Route::get('/profiles-data', [ProfileController::class, 'getProfilesData'])->middleware('check.permission:admin.hr.staff.tester');
Route::post('/profiles-data/update', [ProfileController::class, 'updateProfilesData'])->middleware('check.permission:admin.hr.staff.tester');

View File

@ -236,7 +236,7 @@ class JiraService
$users_data[$user['displayName']]['total_spent'] = 0;
$users_data[$user['displayName']]['total_est'] = 0;
$body = [
'expand' => ['names', 'schema'],
'expand' => ['names', 'schema','changelog'],
'fields' => ['summary', 'status', 'timeoriginalestimate', 'timespent', 'assignee', 'project', 'updated'],
'jql' => sprintf(
"assignee = '%s' AND status IN ('to do', 'todo', 'in progress') ORDER BY updated DESC",

View File

@ -5,13 +5,13 @@
@keyframes blinkBackground {
0% {
background-color: #ffa200; /* Màu vàng */
background-color: #ff5100; /* Màu vàng */
}
50% {
background-color: #ffffff; /* Màu xanh */
color: rgb(0, 0, 0);
}
100% {
background-color: #ffa200; /* Màu vàng */
background-color: #ff5100; /* Màu vàng */
}
}

File diff suppressed because it is too large Load Diff

View File

@ -478,7 +478,9 @@ const SprintReview = () => {
criteriaSprint.length == 0 || loading ? { display: 'none' } : {}
}
>
Criteria for Sprint:
Criteria for Sprint: <Box fs={'italic'} fz={'sm'}>
<a href={`/test-report?projectID=${filter.projectID}&sprintID=${filter.sprintID}`} target='_blank'>Sprint test report</a>
</Box>
</Title>
<Box
style={{
@ -506,17 +508,17 @@ const SprintReview = () => {
>
<Table.Thead>
<Table.Tr bg="#228be66b" style={rowStyle}>
<Table.Th style={{ textAlign: 'center', width: '250px' }}>
<Table.Th style={{ textAlign: 'center', width: '15%' }}>
Criteria
</Table.Th>
<Table.Th style={{ textAlign: 'center', width: '250px' }}>
<Table.Th style={{ textAlign: 'center', width: '25%' }}>
Expect Result
</Table.Th>
<Table.Th style={{ textAlign: 'center', width: '250px' }}>
<Table.Th style={{ textAlign: 'center', width: '25%' }}>
Actual Result
</Table.Th>
<Table.Th style={{ textAlign: 'center' }}>Note</Table.Th>
<Table.Th style={{ textAlign: 'center', width: '100px' }}>
<Table.Th style={{ textAlign: 'center', width: '30%' }}>Note</Table.Th>
<Table.Th style={{ textAlign: 'center', width: '5%' }}>
Point
</Table.Th>
</Table.Tr>
@ -599,6 +601,7 @@ const SprintReview = () => {
value={finalPoint}
onChange={(value) => setFinalPoint(value ?? '')}
size="xs"
w={'40%'}
styles={() => ({
input: {
color: 'red',
@ -639,17 +642,17 @@ const SprintReview = () => {
>
<Table.Thead>
<Table.Tr bg="#228be66b" style={rowStyle}>
<Table.Th style={{ textAlign: 'center', width: '250px' }}>
<Table.Th style={{ textAlign: 'center', width: '15%' }}>
User
</Table.Th>
<Table.Th style={{ textAlign: 'center', width: '250px' }}>
<Table.Th style={{ textAlign: 'center', width: '25%' }}>
Criteria
</Table.Th>
<Table.Th style={{ textAlign: 'center' }}>Note</Table.Th>
<Table.Th style={{ textAlign: 'center', width: '250px' }}>
<Table.Th style={{ textAlign: 'center', width: '40%' }}>Note</Table.Th>
<Table.Th style={{ textAlign: 'center', width: '15%' }}>
Created by
</Table.Th>
<Table.Th style={{ textAlign: 'center', width: '100px' }}>
<Table.Th style={{ textAlign: 'center', width: '5%' }}>
Point
</Table.Th>
</Table.Tr>

View File

@ -304,10 +304,11 @@ const StaffEvaluation = () => {
User:
</Text>
<Select
style={{ width: '50%' }}
style={{ width: '30%' }}
label={''}
placeholder="Select user"
maxLength={255}
size={'xs'}
required
data={listUsers.map((i: User) => ({
value: i.id.toString(),
@ -338,7 +339,6 @@ const StaffEvaluation = () => {
w="100%"
display={'flex'}
mt={15}
style={{ justifyContent: 'space-evenly' }}
>
<Box display={'flex'} mr={10}>
<Text
@ -353,6 +353,7 @@ const StaffEvaluation = () => {
<DateInput
placeholder="Select date"
clearable
size='xs'
required
label={''}
value={filter.fromDate ? new Date(filter.fromDate) : null}
@ -373,6 +374,7 @@ const StaffEvaluation = () => {
<DateInput
placeholder="Select date"
clearable
size='xs'
required
label={''}
value={filter.toDate ? new Date(filter.toDate) : null}

View File

@ -209,7 +209,7 @@ const UsersManagement = () => {
<MultiSelect
label={'Permission(s)'}
required
data={['staff', 'admin', 'hr']}
data={['staff', 'admin', 'hr', 'tester']}
value={
typeof form.values.permission === 'string'
? form.values.permission