@@ -3,6 +3,7 @@ const API_BASE_URL = window.API_BASE_URL;
3
3
let taskRequest ;
4
4
5
5
const taskRequestSkeleton = document . querySelector ( '.taskRequest__skeleton' ) ;
6
+ const container = document . querySelector ( '.container' ) ;
6
7
const taskSkeleton = document . querySelector ( '.task__skeleton' ) ;
7
8
const requestorSkeleton = document . querySelector (
8
9
'.requestors__container__list__skeleton' ,
@@ -12,7 +13,7 @@ const taskRequestContainer = document.getElementById('task-request-details');
12
13
const taskContainer = document . getElementById ( 'task-details' ) ;
13
14
const toast = document . getElementById ( 'toast_task_details' ) ;
14
15
const requestorsContainer = document . getElementById ( 'requestors-details' ) ;
15
-
16
+ const rejectButton = document . getElementById ( 'reject-button' ) ;
16
17
const taskRequestId = new URLSearchParams ( window . location . search ) . get ( 'id' ) ;
17
18
history . pushState ( { } , '' , window . location . href ) ;
18
19
const errorMessage =
@@ -41,6 +42,7 @@ function renderTaskRequestDetails(taskRequest) {
41
42
createCustomElement ( {
42
43
tagName : 'span' ,
43
44
textContent : taskRequest ?. status ,
45
+ id : 'taskRequest__status_text' ,
44
46
class : [
45
47
'taskRequest__status__chip' ,
46
48
`taskRequest__status__chip--${ taskRequest ?. status ?. toLowerCase ( ) } ` ,
@@ -66,6 +68,16 @@ function renderTaskRequestDetails(taskRequest) {
66
68
) ;
67
69
}
68
70
71
+ function updateStatus ( status ) {
72
+ const statusText = document . getElementById ( 'taskRequest__status_text' ) ;
73
+ statusText . classList = [ ] ;
74
+ statusText . classList . add ( 'taskRequest__status__chip' ) ;
75
+ statusText . classList . add (
76
+ `taskRequest__status__chip--${ status ?. toLowerCase ( ) } ` ,
77
+ ) ;
78
+ statusText . textContent = status ;
79
+ }
80
+
69
81
async function renderTaskDetails ( taskRequest ) {
70
82
const { taskId, taskTitle } = taskRequest ;
71
83
try {
@@ -147,9 +159,12 @@ function getAvatar(user) {
147
159
} ) ;
148
160
}
149
161
150
- async function approveTaskRequest ( userId ) {
162
+ async function updateTaskRequest ( action , userId ) {
163
+ const removeSpinner = addSpinner ( container ) ;
164
+ container . classList . add ( 'container-disabled' ) ;
151
165
try {
152
- const res = await fetch ( `${ API_BASE_URL } /taskRequests/approve` , {
166
+ const queryParams = new URLSearchParams ( { action : action } ) ;
167
+ const res = await fetch ( `${ API_BASE_URL } /taskRequests?${ queryParams } ` , {
153
168
credentials : 'include' ,
154
169
method : 'PATCH' ,
155
170
body : JSON . stringify ( {
@@ -162,22 +177,28 @@ async function approveTaskRequest(userId) {
162
177
} ) ;
163
178
164
179
if ( res . ok ) {
165
- showToast ( 'Task Approved Successfully' , 'success' ) ;
180
+ showToast ( 'Task updated Successfully' , 'success' ) ;
166
181
taskRequest = await fetchTaskRequest ( ) ;
167
182
requestorsContainer . innerHTML = '' ;
168
- renderRequestors ( taskRequest ?. requestors ) ;
183
+ updateStatus ( taskRequest . status ) ;
184
+ renderRequestors ( taskRequest ) ;
185
+ renderRejectButton ( taskRequest ) ;
186
+ return res ;
169
187
} else {
170
188
showToast ( errorMessage , 'failure' ) ;
171
189
}
172
190
} catch ( e ) {
173
191
showToast ( errorMessage , 'failure' ) ;
174
192
console . error ( e ) ;
193
+ } finally {
194
+ removeSpinner ( ) ;
195
+ container . classList . remove ( 'container-disabled' ) ;
175
196
}
176
197
}
177
198
178
199
function getActionButton ( requestor ) {
179
200
if ( taskRequest ?. status === taskRequestStatus . APPROVED ) {
180
- if ( taskRequest ? .approvedTo === requestor ?. user ?. id ) {
201
+ if ( taskRequest . approvedTo === requestor ?. user ?. id ) {
181
202
return createCustomElement ( {
182
203
tagName : 'p' ,
183
204
textContent : 'Approved' ,
@@ -192,17 +213,22 @@ function getActionButton(requestor) {
192
213
textContent : 'Approve' ,
193
214
class : 'requestors__conatainer__list__button' ,
194
215
eventListeners : [
195
- { event : 'click' , func : ( ) => approveTaskRequest ( requestor . user ?. id ) } ,
216
+ {
217
+ event : 'click' ,
218
+ func : ( ) =>
219
+ updateTaskRequest ( TaskRequestAction . APPROVE , requestor . user ?. id ) ,
220
+ } ,
196
221
] ,
197
222
} ) ;
198
223
}
199
224
200
- async function renderRequestors ( requestors ) {
225
+ async function renderRequestors ( taskRequest ) {
226
+ const requestors = taskRequest ?. users ;
201
227
requestorSkeleton . classList . remove ( 'hidden' ) ;
202
228
const data = await Promise . all (
203
229
requestors . map ( ( requestor ) => {
204
- return fetch ( `${ API_BASE_URL } /users/userId/${ requestor } ` ) . then ( ( res ) =>
205
- res . json ( ) ,
230
+ return fetch ( `${ API_BASE_URL } /users/userId/${ requestor . userId } ` ) . then (
231
+ ( res ) => res . json ( ) ,
206
232
) ;
207
233
} ) ,
208
234
) ;
@@ -223,22 +249,35 @@ async function renderRequestors(requestors) {
223
249
child : [ getAvatar ( requestor ) ] ,
224
250
} ) ,
225
251
createCustomElement ( {
226
- tagName : 'p' ,
227
- textContent : requestor . user ?. first_name ,
252
+ tagName : 'div' ,
253
+ class : 'requestors__container__list__userDetails__info' ,
254
+ child : [
255
+ createCustomElement ( {
256
+ tagName : 'p' ,
257
+ class : 'info__name' ,
258
+ textContent : requestor . user ?. first_name ,
259
+ } ) ,
260
+ createCustomElement ( {
261
+ tagName : 'a' ,
262
+ textContent : 'details>' ,
263
+ class : 'info__more' ,
264
+ eventListeners : [
265
+ {
266
+ event : 'click' ,
267
+ func : ( ) => populateModalContent ( index ) ,
268
+ } ,
269
+ ] ,
270
+ } ) ,
271
+ ] ,
228
272
} ) ,
229
273
] ,
230
274
} ) ,
231
- getActionButton ( requestor ) ,
275
+ taskRequest . status !== 'DENIED' ? getActionButton ( requestor ) : '' ,
232
276
] ,
233
277
} ) ;
234
278
const avatarDiv = userDetailsDiv . querySelector (
235
279
'.requestors__container__list__userDetails__avatar' ,
236
280
) ;
237
- const firstNameParagraph = userDetailsDiv . querySelector ( 'p' ) ;
238
- avatarDiv . addEventListener ( 'click' , ( ) => populateModalContent ( index ) ) ;
239
- firstNameParagraph . addEventListener ( 'click' , ( ) =>
240
- populateModalContent ( index ) ,
241
- ) ;
242
281
requestorsContainer . append ( userDetailsDiv ) ;
243
282
} ) ;
244
283
}
@@ -249,19 +288,34 @@ async function fetchTaskRequest() {
249
288
} ) ;
250
289
251
290
const { data } = await res . json ( ) ;
291
+ const approvedTo = data . users
292
+ . filter ( ( user ) => user . status === 'APPROVED' )
293
+ ?. map ( ( user ) => user . userId ) ?. [ 0 ] ;
294
+ data . approvedTo = approvedTo ;
252
295
return data ;
253
296
}
297
+ const renderRejectButton = ( taskRequest ) => {
298
+ if ( taskRequest ?. status !== 'PENDING' ) {
299
+ rejectButton . disabled = true ;
300
+ }
254
301
302
+ rejectButton . addEventListener ( 'click' , async ( ) => {
303
+ const res = await updateTaskRequest ( TaskRequestAction . REJECT ) ;
304
+ if ( res ?. ok ) {
305
+ rejectButton . disabled = true ;
306
+ }
307
+ } ) ;
308
+ } ;
255
309
const renderTaskRequest = async ( ) => {
256
310
taskRequestSkeleton . classList . remove ( 'hidden' ) ;
257
311
taskContainer . classList . remove ( 'hidden' ) ;
258
312
try {
259
313
taskRequest = await fetchTaskRequest ( ) ;
260
314
taskRequestSkeleton . classList . add ( 'hidden' ) ;
261
-
315
+ renderRejectButton ( taskRequest ) ;
262
316
renderTaskRequestDetails ( taskRequest ) ;
263
317
renderTaskDetails ( taskRequest ) ;
264
- renderRequestors ( taskRequest ?. requestors ) ;
318
+ renderRequestors ( taskRequest ) ;
265
319
} catch ( e ) {
266
320
console . error ( e ) ;
267
321
}
0 commit comments