@@ -140,41 +140,55 @@ function safeUpdateDashboard(data) {
140140 : ( Array . isArray ( data . servers ) ? data . servers : [ ] ) ;
141141
142142 if ( resolverRows . length > 0 ) {
143- resolverRows . forEach ( resolver => {
143+ // Sort by total queries (desc), then avg response, name, and last seen.
144+ const sortedResolvers = resolverRows . slice ( ) . sort ( ( a , b ) => {
145+ const totalQueries = resolver => {
146+ if ( typeof resolver . total_queries === 'number' ) {
147+ return resolver . total_queries ;
148+ }
149+ if ( typeof resolver . queries === 'number' ) {
150+ return resolver . queries ;
151+ }
152+ return - 1 ;
153+ } ;
154+ const avgResponse = resolver => {
155+ return typeof resolver . avg_response_ms === 'number' ? resolver . avg_response_ms : Number . POSITIVE_INFINITY ;
156+ } ;
157+ const name = resolver => ( resolver . name || '' ) . toLowerCase ( ) ;
158+ const lastSeen = resolver => {
159+ const value = resolver . last_update ;
160+ if ( ! value ) {
161+ return 0 ;
162+ }
163+ const parsed = Date . parse ( value ) ;
164+ return Number . isNaN ( parsed ) ? 0 : parsed ;
165+ } ;
166+
167+ return (
168+ ( totalQueries ( b ) - totalQueries ( a ) ) ||
169+ ( avgResponse ( a ) - avgResponse ( b ) ) ||
170+ ( name ( a ) > name ( b ) ? 1 : name ( a ) < name ( b ) ? - 1 : 0 ) ||
171+ ( lastSeen ( b ) - lastSeen ( a ) )
172+ ) ;
173+ } ) ;
174+
175+ sortedResolvers . forEach ( resolver => {
144176 const row = resolverTable . insertRow ( ) ;
145177 row . insertCell ( 0 ) . textContent = resolver . name || 'Unknown' ;
146178 row . insertCell ( 1 ) . textContent = formatStatus ( resolver . status ) ;
147179 row . insertCell ( 2 ) . textContent = formatPercent ( resolver . success_rate ) ;
148180 row . insertCell ( 3 ) . textContent = formatNumber ( resolver . total_queries !== undefined ? resolver . total_queries : resolver . queries ) ;
149181 row . insertCell ( 4 ) . textContent = formatNumber ( resolver . failed_queries ) ;
150182 row . insertCell ( 5 ) . textContent = formatMilliseconds ( resolver . avg_response_ms ) ;
151- row . insertCell ( 6 ) . textContent = formatMilliseconds ( resolver . avg_rtt_ms ) ;
152- row . insertCell ( 7 ) . textContent = formatTimestamp ( resolver . last_update ) ;
183+ row . insertCell ( 6 ) . textContent = formatTimestamp ( resolver . last_update ) ;
153184 } ) ;
154185 } else {
155186 const row = resolverTable . insertRow ( ) ;
156187 const cell = row . insertCell ( 0 ) ;
157- cell . colSpan = 8 ;
188+ cell . colSpan = 7 ;
158189 cell . textContent = 'No resolver data yet' ;
159190 }
160191
161- // Update server performance table
162- const serverTable = document . getElementById ( 'server-table' ) . getElementsByTagName ( 'tbody' ) [ 0 ] ;
163- serverTable . innerHTML = '' ;
164- if ( data . servers && Array . isArray ( data . servers ) && data . servers . length > 0 ) {
165- data . servers . forEach ( server => {
166- const row = serverTable . insertRow ( ) ;
167- row . insertCell ( 0 ) . textContent = server . name || 'Unknown' ;
168- row . insertCell ( 1 ) . textContent = formatNumber ( server . queries ) ;
169- row . insertCell ( 2 ) . textContent = formatMilliseconds ( server . avg_response_ms ) ;
170- } ) ;
171- } else {
172- const row = serverTable . insertRow ( ) ;
173- const cell = row . insertCell ( 0 ) ;
174- cell . colSpan = 3 ;
175- cell . textContent = 'No server samples yet' ;
176- }
177-
178192 // Update query types table
179193 const queryTypesTable = document . getElementById ( 'query-types-table' ) . getElementsByTagName ( 'tbody' ) [ 0 ] ;
180194 queryTypesTable . innerHTML = '' ;
0 commit comments