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()} >
)}
-