@@ -250,6 +250,8 @@ export class FilerPage {
250250 if ( tmpRemoteFiles && tmpRemoteFiles . files ) {
251251 templateVar . remoteFiles = tmpRemoteFiles . files ;
252252 }
253+ // Set fetch more files start index
254+ templateVar . remoteStartIndex = tmpRemoteFiles . startIndex ;
253255 }
254256 this . _templateAddFileFlag ( templateVar ) ;
255257 const renderContent = filerTemplate ( templateVar || this . baseTemplateVar ) ;
@@ -350,6 +352,10 @@ export class FilerPage {
350352 $ ( '#remote-reload' ) . on ( 'click' , this . refreshRemoteDirectory ) ;
351353 $ ( '#local-reload' ) . on ( 'click' , this . refreshLocalDirectory ) ;
352354 $ ( '#download-button' ) . on ( 'click' , this . onClickDownload ) ;
355+ $ ( '#remote-file-row-more-item' ) . on ( 'click' , ( event ) => {
356+ const startIndex = $ ( event . currentTarget ) . attr ( 'data-start-index' ) ;
357+ this . onClickMoreRemoteFiles ( startIndex ) ;
358+ } ) ;
353359
354360 // Show FlashAir file loading
355361 if ( templateVar . isFetchingFlashairs || templateVar . isFetchingRemoteFileList ) {
@@ -411,7 +417,11 @@ export class FilerPage {
411417 }
412418 changeRemoteDirecory ( remoteNextDir , useCache ) {
413419 this . iotHubAction . requestRemoteFileList ( Object . assign (
414- appMain . store . getState ( ) , { remoteCurDir : remoteNextDir , selectedRemoteFile : null }
420+ appMain . store . getState ( ) , {
421+ remoteCurDir : remoteNextDir ,
422+ selectedRemoteFile : null ,
423+ isMoreRemoteFiles : false
424+ }
415425 , useCache )
416426 )
417427 . catch ( response => {
@@ -480,6 +490,15 @@ export class FilerPage {
480490 }
481491 } ) ;
482492 }
493+ onClickMoreRemoteFiles ( startIndex ) {
494+ this . iotHubAction . requestRemoteFileList ( appMain . store . getState ( ) , true , startIndex )
495+ . catch ( response => {
496+ log . error ( response ) ;
497+ if ( response ) {
498+ this . notifyMessage ( 'danger' , resources [ this . locale ] . common_msg_process_failure ) ;
499+ }
500+ } ) ;
501+ }
483502 watchRequestJob ( ) {
484503 const curState = appMain . store . getState ( ) ;
485504 this . iotHubAction . getJobs ( curState )
@@ -533,6 +552,31 @@ export class FilerPage {
533552 }
534553 }
535554 }
555+ _comparetorFiles ( a , b ) {
556+ // sort by mode(directory or file)
557+ // directory than file
558+ if ( a . m < b . m ) {
559+ return - 1 ;
560+ } else if ( b . m < a . m ) {
561+ return 1 ;
562+ }
563+ // sort by name
564+ if ( a . n . hasOwnProperty ( 'localeCompare' ) ) {
565+ const nameCmp = a . n . localeCompare ( b . n ) ;
566+ if ( nameCmp !== 0 ) {
567+ // ASC sort
568+ return nameCmp ;
569+ }
570+ }
571+ // ASC sort
572+ if ( a . n < b . n ) {
573+ return - 1 ;
574+ } else if ( b . n < a . n ) {
575+ return 1 ;
576+ }
577+ // sort by timestamp
578+ return a . u - b . u ;
579+ }
536580 _fetchRemoteFileList ( job ) {
537581 const curState = appMain . store . getState ( ) ;
538582 if ( ( job . response )
@@ -542,49 +586,59 @@ export class FilerPage {
542586 let fetchedDir = curRemoteFiles . filter ( dir => {
543587 return dir . path !== job . request . arguments . current_path ;
544588 } ) ;
545- job . response . result . sort ( ( a , b ) => {
546- // sort by mode(directory or file)
547- // directory than file
548- if ( a . m < b . m ) {
549- return - 1 ;
550- } else if ( b . m < a . m ) {
551- return 1 ;
552- }
553- // sort by name
554- if ( a . n . hasOwnProperty ( 'localeCompare' ) ) {
555- const nameCmp = a . n . localeCompare ( b . n ) ;
556- if ( nameCmp !== 0 ) {
557- // ASC sort
558- return nameCmp ;
559- }
560- }
561- // ASC sort
562- if ( a . n < b . n ) {
563- return - 1 ;
564- } else if ( b . n < a . n ) {
565- return 1 ;
566- }
567- // sort by timestamp
568- return a . u - b . u ;
589+ let prevDir = curRemoteFiles . filter ( dir => {
590+ return dir . path === job . request . arguments . current_path ;
569591 } ) ;
592+ if ( prevDir . length > 0 ) {
593+ prevDir = prevDir [ 0 ] ;
594+ } else {
595+ prevDir = null ;
596+ }
570597 job . response . result . forEach ( ( file , index , array ) => {
571598 // Mapping shot protperty to regureler property
572599 array [ index ] . name = file . n ;
573600 array [ index ] . mode = file . m ;
574601 // formatting modification timestamp
575602 array [ index ] . modification = dateFormat . format ( fatDateToDate ( file . u ) , 'yyyy/MM/dd' ) ;
576603 } ) ;
604+
605+ let nextFiles = job . response . result ;
606+ let isMoreFiles = false ;
607+ // Cut fetch size
608+ if ( nextFiles . length > FlashAIrScript . LIST_FETCH_MAX ) {
609+ nextFiles = nextFiles . slice ( 0 , FlashAIrScript . LIST_FETCH_MAX ) ;
610+ isMoreFiles = true ;
611+ }
612+ // Add previous directory items
613+ if ( prevDir && prevDir . startIndex > 0 ) {
614+ nextFiles = prevDir . files . concat ( nextFiles ) ;
615+ // Remove parent directory item
616+ nextFiles . shift ( ) ;
617+ // Merge and Uniq
618+ const newFileMap = new Map ( ) ;
619+ nextFiles . forEach ( file => newFileMap . set ( file . name , file ) ) ;
620+ nextFiles . length = 0 ;
621+ for ( let file of newFileMap . values ( ) ) {
622+ nextFiles . push ( file ) ;
623+ }
624+ }
625+ let remoteFileStartIndex = nextFiles . length ;
626+ nextFiles . sort ( this . _comparetorFiles ) ;
577627 // Add move parent directory item
578- job . response . result . unshift ( {
628+ nextFiles . unshift ( {
579629 name : Filer . files . special . PARENT_DIR ,
580630 mode : Filer . files . mode . DIRECTORY ,
581631 modification : ''
582632 } ) ;
583633 fetchedDir = fetchedDir . concat ( [ {
584634 path : job . request . arguments . current_path ,
585- files : job . response . result
635+ startIndex : remoteFileStartIndex ,
636+ files : nextFiles
586637 } ] ) ;
587- this . iotHubAction . updateFiles ( { remoteFiles : fetchedDir } ) ;
638+ this . iotHubAction . updateFiles ( {
639+ remoteFiles : fetchedDir ,
640+ isMoreRemoteFiles : isMoreFiles
641+ } ) ;
588642 this . iotHubAction . deleteJob ( curState , job )
589643 . catch ( message => {
590644 log . error ( message ) ;
0 commit comments