diff --git a/src/Routes.jsx b/src/Routes.jsx index ee9cb51cc..50a300c05 100644 --- a/src/Routes.jsx +++ b/src/Routes.jsx @@ -7,7 +7,6 @@ import ManageEditDac from './pages/manage_dac/ManageEditDac'; import AdminManageUsers from './pages/AdminManageUsers'; import DataAccessRequestApplication from './pages/dar_application/DataAccessRequestApplication'; import DACDatasets from './pages/DACDatasets'; -import DatasetRegistration from './pages/DatasetRegistration'; import Home from './pages/Home'; import NotFound from './pages/NotFound'; import NIHICWebform from './pages/NIHicWebform'; @@ -94,9 +93,7 @@ const Routes = (props) => ( {checkEnv(envGroups.NON_STAGING) && } - - diff --git a/src/components/dac_dataset_table/DACDatasetApprovalStatus.jsx b/src/components/dac_dataset_table/DACDatasetApprovalStatus.jsx index 496c0bf7c..f509d62db 100644 --- a/src/components/dac_dataset_table/DACDatasetApprovalStatus.jsx +++ b/src/components/dac_dataset_table/DACDatasetApprovalStatus.jsx @@ -43,12 +43,14 @@ export default function DACDatasetApprovalStatus(props) { const dacAccepted = (dataset) =>
ACCEPTED - + {dataset.study?.studyId && + + } {dataset.deletable && <> { - const url = `${await getApiUrl()}/api/dataset/v2`; - const res = await fetchOk(url, fp.mergeAll([Config.authOpts(), Config.jsonBody(form), { method: 'POST' }])); - return await res.json(); - }, - registerDataset: async (registration) => { const url = `${await getApiUrl()}/api/dataset/v3`; const res = await axios.post(url, registration, Config.multiPartOpts()); return res.data; }, - getDatasets: async () => { - const url = `${await getApiUrl()}/api/dataset/v2`; - const res = await fetchOk(url, Config.authOpts()); - return await res.json(); - }, - getDatasetsByIds: async (ids) => { const url = `${await getApiUrl()}/api/dataset/batch?ids=${ids.join('&ids=')}`; const res = await fetchOk(url, Config.authOpts()); @@ -59,53 +47,18 @@ export const DataSet = { return await res.json(); }, - downloadDataSets: async (objectIdList, fileName) => { - const url = `${await getApiUrl()}/api/dataset/download`; - const res = await fetchOk(url, fp.mergeAll([Config.jsonBody(objectIdList), Config.fileOpts(), { method: 'POST' }])); - - fileName = fileName === null ? getFileNameFromHttpResponse(res) : fileName; - const responseObj = await res.json(); - - let blob = new Blob([responseObj.datasets], { type: 'text/plain' }); - const urlBlob = window.URL.createObjectURL(blob); - let a = document.createElement('a'); - a.href = urlBlob; - a.download = fileName; - a.click(); - }, - deleteDataset: async (datasetObjectId) => { const url = `${await getApiUrl()}/api/dataset/${datasetObjectId}`; const res = await fetchOk(url, fp.mergeAll([Config.authOpts(), { method: 'DELETE' }])); return await res; }, - updateDataset: async (datasetId, dataSetObject) => { - const url = `${await getApiUrl()}/api/dataset/${datasetId}`; - return await fetchOk(url, fp.mergeAll([Config.authOpts(), Config.jsonBody(dataSetObject), { method: 'PUT' }])); - }, - updateDatasetV3: async (datasetId, datasetAndFiles) => { const url = `${await getApiUrl()}/api/dataset/v3/${datasetId}`; const res = await axios.put(url, datasetAndFiles, Config.multiPartOpts()); return res.data; }, - validateDatasetName: async (name) => { - const url = `${await getApiUrl()}/api/dataset/validate?name=${name}`; - try { - // We expect a 404 in the case where the dataset name does not exist - const res = await fetchAny(url, fp.mergeAll([Config.authOpts(), { method: 'GET' }])); - if (res.status === 404) { - return -1; - } - return await res.json(); - } - catch (err) { - return -1; - } - }, - getStudyById: async (studyId) => { const url = `${await getApiUrl()}/api/dataset/study/${studyId}`; const res = await fetchOk(url, Config.authOpts()); diff --git a/src/pages/DatasetRegistration.jsx b/src/pages/DatasetRegistration.jsx deleted file mode 100644 index 27809c908..000000000 --- a/src/pages/DatasetRegistration.jsx +++ /dev/null @@ -1,1447 +0,0 @@ -import React, {useState, useEffect, useCallback} from 'react'; -import { RadioButton } from '../components/RadioButton'; -import { Link } from 'react-router-dom'; -import Select from 'react-select'; -import { Alert } from '../components/Alert'; -import { ConfirmationDialog } from '../components/ConfirmationDialog'; -import { Notification } from '../components/Notification'; -import { PageHeading } from '../components/PageHeading'; -import { DataSet } from '../libs/ajax/DataSet'; -import { DAC } from '../libs/ajax/DAC'; -import { NotificationService } from '../libs/notificationService'; -import { Storage } from '../libs/storage'; -import * as fp from 'lodash/fp'; -import AsyncSelect from 'react-select/async'; -import DataProviderAgreement from '../assets/Data_Provider_Agreement.pdf'; -import addDatasetIcon from '../images/icon_dataset_add.png'; -import { searchOntologies } from '../libs/utils'; -import { OntologyService } from '../libs/ontologyService'; - -// TODO: Deprecated - remove this component when all datasets have been converted to studies -const getInitialState = () => { - return { - dacList: [], - selectedDac: {}, - allDatasets: '', - allDatasetNames: [], - updateDataset: {}, - disableOkBtn: false, - showValidationMessages: false, - showModal: false, - showDialogSubmit: false, - formData: { - methods: false, - genetic: false, - publication: false, - collaboration: false, - ethics: false, - geographic: false, - moratorium: false, - nonProfit: false, - hmb: false, - npoa: false, - diseases: false, - ontologies: [], - other: false, - primaryOtherText: '', - secondaryOther: false, - secondaryOtherText: '', - generalUse: false - }, - datasetData: { - datasetName: '', - researcher: '', - collectionId: '', - principalInvestigator: '', - datasetRepoUrl: '', - dataType: '', - species: '', - phenotype: '', - nrParticipants: '', - description: '', - dac: '', - consentId: '', - isValidName: false - }, - problemSavingRequest: false, - problemLoadingUpdateDataset: false, - submissionSuccess: false, - errorMessage: '' - }; -}; - -const controlLabelStyle = { - fontWeight: 500, - marginTop: '1rem', - marginBottom: '1rem' -}; - -const DatasetRegistration = (props) => { - const [registrationState, setRegistrationState] = useState(getInitialState); - const { datasetId } = props.match.params; - const { push } = props.history; - - const init = useCallback(async () => { - if (!fp.isNil(datasetId)) { - const data = await DataSet.getDataSetsByDatasetId(datasetId); - // redirect to blank form if dataset id is invalid or inaccessible - if (fp.isEmpty(data) || fp.isNil(data.dataSetId)) { - setRegistrationState(prevState => ({ - ...prevState, - problemLoadingUpdateDataset: true - })); - push('/dataset_registration'); - } else { - setRegistrationState(prevState => ({ - ...prevState, - updateDataset:data - })); - } - } - }, [datasetId, push]); - - const validateDatasetName = useCallback(async (name) => { - return DataSet.validateDatasetName(name).then(datasetId => { - let isValid = true; - //if this is not an update check to make sure this name is not already in use - if (fp.isEmpty(registrationState.updateDataset)) { - isValid = (datasetId < 0); - } - setRegistrationState(prevState => ({ - ...prevState, - datasetData: { - ...prevState.datasetData, - isValidName: isValid - } - })); - }); - }, [registrationState.updateDataset]); - - const prefillDataUseFields = (dataUse) => { - let methods = dataUse.methodsResearch; - let genetics = dataUse.geneticStudiesOnly; - let publication = dataUse.publicationResults; - let collaboration = dataUse.collaboratorRequired; - let ethics = dataUse.ethicsApprovalRequired; - let geographic = dataUse.geographicalRestrictions; - let moratorium = dataUse.publicationMoratorium; - let nonProfit = dataUse.nonProfitUse; - let hmb = dataUse.hmbResearch; - // if the dataset's POA value is set to false, we need to check the NPOA (or NOT POA) option - // if the dataset's POA value is set to true, leave this unchecked - let npoa = (dataUse.populationOriginsAncestry === false); - let diseases = dataUse.diseaseRestrictions; - let other = dataUse.otherRestrictions; - let primaryOtherText = dataUse.other; - let secondaryOther = !fp.isNil(dataUse.secondaryOther); - let secondaryOtherText = dataUse.secondaryOther; - let generalUse = dataUse.generalUse; - - setRegistrationState(prevState => ({ - ...prevState, - formData: { - ...prevState.formData, - methods: methods, - genetic: genetics, - publication: publication, - collaboration: collaboration, - ethics: ethics, - geographic: geographic, - moratorium: moratorium, - nonProfit: nonProfit, - hmb: hmb, - npoa: npoa, - diseases: diseases, - other: other, - primaryOtherText: primaryOtherText, - secondaryOther: secondaryOther, - secondaryOtherText: secondaryOtherText, - generalUse: generalUse - } - })); - }; - - - const prefillDatasetFields = useCallback((dataset) => { - let name = dataset.name; - let collectionId = fp.find({ propertyName: 'Sample Collection ID' })(dataset.properties); - let dataType = fp.find({ propertyName: 'Data Type' })(dataset.properties); - let species = fp.find({ propertyName: 'Species' })(dataset.properties); - let phenotype = fp.find({ propertyName: 'Phenotype/Indication' })(dataset.properties); - let nrParticipants = fp.find({ propertyName: '# of participants' })(dataset.properties); - let description = fp.find({ propertyName: 'Description' })(dataset.properties); - let datasetRepoUrl = fp.find({ propertyName: 'url' })(dataset.properties); - let researcher = fp.find({ propertyName: 'Data Depositor' })(dataset.properties); - let pi = fp.find({ propertyName: 'Principal Investigator(PI)' })(dataset.properties); - - setRegistrationState(prevState => { - let dac = fp.find({ dacId: dataset.dacId })(prevState.dacList); - let validName = validateDatasetName(prevState.datasetData.datasetName); - return { - ...prevState, - selectedDac:dac, - datasetData: { - ...prevState.datasetData, - datasetName: name ? name : '', - collectionId: collectionId ? collectionId.propertyValue : '', - dataType: dataType ? dataType.propertyValue : '', - species: species ? species.propertyValue : '', - phenotype: phenotype ? phenotype.propertyValue : '', - nrParticipants: nrParticipants ? nrParticipants.propertyValue : '', - description: description ? description.propertyValue : '', - datasetRepoUrl: datasetRepoUrl ? datasetRepoUrl.propertyValue : '', - researcher: researcher ? researcher.propertyValue : '', - principalInvestigator: pi ? pi.propertyValue : '', - dac: dac, - isValidName: validName - }, - }; - } - ); - - if (!fp.isEmpty(dataset.dataUse)) { - prefillDataUseFields(dataset.dataUse); - } - },[validateDatasetName]); - - useEffect(() => { - const fetchData = async () => { - await init(); - const notificationData = await NotificationService.getBannerObjectById('eRACommonsOutage'); - const currentUser = await Storage.getCurrentUser(); - const allDatasets = await DataSet.getDatasets(); - const allDatasetNames = allDatasets.map(d => d.name); - const dacs = await DAC.list(); - - setRegistrationState(prevState => ({ - ...prevState, - notificationData, - datasetData: { - ...prevState.datasetData, - researcher: currentUser.displayName - }, - allDatasets, - allDatasetNames, - dacList: dacs - })); - - if (!fp.isEmpty(registrationState.updateDataset)) { - prefillDatasetFields(registrationState.updateDataset); - const ontologies = await getOntologies(registrationState.formData.diseases); - const formattedOntologies = formatOntologyItems(ontologies); - - setRegistrationState(prevState => ({ - ...prevState, - formData: { - ...prevState.formData, - ontologies: formattedOntologies, - diseases: !fp.isEmpty(ontologies) - } - })); - } - }; - - fetchData(); - }, [init, registrationState.formData.diseases, prefillDatasetFields, registrationState.updateDataset]); - - const getOntologies = async (urls = []) => { - if (fp.isEmpty(urls)) { - return []; - } else { - const doidArr = OntologyService.extractDOIDFromUrl(urls); - const urlParams = doidArr.join(','); - const ontologies = await OntologyService.searchOntology(urlParams); - return ontologies; - } - }; - - - // eslint-disable-next-line no-unused-vars - const handleOpenModal = () => { - setRegistrationState(prevState => ({ - ...prevState, - showModal: true - })); - }; - - // eslint-disable-next-line no-unused-vars - const handleCloseModal = () => { - setRegistrationState(prevState => ({ - ...prevState, - showModal: false - })); - }; - - const handleChange = (e) => { - const field = e.target.name; - const value = e.target.value; - const prev = { ...registrationState }; - prev.datasetData[field] = value; - prev.disableOkBtn = false; - prev.problemSavingRequest = false; - prev.submissionSuccess = false; - setRegistrationState(prev); - }; - - // same as handleChange, but adds call to validate dataset name and only affects state if a change has been made - const handleDatasetNameChange = async (e) => { - const value = e.target.value; - if (registrationState.datasetData.datasetName !== value) { - await validateDatasetName(value); - const prev = { ...registrationState }; - prev.datasetData.datasetName = value; - prev.disableOkBtn = false; - prev.problemSavingRequest = false; - prev.submissionSuccess = false; - setRegistrationState(prev); - } - }; - - const handlePositiveIntegerOnly = (e) => { - const field = e.target.name; - const value = e.target.value.replace(/[^\d]/, ''); - - if (value === '' || parseInt(value, 10) > -1) { - const prev = { ...registrationState }; - prev.datasetData[field] = value; - prev.disableOkBtn = false; - prev.problemSavingRequest = false; - prev.submissionSuccess = false; - setRegistrationState(prev); - } - }; - - const handleCheckboxChange = (e) => { - const field = e.target.name; - const value = e.target.checked; - const prev = { ...registrationState }; - prev.formData[field] = value; - prev.disableOkBtn = false; - prev.problemSavingRequest = false; - prev.submissionSuccess = false; - setRegistrationState(prev); - }; - - const validateRequiredFields = (formData) => { - return ( - isValid(formData.researcher) && - isValid(formData.principalInvestigator) && - registrationState.datasetData.isValidName && - isValid(registrationState.datasetData.datasetName) && - isValid(formData.datasetRepoUrl) && - isValid(formData.dataType) && - isValid(formData.species) && - isValid(formData.phenotype) && - isValid(formData.nrParticipants) && - isValid(formData.description) && - isValid(registrationState.selectedDac) && - (!fp.isEmpty(registrationState.updateDataset) || !isTypeOfResearchInvalidChange()) - ); - }; - - - // generates the css classnames based on what's in the dataset name field and if we have tried to submit - const showDatasetNameErrorHighlight = (name, showValidationMessages) => { - if (fp.isEmpty(name)) { - return showValidationMessages ? 'form-control required-field-error' : 'form-control'; - } - // if there is a name loaded in because this is an update - if (!fp.isEmpty(registrationState.updateDataset)) { - let updateDatasetName = registrationState.updateDataset.name; - if (name === updateDatasetName) { - return 'form-control'; - } - // if the old dataset name has been edited - else { - return registrationState.datasetData.isValidName ? 'form-control' : 'form-control required-field-error'; - } - } - // if a new dataset name is being edited - else { - return registrationState.datasetData.isValidName ? 'form-control' : 'form-control required-field-error'; - } - }; - - const attestAndSave = () => { - setRegistrationState(prevState => { - let allValid = validateRequiredFields(prevState.datasetData); - return { - ...prevState, - showDialogSubmit: allValid, - problemLoadingUpdateDataset: false, - showValidationMessages: !allValid - }; - }); - }; - - const isValid = (value) => { - let isValid = false; - if (value !== '' && value !== null && value !== undefined) { - isValid = true; - } - return isValid; - }; - - // Function to handle dialog submission - const dialogHandlerSubmit = (answer) => () => { - if (answer === true) { - let ontologies = []; - for (let ontology of registrationState.formData.ontologies) { - ontologies.push(ontology.item); - } - - const prev = { ...registrationState }; - // Update formData and datasetData state - - if (ontologies.length > 0) { - prev.formData.ontologies = ontologies; - } - - for (let key in prev.datasetData) { - if (prev.datasetData[key] === '') { - prev.datasetData[key] = undefined; - } - } - prev.disableOkBtn = true; - setRegistrationState(prev); - - if (registrationState.showValidationMessages) { - setRegistrationState({ - ...registrationState, - showDialogSubmit: false - }); - } - else { - let formData = registrationState.datasetData; - let ds = formatFormData(formData); - if (fp.isEmpty(registrationState.updateDataset)) { - DataSet.postDatasetForm(ds).then(() => { - setRegistrationState({ - ...registrationState, - showDialogSubmit: false, - submissionSuccess: true - }); - }).catch(e => { - let errorMessage = (e.status === 409) ? - 'Dataset with this name already exists: ' + registrationState.datasetData.datasetName - + '. Please choose a different name before attempting to submit again.' - : 'Some errors occurred, Dataset Registration couldn\'t be completed.'; - setRegistrationState({ - ...registrationState, - problemSavingRequest: true, - submissionSuccess: false, - errorMessage - }); - }); - } else { - const { datasetId } = props.match.params; - DataSet.updateDataset(datasetId, ds).then(() => { - setRegistrationState({ - ...registrationState, - showDialogSubmit: false, - submissionSuccess: true - }); - }).catch(() => { - let errorMessage = 'Some errors occurred, the Dataset was not updated.'; - setRegistrationState({ - ...registrationState, - problemSavingRequest: true, - submissionSuccess: false, - errorMessage - }); - }); - } - } - } else { - setRegistrationState({ - ...registrationState, - showDialogSubmit: false - }); - } - }; - - /** - * HMB, Diseases, and Other/OtherText are all mutually exclusive - */ - - const isTypeOfResearchInvalidChange = () => { - const valid = ( - registrationState.formData.generalUse === true || - registrationState.formData.hmb === true || - (registrationState.formData.diseases === true && !fp.isEmpty(registrationState.formData.ontologies)) || - (registrationState.formData.other === true && !fp.isEmpty(registrationState.formData.primaryOtherText)) - ); - return !valid; - }; - - const setGeneralUse = () => { - setRegistrationState(prevState => ({ - ...prevState, - formData: { - ...prevState.formData, - generalUse: true, - hmb: false, - diseases: false, - ontologies: [], - other: false, - primaryOtherText: '' - }, - disableOkBtn: false, - problemSavingRequest: false, - submissionSuccess: false - })); - }; - - const setHmb = () => { - setRegistrationState(prevState => ({ - ...prevState, - formData: { - ...prevState.formData, - generalUse: false, - hmb: true, - diseases: false, - ontologies: [], - npoa: false, - other: false, - primaryOtherText: '' - }, - disableOkBtn: false, - problemSavingRequest: false, - submissionSuccess: false - })); - }; - - const setDiseases = () => { - setRegistrationState(prevState => ({ - ...prevState, - formData: { - ...prevState.formData, - generalUse: false, - hmb: false, - diseases: true, - npoa: false, - other: false, - primaryOtherText: '' - }, - disableOkBtn: false, - problemSavingRequest: false, - submissionSuccess: false - })); - }; - - const onOntologiesChange = (data) => { - setRegistrationState(prevState => ({ - ...prevState, - formData: { - ...prevState.formData, - ontologies: data || [] - }, - disableOkBtn: false, - problemSavingRequest: false, - submissionSuccess: false - })); - }; - - const setOther = () => { - setRegistrationState(prevState => ({ - ...prevState, - formData: { - ...prevState.formData, - generalUse: false, - hmb: false, - diseases: false, - other: true, - ontologies: [], - npoa: false, - }, - disableOkBtn: false, - problemSavingRequest: false, - submissionSuccess: false - })); - }; - - const setOtherText = (e, level) => { - const value = e.target.value; - (level === 'primary') ? - setRegistrationState(prevState => ({ - ...prevState, - formData: { - ...prevState.formData, - other: true, - primaryOtherText: value, - }, - disableOkBtn: false, - problemSavingRequest: false, - submissionSuccess: false - })) : - setRegistrationState(prevState => ({ - ...prevState, - formData: { - ...prevState.formData, - secondaryOther: true, - secondaryOtherText: value, - }, - disableOkBtn: false, - problemSavingRequest: false, - submissionSuccess: false - })); - }; - - // eslint-disable-next-line no-unused-vars - const back = () => { - props.history.goBack(); - }; - - const createProperties = () => { - let properties = []; - let formData = registrationState.datasetData; - - if (formData.datasetName) { - properties.push({'propertyName': 'Dataset Name', 'propertyValue': formData.datasetName}); - } - if (formData.collectionId) { - properties.push({'propertyName': 'Sample Collection ID', 'propertyValue': formData.collectionId}); - } - if (formData.dataType) { - properties.push({'propertyName': 'Data Type', 'propertyValue': formData.dataType}); - } - if (formData.species) { - properties.push({'propertyName': 'Species', 'propertyValue': formData.species}); - } - if (formData.phenotype) { - properties.push({'propertyName': 'Phenotype/Indication', 'propertyValue': formData.phenotype}); - } - if (formData.nrParticipants) { - properties.push({'propertyName': '# of participants', 'propertyValue': formData.nrParticipants}); - } - if (formData.description) { - properties.push({'propertyName': 'Description', 'propertyValue': formData.description}); - } - if (formData.datasetRepoUrl) { - properties.push({'propertyName': 'url', 'propertyValue': formData.datasetRepoUrl}); - } - if (formData.researcher) { - properties.push({'propertyName': 'Data Depositor', 'propertyValue': formData.researcher}); - } - if (formData.principalInvestigator) { - properties.push({'propertyName': 'Principal Investigator(PI)', 'propertyValue': formData.principalInvestigator}); - } - return properties; - }; - - const dacOptionsChange = () => { - return registrationState.dacList.map(item => ({ - key: item.dacId, - value: item.dacId, - label: item.name, - item: item - })); - }; - - const onDacChange = (option) => { - const prev = { ...registrationState }; - if (fp.isNil(option)) { - prev.selectedDac = {}; - } - else { - prev.selectedDac = option.item; - prev.datasetData.dac = option.item; - prev.disableOkBtn = false; - prev.problemSavingRequest = false; - prev.problemLoadingUpdateDataset = false; - } - setRegistrationState(prev); - }; - - const formatFormData = (data) => { - let result = {}; - result.datasetName = data.datasetName; - result.dacId = registrationState.selectedDac.dacId; - result.consentId = data.consentId; - // The deprecated API this posts to is expecting a `translatedUseRestriction` field - result.translatedUseRestriction = data.translatedDataUse; - result.deletable = true; - result.isAssociatedToDataOwners = true; - result.updateAssociationToDataOwnerAllowed = true; - result.properties = createProperties(); - result.dataUse = fp.isEmpty(registrationState.updateDataset) ? formatDataUse(registrationState.formData) : registrationState.updateDataset.dataUse; - return result; - }; - - const formatDataUse = (data) => { - let result = {}; - if (data.methods) { - result.methodsResearch = data.methods; - } - if (data.genetic) { - result.geneticStudiesOnly = data.genetic; - } - if (data.publication) { - result.publicationResults = data.publication; - } - if (data.collaboration) { - result.collaboratorRequired = data.collaboration; - } - if (data.ethics) { - result.ethicsApprovalRequired = data.ethics; - } - if (data.geographic) { - result.geographicalRestrictions = 'Yes'; - } - if (data.moratorium) { - result.publicationMoratorium = data.moratorium; - } - if (data.npoa) { - result.populationOriginsAncestry = false; - } - if (data.nonProfit) { - result.nonProfitUse = data.nonProfit; - } - if (data.hmb) { - result.hmbResearch = data.hmb; - } - if (data.diseases) { - let ids = data.ontologies.map(ontology => ontology.id); - result.diseaseRestrictions = ids; - } - if (data.other) { - result.otherRestrictions = data.other; - } - if (fp.trim(data.primaryOtherText).length > 0) { - result.other = data.primaryOtherText; - } - if (data.secondaryOther) { - result.secondaryOther = data.secondaryOtherText; - } - if (data.generalUse) { - result.generalUse = data.generalUse; - } - return result; - }; - - const formatOntologyItems = (ontologies) => { - const ontologyItems = ontologies.map((ontology) => { - return { - id: ontology.id || ontology.item.id, - key: ontology.id || ontology.item.id, - value: ontology.id || ontology.item.id, - label: ontology.label || ontology.item.label, - item: ontology || ontology.item - }; - }); - return ontologyItems; - }; - - const { - hmb = false, - npoa = false, - diseases = false, - other = false, - primaryOtherText = '', - secondaryOther = false, - secondaryOtherText = '', - genetic = false, - nonProfit = false, - publication = false, - collaboration = false, - ethics = false, - geographic = false, - moratorium = false, - methods = false, - generalUse = false, - ontologies - } = registrationState.formData; - const { problemSavingRequest, problemLoadingUpdateDataset, showValidationMessages, submissionSuccess } = registrationState; - const isTypeOfResearchInvalid = isTypeOfResearchInvalidChange(); - const isUpdateDataset = (!fp.isEmpty(registrationState.updateDataset)); - const dacOptions = dacOptionsChange(); - const profileUnsubmitted = ( - - Please make sure{' '} - - Your Profile - {' '} - is updated, as it will be linked to your dataset for future correspondence - - ); - - - return ( -
-
-
- -
- -
-
-
-
- -
-
-
-
-
- {registrationState.completed === false && ( -
- -
- )} - {problemLoadingUpdateDataset && ( -
- -
- )} -

1. Dataset Information

- -
-
- -
- -
- - {(fp.isEmpty(registrationState.datasetData.researcher) && showValidationMessages) && ( - Required field - )} -
-
- - -
-
- -
- -
- - {(fp.isEmpty(registrationState.datasetData.principalInvestigator) && showValidationMessages) && ( - Required field - )} -
-
- - {/* 1.3 Dataset Name */} -
-
- -
- -
- - { - fp.includes( - 'required-field-error', - showDatasetNameErrorHighlight(registrationState.datasetData.datasetName, showValidationMessages) - ) && ( - - {registrationState.datasetData.isValidName ? 'Required field' : 'Dataset Name already in use'} - - ) - } -
-
- - -
-
- -
-
- - {(fp.isEmpty(registrationState.datasetData.datasetRepoUrl) && showValidationMessages) && ( - Required field - )} -
-
- -
-
- -
-
- - {(fp.isEmpty(registrationState.datasetData.dataType) && showValidationMessages) && ( - Required field - )} -
-
- -
-
- -
-
- - {(fp.isEmpty(registrationState.datasetData.species) && showValidationMessages) && ( - Required field - )} -
-
- -
-
- -
-
- - {(fp.isEmpty(registrationState.datasetData.phenotype) && showValidationMessages) && ( - Required field - )} -
-
- -
-
- -
-
- - {(fp.isEmpty(registrationState.datasetData.nrParticipants) && showValidationMessages) && ( - Required field - )} -
-
- -
-
- -
-
- - {(fp.isEmpty(registrationState.datasetData.description) && showValidationMessages) && ( - Required field - )} -
-
- -
-
- -
-
-