diff --git a/invenio_theme_tugraz/assets/semantic-ui/js/invenio_theme_tugraz/deposit/DoiMint.js b/invenio_theme_tugraz/assets/semantic-ui/js/invenio_theme_tugraz/deposit/DoiMint.js new file mode 100644 index 0000000..730677c --- /dev/null +++ b/invenio_theme_tugraz/assets/semantic-ui/js/invenio_theme_tugraz/deposit/DoiMint.js @@ -0,0 +1,196 @@ +import React, { Component } from "react"; +import { + Button, + Card, + Icon, + Label, + Loader, + Dimmer, + Message, +} from "semantic-ui-react"; +import { FieldArray } from "formik"; + +import { DoiRest, MapDatacite } from "datacite-rest"; + +export class DoiMint extends Component { + constructor(props) { + super(props); + this.record = props.record || {}; + this.configs = props.config || {}; + this.metadata = this.record.metadata; + this.is_doi = false; + this.id_doi = ""; + + // check for existing identifiers + if ( + typeof this.metadata.identifiers != "undefined" && + this.metadata.identifiers != null && + this.metadata.identifiers.length != null && + this.metadata.identifiers.length > 0 && + this.metadata.identifiers[0] != null + ) { + this.is_doi = true; + this.id_doi = this.metadata.identifiers[0].identifier; + } + + // add metadata to the state + this.state = { + identifiers: [], + showLoader: false, + doi_id: "", + errorMsg: "", + isError: false, + }; + } + + render() { + // this should fetch a new doi + var pushDoi = (form) => { + // activate the loader + this.setState({ + showLoader: true, + }); + + const url = this.configs.datacite_url; + const auth = { + username: this.configs.datacite_uname, + password: this.configs.datacite_pass, + }; + const prefix = this.configs.datacite_prefix; + + // get mapped DOI + const mapped = MapDatacite(this.metadata, this.record.id, prefix); + + const _doirest = new DoiRest(url); + + // Create a new DOI + _doirest + .create(mapped, auth, this.configs.datacite_password_iv) + .then((data) => { + // if there is an error + if (data.data.errors) { + this.setState({ + showLoader: false, + isError: true, + errorMsg: data.data.errors[0].title, + }); + // if credentials are wrong! + } else if (data.code == 405) { + this.setState({ + showLoader: false, + isError: true, + errorMsg: "Not configured!", + }); + } + // new doi is fetched + else { + // add new identifier + const _identifiers = [ + { + identifier: data.data.data.id, + scheme: "doi", + }, + ]; + // submit the value to the form + this.setState({ identifiers: _identifiers }); + form.setFieldValue("metadata.identifiers", this.state.identifiers); + + this.is_doi = true; + // deactivate the loader + this.setState({ + showLoader: false, + doi_id: this.state.identifiers[0].identifier, + }); + } + }) + .catch((error) => { + console.log("error", error); + }); + }; + + // get a link of dio + var doiLink = (doiId) => { + window.open(`https://doi.org/${doiId}`, "_blank"); + }; + + return ( + + + + + Datacite DOI + + + + Record must be a published record to mint a DOI. + + + + {this.state.isError && ( + + {this.state.errorMsg} +

Please contact Repository supporters!

+
+ )} + + {/* when the Component is rendered */} + {!this.is_doi && ( + + {(fieldArrayProps) => { + const { form } = fieldArrayProps; + return ( +
+ + {this.state.showLoader && ( + + Loading... + + )} +
+ ); + }} +
+ )} + + {this.is_doi && ( +
+ +
+ )} +
+
+ ); + } +} diff --git a/invenio_theme_tugraz/assets/semantic-ui/js/invenio_theme_tugraz/deposit/RDMDepositForm.js b/invenio_theme_tugraz/assets/semantic-ui/js/invenio_theme_tugraz/deposit/RDMDepositForm.js new file mode 100644 index 0000000..ceeb426 --- /dev/null +++ b/invenio_theme_tugraz/assets/semantic-ui/js/invenio_theme_tugraz/deposit/RDMDepositForm.js @@ -0,0 +1,520 @@ +// This file is part of InvenioRDM +// Copyright (C) 2020 CERN. +// Copyright (C) 2020 Northwestern University. +// Copyright (C) 2021 Graz University of Technology. +// +// Invenio App RDM is free software; you can redistribute it and/or modify it +// under the terms of the MIT License; see LICENSE file for more details. + +import _get from "lodash/get"; +import React, { Component, createRef } from "react"; +import { + Button, + Card, + Container, + Grid, + Icon, + Ref, + Sticky, +} from "semantic-ui-react"; +import { + AccessRightField, + ComingSoonField, + CreatibutorsField, + DatesField, + DepositFormApp, + FormFeedback, + DeleteButton, + DepositFormTitle, + DescriptionsField, + FileUploader, + FundingField, + IdentifiersField, + LanguagesField, + PublishButton, + PublicationDateField, + PublisherField, + ResourceTypeField, + SaveButton, + SubjectsField, + TitlesField, + RelatedWorksField, + VersionField, + LicenseField, +} from "react-invenio-deposit"; +import { AccordionField } from "react-invenio-forms"; +import { DoiMint } from "./DoiMint"; + +export class RDMDepositForm extends Component { + constructor(props) { + super(props); + this.config = props.config || {}; + // TODO: retrieve from backend + this.config["canHaveMetadataOnlyRecords"] = true; + + // TODO: Make ALL vocabulary be generated by backend. + // Currently, some vocabulary is generated by backend and some is + // generated by frontend here. Iteration is faster and abstractions can be + // discovered by generating vocabulary here. Once happy with vocabularies, + // then we can generate it in the backend. + this.vocabularies = { + metadata: { + ...this.config.vocabularies, + + titles: { + ...this.config.vocabularies.titles, + }, + + descriptions: { + type: [ + { text: "Abstract", value: "abstract" }, + { text: "Methods", value: "methods" }, + { text: "Series Information", value: "seriesinformation" }, + { text: "Table of Contents", value: "tableofcontents" }, + { text: "Technical Info", value: "technicalinfo" }, + { text: "Other", value: "other" }, + ], + }, + + creators: { + type: [ + { text: "Person", value: "personal" }, + { text: "Organization", value: "organizational" }, + ], + role: [ + { text: "Editor", value: "editor" }, + { text: "Data Curator", value: "datacurator" }, + { text: "Data Manager", value: "datamanager" }, + { text: "Project Manager", value: "projectmanager" }, + ], + }, + + contributors: { + type: [ + { text: "Person", value: "personal" }, + { text: "Organization", value: "organizational" }, + ], + role: [ + { text: "Editor", value: "editor" }, + { text: "Data Curator", value: "datacurator" }, + { text: "Data Manager", value: "datamanager" }, + { text: "Project Manager", value: "projectmanager" }, + ], + }, + + dates: { + type: [ + { text: "Accepted", value: "accepted" }, + { text: "Available", value: "available" }, + { text: "Copyrighted", value: "copyrighted" }, + { text: "Collected", value: "collected" }, + { text: "Created", value: "created" }, + { text: "Issued", value: "issued" }, + { text: "Submitted", value: "submitted" }, + { text: "Updated", value: "updated" }, + { text: "Valid", value: "valid" }, + { text: "Withdrawn", value: "withdrawn" }, + { text: "Other", value: "other" }, + ], + }, + + // TODO: Replace with an API backend + funding: { + funder: [ + { + name: "National Institutes of Health (US)", + identifier: "funder1", + scheme: "funderScheme1", + }, + { + name: "European Commission (EU)", + identifier: "funder2", + scheme: "funderScheme2", + }, + ], + award: [ + { + title: "CANCER &AIDS DRUGS--PRECLIN PHARMACOL/TOXICOLOGY", + number: "N01CM037835-016", + identifier: "awardA", + scheme: "awardSchemeA", + parentScheme: "funderScheme1", + parentIdentifier: "funder1", + }, + { + title: + "Beyond the Standard Model at the LHC and with Atom Interferometers.", + number: "228169", + identifier: "awardB1", + scheme: "awardSchemeB", + parentScheme: "funderScheme2", + parentIdentifier: "funder2", + }, + { + title: "ENvironmental COnditions in GLAucoma Patients", + number: "747441", + identifier: "awardB2", + scheme: "awardSchemeB", + parentScheme: "funderScheme2", + parentIdentifier: "funder2", + }, + ], + }, + + related_identifiers: { + resource_type: this.config.vocabularies.resource_type, + scheme: [ + { text: "ARK", value: "ark" }, + { text: "ARXIV", value: "arxiv" }, + { text: "BIBCODE", value: "bibcode" }, + { text: "DOI", value: "doi" }, + { text: "EAN13", value: "ean13" }, + { text: "EISSN", value: "eissn" }, + { text: "HANDLE", value: "handle" }, + { text: "IGSN", value: "igsn" }, + { text: "ISBN", value: "isbn" }, + { text: "ISSN", value: "issn" }, + { text: "ISTC", value: "istc" }, + { text: "LISSN", value: "lissn" }, + { text: "LSID", value: "lsid" }, + { text: "PMID", value: "pmid" }, + { text: "PURL", value: "purl" }, + { text: "UPC", value: "upc" }, + { text: "URL", value: "url" }, + { text: "URN", value: "urn" }, + { text: "W3ID", value: "w3id" }, + ], + relations: [ + { text: "Is cited by", value: "iscitedby" }, + { text: "Cites", value: "cites" }, + { text: "Is supplement to", value: "issupplementto" }, + { text: "Is supplemented by", value: "issupplementedby" }, + { text: "Is continued by", value: "iscontinuedby" }, + { text: "Continues", value: "continues" }, + { text: "Is described by", value: "isdescribedby" }, + { text: "Describes", value: "describes" }, + { text: "Has metadata", value: "hasmetadata" }, + { text: "Is metadata for", value: "ismetadatafor" }, + { text: "Has version", value: "hasversion" }, + { text: "Is version of", value: "isversionof" }, + { text: "Is new version of", value: "isnewversionof" }, + { text: "Is previous version of", value: "ispreviousversionof" }, + { text: "Is part of", value: "ispartof" }, + { text: "Has part", value: "haspart" }, + { text: "Is referenced by", value: "isreferencedby" }, + { text: "References", value: "references" }, + { text: "Is documented by", value: "isdocumentedby" }, + { text: "Documents", value: "documents" }, + { text: "Is compiled by", value: "iscompiledby" }, + { text: "Compiles", value: "compiles" }, + { text: "Is variant form of", value: "isvariantformof" }, + { text: "Is original form of", value: "isoriginalformof" }, + { text: "Is identical to", value: "isidenticalto" }, + { text: "Is reviewed by", value: "isreviewedby" }, + { text: "Reviews", value: "reviews" }, + { text: "Is derived from", value: "isderivedfrom" }, + { text: "Is source of", value: "issourceof" }, + { text: "Is required by", value: "isrequiredby" }, + { text: "Requires", value: "requires" }, + { text: "Is obsoleted by", value: "isobsoletedby" }, + { text: "Obsoletes", value: "obsoletes" }, + ], + }, + subjects: { + options: [ + { + text: "Deep Learning", + value: { + subject: "Deep Learning", + scheme: "user", + identifier: "U1", + }, + }, + { + text: "MeSH: Cognitive Neuroscience", + value: { + subject: "Cognitive Neuroscience", + scheme: "mesh", + identifier: "D000066494", + }, + }, + { + text: "FAST: Glucagonoma", + value: { + subject: "Glucagonoma", + scheme: "fast", + identifier: "943672", + }, + }, + ], + limitToOptions: [ + { text: "All", value: "all" }, + { text: "MeSH", value: "mesh" }, + { text: "FAST", value: "fast" }, + ], + }, + }, + }; + + // check if files are present + this.noFiles = false; + if ( + !Array.isArray(this.props.files.entries) || + (!this.props.files.entries.length && this.props.record.is_published) + ) { + this.noFiles = true; + } + } + + formFeedbackRef = createRef(); + sidebarRef = createRef(); + + accordionStyle = { + header: { className: "inverted brand", style: { cursor: "pointer" } }, + }; + + render() { + return ( + + + + + + + + + {this.noFiles && ( +

+ The record has no files. +

+ )} + +
+ {/**TODO: uncomment to use IdentifiersField*/} + {/* + + +
+
*/} + + + + + + + + ({ + title: result.title_l10n, + description: result.description_l10n, + id: result.id, + link: result.props.url, + })} + /> +
+
+ + + + {/**TODO: uncomment to use Subjects*/} + {/* + */} + + lang !== null)} // needed because dumped empty record from backend gives [null] + serializeSuggestions={(suggestions) => + suggestions.map((item) => ({ + text: item.title_l10n, + value: item.id, + key: item.id, + })) + } + /> + + + +
+
+ {/**TODO: uncomment to use FundingField*/} + {/* + + + +
+
*/} + + + +
+
+
+ + + + + + + + + + + + + + + + + + {this.config.data_cite &&( + + )} + + + +
+
+
+
+ ); + } +} diff --git a/invenio_theme_tugraz/assets/semantic-ui/js/invenio_theme_tugraz/deposit/index.js b/invenio_theme_tugraz/assets/semantic-ui/js/invenio_theme_tugraz/deposit/index.js new file mode 100644 index 0000000..0bf9bed --- /dev/null +++ b/invenio_theme_tugraz/assets/semantic-ui/js/invenio_theme_tugraz/deposit/index.js @@ -0,0 +1,22 @@ +// This file is part of InvenioRDM +// Copyright (C) 2020 CERN. +// Copyright (C) 2020 Northwestern University. +// +// Invenio App RDM is free software; you can redistribute it and/or modify it +// under the terms of the MIT License; see LICENSE file for more details. + +import React from "react"; +import ReactDOM from "react-dom"; +import "semantic-ui-css/semantic.min.css"; + +import { getInputFromDOM } from "react-invenio-deposit"; +import { RDMDepositForm } from "./RDMDepositForm"; + +ReactDOM.render( + , + document.getElementById("deposit-form") +); diff --git a/invenio_theme_tugraz/config.py b/invenio_theme_tugraz/config.py index e87fcb2..a4f7496 100644 --- a/invenio_theme_tugraz/config.py +++ b/invenio_theme_tugraz/config.py @@ -106,9 +106,12 @@ TUG_ROUTES = { "index": "/", "comingsoon": "/comingsoon", "deposit_create": "/uploads/new", + "deposit_edit": "/uploads/", + "record_detail": "/records/" } -INVENIO_DATACITE_URL = "" -INVENIO_DATACITE_UNAME = "" -INVENIO_DATACITE_PASS = "password" -INVENIO_DATACITE_PREFIX = "" +# Datacite +# INVENIO_DATACITE_URL = "" +# INVENIO_DATACITE_UNAME = "" +# INVENIO_DATACITE_PASS = "password" +# INVENIO_DATACITE_PREFIX = "" diff --git a/invenio_theme_tugraz/ext.py b/invenio_theme_tugraz/ext.py index 0a609b3..2f28781 100644 --- a/invenio_theme_tugraz/ext.py +++ b/invenio_theme_tugraz/ext.py @@ -9,7 +9,7 @@ """invenio module for TUGRAZ theme.""" from . import config -from .views import deposit_create, index +from .views import deposit_create, deposit_edit, index, record_detail class InvenioThemeTugraz(object): @@ -26,6 +26,8 @@ class InvenioThemeTugraz(object): # https://flask.palletsprojects.com/en/1.1.x/api/#flask.Flask.add_url_rule app.add_url_rule("/", "index", index) app.add_url_rule("/uploads/new", "deposit_create", deposit_create) + app.add_url_rule("/uploads/", "deposit_edit", deposit_edit) + app.add_url_rule("/records/", "record_detail", record_detail) self.init_config(app) app.extensions["invenio-theme-tugraz"] = self diff --git a/invenio_theme_tugraz/templates/invenio_theme_tugraz/deposit/deposit.html b/invenio_theme_tugraz/templates/invenio_theme_tugraz/deposit/deposit.html new file mode 100644 index 0000000..0a1b36d --- /dev/null +++ b/invenio_theme_tugraz/templates/invenio_theme_tugraz/deposit/deposit.html @@ -0,0 +1,28 @@ +{# + Copyright (C) 2020 CERN. + Copyright (C) 2020 Northwestern University. + Copyright (C) 2021 Graz University of Technology. + + Invenio-them-tugraz is free software; you can redistribute it and/or modify it + under the terms of the MIT License; see LICENSE file for more details. + #} + + {%- extends config.BASE_TEMPLATE %} + + {%- block page_body %} + {%- if record %} + + {%- endif %} + {%- if files %} + + {%- endif %} + {%- if forms_config %} + + {%- endif %} +
+ {%- endblock page_body %} + + {%- block javascript %} + {{ super() }} + {{ webpack['invenio-theme-tugraz-rdm-deposit.js'] }} + {%- endblock %} diff --git a/invenio_theme_tugraz/templates/invenio_theme_tugraz/landingpage/detail.html b/invenio_theme_tugraz/templates/invenio_theme_tugraz/landingpage/detail.html new file mode 100644 index 0000000..42b9fb0 --- /dev/null +++ b/invenio_theme_tugraz/templates/invenio_theme_tugraz/landingpage/detail.html @@ -0,0 +1,133 @@ +{# + Copyright (C) 2020-2021 CERN. + Copyright (C) 2020 Northwestern University. + Copyright (C) 2021 TU Wien. + Copyright (C) 2021 Graz University of Technology. + + Invenio RDM Records is free software; you can redistribute it and/or modify + it under the terms of the MIT License; see LICENSE file for more details. + #} + + {%- extends config.BASE_TEMPLATE %} + + {%- from "invenio_app_rdm/records/macros/files.html" import file_list_box, preview_file_box %} + {%- from "invenio_app_rdm/records/macros/detail.html" import show_detail %} + + {%- set title = record.metadata.title -%} + {%- set metadata = record.metadata %} + + {%- block page_body %} + {% if permissions is defined and permissions.can_update_draft %} +
+
+ {% endif %} +
+
+
+
+ {%- block record_body -%} + {%- block record_header -%} +
+
+
+ {{ record.ui.publication_date_l10n_long }} + {%- if metadata.version %} + | Version {{ metadata.version }} + {% endif %} +
+
+ {{ record.ui.resource_type }} + + +
+
+
+ {%- endblock record_header -%} + {%- block record_title -%} +

{{ metadata.title }}

+

{%- include "invenio_app_rdm/records/details/creators.html" %}

+ {%- endblock record_title -%} + {%- block record_content -%} +

{%- include "invenio_app_rdm/records/details/contributors.html" %}

+ + {%- include "invenio_app_rdm/records/details/subjects.html" %} +
+ {%- include "invenio_app_rdm/records/details/description.html" %} +
+
+ {%- include "invenio_app_rdm/records/details/licenses.html" %} +
+ {%- endblock record_content -%} + {# files #} + {%- block record_files -%} + {%- if files is not none -%} + {%- if files.enabled and record|can_list_files %} + {%- set default_preview = files.default_preview %} + {%- set files = files|order_entries %} + {%- if files|has_previewable_files -%} + {%- set default_preview_file = files|select_preview_file(default_preview=default_preview) %} + {{ preview_file_box(default_preview_file, pid) }} + {%- endif -%} + {{ file_list_box(files, pid) }} + {% endif %} + {%- else -%} + {# TODO: come up with a proper display #} +
Sorry, the files are restricted!
+ {%- endif -%} + {%- endblock record_files -%} + {%- block record_details -%} + {# More details #} +
+ {%- include "invenio_app_rdm/records/details/details.html" %} +
+ {%- endblock record_details -%} + {%- block record_footer -%} +
+
+
+

Upload infromation

+
+
+ + Created: {{ record.ui.created_date_l10n_long }} | Modified: {{ record.ui.updated_date_l10n_long }} + +
+
+
+ {%- endblock record_footer -%} + {%- block jump -%} + + {%- endblock jump -%} + {%- endblock record_body %} +
+
+ {% block record_sidebar %} + {%- include "invenio_app_rdm/records/details/side_bar.html" %} +
+ {%- include "invenio_theme_tugraz/landingpage/doi.html" %} +
+ {% endblock record_sidebar %} +
+
+
+
+ + {%- endblock page_body %} + + {%- block javascript %} + {{ super() }} + {{ webpack['invenio-app-rdm-landing-page.js'] }} + {# Communities management -- TODO include again when communities are ready #} + {# {{ webpack['invenio-communities-records.js'] }} #} + {{ webpack['previewer_theme.js'] }} + {%- endblock javascript %} diff --git a/invenio_theme_tugraz/templates/invenio_theme_tugraz/landingpage/doi.html b/invenio_theme_tugraz/templates/invenio_theme_tugraz/landingpage/doi.html new file mode 100644 index 0000000..a8a32e0 --- /dev/null +++ b/invenio_theme_tugraz/templates/invenio_theme_tugraz/landingpage/doi.html @@ -0,0 +1,36 @@ +{# + Copyright (C) 2020 CERN. + Copyright (C) 2020 Northwestern University. + + Invenio RDM Records is free software; you can redistribute it and/or modify + it under the terms of the MIT License; see LICENSE file for more details. + #} + + {% if metadata.identifiers %} + {%- set id_doi = metadata.identifiers[0].identifier %} +
+ {% if id_doi %} + + {{ id_doi }} + + + + {% else %} + {{ _("No minted DOI") }} + {% endif %} +
+ {% endif %} diff --git a/invenio_theme_tugraz/views.py b/invenio_theme_tugraz/views.py index e79f1c6..f07a991 100644 --- a/invenio_theme_tugraz/views.py +++ b/invenio_theme_tugraz/views.py @@ -12,14 +12,24 @@ import binascii from typing import Dict from elasticsearch_dsl.utils import AttrDict -from flask import Blueprint, current_app, render_template +from flask import Blueprint, current_app, g, render_template from flask_login import login_required from flask_menu import current_menu +from invenio_app_rdm.records_ui.views.decorators import ( + pass_draft, + pass_record, + pass_record_files, + service, + user_permissions, +) from invenio_app_rdm.records_ui.views.deposits import ( get_form_config, get_search_url, new_record, ) +from invenio_rdm_records.resources.config import RDMDraftFilesResourceConfig +from invenio_rdm_records.resources.serializers import UIJSONSerializer +from invenio_rdm_records.services import RDMDraftFilesService from .crypto import Cryptor from .search import FrontpageRecordsSearch @@ -39,6 +49,7 @@ def ui_blueprint(app): blueprint.add_url_rule(routes["index"], view_func=index) blueprint.add_url_rule(routes["comingsoon"], view_func=comingsoon) blueprint.add_url_rule(routes["deposit_create"], view_func=deposit_create) + blueprint.add_url_rule(routes["record_detail"], view_func=record_detail) @blueprint.app_template_filter("make_dict_like") def make_dict_like(value: str, key: str) -> Dict[str, str]: @@ -65,13 +76,13 @@ def index(): def comingsoon(): - """Frontpage.""" + """Comingsoon.""" return render_template("invenio_theme_tugraz/comingsoon.html") -def get_application_details(): +def get_datacite_details(): """Application credentials for DOI.""" - url = current_app.config.get("invenio_datacite_url") or "" + url = current_app.config.get("INVENIO_DATACITE_URL") or "" username = current_app.config.get("INVENIO_DATACITE_UNAME") or "" password = current_app.config.get("INVENIO_DATACITE_PASS") or "" prefix = current_app.config.get("INVENIO_DATACITE_PREFIX") or "" @@ -87,15 +98,73 @@ def get_application_details(): } return details +# +# TODO: change this override behaviour once +# PR is merged: +# https://github.com/inveniosoftware/invenio-app-rdm/pull/638 +# + @login_required def deposit_create(): """Create a new deposit.""" + forms_config = get_form_config(createUrl=("/api/records")) + forms_config["data_cite"] = get_datacite_details() + return render_template( - "invenio_app_rdm/records/deposit.html", - forms_config=get_form_config(createUrl=("/api/records")), - datacite_config=get_application_details(), + "invenio_theme_tugraz/deposit/deposit.html", + forms_config=forms_config, searchbar_config=dict(searchUrl=get_search_url()), record=new_record(), files=dict(default_preview=None, enabled=True, entries=[], links={}), ) + + +@login_required +@pass_draft +def deposit_edit(draft=None, pid_value=None): + """Edit an existing deposit.""" + # TODO: should be embedded in record service + files_service = RDMDraftFilesService() + files_list = files_service.list_files( + id_=pid_value, + identity=g.identity, + links_config=RDMDraftFilesResourceConfig.links_config, + ) + + serializer = UIJSONSerializer() + record = serializer.serialize_object_to_dict(draft.to_dict()) + + # TODO: get the `is_published` field when reading the draft + from invenio_pidstore.errors import PIDUnregistered + try: + service().draft_cls.pid.resolve(pid_value, registered_only=True) + record["is_published"] = True + except PIDUnregistered: + record["is_published"] = False + + forms_config = get_form_config(apiUrl=f"/api/records/{pid_value}/draft") + forms_config["data_cite"] = get_datacite_details() + + return render_template( + "invenio_theme_tugraz/deposit/deposit.html", + forms_config=forms_config, + record=record, + files=files_list.to_dict(), + searchbar_config=dict(searchUrl=get_search_url()), + ) + + +@pass_record +@pass_record_files +@user_permissions(actions=['update_draft']) +def record_detail(record=None, files=None, pid_value=None, permissions=None): + """Record detail page (aka landing page).""" + files_dict = None if files is None else files.to_dict() + return render_template( + "invenio_theme_tugraz/landingpage/detail.html", + record=UIJSONSerializer().serialize_object_to_dict(record.to_dict()), + pid=pid_value, + files=files_dict, + permissions=permissions, + ) diff --git a/invenio_theme_tugraz/webpack.py b/invenio_theme_tugraz/webpack.py index 3d53c0f..97ef93a 100644 --- a/invenio_theme_tugraz/webpack.py +++ b/invenio_theme_tugraz/webpack.py @@ -18,8 +18,31 @@ theme = WebpackThemeBundle( "invenio-theme-tugraz-theme": "./less/invenio_theme_tugraz/theme.less", "invenio-theme-tugraz-js": "./js/invenio_theme_tugraz/theme.js", "invenio-theme-tugraz-search-app": "./js/invenio_theme_tugraz/search/index.js", + # overrides RDM deposit form + 'invenio-theme-tugraz-rdm-deposit': './js/invenio_theme_tugraz/deposit/index.js', + }, + dependencies={ + + # required for RDM deposit form + # keep in sync + "@babel/runtime": "^7.9.0", + 'formik': '^2.1.4', + 'luxon': '^1.23.0', + 'path': '^0.12.7', + 'prop-types': '^15.7.2', + 'react-dnd': '^11.1.3', + 'react-dnd-html5-backend': '^11.1.3', + 'react-invenio-deposit': '^0.11.10', + 'react-invenio-forms': '^0.6.3', + 'react-dropzone': "^11.0.3", + 'yup': '^0.27.0', + '@ckeditor/ckeditor5-build-classic': '^16.0.0', + '@ckeditor/ckeditor5-react': '^2.1.0', + + # datacite - rest api plugin + 'datacite-rest': '^0.1.4', + }, - dependencies={}, ) }, )