invenio-app-rdm 13.0.0b1.dev29__py2.py3-none-any.whl → 13.0.0b1.dev30__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- invenio_app_rdm/__init__.py +1 -1
- invenio_app_rdm/administration/records/records.py +5 -0
- invenio_app_rdm/config.py +3 -0
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/CompareRevisionsDropdown.js +83 -0
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/ImpersonateUserForm.js +0 -1
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/RevisionsDiffViewer.js +77 -0
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/CompareRevisions.js +128 -0
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/RecordResourceActions.js +41 -2
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/api/api.js +5 -0
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/api/routes.js +3 -0
- invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/globals/site.overrides +2 -0
- invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/administration_page.html +15 -0
- invenio_app_rdm/theme/webpack.py +5 -0
- {invenio_app_rdm-13.0.0b1.dev29.dist-info → invenio_app_rdm-13.0.0b1.dev30.dist-info}/METADATA +5 -1
- {invenio_app_rdm-13.0.0b1.dev29.dist-info → invenio_app_rdm-13.0.0b1.dev30.dist-info}/RECORD +19 -15
- {invenio_app_rdm-13.0.0b1.dev29.dist-info → invenio_app_rdm-13.0.0b1.dev30.dist-info}/LICENSE +0 -0
- {invenio_app_rdm-13.0.0b1.dev29.dist-info → invenio_app_rdm-13.0.0b1.dev30.dist-info}/WHEEL +0 -0
- {invenio_app_rdm-13.0.0b1.dev29.dist-info → invenio_app_rdm-13.0.0b1.dev30.dist-info}/entry_points.txt +0 -0
- {invenio_app_rdm-13.0.0b1.dev29.dist-info → invenio_app_rdm-13.0.0b1.dev30.dist-info}/top_level.txt +0 -0
invenio_app_rdm/__init__.py
CHANGED
invenio_app_rdm/config.py
CHANGED
|
@@ -1461,6 +1461,9 @@ from invenio_app_rdm import __version__
|
|
|
1461
1461
|
ADMINISTRATION_DISPLAY_VERSIONS = [("invenio-app-rdm", f"v{__version__}")]
|
|
1462
1462
|
"""Show the InvenioRDM version in the administration panel."""
|
|
1463
1463
|
|
|
1464
|
+
ADMINISTRATION_THEME_BASE_TEMPLATE = "invenio_app_rdm/administration_page.html"
|
|
1465
|
+
"""Administration base template."""
|
|
1466
|
+
|
|
1464
1467
|
|
|
1465
1468
|
APP_RDM_SUBCOMMUNITIES_LABEL = "Subcommunities"
|
|
1466
1469
|
"""Label for the subcommunities in the community browse page."""
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* // This file is part of Invenio-App-Rdm
|
|
3
|
+
* // Copyright (C) 2025 CERN.
|
|
4
|
+
* //
|
|
5
|
+
* // Invenio-App-Rdm is free software; you can redistribute it and/or modify it
|
|
6
|
+
* // under the terms of the MIT License; see LICENSE file for more details.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import React, { useState } from "react";
|
|
10
|
+
import PropTypes from "prop-types";
|
|
11
|
+
import { Grid, Dropdown, Button } from "semantic-ui-react";
|
|
12
|
+
|
|
13
|
+
export const CompareRevisionsDropdown = ({
|
|
14
|
+
loading,
|
|
15
|
+
options,
|
|
16
|
+
onCompare,
|
|
17
|
+
srcRevision: srcOption,
|
|
18
|
+
targetRevision: targetOption,
|
|
19
|
+
}) => {
|
|
20
|
+
// Local state for selected revisions
|
|
21
|
+
const [srcRevision, setSrcRevision] = useState(srcOption);
|
|
22
|
+
const [targetRevision, setTargetRevision] = useState(targetOption);
|
|
23
|
+
|
|
24
|
+
const handleCompare = () => {
|
|
25
|
+
onCompare(srcRevision, targetRevision);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<Grid>
|
|
30
|
+
<Grid.Column mobile={16} computer={6} tablet={16} largeScreen={6} widescreen={6}>
|
|
31
|
+
<label htmlFor="source-revision">From</label>
|
|
32
|
+
<Dropdown
|
|
33
|
+
id="source-revision"
|
|
34
|
+
loading={loading}
|
|
35
|
+
placeholder="Source revision..."
|
|
36
|
+
fluid
|
|
37
|
+
selection
|
|
38
|
+
value={srcRevision}
|
|
39
|
+
onChange={(e, { value }) => setSrcRevision(value)}
|
|
40
|
+
options={options}
|
|
41
|
+
scrolling
|
|
42
|
+
/>
|
|
43
|
+
</Grid.Column>
|
|
44
|
+
<Grid.Column mobile={16} computer={6} tablet={16} largeScreen={6} widescreen={6}>
|
|
45
|
+
<label htmlFor="target-revision">To</label>
|
|
46
|
+
<Dropdown
|
|
47
|
+
id="target-revision"
|
|
48
|
+
loading={loading}
|
|
49
|
+
placeholder="Target revision..."
|
|
50
|
+
fluid
|
|
51
|
+
selection
|
|
52
|
+
value={targetRevision}
|
|
53
|
+
onChange={(e, { value }) => setTargetRevision(value)}
|
|
54
|
+
options={options}
|
|
55
|
+
scrolling
|
|
56
|
+
/>
|
|
57
|
+
</Grid.Column>
|
|
58
|
+
<Grid.Column
|
|
59
|
+
verticalAlign="bottom"
|
|
60
|
+
mobile={16}
|
|
61
|
+
computer={2}
|
|
62
|
+
tablet={16}
|
|
63
|
+
largeScreen={2}
|
|
64
|
+
widescreen={2}
|
|
65
|
+
>
|
|
66
|
+
<Button
|
|
67
|
+
onClick={handleCompare}
|
|
68
|
+
disabled={loading || !srcRevision || !targetRevision}
|
|
69
|
+
>
|
|
70
|
+
Compare
|
|
71
|
+
</Button>
|
|
72
|
+
</Grid.Column>
|
|
73
|
+
</Grid>
|
|
74
|
+
);
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
CompareRevisionsDropdown.propTypes = {
|
|
78
|
+
loading: PropTypes.bool.isRequired,
|
|
79
|
+
options: PropTypes.array.isRequired,
|
|
80
|
+
onCompare: PropTypes.func.isRequired,
|
|
81
|
+
srcRevision: PropTypes.object,
|
|
82
|
+
targetRevision: PropTypes.object,
|
|
83
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* // This file is part of Invenio-App-Rdm
|
|
3
|
+
* // Copyright (C) 2025 CERN.
|
|
4
|
+
* //
|
|
5
|
+
* // Invenio-App-Rdm is free software; you can redistribute it and/or modify it
|
|
6
|
+
* // under the terms of the MIT License; see LICENSE file for more details.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import React, { Component } from "react";
|
|
10
|
+
import PropTypes from "prop-types";
|
|
11
|
+
import { Grid, Container } from "semantic-ui-react";
|
|
12
|
+
import { Differ, Viewer } from "json-diff-kit";
|
|
13
|
+
|
|
14
|
+
export class RevisionsDiffViewer extends Component {
|
|
15
|
+
constructor(props) {
|
|
16
|
+
super(props);
|
|
17
|
+
this.differ = new Differ({
|
|
18
|
+
detectCircular: true,
|
|
19
|
+
maxDepth: null,
|
|
20
|
+
showModifications: true,
|
|
21
|
+
arrayDiffMethod: "lcs",
|
|
22
|
+
ignoreCase: false,
|
|
23
|
+
ignoreCaseForKey: false,
|
|
24
|
+
recursiveEqual: true,
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
this.viewerProps = {
|
|
28
|
+
indent: 4,
|
|
29
|
+
lineNumbers: true,
|
|
30
|
+
highlightInlineDiff: true,
|
|
31
|
+
inlineDiffOptions: {
|
|
32
|
+
mode: "word",
|
|
33
|
+
wordSeparator: " ",
|
|
34
|
+
},
|
|
35
|
+
hideUnchangedLines: true,
|
|
36
|
+
syntaxHighlight: false,
|
|
37
|
+
virtual: true,
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
this.state = {
|
|
41
|
+
currentDiff: undefined,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
componentDidUpdate(prevProps) {
|
|
46
|
+
const { diff } = this.props;
|
|
47
|
+
|
|
48
|
+
if (diff !== prevProps.diff) {
|
|
49
|
+
this.computeDiff();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
computeDiff = () => {
|
|
54
|
+
const { diff } = this.props;
|
|
55
|
+
const _diff = this.differ.diff(diff?.srcRevision, diff?.targetRevision);
|
|
56
|
+
this.setState({ currentDiff: _diff });
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
render() {
|
|
60
|
+
const { currentDiff } = this.state;
|
|
61
|
+
|
|
62
|
+
return currentDiff ? (
|
|
63
|
+
<Grid>
|
|
64
|
+
<Grid.Column width={16}>
|
|
65
|
+
<Container fluid>
|
|
66
|
+
<Viewer diff={currentDiff} {...this.viewerProps} />
|
|
67
|
+
</Container>
|
|
68
|
+
</Grid.Column>
|
|
69
|
+
</Grid>
|
|
70
|
+
) : null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
RevisionsDiffViewer.propTypes = {
|
|
75
|
+
diff: PropTypes.object,
|
|
76
|
+
viewerProps: PropTypes.object.isRequired,
|
|
77
|
+
};
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* // This file is part of Invenio-App-Rdm
|
|
3
|
+
* // Copyright (C) 2025 CERN.
|
|
4
|
+
* //
|
|
5
|
+
* // Invenio-App-Rdm is free software; you can redistribute it and/or modify it
|
|
6
|
+
* // under the terms of the MIT License; see LICENSE file for more details.
|
|
7
|
+
*/
|
|
8
|
+
import React, { Component } from "react";
|
|
9
|
+
import PropTypes from "prop-types";
|
|
10
|
+
import { RecordModerationApi } from "./api";
|
|
11
|
+
import { withCancel, ErrorMessage } from "react-invenio-forms";
|
|
12
|
+
import { Modal, Button, Grid } from "semantic-ui-react";
|
|
13
|
+
import { i18next } from "@translations/invenio_app_rdm/i18next";
|
|
14
|
+
import { CompareRevisionsDropdown } from "../components/CompareRevisionsDropdown";
|
|
15
|
+
import { RevisionsDiffViewer } from "../components/RevisionsDiffViewer";
|
|
16
|
+
|
|
17
|
+
export class CompareRevisions extends Component {
|
|
18
|
+
constructor(props) {
|
|
19
|
+
super(props);
|
|
20
|
+
|
|
21
|
+
this.state = {
|
|
22
|
+
loading: true,
|
|
23
|
+
error: undefined,
|
|
24
|
+
allRevisions: {},
|
|
25
|
+
srcRevision: undefined,
|
|
26
|
+
targetRevision: undefined,
|
|
27
|
+
diff: undefined,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async fetchRevisions() {
|
|
32
|
+
const { resource } = this.props;
|
|
33
|
+
this.setState({ loading: true });
|
|
34
|
+
|
|
35
|
+
try {
|
|
36
|
+
this.cancellableAction = withCancel(RecordModerationApi.getRevisions(resource));
|
|
37
|
+
const response = await this.cancellableAction.promise;
|
|
38
|
+
const revisions = await response.data;
|
|
39
|
+
|
|
40
|
+
this.setState({
|
|
41
|
+
allRevisions: revisions,
|
|
42
|
+
targetRevision: revisions[0],
|
|
43
|
+
srcRevision: revisions.length > 1 ? revisions[1] : revisions[0],
|
|
44
|
+
loading: false,
|
|
45
|
+
});
|
|
46
|
+
} catch (error) {
|
|
47
|
+
if (error === "UNMOUNTED") return;
|
|
48
|
+
this.setState({ error: error, loading: false });
|
|
49
|
+
console.error(error);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
componentDidMount() {
|
|
54
|
+
this.fetchRevisions();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
componentWillUnmount() {
|
|
58
|
+
this.cancellableAction && this.cancellableAction.cancel();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
handleModalClose = () => {
|
|
62
|
+
const { actionCancelCallback } = this.props;
|
|
63
|
+
actionCancelCallback();
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
handleCompare = (srcRevision, targetRevision) => {
|
|
67
|
+
this.setState({ diff: { srcRevision, targetRevision } });
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
render() {
|
|
71
|
+
const { error, loading, allRevisions, srcRevision, targetRevision, diff } =
|
|
72
|
+
this.state;
|
|
73
|
+
const options = Object.values(allRevisions).map((rev) => ({
|
|
74
|
+
key: rev.updated,
|
|
75
|
+
text: `${rev.updated} (${rev.revision_id})`,
|
|
76
|
+
value: rev,
|
|
77
|
+
}));
|
|
78
|
+
|
|
79
|
+
return loading ? (
|
|
80
|
+
<p>Loading...</p>
|
|
81
|
+
) : (
|
|
82
|
+
<>
|
|
83
|
+
<Modal.Content>
|
|
84
|
+
<CompareRevisionsDropdown
|
|
85
|
+
loading={loading}
|
|
86
|
+
options={options}
|
|
87
|
+
srcRevision={srcRevision}
|
|
88
|
+
targetRevision={targetRevision}
|
|
89
|
+
onCompare={this.handleCompare}
|
|
90
|
+
/>
|
|
91
|
+
{error && (
|
|
92
|
+
<Modal.Content>
|
|
93
|
+
<ErrorMessage
|
|
94
|
+
header={i18next.t("Unable to fetch revisions.")}
|
|
95
|
+
content={error}
|
|
96
|
+
icon="exclamation"
|
|
97
|
+
className="text-align-left"
|
|
98
|
+
negative
|
|
99
|
+
/>
|
|
100
|
+
</Modal.Content>
|
|
101
|
+
)}
|
|
102
|
+
<Modal.Content scrolling>
|
|
103
|
+
<RevisionsDiffViewer diff={this.state.diff} />
|
|
104
|
+
</Modal.Content>
|
|
105
|
+
</Modal.Content>
|
|
106
|
+
<Modal.Actions>
|
|
107
|
+
<Grid>
|
|
108
|
+
<Grid.Column floated="left" width={8} textAlign="left">
|
|
109
|
+
<Button
|
|
110
|
+
onClick={this.handleModalClose}
|
|
111
|
+
disabled={loading}
|
|
112
|
+
loading={loading}
|
|
113
|
+
aria-label={i18next.t("Cancel revision comparison")}
|
|
114
|
+
>
|
|
115
|
+
Close
|
|
116
|
+
</Button>
|
|
117
|
+
</Grid.Column>
|
|
118
|
+
</Grid>
|
|
119
|
+
</Modal.Actions>
|
|
120
|
+
</>
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
CompareRevisions.propTypes = {
|
|
126
|
+
resource: PropTypes.object.isRequired,
|
|
127
|
+
actionCancelCallback: PropTypes.func.isRequired,
|
|
128
|
+
};
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import TombstoneForm from "./TombstoneForm";
|
|
10
|
+
import { CompareRevisions } from "./CompareRevisions";
|
|
10
11
|
import React, { Component } from "react";
|
|
11
12
|
import PropTypes from "prop-types";
|
|
12
13
|
import { Button, Modal, Icon } from "semantic-ui-react";
|
|
@@ -22,16 +23,34 @@ export class RecordResourceActions extends Component {
|
|
|
22
23
|
modalOpen: false,
|
|
23
24
|
modalHeader: undefined,
|
|
24
25
|
modalBody: undefined,
|
|
26
|
+
modalProps: undefined,
|
|
25
27
|
};
|
|
26
28
|
}
|
|
27
29
|
|
|
28
30
|
onModalTriggerClick = (e, { payloadSchema, dataName, dataActionKey }) => {
|
|
29
31
|
const { resource } = this.props;
|
|
30
32
|
|
|
33
|
+
if (dataActionKey === "compare") {
|
|
34
|
+
this.setState({
|
|
35
|
+
modalOpen: true,
|
|
36
|
+
modalHeader: i18next.t("Compare revisions"),
|
|
37
|
+
modalProps: {
|
|
38
|
+
size: "large",
|
|
39
|
+
},
|
|
40
|
+
modalBody: (
|
|
41
|
+
<CompareRevisions
|
|
42
|
+
actionSuccessCallback={this.handleSuccess}
|
|
43
|
+
actionCancelCallback={this.closeModal}
|
|
44
|
+
resource={resource}
|
|
45
|
+
/>
|
|
46
|
+
),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
31
49
|
if (dataActionKey === "delete") {
|
|
32
50
|
this.setState({
|
|
33
51
|
modalOpen: true,
|
|
34
52
|
modalHeader: i18next.t("Delete record"),
|
|
53
|
+
modalProps: undefined, // default size
|
|
35
54
|
modalBody: (
|
|
36
55
|
<TombstoneForm
|
|
37
56
|
actionSuccessCallback={this.handleSuccess}
|
|
@@ -45,6 +64,7 @@ export class RecordResourceActions extends Component {
|
|
|
45
64
|
this.setState({
|
|
46
65
|
modalOpen: true,
|
|
47
66
|
modalHeader: i18next.t("Restore record"),
|
|
67
|
+
modalProps: undefined, // default size
|
|
48
68
|
modalBody: (
|
|
49
69
|
<RestoreConfirmation
|
|
50
70
|
actionSuccessCallback={this.handleSuccess}
|
|
@@ -76,11 +96,30 @@ export class RecordResourceActions extends Component {
|
|
|
76
96
|
|
|
77
97
|
render() {
|
|
78
98
|
const { actions, Element, resource } = this.props;
|
|
79
|
-
const { modalOpen, modalHeader, modalBody } = this.state;
|
|
99
|
+
const { modalOpen, modalHeader, modalBody, modalProps } = this.state;
|
|
80
100
|
let icon;
|
|
81
101
|
return (
|
|
82
102
|
<>
|
|
83
103
|
{Object.entries(actions).map(([actionKey, actionConfig]) => {
|
|
104
|
+
if (actionKey === "compare" && !resource.deletion_status.is_deleted) {
|
|
105
|
+
icon = "file code outline";
|
|
106
|
+
return (
|
|
107
|
+
<Element
|
|
108
|
+
key={actionKey}
|
|
109
|
+
onClick={this.onModalTriggerClick}
|
|
110
|
+
payloadSchema={actionConfig.payload_schema}
|
|
111
|
+
dataName={actionConfig.text}
|
|
112
|
+
dataActionKey={actionKey}
|
|
113
|
+
icon={icon}
|
|
114
|
+
fluid
|
|
115
|
+
basic
|
|
116
|
+
labelPosition="left"
|
|
117
|
+
>
|
|
118
|
+
{icon && <Icon name={icon} />}
|
|
119
|
+
{actionConfig.text}
|
|
120
|
+
</Element>
|
|
121
|
+
);
|
|
122
|
+
}
|
|
84
123
|
if (actionKey === "delete" && !resource.deletion_status.is_deleted) {
|
|
85
124
|
icon = "trash alternate";
|
|
86
125
|
return (
|
|
@@ -120,7 +159,7 @@ export class RecordResourceActions extends Component {
|
|
|
120
159
|
}
|
|
121
160
|
return null;
|
|
122
161
|
})}
|
|
123
|
-
<ActionModal modalOpen={modalOpen} resource={resource}>
|
|
162
|
+
<ActionModal modalOpen={modalOpen} resource={resource} modalProps={modalProps}>
|
|
124
163
|
{modalHeader && <Modal.Header>{modalHeader}</Modal.Header>}
|
|
125
164
|
{!_isEmpty(modalBody) && modalBody}
|
|
126
165
|
</ActionModal>
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/api/api.js
CHANGED
|
@@ -22,7 +22,12 @@ const restoreRecord = async (record) => {
|
|
|
22
22
|
return await http.post(APIRoutes.restore(record));
|
|
23
23
|
};
|
|
24
24
|
|
|
25
|
+
const getRevisions = async (record) => {
|
|
26
|
+
return await http.get(APIRoutes.compare(record));
|
|
27
|
+
};
|
|
28
|
+
|
|
25
29
|
export const RecordModerationApi = {
|
|
26
30
|
deleteRecord: deleteRecord,
|
|
27
31
|
restoreRecord: restoreRecord,
|
|
32
|
+
getRevisions: getRevisions,
|
|
28
33
|
};
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/api/routes.js
CHANGED
|
@@ -12,6 +12,9 @@ const APIRoutesGenerators = {
|
|
|
12
12
|
delete: (record, idKeyPath = "id") => {
|
|
13
13
|
return `/api/records/${_get(record, idKeyPath)}/delete`;
|
|
14
14
|
},
|
|
15
|
+
compare: (record, idKeyPath = "id") => {
|
|
16
|
+
return `/api/records/${_get(record, idKeyPath)}/revisions`;
|
|
17
|
+
},
|
|
15
18
|
|
|
16
19
|
restore: (record, idKeyPath = "id") => {
|
|
17
20
|
return `/api/records/${_get(record, idKeyPath)}/restore`;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
This file is part of Invenio.
|
|
4
|
+
Copyright (C) 2015-2025 CERN.
|
|
5
|
+
|
|
6
|
+
Invenio is free software; you can redistribute it and/or modify it
|
|
7
|
+
under the terms of the MIT License; see LICENSE file for more details.
|
|
8
|
+
#}
|
|
9
|
+
|
|
10
|
+
{%- extends "invenio_theme/page.html" -%}
|
|
11
|
+
|
|
12
|
+
{%- block css %}
|
|
13
|
+
{{ super()}}
|
|
14
|
+
<link rel="stylesheet" href="/static/css/json-diff-kit.css">
|
|
15
|
+
{%- endblock css %}
|
invenio_app_rdm/theme/webpack.py
CHANGED
|
@@ -58,6 +58,7 @@ theme = WebpackThemeBundle(
|
|
|
58
58
|
"react-invenio-forms": "^4.0.0",
|
|
59
59
|
"react-searchkit": "^3.0.0",
|
|
60
60
|
"yup": "^0.32.0",
|
|
61
|
+
"json-diff-kit": "^1.0.30",
|
|
61
62
|
},
|
|
62
63
|
aliases={
|
|
63
64
|
# Define Semantic-UI theme configuration needed by
|
|
@@ -87,6 +88,10 @@ theme = WebpackThemeBundle(
|
|
|
87
88
|
"from": "../node_modules/tinymce/skins/ui/oxide/content.min.css",
|
|
88
89
|
"to": "../../static/dist/js/skins/ui/oxide",
|
|
89
90
|
},
|
|
91
|
+
{
|
|
92
|
+
"from": "../node_modules/json-diff-kit/dist/viewer.css",
|
|
93
|
+
"to": "../../static/css/json-diff-kit.css",
|
|
94
|
+
},
|
|
90
95
|
],
|
|
91
96
|
),
|
|
92
97
|
},
|
{invenio_app_rdm-13.0.0b1.dev29.dist-info → invenio_app_rdm-13.0.0b1.dev30.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: invenio-app-rdm
|
|
3
|
-
Version: 13.0.0b1.
|
|
3
|
+
Version: 13.0.0b1.dev30
|
|
4
4
|
Summary: Invenio Research Data Management.
|
|
5
5
|
Home-page: https://github.com/inveniosoftware/invenio-app-rdm
|
|
6
6
|
Author: CERN
|
|
@@ -97,6 +97,10 @@ https://inveniordm.docs.cern.ch
|
|
|
97
97
|
Changes
|
|
98
98
|
=======
|
|
99
99
|
|
|
100
|
+
Version v13.0.0b1.dev30 (released 2025-01-27)
|
|
101
|
+
|
|
102
|
+
- administration: add record revision comparison
|
|
103
|
+
|
|
100
104
|
Version v13.0.0b1.dev29 (released 2025-01-23)
|
|
101
105
|
|
|
102
106
|
- preview: do not mint parent doi if doi is not reserved and doi is optional
|
{invenio_app_rdm-13.0.0b1.dev29.dist-info → invenio_app_rdm-13.0.0b1.dev30.dist-info}/RECORD
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
invenio_app_rdm/__init__.py,sha256=
|
|
1
|
+
invenio_app_rdm/__init__.py,sha256=u4q_SFxQYGGR04phk4HQNcPmPh5_YK-1RsLpWt6JFz0,700
|
|
2
2
|
invenio_app_rdm/cli.py,sha256=G6QqNU2W6n6ICtTMnpeKFXIsdorncDmVXwwwsGH5F2k,2746
|
|
3
|
-
invenio_app_rdm/config.py,sha256=
|
|
3
|
+
invenio_app_rdm/config.py,sha256=eg8JHluXVF6qkcom-YsaFdQj7CniqN2kc3S7JxbRU0E,50382
|
|
4
4
|
invenio_app_rdm/ext.py,sha256=PkZhATGJDgYqBJQh41NdvBZWR83mgI3Eej6rj10UVJE,5278
|
|
5
5
|
invenio_app_rdm/tasks.py,sha256=XAbl8KeAWaJ5lC_4OUWUPstvCT7lYs5tRR1zSVBDfRk,1275
|
|
6
6
|
invenio_app_rdm/urls.py,sha256=VRbpuN3kQ2fcmKvEIGQ5O1EnaSsEE2kyhLwUmONwZO8,2192
|
|
@@ -8,7 +8,7 @@ invenio_app_rdm/administration/__init__.py,sha256=8r9LeoE9fNHZSVS5QsCfVhRU7MAiEO
|
|
|
8
8
|
invenio_app_rdm/administration/domains/__init__.py,sha256=Qob5kqjRPxpuSE5yDV2tesN6tmaKp5JcxCxGA8Mrcak,487
|
|
9
9
|
invenio_app_rdm/administration/domains/domains.py,sha256=vafLa-mqkg_tQLjx328E64P_4mksB5kjBlsfunvdatg,5599
|
|
10
10
|
invenio_app_rdm/administration/records/__init__.py,sha256=WpNHBm_Mk9FF8GzvrXWjL79URMSgBhpqgxvrLXNooqg,434
|
|
11
|
-
invenio_app_rdm/administration/records/records.py,sha256=
|
|
11
|
+
invenio_app_rdm/administration/records/records.py,sha256=ODMtYaeU2gO6wYQChqCz14fiiFOKknAGIAo4tzMchC8,5345
|
|
12
12
|
invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/domains_search.html,sha256=NP8HPfOQPIR9psNDMFRXJH8fjok2AbXCentD_3Q1wWw,338
|
|
13
13
|
invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/user_moderation.html,sha256=koXd8lV_KBgAl1Wll7aM3xR0NgYcOl2PiFqD2Xkcp2w,348
|
|
14
14
|
invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/user_moderation_details.html,sha256=g6YZh9yWqDfzd5kMgIrO4c5k4iKa61y04RsuT_ZbMJI,350
|
|
@@ -102,11 +102,13 @@ invenio_app_rdm/requests_ui/views/requests.py,sha256=gREAyePWlE-E3LIebTuSkzZ6VGl
|
|
|
102
102
|
invenio_app_rdm/requests_ui/views/ui.py,sha256=DBysYQa__gOCg-pikO6HmoVLmRmMAVWeTBiYhPa7PmA,2359
|
|
103
103
|
invenio_app_rdm/theme/__init__.py,sha256=QbkxNjjOmGKRlie96HfTXgnFeVQjOX0GdiZnHP7pIhs,277
|
|
104
104
|
invenio_app_rdm/theme/views.py,sha256=UJs2_C28BWsXY1JqbRK4_ML1JRtGo1yM2S0_W37JJo4,4545
|
|
105
|
-
invenio_app_rdm/theme/webpack.py,sha256=
|
|
105
|
+
invenio_app_rdm/theme/webpack.py,sha256=5ucwIJQgM1y9EFdRcsxv_ThPs7hXRzdmipVBxoU1McI,5090
|
|
106
106
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/theme.js,sha256=2-BWDEH3YQPwPt1ey3jUHnMrKTyb0JBPRlydk5_reH8,4151
|
|
107
107
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/utils.js,sha256=zKROcc3qE64-UhM8ha42K-EDDxAXMupxoocZZ9bjEHo,3452
|
|
108
|
+
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/CompareRevisionsDropdown.js,sha256=h7ilYSO4XYwdIqO75R1aREzCdp-EFeHbMbYvQ-Iq41A,2342
|
|
108
109
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/ImpersonateUser.js,sha256=GmZGEPOylGXr6fyNJxS_0hPwCGdO98F2u6Pn8Qrt9ew,2291
|
|
109
|
-
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/ImpersonateUserForm.js,sha256=
|
|
110
|
+
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/ImpersonateUserForm.js,sha256=qsjNiOsHWx9rrP3uA4nxthUEoY9b82n0IO8PfdObxHQ,6815
|
|
111
|
+
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/RevisionsDiffViewer.js,sha256=N8dEcGupDr1_TG858E6uU64TDtGVR4zJ_mgKiASG90s,1823
|
|
110
112
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/SetQuotaAction.js,sha256=wwvYfTJ7pBEdoeqcEqmxFLaEwpJnnFW0oRQTyAdDSBw,3038
|
|
111
113
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/SetQuotaForm.js,sha256=Ltr03KlCogkg2NjqWc1GkxJlYPWB2LDLHL04w6eJiRU,5749
|
|
112
114
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/index.js,sha256=soELMxc1jf_rL62CJ9wtWGVG13yk1PRY7JqseqnKkqU,297
|
|
@@ -114,15 +116,16 @@ invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/domai
|
|
|
114
116
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/domains/search/SearchResultItemLayout.js,sha256=sWIHw6tSCmRa0dYCHTa-fbxnHr9MhyDhMUiGlGV-HWE,6097
|
|
115
117
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/domains/search/index.js,sha256=uajCJbGiHGjRH_YapCGGXATKtAUlXTr0jirx1UfqjCQ,283
|
|
116
118
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/drafts/index.js,sha256=DuPY4wnnwyWF61Oyef1S4SvQrg-DrkZZjjQKlA0DeJo,1159
|
|
119
|
+
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/CompareRevisions.js,sha256=wqJrxHi5kW83PJhJMinpuX-He1NPBVjRVHyyhBoHoQ4,3723
|
|
117
120
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/RecordActions.js,sha256=FAjkK7TZ4ebjsQh1ZcFFHkVePP2T8msa1OAIjxktKJo,1935
|
|
118
|
-
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/RecordResourceActions.js,sha256=
|
|
121
|
+
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/RecordResourceActions.js,sha256=l3Ed1_cgUlLC6zjRkwA7v48sPfXqQKsNZGdGWBHGDfY,5519
|
|
119
122
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/RemovalReasonsSelect.js,sha256=8y1YRo1ZyqDfeQL4aNbO9ig3689YpzEBse8kLf_qI8o,2192
|
|
120
123
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/RestoreConfirmation.js,sha256=Bo2_psfPKys0Xn6jzozxePzW3x9VbyvNYI64Qlqmh7w,3085
|
|
121
124
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/TombstoneForm.js,sha256=maPIZMR6QQsLUlr3S7G203muRbZ9wTRoZR2DCy0aAXg,6943
|
|
122
125
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/index.js,sha256=kWIIp7kzH3oe4xbByiUC3SpgEjAt4R3mWH8vneGWhiU,1460
|
|
123
|
-
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/api/api.js,sha256=
|
|
126
|
+
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/api/api.js,sha256=aVg7q92xn-wRx7Uff0EXBA04qYrvhYNu7IbbzfDT_LY,982
|
|
124
127
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/api/index.js,sha256=8D199izj4qOxNVS1XrS3JutmuBYIjHkvshUdv1aU92U,261
|
|
125
|
-
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/api/routes.js,sha256=
|
|
128
|
+
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/api/routes.js,sha256=scsibLhOtl8m6rI1w2IZEgW5eP_z8nRPkBSSFJXoOKQ,668
|
|
126
129
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/search/AdministrationSearchLayout.js,sha256=3pRQVkFOnyqRFWmbE3vXMB75Vnrvf-Y5pzZF79iT9q0,1854
|
|
127
130
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/search/RecordSearchLayout.js,sha256=F3Ht0kMf6-cSmbTSRo-PnJLneCqoqh7d0ea1A2Lj2i8,2544
|
|
128
131
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/search/SearchResultItemLayout.js,sha256=CsbdG5fVx2hw1SenJ5wHVd468-n5qp2yhB5x3ceGCuE,5611
|
|
@@ -248,7 +251,7 @@ invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/seg
|
|
|
248
251
|
invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/elements/segment.variables,sha256=HwtfX97PrCMjVYBHj323pUmrjBuUl41yVthXQL_8YHs,141
|
|
249
252
|
invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/globals/reset.overrides,sha256=ms-coZLC-kFoWoZ4UNyJq0FRQ0bSLRziXzbyP7tnmNA,139
|
|
250
253
|
invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/globals/reset.variables,sha256=Luyh-V1w5wDFv2j77bYmTxfn22Cp7h1vLjRsqhf207Y,139
|
|
251
|
-
invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/globals/site.overrides,sha256=
|
|
254
|
+
invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/globals/site.overrides,sha256=8LBnXXf0lYLQEhw-1BBhKj9tGYCS1Gpw0qVxKG_Vomo,9011
|
|
252
255
|
invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/globals/site.variables,sha256=j59x9AQ5p4omynVitye2tIM3h0GCXSqcajNYJElKxjI,3043
|
|
253
256
|
invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/accordion.overrides,sha256=7SK2kGZU-KMda2SVbuLfP-6hk0vTe_4gFk6O_RvU_hs,3306
|
|
254
257
|
invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/accordion.variables,sha256=JFUnfiL_Xve48EwxRjYq0T-QJA8jboC606L08IjrBXg,322
|
|
@@ -378,6 +381,7 @@ invenio_app_rdm/theme/static/images/icons8-web-design-80.png,sha256=lRi5Dfc01unG
|
|
|
378
381
|
invenio_app_rdm/theme/static/images/invenio-rdm.svg,sha256=UPCbTYMkSmnFj0SqQ2o_oJdybZtH_Q4HguqS0x-FS2U,6831
|
|
379
382
|
invenio_app_rdm/theme/static/images/orcid.svg,sha256=D79IRA7Ul2mfO9deW-Xocz_FTR-Ol5q3Nepya34pjWY,1117
|
|
380
383
|
invenio_app_rdm/theme/static/images/ror-icon.svg,sha256=aIth5_-aYB7yx1nswjM6XgHAFW6dvJc5khkR9khWCZM,3712
|
|
384
|
+
invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/administration_page.html,sha256=KkfcHLi4vx-Pd4K0ZZvgPBx6lGK5l9xCLV3hkklvYVw,394
|
|
381
385
|
invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/default_static_page.html,sha256=Un6KtaKmNlM-R7Qu1eeh0FFckgym3mq1zHV-AOew5pY,1178
|
|
382
386
|
invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/footer.html,sha256=rZ5XGaoYNIOCii6W7ClPv6sgjeU5HPLR6TeEqTWzDZ0,2975
|
|
383
387
|
invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/frontpage.html,sha256=l-u25QOE2OkkPt-f7Cce469u4W2TnBdB_HVXpSZx3DE,1605
|
|
@@ -519,9 +523,9 @@ invenio_app_rdm/users_ui/views/__init__.py,sha256=SMdY2NJj9GICfr3Xuok7qdNYVtA2bJ
|
|
|
519
523
|
invenio_app_rdm/users_ui/views/dashboard.py,sha256=iUn2PrODAwb8ugmMosJKAjPhUzjCiWiAWoXQr9RUFuc,1793
|
|
520
524
|
invenio_app_rdm/users_ui/views/ui.py,sha256=W_eXM8dLVIrNHQB2UEh37C9BYoHauft6RyvcDNFHovA,1742
|
|
521
525
|
invenio_app_rdm/utils/files.py,sha256=CruDyO2gDVadSlWEJD-WHpWHeOQ0juh-Ei9jz3D9yjc,3923
|
|
522
|
-
invenio_app_rdm-13.0.0b1.
|
|
523
|
-
invenio_app_rdm-13.0.0b1.
|
|
524
|
-
invenio_app_rdm-13.0.0b1.
|
|
525
|
-
invenio_app_rdm-13.0.0b1.
|
|
526
|
-
invenio_app_rdm-13.0.0b1.
|
|
527
|
-
invenio_app_rdm-13.0.0b1.
|
|
526
|
+
invenio_app_rdm-13.0.0b1.dev30.dist-info/LICENSE,sha256=AZXFHRrZa5s4m9DV7zZr4bPGTMUvcEPCodeV_AmFI8k,1204
|
|
527
|
+
invenio_app_rdm-13.0.0b1.dev30.dist-info/METADATA,sha256=3_x0mc0UjZZiexx0iri9AuiPfUlBQVnWzZClrRHqeYQ,9651
|
|
528
|
+
invenio_app_rdm-13.0.0b1.dev30.dist-info/WHEEL,sha256=9Hm2OB-j1QcCUq9Jguht7ayGIIZBRTdOXD1qg9cCgPM,109
|
|
529
|
+
invenio_app_rdm-13.0.0b1.dev30.dist-info/entry_points.txt,sha256=r1vTqYNABeWqRMWitzyR9FnBsAy-KYZKZCp95IziyLY,2070
|
|
530
|
+
invenio_app_rdm-13.0.0b1.dev30.dist-info/top_level.txt,sha256=quZejDUw2vLfKQboNIuVLJ9fxZifdnCT_s2PNf1dfmk,16
|
|
531
|
+
invenio_app_rdm-13.0.0b1.dev30.dist-info/RECORD,,
|
{invenio_app_rdm-13.0.0b1.dev29.dist-info → invenio_app_rdm-13.0.0b1.dev30.dist-info}/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{invenio_app_rdm-13.0.0b1.dev29.dist-info → invenio_app_rdm-13.0.0b1.dev30.dist-info}/top_level.txt
RENAMED
|
File without changes
|