diff --git a/README.md b/README.md index e1de47be..800a99f0 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Running the following command will create an optimized static build of your app npm run build ```` -## Docker build for DEV development +## Docker build for DEV/TEST/PROD development There are a few configurable environment variables to keep in mind: @@ -28,11 +28,3 @@ There are a few configurable environment variables to keep in mind: cd docker ./docker-development.sh [check|config|build|start|stop|down] ``` - -## Docker build for deployment on TEST/STAGE/PROD - -``` -cd docker -docker pull hubmap/ingest-ui:2.3.0 (replace with the actual released version number) -./docker-deployment.sh [start|stop|down] -``` diff --git a/VERSION b/VERSION index c959dfbb..6ac04ca9 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.6.12 +2.6.13 diff --git a/src/src/App.js b/src/src/App.js index ff147736..bcc3eb18 100644 --- a/src/src/App.js +++ b/src/src/App.js @@ -313,7 +313,8 @@ export function App (props){ }; function handleCancel(){ - window.history.back(); + // window.history.back(); + navigate("/"); } const onClose = (event, reason) => { navigate("/"); diff --git a/src/src/components/collections/collections.jsx b/src/src/components/collections/collections.jsx index a4aeb5c7..fb829b3b 100644 --- a/src/src/components/collections/collections.jsx +++ b/src/src/components/collections/collections.jsx @@ -4,6 +4,7 @@ import "../../App.css"; import SearchComponent from "../search/SearchComponent"; import {COLUMN_DEF_MIXED,COLUMN_DEF_MIXED_SM} from "../search/table_constants"; import { entity_api_get_entity,entity_api_create_entity, entity_api_update_entity} from '../../service/entity_api'; +import {ingest_api_publish_collection,ingest_api_user_admin} from '../../service/ingest_api'; import { getPublishStatusColor } from "../../utils/badgeClasses"; import { generateDisplaySubtypeSimple_UBKG } from "../../utils/display_subtypes"; import Papa from 'papaparse'; @@ -15,7 +16,7 @@ import Dialog from "@material-ui/core/Dialog"; import DialogActions from "@material-ui/core/DialogActions"; import DialogContent from "@material-ui/core/DialogContent"; import GroupModal from "../uuid/groupModal"; - +import LoadingButton from '@mui/lab/LoadingButton'; import Table from '@mui/material/Table'; import TableBody from '@mui/material/TableBody'; import TableCell from '@mui/material/TableCell'; @@ -23,7 +24,7 @@ import TableContainer from '@mui/material/TableContainer'; import TableHead from '@mui/material/TableHead'; import TableRow from '@mui/material/TableRow'; import {DataGrid,GridToolbar} from "@mui/x-data-grid"; - +import {ErrBox} from "../../utils/ui_elements"; import Alert from '@mui/material/Alert'; import Collapse from '@mui/material/Collapse'; import LinearProgress from '@material-ui/core/LinearProgress'; @@ -48,20 +49,29 @@ export function CollectionForm (props){ var [associatedEntities, setassociatedEntities] = useState([]); var [associatedEntitiesInitial, setassociatedEntitiesInitial] = useState([]); var [selectedSources, setSelectedSources] = useState([]); + var [publishing, setPublishing] = useState(false); var [fileDetails, setFileDetails] = useState(); var [buttonState, setButtonState] = useState(''); var [warningOpen, setWarningOpen] = React.useState(false); - var [openGroupModal, setOpenGroupModal] = useState(false - - - ); + var [openGroupModal, setOpenGroupModal] = useState(false); var [lookupShow, setLookupShow] = useState(false); var [loadingDatasets, setLoadingDatasets] = useState(true); var [hideUUIDList, setHideUUIDList] = useState(true); var [loadUUIDList, setLoadUUIDList] = useState(false); var [validatingSubmitForm, setValidatingSubmitForm] = useState(false); var [entityInfo, setEntityInfo] = useState(); + var [userAdmin, setUserAdmin] = useState(false); var [pageError, setPageError] = useState(""); + // var [publishError, setPublishError] = useState({ + // status:"", + // message:"", + // }); + // @TODO: See what we can globalize/memoize/notize here + var [errorHandler, setErrorHandler] = useState({ + status: "", + message: "", + isError: null + }); var [formWarnings, setFormWarnings] = useState({ bulk_dataset_uuids:"" }); @@ -87,6 +97,18 @@ export function CollectionForm (props){ var [datatypeList] = useState(props.dtl_all); var [editingCollection] = useState(props.editingCollection); + + useEffect(() => { + ingest_api_user_admin(JSON.parse(localStorage.getItem("info")).groups_token) + .then((results) => { + console.debug('%c◉ ADMINCHECK ', 'color:#3F007b', results); + setUserAdmin(results) + }) + .catch((err) => { + console.debug('%c⭗', 'color:#1f005d', "ingest_api_user_admin ERR", err ); + }) + }, []); + useEffect(() => { if (editingCollection) { setassociatedEntities([]) @@ -379,18 +401,7 @@ export function CollectionForm (props){ // Only include if presnent, ignore if not console.debug('%c⊙', 'color:#00ff7b', "contributors",contributors ); if (contributors && (contributors[0] && contributors[0].orcid!==undefined)) { - // formValuesSubmit.contributors = contributors formValuesSubmit.contributors = contributors - setFormErrors((prevValues) => ({ - ...prevValues, - 'contributors': "", - })) - } else{ - setFormErrors((prevValues) => ({ - ...prevValues, - 'contributors': "Contributors detected but colums are unsupported / improperly formatted. Please referto the examples linked below and try again.", - })) - isValid = false; } // Do not send blank contacts if (contacts && (contacts[0])) { @@ -467,6 +478,27 @@ export function CollectionForm (props){ }); } + const handlePublish = () => { + setPublishing(true) + ingest_api_publish_collection(props.authToken,editingCollection.uuid) + .then((response) => { + if(response.status === 200){ + console.debug('%c◉ Good ingest_api_publish_collection ', 'color:#00ff7b', response); + props.onProcessed(response.results); + }else{ + console.debug('%c◉ ingest_api_publish_collection Bad result', 'color:#ff337b', response); + setPublishing(false) + let authMessage = response.status === 401 ? "User must be Authorized" : response.results.error.toString(); + setPageError(response.status + " | " + authMessage); + } + }) + .catch((error) => { + console.debug('%c⭗ handlePublishErr Broken Result', 'color:#ff005d', error); + setPageError(error.status + " | " + error.message); + setPublishing(false); + }); + } + const handleUpdate = (formSubmit) => { // Need to only pass what's changed now console.debug('%c◉ formSubmit ', 'color:#00ff7b',formSubmit ); @@ -520,13 +552,12 @@ export function CollectionForm (props){ var contributors = [] var contacts = [] for (const row of data.data) { + contributors.push(row) if(!row.is_contact){ row.is_contact = "NO" }else if (row.is_contact && (row.is_contact === "TRUE"|| row.is_contact.toLowerCase()==="yes") ){ contacts.push(row) } - contributors.push(row) - } setFormValues ({ ...formValues, @@ -548,10 +579,14 @@ export function CollectionForm (props){ key={("rowName_" + index)} className="row-selection" > - {row.display_name} - {row.affiliation} - {row.orcid} - { (row.is_contact && (row.is_contact==="TRUE" || row.is_contact.toLowerCase()==="yes")) ? : ""} + {row.display_name} + {row.affiliation} + {row.orcid} + {row.email } + { (row.is_contact && (row.is_contact==="TRUE" || row.is_contact.toLowerCase()==="yes")) ? : ""} + {row.is_principal_investigator } + {row.is_operator } + {row.metadata_schema_id} ); }); @@ -566,10 +601,14 @@ export function CollectionForm (props){ - Name - Affiliation - Orcid - Is Contact + Name + Affiliation + Orcid + Email + Is Contact + Is Principal Investigator + Is Operator + Metadata Schema ID @@ -880,6 +919,18 @@ export function CollectionForm (props){ value={formValues.title} /> + {editingCollection && editingCollection.doi_url && ( + + + + )} - Contributors @@ -903,9 +953,8 @@ export function CollectionForm (props){ {formValues.contributors && formValues.contributors.length > 0 && ( <>{renderContribTable()} )} -
- Please referto the contributor file schema information, and this Example TSV File + Please refer to the contributor file schema information, and this Example TSV File