@@ -239,6 +239,7 @@ class Spinner {
239239 constructor ( ) {
240240 this . spinner = this . createSpinner ( ) ;
241241 this . debounceTimeout = null ;
242+ this . isHiding = false ;
242243 }
243244
244245 createSpinner ( ) {
@@ -248,42 +249,47 @@ class Spinner {
248249 }
249250
250251 show ( ) {
251- document . querySelector ( ".navbar" ) . append ( this . spinner ) ;
252+ this . isHiding = false ;
253+ const contentNode = document . querySelector ( ".content" ) ;
254+ contentNode . appendChild ( this . spinner ) ;
255+ // Reset spinner appearance
252256 this . spinner . classList . remove ( "spinner-fade-out" ) ;
253257 this . spinner . style . transform = "scaleX(0.0)" ;
254258 setTimeout ( ( ) => {
255259 this . spinner . style . transform = "scaleX(0.10)" ;
256260 } , 100 ) ;
257261 }
258262
259- remove ( ) {
260- const contentNode = document . querySelector ( ".navbar" ) ;
261- if ( contentNode . contains ( this . spinner ) ) {
262- contentNode . removeChild ( this . spinner ) ;
263- }
264- }
265-
266263 hide ( ) {
267- const contentNode = document . querySelector ( ".navbar" ) ;
268- if ( contentNode . contains ( this . spinner ) ) {
269- this . spinner . addEventListener ( "transitionend" , ( event ) => {
270- if ( event . propertyName === "transform" ) {
271- this . spinner . classList . add ( "spinner-fade-out" ) ;
272- }
273- } , { once : true } ) ;
274- this . spinner . addEventListener ( "transitionend" , ( event ) => {
275- if ( event . propertyName === "opacity" ) {
276- contentNode . removeChild ( this . spinner ) ;
277- }
278- } , { once : true } ) ;
279- }
264+ if ( this . isHiding ) { return ; } ;
265+ this . isHiding = true ;
266+
267+ const contentNode = document . querySelector ( ".content" ) ;
268+ if ( ! contentNode . contains ( this . spinner ) ) { return ; } ;
269+
270+ // Expand spinner to full width
271+ this . spinner . style . transform = "scaleX(1.0)" ;
272+
273+ let transformDone = false ;
274+ this . spinner . ontransitionend = ( event ) => {
275+ if ( ! transformDone && event . propertyName === "transform" ) {
276+ // When transform finishes, trigger the fade-out
277+ transformDone = true ;
278+ this . spinner . classList . add ( "spinner-fade-out" ) ;
279+ } else if ( transformDone && event . propertyName === "opacity" ) {
280+ // When opacity transition ends, remove the spinner
281+ contentNode . removeChild ( this . spinner ) ;
282+ this . spinner . ontransitionend = null ;
283+ }
284+ } ;
280285 }
281286
282287 updateProgress ( percentage ) {
283- const minProgress = 10 ,
284- progress = Math . max ( percentage , minProgress ) ;
288+ if ( this . isHiding ) { return ; } ;
289+
290+ const minProgress = 10 ;
291+ const progress = Math . max ( percentage , minProgress ) ;
285292
286- // Set a debounce to prevent rapid updates and bar jitter
287293 clearTimeout ( this . debounceTimeout ) ;
288294 this . debounceTimeout = setTimeout ( ( ) => {
289295 this . spinner . style . transform = `scaleX(${ progress / 100 } )` ;
@@ -725,7 +731,6 @@ class ParquetProcessor {
725731 totalGroups = rowGroupItems . length ;
726732 if ( totalGroups === 0 ) {
727733 console . warn ( "No data found for the given ID." ) ;
728- map . spinner . remove ( ) ;
729734 return results ;
730735 }
731736
0 commit comments