From 9b989f2260031fe7fbe92bbeb27c7815e20f7440 Mon Sep 17 00:00:00 2001 From: Stephen Smith Date: Wed, 12 Oct 2022 17:01:33 -0400 Subject: [PATCH] 16073: Process io file array and secondaryFiles into groups preserving main file association, indent secondaryFiles Arvados-DCO-1.1-Signed-off-by: Stephen Smith --- src/views/process-panel/process-io-card.tsx | 39 +++++++++++++-------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/views/process-panel/process-io-card.tsx b/src/views/process-panel/process-io-card.tsx index 0e93c9a6..45ba76b3 100644 --- a/src/views/process-panel/process-io-card.tsx +++ b/src/views/process-panel/process-io-card.tsx @@ -63,6 +63,7 @@ import { RootState } from 'store/store'; import { ProcessOutputCollectionFiles } from './process-output-collection-files'; import { Process } from 'store/processes/process'; import { navigateTo } from 'store/navigation/navigation-action'; +import classNames from 'classnames'; type CssRules = | "card" @@ -78,6 +79,7 @@ type CssRules = | "collectionLink" | "imagePreview" | "valArray" + | "secondaryVal" | "emptyValue" | "halfRow" | "symmetricTabs" @@ -160,6 +162,9 @@ const styles: StyleRulesCallback = (theme: ArvadosTheme) => ({ display: 'inline', } }, + secondaryVal: { + paddingLeft: '20px', + }, emptyValue: { color: theme.customs.colors.grey500, }, @@ -320,6 +325,7 @@ export type ProcessIOValue = { display: ReactElement; imageUrl?: string; collection?: ReactElement; + secondary?: boolean; } export type ProcessIOParameter = { @@ -398,7 +404,7 @@ const ProcessValuePreview = withStyles(styles)( {value.imageUrl && showImagePreview ? Inline Preview : ""} {value.imageUrl && !showImagePreview ? : ""} - + {value.display} @@ -497,7 +503,7 @@ export const getIOParamDisplayValue = (auth: AuthState, input: CommandInputParam ]; return files.length ? - files.map(file => fileToProcessIOValue(file, auth, pdh)) : + files.map((file, i) => fileToProcessIOValue(file, (i > 0), auth, pdh)) : [{display: }]; case isPrimitiveOfType(input, CWLType.DIRECTORY): @@ -540,18 +546,20 @@ export const getIOParamDisplayValue = (auth: AuthState, input: CommandInputParam [{display: }]; case isArrayOfType(input, CWLType.FILE): - const fileArrayMainFile = ((input as FileArrayCommandInputParameter).value || []); - const fileArraySecondaryFiles = fileArrayMainFile.map((file) => ( - ((file as unknown) as FileWithSecondaryFiles)?.secondaryFiles || [] - )).reduce((acc: File[], params: File[]) => (acc.concat(params)), []); - - const fileArrayFiles = [ - ...fileArrayMainFile, - ...fileArraySecondaryFiles - ]; - - return fileArrayFiles.length ? - fileArrayFiles.map(file => fileToProcessIOValue(file, auth, pdh)) : + const fileArrayMainFiles = ((input as FileArrayCommandInputParameter).value || []); + + // Convert each main file into separate arrays of ProcessIOValue to preserve secondaryFile grouping + const fileArrayValues = fileArrayMainFiles.map((mainFile: File): ProcessIOValue[] => { + const secondaryFiles = ((mainFile as unknown) as FileWithSecondaryFiles)?.secondaryFiles || []; + return [ + fileToProcessIOValue(mainFile, false, auth, pdh), + ...(secondaryFiles.map(file => fileToProcessIOValue(file, true, auth, pdh))) + ]; + // Reduce each mainFile/secondaryFile group into single array preserving ordering + }).reduce((acc: ProcessIOValue[], mainFile: ProcessIOValue[]) => (acc.concat(mainFile)), []); + + return fileArrayValues.length ? + fileArrayValues : [{display: }]; case isArrayOfType(input, CWLType.DIRECTORY): @@ -637,9 +645,10 @@ const directoryToProcessIOValue = (directory: Directory, auth: AuthState, pdh?: }; }; -const fileToProcessIOValue = (file: File, auth: AuthState, pdh?: string): ProcessIOValue => { +const fileToProcessIOValue = (file: File, secondary: boolean, auth: AuthState, pdh?: string): ProcessIOValue => { return { display: , + secondary, imageUrl: isFileImage(file.basename) ? getImageUrl(auth, file, pdh) : undefined, collection: , } -- 2.30.2