Skip to content

Commit

Permalink
embargo component (#267)
Browse files Browse the repository at this point in the history
* embargo component

* empty record

* record restriction variables added to form config

* empty_data component for access

* accessrights on detail

* version bump

---------

Co-authored-by: Mirek Simek <[email protected]>
  • Loading branch information
Ducica and mesemus authored Feb 15, 2025
1 parent 1d099da commit 5da49b7
Show file tree
Hide file tree
Showing 11 changed files with 186 additions and 2 deletions.
6 changes: 5 additions & 1 deletion oarepo_ui/resources/components/__init__.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
from .access_empty_record import EmptyRecordAccessComponent
from .babel import BabelComponent
from .base import UIResourceComponent
from .bleach import AllowedHtmlTagsComponent
from .communities import AllowedCommunitiesComponent
from .files import FilesComponent
from .permissions import PermissionsComponent
from .files_locked import FilesLockedComponent
from .permissions import PermissionsComponent
from .record_restriction import RecordRestrictionComponent

__all__ = (
"UIResourceComponent",
Expand All @@ -14,4 +16,6 @@
"FilesComponent",
"AllowedCommunitiesComponent",
"FilesLockedComponent",
"RecordRestrictionComponent",
"EmptyRecordAccessComponent",
)
15 changes: 15 additions & 0 deletions oarepo_ui/resources/components/access_empty_record.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from .base import UIResourceComponent
from typing import Dict


class EmptyRecordAccessComponent(UIResourceComponent):
def empty_record(self, *, resource_requestctx, empty_data: Dict, **kwargs) -> None:
"""
Called before an empty record data are returned.
:param resource_requestctx: invenio request context (see https://github.com/inveniosoftware/flask-resources/blob/master/flask_resources/context.py)
:param empty_data: empty record data
"""
empty_data.setdefault("access", {})
empty_data["access"]["files"] = "public"
empty_data["access"]["record"] = "public"
1 change: 1 addition & 0 deletions oarepo_ui/resources/components/communities.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ def check_user_permissions(cls, community_id, workflow, identity, action):
@classmethod
def community_to_dict(cls, community):
return {
"access": community.access.dump(),
"slug": str(community.slug),
"id": str(community.id),
"logo": f"/api/communities/{community.id}/logo",
Expand Down
14 changes: 14 additions & 0 deletions oarepo_ui/resources/components/record_restriction.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from flask import current_app
from .base import UIResourceComponent
from datetime import timedelta


class RecordRestrictionComponent(UIResourceComponent):
def form_config(self, *, form_config, **kwargs):
form_config["recordRestrictionGracePeriod"] = current_app.config.get(
"RDM_RECORDS_RESTRICTION_GRACE_PERIOD", timedelta(days=30)
).days

form_config["allowRecordRestriction"] = current_app.config.get(
"RDM_RECORDS_ALLOW_RESTRICTION_AFTER_GRACE_PERIOD", False
)
1 change: 1 addition & 0 deletions oarepo_ui/resources/resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,7 @@ def empty_record(self, resource_requestctx, **kwargs):
resource_requestctx=resource_requestctx,
empty_data=empty_data,
)

return empty_data

@property
Expand Down
23 changes: 23 additions & 0 deletions oarepo_ui/templates/components/AccessRight.jinja
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{# def access, search_link, searchFacet="access_status" #}

{% set icons = {
"open": "/static/icons/locks/zamky_open_access.svg",
"restricted": "/static/icons/locks/zamky_Partialy_closed_access.svg",
"embargoed": "/static/icons/locks/zamky_Closed_access.svg",
"metadata-only": "/static/icons/locks/zamky_Partialy_closed_access.svg"
} %}

{% if access.id == "embargoed" %}
{% set tooltipText = "{} - {} ({})".format(access["title_l10n"], access["description_l10n"], access["embargo_date_l10n"]) %}
{% else %}
{% set tooltipText = "{} - {}".format(access["title_l10n"], access["description_l10n"]) %}
{% endif %}


{% set href = search_link ~ "?q=&f=" ~ searchFacet ~ ":" ~ access["id"] %}

<div data-tooltip="{{ tooltipText }}" class="inline">
<a href="{{ href }}" target="_blank" rel="noopener noreferrer">
<img class="ui image mini inline" src="{{ icons[access.id] }}" alt="{{ access.id }}" title="{{ access.id }}" />
</a>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import React, { useEffect, useRef } from "react";
import { Field, useFormikContext } from "formik";
import { AccessRightFieldCmp } from "@js/invenio_rdm_records/src/deposit/fields/AccessField/AccessRightField";
import PropTypes from "prop-types";
import { useFormConfig } from "@js/oarepo_ui";

export const AccessRightField = ({
fieldPath,
label,
labelIcon,
showMetadataAccess,
community,
record,
recordRestrictionGracePeriod,
allowRecordRestriction,
}) => {
const { values } = useFormikContext();
const {
formConfig: { allowed_communities },
} = useFormConfig();

const mounted = useRef(false);
// when you enable embargo to scroll the embargo related inputs into view
useEffect(() => {
// don't scroll it into view on mount if the input exists
if (!mounted.current) {
mounted.current = true;
return;
}

const embargoReasonInput = document.getElementById("access.embargo.reason");
if (embargoReasonInput) {
const rect = embargoReasonInput.getBoundingClientRect();
window.scrollTo(0, document.body.scrollHeight - rect.y);
}
}, [values?.access?.embargo?.active]);
return (
<Field name={fieldPath}>
{(formik) => {
const mainCommunity =
community ||
allowed_communities.find(
(c) => c.id === record?.parent?.communities?.default
);
return (
<AccessRightFieldCmp
formik={formik}
fieldPath={fieldPath}
label={label}
labelIcon={labelIcon}
showMetadataAccess={showMetadataAccess}
community={mainCommunity}
record={record}
recordRestrictionGracePeriod={recordRestrictionGracePeriod}
allowRecordRestriction={allowRecordRestriction}
/>
);
}}
</Field>
);
};

AccessRightField.propTypes = {
fieldPath: PropTypes.string.isRequired,
label: PropTypes.string.isRequired,
labelIcon: PropTypes.string.isRequired,
showMetadataAccess: PropTypes.bool,
community: PropTypes.object,
record: PropTypes.object.isRequired,
recordRestrictionGracePeriod: PropTypes.number.isRequired,
allowRecordRestriction: PropTypes.bool.isRequired,
};

AccessRightField.defaultProps = {
showMetadataAccess: true,
community: undefined,
};
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from "./AccessRightField";
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@ export * from "./SaveButton";
export * from "./ConfirmationModal";
export * from "./BaseFormLayout";
export * from "./CompactFieldLabel";
export * from "./AccessRightField";
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,50 @@
width: 100%;
padding-right: 1rem;
}

.ui.card.access-right {
width: unset;
padding: 0 1rem;
font-size: 1rem;
.field-label-class {
font-size: 1rem;
margin-bottom: 0.5rem;
}

.ui.fitted.checkbox {
margin-top: 0.5rem;
}

.content.extra {
.field {
margin-bottom: 0;
}
label.helptext {
display: inline-block;
margin-bottom: 1rem;
}
}

.field .content:not(:last-child) {
border-bottom: 1px solid @solidBorderColor;
}
.disabled {
opacity: 0.5;
}
.content {
padding: 1rem 0;

.ui.message {
padding: 1em 0.7em;
margin: 0;
}
}

.disabled.description {
margin-top: 3px;
}

.ui.divider {
margin: 0.3rem 0;
}
}
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[metadata]
name = oarepo-ui
version = 5.2.38
version = 5.2.39
description = UI module for invenio 3.5+
long_description = file: README.md
long_description_content_type = text/markdown
Expand Down

0 comments on commit 5da49b7

Please sign in to comment.