Skip to content

Commit

Permalink
service: lock record files conditionally
Browse files Browse the repository at this point in the history
  • Loading branch information
kpsherva authored and zzacharo committed Aug 17, 2023
1 parent ee04b1b commit a3bb52b
Show file tree
Hide file tree
Showing 12 changed files with 441 additions and 99 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ export const NewVersionButton = ({ onError, record, disabled, ...uiProps }) => {
loading={loading}
icon
labelPosition="left"
disabled={disabled}
{...uiProps}
>
<Icon name="tag" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,14 @@ export const FileUploaderComponent = ({
importButtonText,
isFileImportInProgress,
decimalSizeDisplay,
filesLocked,
...uiProps
}) => {
// We extract the working copy of the draft stored as `values` in formik
const { values: formikDraft } = useFormikContext();
const filesEnabled = _get(formikDraft, "files.enabled", false);
const [warningMsg, setWarningMsg] = useState();
const lockFileUploader = !isDraftRecord && filesLocked;

const filesList = Object.values(files).map((fileState) => {
return {
Expand Down Expand Up @@ -144,7 +146,6 @@ export const FileUploaderComponent = ({

const displayImportBtn =
filesEnabled && isDraftRecord && hasParentRecord && !filesList.length;

return (
<Overridable
id="ReactInvenioDeposit.FileUploader.layout"
Expand All @@ -169,19 +170,19 @@ export const FileUploaderComponent = ({
dropzoneParams={dropzoneParams}
warningMsg={warningMsg}
setWarningMsg={setWarningMsg}
filesLocked={lockFileUploader}
{...uiProps}
>
<>
<Grid>
<Grid className="file-uploader">
<Grid.Row className="pt-10 pb-5">
{isDraftRecord && (
{!lockFileUploader && (
<FileUploaderToolbar
{...uiProps}
config={config}
filesEnabled={filesEnabled}
filesList={filesList}
filesSize={filesSize}
isDraftRecord={isDraftRecord}
quota={quota}
decimalSizeDisplay={decimalSizeDisplay}
/>
Expand All @@ -200,7 +201,7 @@ export const FileUploaderComponent = ({
<Grid.Row className="pb-5 pt-5">
<Grid.Column width={16}>
<Message visible info>
<div style={{ display: "inline-block", float: "right" }}>
<div className="right-floated display-inline-block">
<Button
type="button"
size="mini"
Expand All @@ -212,7 +213,7 @@ export const FileUploaderComponent = ({
loading={isFileImportInProgress}
/>
</div>
<p style={{ marginTop: "5px", display: "inline-block" }}>
<p className="display-inline-block mt-5">
<Icon name="info circle" />
{i18next.t("You can import files from the previous version.")}
</p>
Expand All @@ -226,7 +227,7 @@ export const FileUploaderComponent = ({
id="ReactInvenioDeposit.FileUploader.FileUploaderArea.container"
filesList={filesList}
dropzoneParams={dropzoneParams}
isDraftRecord={isDraftRecord}
filesLocked={lockFileUploader}
filesEnabled={filesEnabled}
deleteFile={deleteFile}
decimalSizeDisplay={decimalSizeDisplay}
Expand All @@ -238,7 +239,7 @@ export const FileUploaderComponent = ({
{...uiProps}
filesList={filesList}
dropzoneParams={dropzoneParams}
isDraftRecord={isDraftRecord}
filesLocked={lockFileUploader}
filesEnabled={filesEnabled}
deleteFile={deleteFile}
decimalSizeDisplay={decimalSizeDisplay}
Expand All @@ -250,6 +251,8 @@ export const FileUploaderComponent = ({
<Overridable
id="ReactInvenioDeposit.FileUploader.NewVersionButton.container"
isDraftRecord={isDraftRecord}
draft={formikDraft}
filesLocked={lockFileUploader}
permissions={permissions}
record={record}
{...uiProps}
Expand All @@ -268,25 +271,26 @@ export const FileUploaderComponent = ({
</Grid.Column>
</Grid.Row>
) : (
<Grid.Row className="file-upload-note pt-5">
<Grid.Column width={16}>
<Message info>
<NewVersionButton
record={record}
onError={() => {}}
className=""
disabled={!permissions.can_new_version}
style={{ float: "right" }}
/>
<p style={{ marginTop: "5px", display: "inline-block" }}>
<Icon name="info circle" size="large" />
{i18next.t(
"You must create a new version to add, modify or delete files."
)}
</p>
</Message>
</Grid.Column>
</Grid.Row>
filesLocked && (
<Grid.Row className="file-upload-note pt-5">
<Grid.Column width={16}>
<Message info>
<NewVersionButton
record={record}
onError={() => {}}
className="right-floated"
disabled={!permissions.can_new_version}
/>
<p className="mt-5 display-inline-block">
<Icon name="info circle" size="large" />
{i18next.t(
"You must create a new version to add, modify or delete files."
)}
</p>
</Message>
</Grid.Column>
</Grid.Row>
)
)}
</Overridable>
</Grid>
Expand Down Expand Up @@ -342,6 +346,7 @@ FileUploaderComponent.propTypes = {
uploadFiles: PropTypes.func.isRequired,
deleteFile: PropTypes.func.isRequired,
decimalSizeDisplay: PropTypes.bool,
filesLocked: PropTypes.bool,
permissions: PropTypes.object,
};

Expand All @@ -363,4 +368,5 @@ FileUploaderComponent.defaultProps = {
importButtonIcon: "sync",
importButtonText: i18next.t("Import files"),
decimalSizeDisplay: true,
filesLocked: false,
};
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ import {
} from "semantic-ui-react";
import { humanReadableBytes } from "react-invenio-forms";

const FileTableHeader = ({ isDraftRecord }) => (
const FileTableHeader = ({ filesLocked }) => (
<Table.Header>
<Table.Row>
<Table.HeaderCell>
Expand All @@ -38,24 +38,24 @@ const FileTableHeader = ({ isDraftRecord }) => (
</Table.HeaderCell>
<Table.HeaderCell>{i18next.t("Filename")}</Table.HeaderCell>
<Table.HeaderCell>{i18next.t("Size")}</Table.HeaderCell>
{isDraftRecord && (
{!filesLocked && (
<Table.HeaderCell textAlign="center">{i18next.t("Progress")}</Table.HeaderCell>
)}
{isDraftRecord && <Table.HeaderCell />}
{!filesLocked && <Table.HeaderCell />}
</Table.Row>
</Table.Header>
);

FileTableHeader.propTypes = {
isDraftRecord: PropTypes.bool,
filesLocked: PropTypes.bool,
};

FileTableHeader.defaultProps = {
isDraftRecord: false,
filesLocked: false,
};

const FileTableRow = ({
isDraftRecord,
filesLocked,
file,
deleteFile,
defaultPreview,
Expand Down Expand Up @@ -125,7 +125,7 @@ const FileTableRow = ({
<Table.Cell data-label={i18next.t("Size")} width={2}>
{file.size ? humanReadableBytes(file.size, decimalSizeDisplay) : ""}
</Table.Cell>
{isDraftRecord && (
{!filesLocked && (
<Table.Cell
className="file-upload-pending"
data-label={i18next.t("Progress")}
Expand All @@ -145,7 +145,7 @@ const FileTableRow = ({
{file.uploadState?.isPending && <span>{i18next.t("Pending")}</span>}
</Table.Cell>
)}
{isDraftRecord && (
{!filesLocked && (
<Table.Cell textAlign="right" width={2}>
{(file.uploadState?.isFinished || file.uploadState?.isFailed) &&
(isDeleting ? (
Expand Down Expand Up @@ -180,7 +180,7 @@ const FileTableRow = ({
};

FileTableRow.propTypes = {
isDraftRecord: PropTypes.bool,
filesLocked: PropTypes.bool,
file: PropTypes.object,
deleteFile: PropTypes.func.isRequired,
defaultPreview: PropTypes.string,
Expand All @@ -189,21 +189,21 @@ FileTableRow.propTypes = {
};

FileTableRow.defaultProps = {
isDraftRecord: false,
filesLocked: false,
file: undefined,
defaultPreview: undefined,
decimalSizeDisplay: false,
};

const FileUploadBox = ({
isDraftRecord,
filesLocked,
filesList,
dragText,
uploadButtonIcon,
uploadButtonText,
openFileDialog,
}) =>
isDraftRecord && (
!filesLocked && (
<Segment
basic
padded="very"
Expand Down Expand Up @@ -236,7 +236,7 @@ const FileUploadBox = ({
);

FileUploadBox.propTypes = {
isDraftRecord: PropTypes.bool.isRequired,
filesLocked: PropTypes.bool.isRequired,
filesList: PropTypes.array,
dragText: PropTypes.string,
uploadButtonIcon: PropTypes.node,
Expand All @@ -252,23 +252,18 @@ FileUploadBox.defaultProps = {
openFileDialog: null,
};

const FilesListTable = ({
isDraftRecord,
filesList,
deleteFile,
decimalSizeDisplay,
}) => {
const FilesListTable = ({ filesLocked, filesList, deleteFile, decimalSizeDisplay }) => {
const { setFieldValue, values: formikDraft } = useFormikContext();
const defaultPreview = _get(formikDraft, "files.default_preview", "");
return (
<Table>
<FileTableHeader isDraftRecord={isDraftRecord} />
<FileTableHeader filesLocked={filesLocked} />
<Table.Body>
{filesList.map((file) => {
return (
<FileTableRow
key={file.name}
isDraftRecord={isDraftRecord}
filesLocked={filesLocked}
file={file}
deleteFile={deleteFile}
defaultPreview={defaultPreview}
Expand All @@ -285,14 +280,14 @@ const FilesListTable = ({
};

FilesListTable.propTypes = {
isDraftRecord: PropTypes.bool,
filesLocked: PropTypes.bool,
filesList: PropTypes.array,
deleteFile: PropTypes.func,
decimalSizeDisplay: PropTypes.bool,
};

FilesListTable.defaultProps = {
isDraftRecord: undefined,
filesLocked: undefined,
filesList: undefined,
deleteFile: undefined,
decimalSizeDisplay: undefined,
Expand Down Expand Up @@ -341,7 +336,7 @@ FileUploaderArea.propTypes = {
dropzoneParams: PropTypes.object,
filesEnabled: PropTypes.bool.isRequired,
filesList: PropTypes.array,
isDraftRecord: PropTypes.bool,
filesLocked: PropTypes.bool,
links: PropTypes.object,
setDefaultPreviewFile: PropTypes.func,
uploadButtonIcon: PropTypes.string,
Expand All @@ -354,7 +349,7 @@ FileUploaderArea.defaultProps = {
dragText: undefined,
dropzoneParams: undefined,
filesList: undefined,
isDraftRecord: false,
filesLocked: false,
links: undefined,
setDefaultPreviewFile: undefined,
uploadButtonIcon: undefined,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,42 +20,40 @@ export class ReferencesField extends Component {
const { fieldPath, label, labelIcon, required, showEmptyValue } = this.props;

return (
<>
<ArrayField
addButtonLabel={i18next.t("Add reference")}
defaultNewValue={emptyReference}
fieldPath={fieldPath}
label={<FieldLabel htmlFor={fieldPath} icon={labelIcon} label={label} />}
required={required}
showEmptyValue={showEmptyValue}
>
{({ arrayHelpers, indexPath }) => {
const fieldPathPrefix = `${fieldPath}.${indexPath}`;
<ArrayField
addButtonLabel={i18next.t("Add reference")}
defaultNewValue={emptyReference}
fieldPath={fieldPath}
label={<FieldLabel htmlFor={fieldPath} icon={labelIcon} label={label} />}
required={required}
showEmptyValue={showEmptyValue}
>
{({ arrayHelpers, indexPath }) => {
const fieldPathPrefix = `${fieldPath}.${indexPath}`;

return (
<GroupField optimized>
<TextField
fieldPath={`${fieldPathPrefix}.reference`}
label={i18next.t("Reference string")}
required
width={16}
/>
return (
<GroupField optimized>
<TextField
fieldPath={`${fieldPathPrefix}.reference`}
label={i18next.t("Reference string")}
required
width={16}
/>

<Form.Field>
<Button
aria-label={i18next.t("Remove field")}
className="close-btn"
icon
onClick={() => arrayHelpers.remove(indexPath)}
>
<Icon name="close" />
</Button>
</Form.Field>
</GroupField>
);
}}
</ArrayField>
</>
<Form.Field>
<Button
aria-label={i18next.t("Remove field")}
className="close-btn"
icon
onClick={() => arrayHelpers.remove(indexPath)}
>
<Icon name="close" />
</Button>
</Form.Field>
</GroupField>
);
}}
</ArrayField>
);
}
}
Expand Down
Loading

0 comments on commit a3bb52b

Please sign in to comment.