@@ -124,7 +124,9 @@ var DEFAULT_STATE = {
124124 s3FileFetchProgress : 0 ,
125125 // Number to track progress of batch fetches for s3 files
126126 s3Files : {
127+ maxNumFilesSelected : 60000 ,
127128 value : [ ] ,
129+ valueMap : { } ,
128130 cachedValues : [ ] ,
129131 // Where all fetched file records are cached
130132 validValues : [ ] ,
@@ -284,7 +286,7 @@ var newStateIsValid = function newStateIsValid(key, value) {
284286 if ( ! VALIDATABLE_STATE_KEYS . includes ( key ) ) {
285287 return false ;
286288 }
287- var idList = [ ] ;
289+ var idList = { } ;
288290 switch ( key ) {
289291 case 'sites' :
290292 return newStateIsAllowable ( key , value ) && Array . isArray ( validValues ) && value . length > 0 && value . every ( function ( site ) {
@@ -298,11 +300,11 @@ var newStateIsValid = function newStateIsValid(key, value) {
298300 } ) ) {
299301 return false ;
300302 }
301- idList = validValues . map ( function ( fileObj ) {
302- return fileObj . url ;
303+ validValues . forEach ( function ( fileObj ) {
304+ idList [ fileObj . url ] = true ;
303305 } ) ;
304306 return newStateIsAllowable ( key , value ) && value . length > 0 && value . every ( function ( id ) {
305- return idList . includes ( id ) ;
307+ return idList [ id ] || false ;
306308 } ) ;
307309 default :
308310 return newStateIsAllowable ( key , value ) && ( ! Array . isArray ( validValues ) || validValues . includes ( value ) ) ;
@@ -523,15 +525,50 @@ var getInitialStateFromProps = function getInitialStateFromProps(props) {
523525 // Done!
524526 return initialState ;
525527} ;
526- var getS3FilesFilteredFileCount = function getS3FilesFilteredFileCount ( state ) {
527- return state . s3Files . validValues . filter ( function ( row ) {
528- return Object . keys ( state . s3Files . filters ) . every ( function ( col ) {
528+ var getS3FilesFilterFunction = function getS3FilesFilterFunction ( state ) {
529+ return function ( row ) {
530+ var allowValue = true ;
531+ var hasProvisionalDataStep = state . requiredSteps . some ( function ( step ) {
532+ return step . key === 'provisionalData' ;
533+ } ) ;
534+ var excludeProvisionalData = hasProvisionalDataStep && state . provisionalData . value === 'exclude' ;
535+ if ( excludeProvisionalData ) {
536+ allowValue = ( 0 , _typeUtil . isStringNonEmpty ) ( row . release ) && ! _ReleaseService . default . isNonRelease ( row . release ) ;
537+ }
538+ var matchesFilters = Object . keys ( state . s3Files . filters ) . every ( function ( col ) {
529539 if ( col === 'name' ) {
530540 return ! state . s3Files . filters . name . length || row . name . includes ( state . s3Files . filters . name ) ;
531541 }
532542 return ! state . s3Files . filters [ col ] . length || state . s3Files . filters [ col ] . includes ( row [ col ] ) ;
533543 } ) ;
534- } ) . length ;
544+ return matchesFilters && allowValue ;
545+ } ;
546+ } ;
547+ var getS3FilesFilteredFileCount = function getS3FilesFilteredFileCount ( state ) {
548+ var filtered = state . s3Files . validValues . filter ( getS3FilesFilterFunction ( state ) ) ;
549+ return filtered . length ;
550+ } ;
551+ var calcS3FilesSummaryState = function calcS3FilesSummaryState ( previousState , action ) {
552+ var newState = _extends ( { } , previousState ) ;
553+ var s3FilesIdx = newState . requiredSteps . findIndex ( function ( step ) {
554+ return step . key === 's3Files' ;
555+ } ) ;
556+ // If we didn't already update the total size then recalculate it
557+ if ( action . type !== 'setIndividualS3FileSelected' ) {
558+ newState . s3Files . totalSize = newState . s3Files . value . map ( function ( id ) {
559+ return newState . s3Files . bytesByUrl [ id ] ;
560+ } ) . reduce ( function ( a , b ) {
561+ return a + b ;
562+ } , 0 ) ;
563+ }
564+ // Step is only complete when there's a selection that's not too big
565+ newState . s3Files . estimatedPostSize = estimatePostSize ( newState . s3Files , newState . sites ) ;
566+ newState . s3Files . isValid = newState . s3Files . value . length > 0 && newState . s3Files . estimatedPostSize < _manifestUtil . MAX_POST_BODY_SIZE ;
567+ newState . requiredSteps [ s3FilesIdx ] . isComplete = newState . s3Files . isValid ;
568+ newState . allStepsComplete = newState . requiredSteps . every ( function ( step ) {
569+ return step . isComplete || step . isComplete === null ;
570+ } ) ;
571+ return newState ;
535572} ;
536573
537574// Generate a new full state object with a new value and isValid boolean for the
@@ -558,44 +595,61 @@ var getAndValidateNewS3FilesState = function getAndValidateNewS3FilesState(previ
558595 return newState ;
559596 }
560597 newState . s3Files . value = action . value ;
598+ newState . s3Files . valueMap = { } ;
599+ if ( ( 0 , _typeUtil . existsNonEmpty ) ( newState . s3Files . value ) ) {
600+ newState . s3Files . value . forEach ( function ( value ) {
601+ newState . s3Files . valueMap [ value ] = true ;
602+ } ) ;
603+ }
561604 break ;
562605 case 'setValidatableValue' :
563606 if ( ! newStateIsAllowable ( action . key , action . value ) ) {
564607 return newState ;
565608 }
566609 newState . s3Files . value = action . value ;
610+ newState . s3Files . valueMap = { } ;
611+ if ( ( 0 , _typeUtil . existsNonEmpty ) ( newState . s3Files . value ) ) {
612+ newState . s3Files . value . forEach ( function ( value ) {
613+ newState . s3Files . valueMap [ value ] = true ;
614+ } ) ;
615+ }
567616 newState . s3Files . validValues . forEach ( function ( file , idx ) {
568- newState . s3Files . validValues [ idx ] . tableData . checked = newState . s3Files . value . includes ( file . url ) ;
617+ newState . s3Files . validValues [ idx ] . tableData . checked = newState . s3Files . valueMap [ file . url ] || false ;
569618 } ) ;
570619 break ;
571620 case 'setS3FilesValueSelectAll' :
572621 newState . s3Files . value = newState . s3Files . validValues . map ( function ( file ) {
573622 return file . url ;
574623 } ) ;
624+ newState . s3Files . valueMap = { } ;
625+ if ( ( 0 , _typeUtil . existsNonEmpty ) ( newState . s3Files . value ) ) {
626+ newState . s3Files . value . forEach ( function ( value ) {
627+ newState . s3Files . valueMap [ value ] = true ;
628+ } ) ;
629+ }
575630 newState . s3Files . validValues . forEach ( function ( file , idx ) {
576631 newState . s3Files . validValues [ idx ] . tableData . checked = true ;
577632 } ) ;
578633 break ;
579634 case 'setS3FilesValueSelectNone' :
580635 newState . s3Files . value = [ ] ;
636+ newState . s3Files . valueMap = { } ;
581637 newState . s3Files . validValues . forEach ( function ( file , idx ) {
582638 newState . s3Files . validValues [ idx ] . tableData . checked = false ;
583639 } ) ;
584640 break ;
585641 case 'setS3FilesValueSelectFiltered' :
586- newState . s3Files . value = newState . s3Files . validValues . filter ( function ( row ) {
587- return Object . keys ( newState . s3Files . filters ) . every ( function ( col ) {
588- if ( col === 'name' ) {
589- return ! newState . s3Files . filters . name . length || row . name . includes ( newState . s3Files . filters . name ) ; // eslint-disable-line max-len
590- }
591-
592- return ! newState . s3Files . filters [ col ] . length || newState . s3Files . filters [ col ] . includes ( row [ col ] ) ; // eslint-disable-line max-len
593- } ) ;
594- } ) . map ( function ( file ) {
642+ newState . s3Files . value = newState . s3Files . validValues . filter ( getS3FilesFilterFunction ( newState ) ) . map ( function ( file ) {
595643 return file . url ;
596644 } ) ;
645+ newState . s3Files . valueMap = { } ;
646+ if ( ( 0 , _typeUtil . existsNonEmpty ) ( newState . s3Files . value ) ) {
647+ newState . s3Files . value . forEach ( function ( value ) {
648+ newState . s3Files . valueMap [ value ] = true ;
649+ } ) ;
650+ }
597651 newState . s3Files . validValues . forEach ( function ( file , idx ) {
598- newState . s3Files . validValues [ idx ] . tableData . checked = newState . s3Files . value . includes ( file . url ) ; // eslint-disable-line max-len
652+ newState . s3Files . validValues [ idx ] . tableData . checked = newState . s3Files . valueMap [ file . url ] || false ; // eslint-disable-line max-len
599653 } ) ;
600654
601655 break ;
@@ -611,36 +665,21 @@ var getAndValidateNewS3FilesState = function getAndValidateNewS3FilesState(previ
611665 // just add/subtract the size of the file specified
612666 if ( action . selected ) {
613667 newState . s3Files . value . push ( action . url ) ;
668+ newState . s3Files . valueMap [ action . url ] = true ;
614669 newState . s3Files . totalSize += newState . s3Files . bytesByUrl [ action . url ] ;
615670 } else {
616671 if ( newState . s3Files . value . indexOf ( action . url ) === - 1 ) {
617672 return newState ;
618673 }
619674 newState . s3Files . value . splice ( newState . s3Files . value . indexOf ( action . url ) , 1 ) ;
675+ delete newState . s3Files . valueMap [ action . url ] ;
620676 newState . s3Files . totalSize -= newState . s3Files . bytesByUrl [ action . url ] ;
621677 }
622678 break ;
623679 default :
624680 return newState ;
625681 }
626-
627- // If we didn't already update the total size then recalculate it
628- if ( action . type !== 'setIndividualS3FileSelected' ) {
629- newState . s3Files . totalSize = newState . s3Files . value . map ( function ( id ) {
630- return newState . s3Files . bytesByUrl [ id ] ;
631- } ) . reduce ( function ( a , b ) {
632- return a + b ;
633- } , 0 ) ;
634- }
635-
636- // Step is only complete when there's a selection that's not too big
637- newState . s3Files . estimatedPostSize = estimatePostSize ( newState . s3Files , newState . sites ) ;
638- newState . s3Files . isValid = newState . s3Files . value . length > 0 && newState . s3Files . estimatedPostSize < _manifestUtil . MAX_POST_BODY_SIZE ;
639- newState . requiredSteps [ s3FilesIdx ] . isComplete = newState . s3Files . isValid ;
640- newState . allStepsComplete = newState . requiredSteps . every ( function ( step ) {
641- return step . isComplete || step . isComplete === null ;
642- } ) ;
643- return newState ;
682+ return calcS3FilesSummaryState ( newState , action ) ;
644683} ;
645684
646685// Generate new s3Files.validValues and s3Files filter values in state.
@@ -689,31 +728,29 @@ var regenerateS3FilesFiltersAndValidValues = function regenerateS3FilesFiltersAn
689728 } ) . map ( function ( file ) {
690729 return _extends ( { } , file , {
691730 tableData : {
692- checked : updated . s3Files . value . includes ( file . url )
731+ checked : updated . s3Files . valueMap [ file . url ] || false
693732 }
694733 } ) ;
695734 } ) ;
696735 // If cachedValues and validValues differ in size then rebuild valueLookups for
697736 // filters, adjust filter selections to suit, and regenerate filtered file count.
698737 var filterKeys = Object . keys ( updated . s3Files . valueLookups || { } ) ;
699- if ( updated . s3Files . validValues . length < updated . s3Files . cachedValues . length ) {
700- filterKeys . forEach ( function ( key ) {
701- updated . s3Files . valueLookups [ key ] = { } ;
702- } ) ;
703- updated . s3Files . validValues . forEach ( function ( file ) {
704- filterKeys . forEach ( function ( lookup ) {
705- if ( typeof file [ lookup ] === 'undefined' ) {
706- return ;
707- }
708- updated . s3Files . valueLookups [ lookup ] [ file [ lookup ] ] = file [ lookup ] || '(none)' ;
709- } ) ;
738+ filterKeys . forEach ( function ( key ) {
739+ updated . s3Files . valueLookups [ key ] = { } ;
740+ } ) ;
741+ updated . s3Files . validValues . forEach ( function ( file ) {
742+ filterKeys . forEach ( function ( lookup ) {
743+ if ( typeof file [ lookup ] === 'undefined' ) {
744+ return ;
745+ }
746+ updated . s3Files . valueLookups [ lookup ] [ file [ lookup ] ] = file [ lookup ] || '(none)' ;
710747 } ) ;
711- filterKeys . forEach ( function ( key ) {
712- updated . s3Files . filters [ key ] = updated . s3Files . filters [ key ] . filter ( function ( filterVal ) {
713- return Object . keys ( updated . s3Files . valueLookups [ key ] ) . includes ( filterVal ) ;
714- } ) ;
748+ } ) ;
749+ filterKeys . forEach ( function ( key ) {
750+ updated . s3Files . filters [ key ] = updated . s3Files . filters [ key ] . filter ( function ( filterVal ) {
751+ return Object . keys ( updated . s3Files . valueLookups [ key ] ) . includes ( filterVal ) ;
715752 } ) ;
716- }
753+ } ) ;
717754 updated . s3Files . filteredFileCount = getS3FilesFilteredFileCount ( updated ) ;
718755 // Create an action to send to the reducer helper to set an updated value and revalidate.
719756 var action = {
@@ -753,6 +790,38 @@ var getAndValidateNewState = function getAndValidateNewState(previousState, acti
753790 value : action . value ,
754791 isValid : valueIsValid
755792 } ) ;
793+ var hasProvDataStep = newState . requiredSteps . some ( function ( step ) {
794+ return step . key === 'provisionalData' ;
795+ } ) ;
796+ var hasS3FilesStep = newState . requiredSteps . some ( function ( step ) {
797+ return step . key === 's3Files' ;
798+ } ) ;
799+ if ( hasProvDataStep && hasS3FilesStep && action . key === 'provisionalData' ) {
800+ if ( action . value === 'exclude' ) {
801+ // Go through validValues, uncheck any provisional when set to exclude
802+ if ( ( 0 , _typeUtil . existsNonEmpty ) ( newState . s3Files . validValues ) ) {
803+ newState . s3Files . value = [ ] ;
804+ newState . s3Files . valueMap = { } ;
805+ newState . s3Files . validValues = newState . s3Files . validValues . map ( function ( value ) {
806+ var isProv = _ReleaseService . default . isProv ( value . release ) ;
807+ if ( isProv ) {
808+ return _extends ( { } , value , {
809+ tableData : _extends ( { } , value . tableData , {
810+ checked : false
811+ } )
812+ } ) ;
813+ }
814+ if ( value . tableData . checked ) {
815+ newState . s3Files . value . push ( value . url ) ;
816+ newState . s3Files . valueMap [ value . url ] = true ;
817+ }
818+ return value ;
819+ } ) ;
820+ newState = calcS3FilesSummaryState ( newState , action ) ;
821+ }
822+ }
823+ newState . s3Files . filteredFileCount = getS3FilesFilteredFileCount ( newState ) ;
824+ }
756825 newState . requiredSteps = previousState . requiredSteps . map ( function ( step ) {
757826 var requiredStateKeys = ALL_STEPS [ step . key ] ? ALL_STEPS [ step . key ] . requiredStateKeys : [ ] ;
758827 return step . isComplete === null ? _extends ( { } , step ) : _extends ( { } , step , {
0 commit comments