From fe41be6c6bcc21fc0c7c6450485a1d1f7955ebe5 Mon Sep 17 00:00:00 2001 From: Stephen Smith Date: Wed, 2 Nov 2022 17:17:18 -0400 Subject: [PATCH] 19684: Catch object values in primitive parameters and external values in files/directories, show unsupported value message Arvados-DCO-1.1-Signed-off-by: Stephen Smith --- cypress/integration/process.spec.js | 115 ++++++++++++++++++-- src/views/process-panel/process-io-card.tsx | 58 ++++++---- 2 files changed, 142 insertions(+), 31 deletions(-) diff --git a/cypress/integration/process.spec.js b/cypress/integration/process.spec.js index c8a510bf..732310f7 100644 --- a/cypress/integration/process.spec.js +++ b/cypress/integration/process.spec.js @@ -440,6 +440,9 @@ describe('Process tests', function() { "location": "keep:00000000000000000000000000000000+03/input3-2.txt" } ] + }, + { + "$import": "import_path" } ] } @@ -463,6 +466,9 @@ describe('Process tests', function() { "basename": "11111111111111111111111111111111+03", "class": "Directory", "location": "keep:11111111111111111111111111111111+03" + }, + { + "$import": "import_path" } ] } @@ -479,7 +485,10 @@ describe('Process tests', function() { "input_int_array": [ 1, 3, - 5 + 5, + { + "$import": "import_path" + } ] } }, @@ -494,7 +503,10 @@ describe('Process tests', function() { input: { "input_long_array": [ 10, - 20 + 20, + { + "$import": "import_path" + } ] } }, @@ -510,7 +522,10 @@ describe('Process tests', function() { "input_float_array": [ 10.2, 10.4, - 10.6 + 10.6, + { + "$import": "import_path" + } ] } }, @@ -526,7 +541,10 @@ describe('Process tests', function() { "input_double_array": [ 20.1, 20.2, - 20.3 + 20.3, + { + "$import": "import_path" + } ] } }, @@ -542,9 +560,78 @@ describe('Process tests', function() { "input_string_array": [ "Hello", "World", - "!" + "!", + { + "$import": "import_path" + } ] } + }, + { + definition: { + "id": "#main/input_bool_include", + "type": "boolean" + }, + input: { + "input_bool_include": { + "$include": "include_path" + } + } + }, + { + definition: { + "id": "#main/input_int_include", + "type": "int" + }, + input: { + "input_int_include": { + "$include": "include_path" + } + } + }, + { + definition: { + "id": "#main/input_float_include", + "type": "float" + }, + input: { + "input_float_include": { + "$include": "include_path" + } + } + }, + { + definition: { + "id": "#main/input_string_include", + "type": "string" + }, + input: { + "input_string_include": { + "$include": "include_path" + } + } + }, + { + definition: { + "id": "#main/input_file_include", + "type": "File" + }, + input: { + "input_file_include": { + "$include": "include_path" + } + } + }, + { + definition: { + "id": "#main/input_directory_include", + "type": "Directory" + }, + input: { + "input_directory_include": { + "$include": "include_path" + } + } } ]; @@ -920,13 +1007,21 @@ describe('Process tests', function() { verifyIOParameter('input_file_array', null, null, 'input2.tar', '00000000000000000000000000000000+02'); verifyIOParameter('input_file_array', null, null, 'input3.tar', undefined, true); verifyIOParameter('input_file_array', null, null, 'input3-2.txt', undefined, true); + verifyIOParameter('input_file_array', null, null, 'Cannot display value', undefined, true); verifyIOParameter('input_dir_array', null, null, '/', '11111111111111111111111111111111+02'); verifyIOParameter('input_dir_array', null, null, '/', '11111111111111111111111111111111+03', true); - verifyIOParameter('input_int_array', null, null, ["1", "3", "5"]); - verifyIOParameter('input_long_array', null, null, ["10", "20"]); - verifyIOParameter('input_float_array', null, null, ["10.2", "10.4", "10.6"]); - verifyIOParameter('input_double_array', null, null, ["20.1", "20.2", "20.3"]); - verifyIOParameter('input_string_array', null, null, ["Hello", "World", "!"]); + verifyIOParameter('input_dir_array', null, null, 'Cannot display value', undefined, true); + verifyIOParameter('input_int_array', null, null, ["1", "3", "5", "Cannot display value"]); + verifyIOParameter('input_long_array', null, null, ["10", "20", "Cannot display value"]); + verifyIOParameter('input_float_array', null, null, ["10.2", "10.4", "10.6", "Cannot display value"]); + verifyIOParameter('input_double_array', null, null, ["20.1", "20.2", "20.3", "Cannot display value"]); + verifyIOParameter('input_string_array', null, null, ["Hello", "World", "!", "Cannot display value"]); + verifyIOParameter('input_bool_include', null, null, "Cannot display value"); + verifyIOParameter('input_int_include', null, null, "Cannot display value"); + verifyIOParameter('input_float_include', null, null, "Cannot display value"); + verifyIOParameter('input_string_include', null, null, "Cannot display value"); + verifyIOParameter('input_file_include', null, null, "Cannot display value"); + verifyIOParameter('input_directory_include', null, null, "Cannot display value"); }); cy.get('[data-cy=process-io-card] h6').contains('Outputs') .parents('[data-cy=process-io-card]').within((ctx) => { diff --git a/src/views/process-panel/process-io-card.tsx b/src/views/process-panel/process-io-card.tsx index 90427659..4f93f48c 100644 --- a/src/views/process-panel/process-io-card.tsx +++ b/src/views/process-panel/process-io-card.tsx @@ -34,7 +34,8 @@ import { ImageOffIcon, OutputIcon, MaximizeIcon, - UnMaximizeIcon + UnMaximizeIcon, + InfoIcon } from 'components/icon/icon'; import { MPVPanelProps } from 'components/multi-panel-view/multi-panel-view'; import { @@ -484,37 +485,33 @@ export const getIOParamDisplayValue = (auth: AuthState, input: CommandInputParam switch (true) { case isPrimitiveOfType(input, CWLType.BOOLEAN): const boolValue = (input as BooleanCommandInputParameter).value; - return boolValue !== undefined && !(Array.isArray(boolValue) && boolValue.length === 0) ? - [{display:
{String(boolValue)}
}] : + [{display: renderPrimitiveValue(boolValue, false) }] : [{display: }]; case isPrimitiveOfType(input, CWLType.INT): case isPrimitiveOfType(input, CWLType.LONG): const intValue = (input as IntCommandInputParameter).value; - return intValue !== undefined && // Missing values are empty array !(Array.isArray(intValue) && intValue.length === 0) ? - [{display:
{String(intValue)}
}] + [{display: renderPrimitiveValue(intValue, false) }] : [{display: }]; case isPrimitiveOfType(input, CWLType.FLOAT): case isPrimitiveOfType(input, CWLType.DOUBLE): const floatValue = (input as FloatCommandInputParameter).value; - return floatValue !== undefined && !(Array.isArray(floatValue) && floatValue.length === 0) ? - [{display:
{String(floatValue)}
}]: + [{display: renderPrimitiveValue(floatValue, false) }]: [{display: }]; case isPrimitiveOfType(input, CWLType.STRING): const stringValue = (input as StringCommandInputParameter).value || undefined; - return stringValue !== undefined && !(Array.isArray(stringValue) && stringValue.length === 0) ? - [{display:
{stringValue}
}] : + [{display: renderPrimitiveValue(stringValue, false) }] : [{display: }]; case isPrimitiveOfType(input, CWLType.FILE): @@ -526,14 +523,12 @@ export const getIOParamDisplayValue = (auth: AuthState, input: CommandInputParam ...secondaryFiles ]; const mainFilePdhUrl = mainFile ? getResourcePdhUrl(mainFile, pdh) : ""; - return files.length ? files.map((file, i) => fileToProcessIOValue(file, (i > 0), auth, pdh, (i > 0 ? mainFilePdhUrl : ""))) : [{display: }]; case isPrimitiveOfType(input, CWLType.DIRECTORY): const directory = (input as DirectoryCommandInputParameter).value; - return directory !== undefined && !(Array.isArray(directory) && directory.length === 0) ? [directoryToProcessIOValue(directory, auth, pdh)] : @@ -543,31 +538,28 @@ export const getIOParamDisplayValue = (auth: AuthState, input: CommandInputParam !(input.type instanceof Array) && input.type.type === 'enum': const enumValue = (input as EnumCommandInputParameter).value; - - return enumValue !== undefined ? - [{ display:
{(input as EnumCommandInputParameter).value || ''}
}] : + return enumValue !== undefined && enumValue ? + [{ display:
{enumValue}
}] : [{display: }]; case isArrayOfType(input, CWLType.STRING): const strArray = (input as StringArrayCommandInputParameter).value || []; return strArray.length ? - [{ display: <>{((input as StringArrayCommandInputParameter).value || []).map((val) => )} }] : + [{ display: <>{strArray.map((val) => renderPrimitiveValue(val, true))} }] : [{display: }]; case isArrayOfType(input, CWLType.INT): case isArrayOfType(input, CWLType.LONG): const intArray = (input as IntArrayCommandInputParameter).value || []; - return intArray.length ? - [{ display: <>{((input as IntArrayCommandInputParameter).value || []).map((val) => )} }] : + [{ display: <>{intArray.map((val) => renderPrimitiveValue(val, true))} }] : [{display: }]; case isArrayOfType(input, CWLType.FLOAT): case isArrayOfType(input, CWLType.DOUBLE): const floatArray = (input as FloatArrayCommandInputParameter).value || []; - return floatArray.length ? - [{ display: <>{floatArray.map((val) => )} }] : + [{ display: <>{floatArray.map((val) => renderPrimitiveValue(val, true))} }] : [{display: }]; case isArrayOfType(input, CWLType.FILE): @@ -591,13 +583,21 @@ export const getIOParamDisplayValue = (auth: AuthState, input: CommandInputParam case isArrayOfType(input, CWLType.DIRECTORY): const directories = (input as DirectoryArrayCommandInputParameter).value || []; - return directories.length ? directories.map(directory => directoryToProcessIOValue(directory, auth, pdh)) : [{display: }]; default: - return []; + return [{display: }]; + } +}; + +const renderPrimitiveValue = (value: any, asChip: boolean) => { + const isObject = typeof value === 'object'; + if (!isObject) { + return asChip ? :
{String(value)}
; + } else { + return asChip ? : ; } }; @@ -668,6 +668,8 @@ const normalizeDirectoryLocation = (directory: Directory): Directory => { }; const directoryToProcessIOValue = (directory: Directory, auth: AuthState, pdh?: string): ProcessIOValue => { + if (isExternalValue(directory)) {return {display: }} + const normalizedDirectory = normalizeDirectoryLocation(directory); return { display: , @@ -676,6 +678,8 @@ const directoryToProcessIOValue = (directory: Directory, auth: AuthState, pdh?: }; const fileToProcessIOValue = (file: File, secondary: boolean, auth: AuthState, pdh: string | undefined, mainFilePdh: string): ProcessIOValue => { + if (isExternalValue(file)) {return {display: }} + const resourcePdh = getResourcePdhUrl(file, pdh); return { display: , @@ -685,10 +689,22 @@ const fileToProcessIOValue = (file: File, secondary: boolean, auth: AuthState, p } }; +const isExternalValue = (val: any) => + Object.keys(val).includes('$import') || + Object.keys(val).includes('$include') + const EmptyValue = withStyles(styles)( ({classes}: WithStyles) => No value ); +const UnsupportedValue = withStyles(styles)( + ({classes}: WithStyles) => Cannot display value +); + +const UnsupportedValueChip = withStyles(styles)( + ({classes}: WithStyles) => } label={"Cannot display value"} /> +); + const ImagePlaceholder = withStyles(styles)( ({classes}: WithStyles) => ); -- 2.30.2