Skip to content

Commit 78da765

Browse files
authored
v2.5.2 (#69)
* fix AOP prov step handling, performance, selection limit * handle render, initialization of filters * fix styling of prov data message in AOP workflow * prepare v2.5.2
1 parent a1c89e8 commit 78da765

File tree

13 files changed

+2876
-1995
lines changed

13 files changed

+2876
-1995
lines changed

lib/components/DownloadDataContext/DownloadDataContext.d.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ export function getTestableItems(): {
4545
s3FileFetches: {};
4646
s3FileFetchProgress: number;
4747
s3Files: {
48+
maxNumFilesSelected: number;
4849
value: never[];
50+
valueMap: {};
4951
cachedValues: never[];
5052
validValues: never[];
5153
isValid: boolean;
@@ -192,7 +194,9 @@ declare function useDownloadDataState(): {
192194
s3FileFetches: {};
193195
s3FileFetchProgress: number;
194196
s3Files: {
197+
maxNumFilesSelected: number;
195198
value: never[];
199+
valueMap: {};
196200
cachedValues: never[];
197201
validValues: never[];
198202
isValid: boolean;
@@ -272,7 +276,9 @@ declare function useDownloadDataState(): {
272276
s3FileFetches: {};
273277
s3FileFetchProgress: number;
274278
s3Files: {
279+
maxNumFilesSelected: number;
275280
value: never[];
281+
valueMap: {};
276282
cachedValues: never[];
277283
validValues: never[];
278284
isValid: boolean;
@@ -356,8 +362,10 @@ declare namespace DEFAULT_STATE {
356362
export const s3FileFetches: {};
357363
export const s3FileFetchProgress: number;
358364
export namespace s3Files {
365+
export const maxNumFilesSelected: number;
359366
const value_1: never[];
360367
export { value_1 as value };
368+
export const valueMap: {};
361369
export const cachedValues: never[];
362370
export const validValues: never[];
363371
export const isValid: boolean;

lib/components/DownloadDataContext/DownloadDataContext.js

Lines changed: 123 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -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, {

lib/components/DownloadStepForm/DownloadStepForm.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
declare function DownloadStepForm(props: any): any;
1+
export default DownloadStepForm;
2+
declare function DownloadStepForm(props: any): JSX.Element | null;
23
declare namespace DownloadStepForm {
34
namespace propTypes {
45
const stepKey: PropTypes.Validator<string>;
@@ -15,5 +16,4 @@ declare namespace DownloadStepForm {
1516
export { renderDownloadButton_1 as renderDownloadButton };
1617
}
1718
}
18-
export default DownloadStepForm;
1919
import PropTypes from "prop-types";

0 commit comments

Comments
 (0)