<ProcessIORaw data={raw} />
</div>}
</>}
- {raw && Object.keys(raw).length === 0 && <Grid container item alignItems='center' justify='center'>
+ {!loading && !hasRaw && !hasParams && <Grid container item alignItems='center' justify='center'>
<DefaultView messages={["No parameters found"]} />
</Grid>}
</>) :
...(mainFile && !(Array.isArray(mainFile) && mainFile.length === 0) ? [mainFile] : []),
...secondaryFiles
];
+ const mainFilePdhUrl = mainFile ? getResourcePdhUrl(mainFile, pdh) : "";
return files.length ?
- files.map((file, i) => fileToProcessIOValue(file, (i > 0), auth, pdh)) :
+ files.map((file, i) => fileToProcessIOValue(file, (i > 0), auth, pdh, (i > 0 ? mainFilePdhUrl : ""))) :
[{display: <EmptyValue />}];
case isPrimitiveOfType(input, CWLType.DIRECTORY):
case isArrayOfType(input, CWLType.FILE):
const fileArrayMainFiles = ((input as FileArrayCommandInputParameter).value || []);
+ const firstMainFilePdh = (fileArrayMainFiles.length > 0 && fileArrayMainFiles[0]) ? getResourcePdhUrl(fileArrayMainFiles[0], pdh) : "";
// Convert each main file into separate arrays of ProcessIOValue to preserve secondaryFile grouping
- const fileArrayValues = fileArrayMainFiles.map((mainFile: File): ProcessIOValue[] => {
+ const fileArrayValues = fileArrayMainFiles.map((mainFile: File, i): ProcessIOValue[] => {
const secondaryFiles = ((mainFile as unknown) as FileWithSecondaryFiles)?.secondaryFiles || [];
return [
- fileToProcessIOValue(mainFile, false, auth, pdh),
- ...(secondaryFiles.map(file => fileToProcessIOValue(file, true, auth, pdh)))
+ // Pass firstMainFilePdh to secondary files and every main file besides the first to hide pdh if equal
+ ...(mainFile ? [fileToProcessIOValue(mainFile, false, auth, pdh, i > 0 ? firstMainFilePdh : "")] : []),
+ ...(secondaryFiles.map(file => fileToProcessIOValue(file, true, auth, pdh, firstMainFilePdh)))
];
// Reduce each mainFile/secondaryFile group into single array preserving ordering
}).reduce((acc: ProcessIOValue[], mainFile: ProcessIOValue[]) => (acc.concat(mainFile)), []);
pdh?: string;
}
-const KeepUrlBase = withStyles(styles)(({auth, res, pdh, classes}: KeepUrlProps & WithStyles<CssRules>) => {
+const getResourcePdhUrl = (res: File | Directory, pdh?: string): string => {
const keepUrl = getKeepUrl(res, pdh);
- const pdhUrl = keepUrl ? keepUrl.split('/').slice(0, 1)[0] : '';
+ return keepUrl ? keepUrl.split('/').slice(0, 1)[0] : '';
+};
+
+const KeepUrlBase = withStyles(styles)(({auth, res, pdh, classes}: KeepUrlProps & WithStyles<CssRules>) => {
+ const pdhUrl = getResourcePdhUrl(res, pdh);
// Passing a pdh always returns a relative wb2 collection url
const pdhWbPath = getNavUrl(pdhUrl, auth);
return pdhUrl && pdhWbPath ?
const keepUrlPath = keepUrlParts.length > 1 ? keepUrlParts.slice(1).join('/') : '';
const keepUrlPathNav = getKeepNavUrl(auth, res, pdh);
- return keepUrlPath && keepUrlPathNav ?
- <Tooltip title={"View in keep-web"}><a className={classes.keepLink} href={keepUrlPathNav} target="_blank" rel="noopener noreferrer">{keepUrlPath}</a></Tooltip> :
- // Show No value for root collection io that lacks path part
+ return keepUrlPathNav ?
+ <Tooltip title={"View in keep-web"}><a className={classes.keepLink} href={keepUrlPathNav} target="_blank" rel="noopener noreferrer">{keepUrlPath || '/'}</a></Tooltip> :
<EmptyValue />;
});
};
};
-const fileToProcessIOValue = (file: File, secondary: boolean, auth: AuthState, pdh?: string): ProcessIOValue => {
+const fileToProcessIOValue = (file: File, secondary: boolean, auth: AuthState, pdh: string | undefined, mainFilePdh: string): ProcessIOValue => {
+ const resourcePdh = getResourcePdhUrl(file, pdh);
return {
display: <KeepUrlPath auth={auth} res={file} pdh={pdh}/>,
secondary,
imageUrl: isFileImage(file.basename) ? getImageUrl(auth, file, pdh) : undefined,
- collection: <KeepUrlBase auth={auth} res={file} pdh={pdh}/>,
+ collection: (resourcePdh !== mainFilePdh) ? <KeepUrlBase auth={auth} res={file} pdh={pdh}/> : <></>,
}
};