Skip to content

Commit

Permalink
Adds GraphQL query support for picking s3 objects in the ingest bucke…
Browse files Browse the repository at this point in the history
…t. Backend implemented with a new S3 backend utility module.

Defines a S3ObjectPicker component, now used by the file set modal and fil set replace modal.
  • Loading branch information
bmquinn committed Jun 25, 2024
1 parent b1b4780 commit 5d5748b
Show file tree
Hide file tree
Showing 15 changed files with 724 additions and 158 deletions.
10 changes: 6 additions & 4 deletions app/assets/js/components/Work/Tabs/Preservation/ActionsCol.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,10 @@ const PreservationActionsCol = ({
<AuthDisplayAuthorized>
<a
className={actionItemClasses}
onClick={() => handleReplaceFilesetClick(fileset)}
onClick={() => {
handleReplaceFilesetClick(fileset)
setIsActionsOpen(false);
}}
>
<IconReplace />
<span style={{ marginLeft: "0.5rem" }}>Replace fileset</span>
Expand All @@ -202,11 +205,10 @@ const PreservationActionsCol = ({
</DialogClose>
<DialogTitle>
Delete
{`Fileset: ${
deleteFilesetModal.fileset.coreMetadata
{`Fileset: ${deleteFilesetModal.fileset.coreMetadata
? deleteFilesetModal.fileset.coreMetadata.label
: ""
}`}
}`}
</DialogTitle>
{work && (
<div
Expand Down
77 changes: 57 additions & 20 deletions app/assets/js/components/Work/Tabs/Preservation/FileSetModal.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { GET_WORK, INGEST_FILE_SET } from "@js/components/Work/work.gql.js";
import React, { useState } from "react";
/** @jsx jsx */
import { css, jsx } from "@emotion/react";
import { s3Location, toastWrapper } from "@js/services/helpers";
import { getFileNameFromS3Uri, s3Location, toastWrapper } from "@js/services/helpers";
import { useLazyQuery, useMutation } from "@apollo/client";

import Error from "@js/components/UI/Error";
Expand All @@ -17,11 +17,25 @@ import WorkTabsPreservationFileSetForm from "@js/components/Work/Tabs/Preservati
import classNames from "classnames";
import useAcceptedMimeTypes from "@js/hooks/useAcceptedMimeTypes";
import { useCodeLists } from "@js/context/code-list-context";
import S3ObjectPicker from "@js/components/Work/Tabs/Preservation/S3ObjectPicker"

const modalCss = css`
z-index: 100;
`;

const sectionHeaderCss = css`
font-size: 1.2rem;
font-weight: bold;
margin-bottom: 1rem;
`;

const sectionCss = css`
margin-bottom: 2rem;
padding: 1rem;
border: 1px solid #ddd;
border-radius: 4px;
`;

function WorkTabsPreservationFileSetModal({
closeModal,
isVisible,
Expand All @@ -34,6 +48,7 @@ function WorkTabsPreservationFileSetModal({
const [uploadError, setUploadError] = useState();
const [stateXhr, setStateXhr] = useState(null);
const [acceptedFileTypes, setAcceptedFileTypes] = React.useState("");
const [uploadMethod, setUploadMethod] = useState(null);

const codeLists = useCodeLists();

Expand All @@ -48,10 +63,17 @@ function WorkTabsPreservationFileSetModal({
shouldUnregister: false,
});

// Watch form select element fileSetRole for changes, to determine what types
// of files are allowed to upload
const watchRole = methods.watch("fileSetRole");

const handleSelectS3Object = (s3Object) => {
setCurrentFile({
location: s3Object.key,
name: getFileNameFromS3Uri(s3Object.key),
});
setS3UploadLocation(s3Object.key);
setUploadMethod('s3');
};

React.useEffect(() => {
if (!watchRole) return;
const mimeTypes = useAcceptedMimeTypes({
Expand Down Expand Up @@ -88,8 +110,6 @@ function WorkTabsPreservationFileSetModal({
onError(error) {
console.error(`error:`, error);
resetForm();
// bug with this error not clearing/resetting
// https://github.com/apollographql/apollo-feature-requests/issues/170
},
refetchQueries: [
{
Expand All @@ -102,7 +122,7 @@ function WorkTabsPreservationFileSetModal({
);

const handleSubmit = (data) => {
ingestFileSet({
const mutationInput = {
variables: {
accession_number: data.accessionNumber,
workId,
Expand All @@ -113,8 +133,9 @@ function WorkTabsPreservationFileSetModal({
original_filename: currentFile.name,
location: s3UploadLocation,
},
},
});
}
}
ingestFileSet(mutationInput);
};

const handleCancel = () => {
Expand All @@ -129,10 +150,12 @@ function WorkTabsPreservationFileSetModal({
setS3UploadLocation(null);
setUploadProgress(0);
setUploadError(null);
setUploadMethod(null);
};

const handleSetFile = (file) => {
setCurrentFile(file);
setUploadMethod('dragdrop');
if (file) {
getPresignedUrl({
variables: {
Expand Down Expand Up @@ -228,17 +251,31 @@ function WorkTabsPreservationFileSetModal({
</UIFormField>

{watchRole && (
<div className="block mt-5">
<WorkTabsPreservationFileSetDropzone
currentFile={currentFile}
acceptedFileTypes={acceptedFileTypes}
fileSetRole={watchRole}
handleRemoveFile={resetForm}
handleSetFile={handleSetFile}
uploadProgress={uploadProgress}
workTypeId={workTypeId}
/>
</div>
<>
<div css={sectionCss}>
<h3 css={sectionHeaderCss}>Option 1: Drag and Drop File</h3>
<WorkTabsPreservationFileSetDropzone
currentFile={currentFile}
acceptedFileTypes={acceptedFileTypes}
fileSetRole={watchRole}
handleRemoveFile={resetForm}
handleSetFile={handleSetFile}
uploadProgress={uploadProgress}
workTypeId={workTypeId}
disabled={uploadMethod === 's3'}
/>
</div>

<div css={sectionCss}>
<h3 css={sectionHeaderCss}>Option 2: Choose from S3 Ingest Bucket</h3>
<S3ObjectPicker
onFileSelect={handleSelectS3Object}
fileSetRole={watchRole}
workTypeId={workTypeId}
disabled={uploadMethod === 'dragdrop'}
/>
</div>
</>
)}

{s3UploadLocation && (
Expand Down Expand Up @@ -282,4 +319,4 @@ WorkTabsPreservationFileSetModal.propTypes = {
workTypeId: PropTypes.oneOf(["IMAGE", "AUDIO", "VIDEO"]),
};

export default WorkTabsPreservationFileSetModal;
export default WorkTabsPreservationFileSetModal;
Loading

0 comments on commit 5d5748b

Please sign in to comment.