[arvados-workbench2] created: 2.4.0-344-gfe41be6c
git repository hosting
git at public.arvados.org
Wed Nov 2 21:18:42 UTC 2022
at fe41be6c6bcc21fc0c7c6450485a1d1f7955ebe5 (commit)
commit fe41be6c6bcc21fc0c7c6450485a1d1f7955ebe5
Author: Stephen Smith <stephen at curii.com>
Date: Wed Nov 2 17:17:18 2022 -0400
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 <stephen at curii.com>
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: <pre>{String(boolValue)}</pre> }] :
+ [{display: renderPrimitiveValue(boolValue, false) }] :
[{display: <EmptyValue />}];
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: <pre>{String(intValue)}</pre> }]
+ [{display: renderPrimitiveValue(intValue, false) }]
: [{display: <EmptyValue />}];
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: <pre>{String(floatValue)}</pre> }]:
+ [{display: renderPrimitiveValue(floatValue, false) }]:
[{display: <EmptyValue />}];
case isPrimitiveOfType(input, CWLType.STRING):
const stringValue = (input as StringCommandInputParameter).value || undefined;
-
return stringValue !== undefined &&
!(Array.isArray(stringValue) && stringValue.length === 0) ?
- [{display: <pre>{stringValue}</pre> }] :
+ [{display: renderPrimitiveValue(stringValue, false) }] :
[{display: <EmptyValue />}];
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: <EmptyValue />}];
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: <pre>{(input as EnumCommandInputParameter).value || ''}</pre> }] :
+ return enumValue !== undefined && enumValue ?
+ [{ display: <pre>{enumValue}</pre> }] :
[{display: <EmptyValue />}];
case isArrayOfType(input, CWLType.STRING):
const strArray = (input as StringArrayCommandInputParameter).value || [];
return strArray.length ?
- [{ display: <>{((input as StringArrayCommandInputParameter).value || []).map((val) => <Chip label={val} />)}</> }] :
+ [{ display: <>{strArray.map((val) => renderPrimitiveValue(val, true))}</> }] :
[{display: <EmptyValue />}];
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) => <Chip label={val} />)}</> }] :
+ [{ display: <>{intArray.map((val) => renderPrimitiveValue(val, true))}</> }] :
[{display: <EmptyValue />}];
case isArrayOfType(input, CWLType.FLOAT):
case isArrayOfType(input, CWLType.DOUBLE):
const floatArray = (input as FloatArrayCommandInputParameter).value || [];
-
return floatArray.length ?
- [{ display: <>{floatArray.map((val) => <Chip label={val} />)}</> }] :
+ [{ display: <>{floatArray.map((val) => renderPrimitiveValue(val, true))}</> }] :
[{display: <EmptyValue />}];
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: <EmptyValue />}];
default:
- return [];
+ return [{display: <UnsupportedValue />}];
+ }
+};
+
+const renderPrimitiveValue = (value: any, asChip: boolean) => {
+ const isObject = typeof value === 'object';
+ if (!isObject) {
+ return asChip ? <Chip label={String(value)} /> : <pre>{String(value)}</pre>;
+ } else {
+ return asChip ? <UnsupportedValueChip /> : <UnsupportedValue />;
}
};
@@ -668,6 +668,8 @@ const normalizeDirectoryLocation = (directory: Directory): Directory => {
};
const directoryToProcessIOValue = (directory: Directory, auth: AuthState, pdh?: string): ProcessIOValue => {
+ if (isExternalValue(directory)) {return {display: <UnsupportedValue />}}
+
const normalizedDirectory = normalizeDirectoryLocation(directory);
return {
display: <KeepUrlPath auth={auth} res={normalizedDirectory} pdh={pdh}/>,
@@ -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: <UnsupportedValue />}}
+
const resourcePdh = getResourcePdhUrl(file, pdh);
return {
display: <KeepUrlPath auth={auth} res={file} pdh={pdh}/>,
@@ -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<CssRules>) => <span className={classes.emptyValue}>No value</span>
);
+const UnsupportedValue = withStyles(styles)(
+ ({classes}: WithStyles<CssRules>) => <span className={classes.emptyValue}>Cannot display value</span>
+);
+
+const UnsupportedValueChip = withStyles(styles)(
+ ({classes}: WithStyles<CssRules>) => <Chip icon={<InfoIcon />} label={"Cannot display value"} />
+);
+
const ImagePlaceholder = withStyles(styles)(
({classes}: WithStyles<CssRules>) => <span className={classes.imagePlaceholder}><ImageIcon /></span>
);
-----------------------------------------------------------------------
hooks/post-receive
--
More information about the arvados-commits
mailing list