1
1
const params = new URLSearchParams ( window . location . search ) ;
2
2
const userListElement = document . getElementById ( USER_LIST_ELEMENT ) ;
3
3
const loaderElement = document . getElementById ( LOADER_ELEMENT ) ;
4
+ const userloaderElement = document . getElementById ( USER_LOADER_ELEMENT ) ;
4
5
const tileViewBtn = document . getElementById ( TILE_VIEW_BTN ) ;
5
6
const tableViewBtn = document . getElementById ( TABLE_VIEW_BTN ) ;
6
7
const userSearchElement = document . getElementById ( USER_SEARCH_ELEMENT ) ;
@@ -12,10 +13,13 @@ const filterButton = document.getElementById(FILTER_BUTTON);
12
13
const availabilityFilter = document . getElementById ( AVAILABILITY_FILTER ) ;
13
14
const applyFilterButton = document . getElementById ( APPLY_FILTER_BUTTON ) ;
14
15
const clearButton = document . getElementById ( CLEAR_BUTTON ) ;
16
+ const ulElement = document . getElementById ( HEAD_LIST_ELEMENT ) ;
15
17
16
18
let tileViewActive = false ;
17
19
let tableViewActive = true ;
20
+ let isLoading = false ;
18
21
let page = 0 ;
22
+ let run = true ;
19
23
20
24
const init = (
21
25
prevBtn ,
@@ -27,26 +31,24 @@ const init = (
27
31
paginationElement ,
28
32
loaderElement ,
29
33
) => {
30
- prevBtn . addEventListener ( 'click' , ( ) => {
31
- showUserDataList (
32
- -- page ,
33
- userListElement ,
34
- paginationElement ,
35
- loaderElement ,
36
- prevBtn ,
37
- nextBtn ,
38
- ) ;
39
- } ) ;
34
+ window . addEventListener ( 'scroll' , async ( ) => {
35
+ if (
36
+ window . innerHeight + window . scrollY >= document . body . offsetHeight - 100 &&
37
+ run
38
+ ) {
39
+ if ( ! page ) {
40
+ page ++ ;
41
+ return ;
42
+ }
40
43
41
- nextBtn . addEventListener ( 'click' , ( ) => {
42
- showUserDataList (
43
- ++ page ,
44
- userListElement ,
45
- paginationElement ,
46
- loaderElement ,
47
- prevBtn ,
48
- nextBtn ,
49
- ) ;
44
+ run = false ;
45
+ showUserDataList (
46
+ page ++ ,
47
+ userListElement ,
48
+ paginationElement ,
49
+ loaderElement ,
50
+ ) ;
51
+ }
50
52
} ) ;
51
53
52
54
tileViewBtn . addEventListener ( 'click' , ( ) => {
@@ -65,17 +67,9 @@ const init = (
65
67
userListElement ,
66
68
paginationElement ,
67
69
loaderElement ,
68
- prevBtn ,
69
70
) ;
70
71
}
71
- showUserDataList (
72
- page ,
73
- userListElement ,
74
- paginationElement ,
75
- loaderElement ,
76
- prevBtn ,
77
- nextBtn ,
78
- ) ;
72
+ showUserDataList ( page , userListElement , paginationElement , loaderElement ) ;
79
73
} , 500 ) ,
80
74
) ;
81
75
} ;
@@ -86,6 +80,8 @@ function showTileView(userListElement, tableViewBtn, tileViewBtn) {
86
80
tableViewBtn . classList . remove ( 'btn-active' ) ;
87
81
tileViewBtn . classList . add ( 'btn-active' ) ;
88
82
const listContainerElement = userListElement . lastChild ;
83
+ const headList = document . getElementById ( 'head_list' ) ;
84
+ headList . classList . add ( 'tile-webview' ) ;
89
85
listContainerElement . childNodes . forEach ( ( listElement ) => {
90
86
const imgElement = listElement . firstChild ;
91
87
imgElement . classList . add ( 'remove-element' ) ;
@@ -99,6 +95,8 @@ function showTableView(userListElement, tableViewBtn, tileViewBtn) {
99
95
tileViewBtn . classList . remove ( 'btn-active' ) ;
100
96
tableViewBtn . classList . add ( 'btn-active' ) ;
101
97
const listContainerElement = userListElement . lastChild ;
98
+ const headList = document . getElementById ( 'head_list' ) ;
99
+ headList . classList . remove ( 'tile-webview' ) ;
102
100
listContainerElement . childNodes . forEach ( ( listElement ) => {
103
101
const imgElement = listElement . firstChild ;
104
102
imgElement . classList . remove ( 'remove-element' ) ;
@@ -116,6 +114,7 @@ function showErrorMessage(
116
114
const paraELe = document . createElement ( 'p' ) ;
117
115
const textNode = document . createTextNode ( msg ) ;
118
116
paraELe . appendChild ( textNode ) ;
117
+ paraELe . id = 'error_para' ;
119
118
paraELe . classList . add ( 'error-text' ) ;
120
119
userListElement . appendChild ( paraELe ) ;
121
120
paginationElement . classList . add ( 'remove-element' ) ;
@@ -149,14 +148,7 @@ function generateUserList(
149
148
userListElement ,
150
149
paginationElement ,
151
150
loaderElement ,
152
- prevBtn ,
153
151
) {
154
- userListElement . innerHTML = '' ;
155
- if ( page <= 0 ) {
156
- prevBtn . classList . add ( 'btn-disabled' ) ;
157
- } else {
158
- prevBtn . classList . remove ( 'btn-disabled' ) ;
159
- }
160
152
if ( ! users || ! users . length ) {
161
153
showErrorMessage (
162
154
'No data found' ,
@@ -166,40 +158,49 @@ function generateUserList(
166
158
) ;
167
159
return ;
168
160
}
169
- const ulElement = document . createElement ( 'ul' ) ;
170
- users . forEach ( ( userData ) => {
171
- const listElement = document . createElement ( 'li' ) ;
172
- const imgElement = document . createElement ( 'img' ) ;
173
- imgElement . src = userData . picture ? userData . picture : DEFAULT_AVATAR ;
174
- imgElement . classList . add ( 'user-img-dimension' ) ;
175
- const pElement = document . createElement ( 'p' ) ;
176
- const node = document . createTextNode (
177
- `${ userData . first_name } ${ userData . last_name } ` ,
178
- ) ;
179
- pElement . appendChild ( node ) ;
180
- listElement . appendChild ( imgElement ) ;
181
- listElement . appendChild ( pElement ) ;
182
161
183
- if ( tileViewActive ) {
184
- let imgElement = listElement . firstChild ;
185
- listElement . classList . remove ( 'tile-width' ) ;
186
- imgElement . classList . add ( 'remove-element' ) ;
162
+ const errorTexts = document . getElementById ( 'error_para' ) ;
163
+ if ( errorTexts ) {
164
+ errorTexts . remove ( ) ;
165
+ }
166
+
167
+ if ( showPagination || page == 0 ) {
168
+ ulElement . innerHTML = '' ;
169
+ }
170
+
171
+ if ( users ?. length ) {
172
+ users ?. forEach ( ( userData ) => {
173
+ const listElement = document . createElement ( 'li' ) ;
174
+ const imgElement = document . createElement ( 'img' ) ;
175
+ imgElement . src = userData . picture ? userData . picture : DEFAULT_AVATAR ;
176
+ imgElement . classList . add ( 'user-img-dimension' ) ;
177
+ listElement . classList . add ( 'tile-webview' ) ;
178
+ const pElement = document . createElement ( 'p' ) ;
179
+ const node = document . createTextNode (
180
+ `${ userData . first_name } ${ userData . last_name } ` ,
181
+ ) ;
182
+ pElement . appendChild ( node ) ;
183
+ listElement . appendChild ( imgElement ) ;
184
+ listElement . appendChild ( pElement ) ;
185
+
186
+ if ( tileViewActive ) {
187
+ let imgElement = listElement . firstChild ;
188
+ listElement . classList . add ( 'tile-width' ) ;
189
+ imgElement . classList . add ( 'remove-element' ) ;
190
+ }
191
+ listElement . onclick = ( ) => {
192
+ document . getElementById ( 'user-search' ) . value = '' ;
193
+ window . location . href = `/users/details/index.html?username=${ userData . username } ` ;
194
+ } ;
195
+ ulElement . appendChild ( listElement ) ;
196
+ } ) ;
197
+ loaderElement . classList . add ( 'remove-element' ) ;
198
+ userListElement . appendChild ( ulElement ) ;
199
+ run = true ;
200
+ if ( document . getElementById ( 'loader' ) ) {
201
+ document . getElementById ( 'loader' ) . classList . add ( 'remove-element' ) ;
187
202
}
188
- listElement . onclick = ( ) => {
189
- document . getElementById ( 'user-search' ) . value = '' ;
190
- window . location . href = `/users/details/index.html?username=${ userData . username } ` ;
191
- } ;
192
- ulElement . appendChild ( listElement ) ;
193
- } ) ;
194
- loaderElement . classList . add ( 'remove-element' ) ;
195
- if ( showPagination ) {
196
- paginationElement . classList . remove ( 'remove-element' ) ;
197
- paginationElement . classList . add ( 'pagination' ) ;
198
- } else {
199
- paginationElement . classList . add ( 'remove-element' ) ;
200
- paginationElement . classList . remove ( 'pagination' ) ;
201
203
}
202
- userListElement . appendChild ( ulElement ) ;
203
204
}
204
205
205
206
async function fetchUsersData ( searchInput ) {
@@ -238,19 +239,28 @@ async function getParticularUserData(
238
239
userListElement ,
239
240
paginationElement ,
240
241
loaderElement ,
241
- prevBtn ,
242
242
) {
243
243
try {
244
+ page = 0 ;
245
+ if ( ! searchInput . length ) {
246
+ await showUserDataList (
247
+ page ,
248
+ userListElement ,
249
+ paginationElement ,
250
+ loaderElement ,
251
+ ) ;
252
+ return ;
253
+ }
244
254
const usersData = await fetchUsersData ( searchInput ) ;
245
255
if ( usersData . users ) {
246
- const data = formatUsersData ( usersData . users ) ;
256
+ const data = formatUsersData ( usersData ?. users ) ;
257
+
247
258
generateUserList (
248
259
data ,
249
- false ,
260
+ true ,
250
261
userListElement ,
251
262
paginationElement ,
252
263
loaderElement ,
253
- prevBtn ,
254
264
) ;
255
265
} else {
256
266
showErrorMessage (
@@ -318,32 +328,24 @@ function displayLoader() {
318
328
function clearFilters ( ) {
319
329
availabilityFilter . value = 'none' ;
320
330
displayLoader ( ) ;
321
- showUserDataList (
322
- page ,
323
- userListElement ,
324
- paginationElement ,
325
- loaderElement ,
326
- prevBtn ,
327
- nextBtn ,
328
- ) ;
331
+ showUserDataList ( page , userListElement , paginationElement , loaderElement ) ;
329
332
}
330
333
331
334
const showUserDataList = async (
332
335
page ,
333
336
userListElement ,
334
337
paginationElement ,
335
338
loaderElement ,
336
- prevBtn ,
337
- nextBtn ,
338
339
) => {
339
340
try {
341
+ if ( isLoading ) return ;
342
+ if ( page != 0 ) {
343
+ isLoading = true ;
344
+ userloaderElement . style . display = 'block' ;
345
+ }
346
+
340
347
const userData = await getUsersData ( page ) ;
341
- if ( userData . length ) {
342
- if ( userData . length < USER_FETCH_COUNT ) {
343
- nextBtn . classList . add ( 'btn-disabled' ) ;
344
- } else {
345
- nextBtn . classList . remove ( 'btn-disabled' ) ;
346
- }
348
+ if ( userData && userData . length ) {
347
349
let usersDataList = userData . filter (
348
350
( user ) => user . first_name && ! user . roles ?. archived ,
349
351
) ;
@@ -355,11 +357,10 @@ const showUserDataList = async (
355
357
} ) ) ;
356
358
generateUserList (
357
359
usersDataList ,
358
- true ,
360
+ false ,
359
361
userListElement ,
360
362
paginationElement ,
361
363
loaderElement ,
362
- prevBtn ,
363
364
) ;
364
365
}
365
366
} catch ( err ) {
@@ -370,6 +371,9 @@ const showUserDataList = async (
370
371
paginationElement ,
371
372
loaderElement ,
372
373
) ;
374
+ } finally {
375
+ userloaderElement . style . display = 'none' ;
376
+ isLoading = false ;
373
377
}
374
378
} ;
375
379
@@ -664,6 +668,7 @@ clearButton.addEventListener('click', function () {
664
668
clearCheckboxes ( 'availability-filter' ) ;
665
669
filterModal . classList . toggle ( 'hidden' ) ;
666
670
displayLoader ( ) ;
671
+ page = 0 ;
667
672
showUserDataList (
668
673
page ,
669
674
userListElement ,
0 commit comments