diff --git a/public/electron.js b/public/electron.js
index 6fb0408..3d79719 100644
--- a/public/electron.js
+++ b/public/electron.js
@@ -66,9 +66,9 @@ const createMainWindow = () => {
preload: path.join(__dirname, 'preload.js'),
nativeWindowOpen: true,
},
- width: 1000,
+ width: 1050,
height: 880,
- minWidth: 1000,
+ minWidth: 1050,
minHeight: 880,
backgroundColor: '#094580',
});
diff --git a/python/eeg2bids.py b/python/eeg2bids.py
index c509fd9..9ab0959 100644
--- a/python/eeg2bids.py
+++ b/python/eeg2bids.py
@@ -244,7 +244,7 @@ def edf_to_bids_thread(data):
if 'edfData' not in data or 'files' not in data['edfData'] or not data['edfData']['files']:
error_messages.append('No .edf file(s) to convert.')
if 'bids_directory' not in data or not data['bids_directory']:
- error_messages.append('The BIDS output directory is missing.')
+ error_messages.append('The BIDS output folder is missing.')
if not data['session']:
error_messages.append('The LORIS Visit Label is missing.')
diff --git a/src/css/Configuration.css b/src/css/Configuration.css
index 932d2d6..cb16f8a 100644
--- a/src/css/Configuration.css
+++ b/src/css/Configuration.css
@@ -30,4 +30,5 @@ textarea {
}
.fa-question-circle {
color: #064785;
+ margin: 0 5px;
}
diff --git a/src/css/index.css b/src/css/index.css
index 7bee123..2f34dfa 100644
--- a/src/css/index.css
+++ b/src/css/index.css
@@ -56,7 +56,7 @@ body {
max-width: 175px;
}
.label {
- width: 210px;
+ width: 240px;
display: inline-block;
max-width: 100%;
padding-right: 20px;
@@ -73,7 +73,7 @@ input {
}
.comboField {
display: inline-block;
- max-width: calc(100% - 230px);
+ max-width: calc(100% - 260px);
vertical-align: top;
}
.alert {
diff --git a/src/jsx/Configuration.js b/src/jsx/Configuration.js
index 1be4e15..28090d9 100644
--- a/src/jsx/Configuration.js
+++ b/src/jsx/Configuration.js
@@ -579,7 +579,7 @@ const Configuration = (props) => {
appContext.getFromTask('bidsDirectory'),
);
} else {
- bidsDirectoryStatus = formatError('No BIDS output directory selected');
+ bidsDirectoryStatus = formatError('No BIDS output folder selected');
}
result.push(
{bidsDirectoryStatus}
);
@@ -1341,6 +1341,8 @@ const Configuration = (props) => {
label='EDF Recording to convert'
required={true}
onUserInput={onUserInput}
+ help='Filename(s) must be formatted correctly:
+ e.g. [subjectID]_[sessionLabel]_[taskName]_[run-1]_ieeg.edf'
/>
@@ -1355,6 +1357,7 @@ const Configuration = (props) => {
label='BIDS output folder'
placeholder={state.bidsDirectory.get}
onUserInput={onUserInput}
+ help='Where the BIDS-compliant folder will be created'
/>
@@ -1368,6 +1371,7 @@ const Configuration = (props) => {
eeg: 'EEG',
}}
checked={state.modality.get}
+ help='If any intracranial (stereo) channels, select Stereo iEEG'
/>
@@ -1381,6 +1385,8 @@ const Configuration = (props) => {
no: 'No',
}}
checked={state.LORIScompliant.get ? 'yes' : 'no'}
+ help='Select Yes if research datasets will be stored
+ in a LORIS data platform'
/>
@@ -1407,6 +1413,9 @@ const Configuration = (props) => {
}
label='Recording parameters (json)'
onUserInput={onUserInput}
+ help='Used to contribute non-required fields to *.json BIDS
+ parameter file. See BIDS spec and template available with
+ this release. Blank fields ignored.'
/>
@@ -1421,6 +1430,8 @@ const Configuration = (props) => {
}
label='annotations.json'
onUserInput={onUserInput}
+ help='Labels for Annotations, compliant with BIDS spec.
+ One file per task/run. Filename must be formatted correctly.'
/>
@@ -1453,6 +1464,9 @@ const Configuration = (props) => {
}
label='annotations.tsv'
onUserInput={onUserInput}
+ help='Annotation data: time, label, etc compliant
+ with BIDS spec. One file per task/run.
+ Filename must be formatted correctly.'
/>
@@ -1469,6 +1483,8 @@ const Configuration = (props) => {
label='Task name'
value={state.taskName.get}
onUserInput={onUserInput}
+ help='Task, stimulus, state or experimental context.
+ See BIDS specification for more information.'
/>
{state.LORIScompliant.get &&
@@ -1477,6 +1493,10 @@ const Configuration = (props) => {
Site *
+
@@ -1504,6 +1524,10 @@ const Configuration = (props) => {
Project *
+
@@ -1531,6 +1555,10 @@ const Configuration = (props) => {
Subproject *
+
@@ -1560,6 +1588,10 @@ const Configuration = (props) => {
Session *
+
{state.LORIScompliant.get &&
(LORIS Visit Label)
@@ -1598,6 +1630,7 @@ const Configuration = (props) => {
label='Reference'
value={state.reference.get}
onUserInput={onUserInput}
+ help='See BIDS specification for more information'
/>
@@ -1607,6 +1640,7 @@ const Configuration = (props) => {
value={state.lineFreq.get}
placeholder='n/a'
onUserInput={onUserInput}
+ help='See BIDS specification for more information'
/>
@@ -1621,6 +1655,7 @@ const Configuration = (props) => {
'epoched': 'Epoched',
}}
onUserInput={onUserInput}
+ help='See BIDS specification for more information'
/>
@@ -1648,6 +1683,8 @@ const Configuration = (props) => {
}
}
checked={state.participantEntryMode.get}
+ help='Specify participant details manually
+ or by lookup in LORIS'
/>
}
@@ -1678,6 +1715,7 @@ const Configuration = (props) => {
'other': 'Other',
}}
onUserInput={onUserInput}
+ help='Required; see BIDS specification for more information'
/>
@@ -1692,6 +1730,7 @@ const Configuration = (props) => {
'A': 'Ambidextrous',
}}
onUserInput={onUserInput}
+ help='Required; see BIDS specification for more information'
/>
>
@@ -1728,6 +1767,7 @@ const Configuration = (props) => {
'A': 'Ambidextrous',
}}
onUserInput={onUserInput}
+ help='Required; see BIDS specification for more information'
/>
>
@@ -1741,6 +1781,7 @@ const Configuration = (props) => {
required={true}
value={state.participantID.get}
onUserInput={onUserInput}
+ help='Study ID (e.g. LORIS PSCID)'
/>
{state.LORIScompliant.get &&
Use the LORIS PSCID
@@ -1753,6 +1794,7 @@ const Configuration = (props) => {
placeholder='n/a'
value={state.participantAge.get}
onUserInput={onUserInput}
+ help='Required; see BIDS specification for more information'
/>
@@ -1767,6 +1809,7 @@ const Configuration = (props) => {
'other': 'Other',
}}
onUserInput={onUserInput}
+ help='Required; see BIDS specification for more information'
/>
@@ -1781,6 +1824,7 @@ const Configuration = (props) => {
'A': 'Ambidextrous',
}}
onUserInput={onUserInput}
+ help='Required; see BIDS specification for more information'
/>
>
@@ -1949,6 +1993,8 @@ const Configuration = (props) => {
value={preparedBy}
placeholder='Enter your name'
onUserInput={(_, value) => setPreparedBy(value)}
+ help='Name of person performing data conversion
+ and validation is required.'
/>
{!preparedBy && displayErrors &&
@@ -1975,6 +2021,7 @@ const Configuration = (props) => {
>
{modalText.message[modalText.mode]}
+
>
);
} else {
diff --git a/src/jsx/Validator.js b/src/jsx/Validator.js
index 8083f12..53c5d90 100644
--- a/src/jsx/Validator.js
+++ b/src/jsx/Validator.js
@@ -161,6 +161,13 @@ const Validator = (props) => {
}
}, [socketContext]);
+ useEffect(() => {
+ if (!appContext.getFromTask('output_time')) {
+ setValidationMode('folder');
+ } else {
+ setValidationMode('lastRun');
+ }
+ }, [props.visible]);
/**
* onMessage - received message from python.
* @param {object} message - response
@@ -208,7 +215,7 @@ const Validator = (props) => {
setBidsDirectory(value)}
/>
diff --git a/src/jsx/elements/inputs.js b/src/jsx/elements/inputs.js
index 6ee4070..2616dfc 100644
--- a/src/jsx/elements/inputs.js
+++ b/src/jsx/elements/inputs.js
@@ -36,7 +36,8 @@ export const FileInput = (props) => {
{props.help &&
}
-
+
+
{
@@ -71,6 +72,7 @@ FileInput.propTypes = {
accept: PropTypes.string,
onUserInput: PropTypes.func,
placeholder: PropTypes.string,
+ help: PropTypes.string,
};
/**
@@ -103,17 +105,20 @@ export const DirectoryInput = (props) => {
* :
null
}
+ {props.help &&
+
+ }
- {props.placeholder ?? 'No directory chosen'}
+ {props.placeholder ?? 'No folder chosen'}
>
);
@@ -124,6 +129,7 @@ DirectoryInput.propTypes = {
label: PropTypes.string,
onUserInput: PropTypes.func,
placeholder: PropTypes.string,
+ help: PropTypes.string,
};
/**
@@ -160,6 +166,9 @@ export const TextInput = (props) => {
* :
null
}
+ {props.help &&
+
+ }
}
@@ -196,6 +205,7 @@ TextInput.propTypes = {
]),
bannedCharacters: PropTypes.array,
readonly: PropTypes.bool,
+ help: PropTypes.string,
};
/**
@@ -267,10 +277,15 @@ export const RadioInput = (props) => {
}
return
- {props.label} {props.required ?
+
+ {props.label} {props.required ?
* :
null
- }
+ }
+ {props.help &&
+
+ }
+
{content}
;
@@ -296,6 +311,7 @@ RadioInput.propTypes = {
options: PropTypes.object,
checked: PropTypes.string,
onUserInput: PropTypes.func,
+ help: PropTypes.string,
};
/**
@@ -360,6 +376,9 @@ export const SelectInput = (props) => {
* :
null
}
+ {props.help &&
+
+ }
}
@@ -394,6 +413,7 @@ SelectInput.propTypes = {
emptyOption: PropTypes.string,
options: PropTypes.object,
onUserInput: PropTypes.func,
+ help: PropTypes.string,
};
/**
@@ -420,6 +440,9 @@ export const NumberInput = (props) => {
<>
{props.label}
+ {props.help &&
+
+ }
{
* :
null
}
+ {props.help &&
+
+ }