1
1
// Global active filters set
2
2
const activeFilters = new Set ( [ 'os_system' ] ) ;
3
3
4
- // Table Update Logic
4
+ // Table Update Logic - Optimized for lazy loading
5
5
function updateTable ( ) {
6
- // Get all leaderboard tables
7
- const leaderboards = document . querySelectorAll ( '.tabcontent ') ;
8
- const noResultsMessage = document . querySelector ( '#no-results' ) ;
6
+ // Only process the currently visible leaderboard table
7
+ const container = document . getElementById ( 'leaderboard-container ') ;
8
+ if ( ! container ) return ;
9
9
10
- leaderboards . forEach ( leaderboard => {
11
- // Only process visible leaderboard
12
- if ( leaderboard . style . display !== 'block' ) return ;
10
+ const visibleLeaderboard = container . querySelector ( '.tabcontent.active' ) ;
11
+ if ( ! visibleLeaderboard ) return ;
12
+
13
+ const tableRows = visibleLeaderboard . querySelectorAll ( '.data-table tbody tr:not(.no-results)' ) ;
14
+ let visibleRowCount = 0 ;
15
+
16
+ tableRows . forEach ( row => {
17
+ // Show row by default
18
+ let showRow = true ;
13
19
14
- const tableRows = leaderboard . querySelectorAll ( '.data-table tbody tr' ) ;
15
- let visibleRowCount = 0 ;
20
+ // Check filters
21
+ for ( const filter of activeFilters ) {
22
+ if ( row . getAttribute ( `data-${ filter } ` ) !== 'true' ) {
23
+ showRow = false ;
24
+ break ;
25
+ }
26
+ }
16
27
17
- tableRows . forEach ( row => {
18
- // Show row by default
19
- let showRow = true ;
28
+ // Check tag filter
29
+ if ( showRow ) {
30
+ const selectedTags = getSelectedTags ( ) ;
31
+ const allTagsSelected = isAllTagsSelected ( ) ;
20
32
21
- // Check filters
22
- for ( const filter of activeFilters ) {
23
- if ( row . getAttribute ( `data- ${ filter } ` ) !== 'true' ) {
33
+ if ( ! allTagsSelected ) {
34
+ const rowTags = ( row . getAttribute ( 'data-tags' ) || '' ) . split ( ',' ) . map ( t => t . trim ( ) ) . filter ( Boolean ) ;
35
+ if ( ! rowTags . some ( tag => selectedTags . includes ( tag ) ) ) {
24
36
showRow = false ;
25
- break ;
26
37
}
27
38
}
28
-
29
- // Toggle row visibility
30
- row . style . display = showRow ? '' : 'none' ;
31
- if ( showRow ) visibleRowCount ++ ;
32
- } ) ;
33
-
34
- const noResultsMessage = leaderboard . querySelector ( '.no-results' ) ;
35
- // Show/hide no results message
36
- if ( visibleRowCount === 0 && activeFilters . size > 0 ) {
37
- noResultsMessage . style . display = 'table-row' ;
38
- } else {
39
- noResultsMessage . style . display = 'none' ;
40
39
}
40
+
41
+ // Toggle row visibility
42
+ row . style . display = showRow ? '' : 'none' ;
43
+ if ( showRow ) visibleRowCount ++ ;
41
44
} ) ;
45
+
46
+ const noResultsMessage = visibleLeaderboard . querySelector ( '.no-results' ) ;
47
+ // Show/hide no results message
48
+ if ( visibleRowCount === 0 && ( activeFilters . size > 0 || ! isAllTagsSelected ( ) ) ) {
49
+ noResultsMessage . style . display = 'table-row' ;
50
+ } else {
51
+ noResultsMessage . style . display = 'none' ;
52
+ }
53
+ }
54
+
55
+ function isAllTagsSelected ( ) {
56
+ const multiselect = document . getElementById ( 'tag-multiselect' ) ;
57
+ if ( ! multiselect ) return true ;
58
+ const selectedTags = getSelectedTags ( ) ;
59
+ const allCheckboxes = multiselect . querySelectorAll ( '.tag-checkbox:not([value="All"])' ) ;
60
+ return selectedTags . length === allCheckboxes . length ;
42
61
}
43
62
44
63
// Updated Filter Button Logic
@@ -67,17 +86,6 @@ document.addEventListener('DOMContentLoaded', function() {
67
86
} ) ;
68
87
} ) ;
69
88
70
- // Apply filters when switching tabs
71
- document . querySelectorAll ( '.tablinks' ) . forEach ( tab => {
72
- tab . addEventListener ( 'click' , function ( ) {
73
- // Wait for the tab content to be shown
74
- setTimeout ( updateTable , 0 ) ;
75
- } ) ;
76
- } ) ;
77
-
78
- // Initial application of filters
79
- setTimeout ( updateTable , 0 ) ;
80
-
81
89
// Multi-select dropdown logic
82
90
const multiselect = document . getElementById ( 'tag-multiselect' ) ;
83
91
if ( multiselect ) {
@@ -169,60 +177,4 @@ function getSelectedTags() {
169
177
if ( ! multiselect ) return [ ] ;
170
178
const checkboxes = multiselect . querySelectorAll ( '.tag-checkbox:not([value="All"])' ) ;
171
179
return Array . from ( checkboxes ) . filter ( cb => cb . checked ) . map ( cb => cb . value ) ;
172
- }
173
-
174
- // Patch the table update logic to include tag filtering
175
- const originalUpdateTable = updateTable ;
176
- updateTable = function ( ) {
177
- // Get selected tags
178
- const selectedTags = getSelectedTags ( ) ;
179
- const multiselect = document . getElementById ( 'tag-multiselect' ) ;
180
- const allTagsSelected = multiselect ? ( selectedTags . length === multiselect . querySelectorAll ( '.tag-checkbox:not([value="All"])' ) . length ) : true ;
181
-
182
- // Get all leaderboard tables
183
- const leaderboards = document . querySelectorAll ( '.tabcontent' ) ;
184
- const noResultsMessage = document . querySelector ( '#no-results' ) ;
185
- let anyVisible = false ;
186
-
187
- leaderboards . forEach ( leaderboard => {
188
- // Only process visible leaderboard
189
- if ( leaderboard . style . display !== 'block' ) return ;
190
-
191
- const tableRows = leaderboard . querySelectorAll ( '.data-table tbody tr' ) ;
192
- let visibleRowCount = 0 ;
193
-
194
- tableRows . forEach ( row => {
195
- // Show row by default
196
- let showRow = true ;
197
-
198
- // Check existing filters
199
- for ( const filter of activeFilters ) {
200
- if ( row . getAttribute ( `data-${ filter } ` ) !== 'true' ) {
201
- showRow = false ;
202
- break ;
203
- }
204
- }
205
-
206
- // Check tag filter
207
- if ( showRow && ! allTagsSelected ) {
208
- const rowTags = ( row . getAttribute ( 'data-tags' ) || '' ) . split ( ',' ) . map ( t => t . trim ( ) ) . filter ( Boolean ) ;
209
- if ( ! rowTags . some ( tag => selectedTags . includes ( tag ) ) ) {
210
- showRow = false ;
211
- }
212
- }
213
-
214
- // Toggle row visibility
215
- row . style . display = showRow ? '' : 'none' ;
216
- if ( showRow ) visibleRowCount ++ ;
217
- } ) ;
218
-
219
- const noResultsMessage = leaderboard . querySelector ( '.no-results' ) ;
220
- // Show/hide no results message
221
- if ( visibleRowCount === 0 && ( activeFilters . size > 0 || ! allTagsSelected ) ) {
222
- noResultsMessage . style . display = 'table-row' ;
223
- } else {
224
- noResultsMessage . style . display = 'none' ;
225
- if ( visibleRowCount > 0 ) anyVisible = true ;
226
- }
227
- } ) ;
228
- } ;
180
+ }
0 commit comments