invenio-app-rdm 14.0.0b4.dev3__py2.py3-none-any.whl → 14.0.0b4.dev5__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.
Files changed (22) hide show
  1. invenio_app_rdm/__init__.py +1 -1
  2. invenio_app_rdm/administration/audit_logs/audit_logs.py +1 -0
  3. invenio_app_rdm/administration/moderation/requests.py +1 -1
  4. invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/requests_details.html +8 -6
  5. invenio_app_rdm/config.py +9 -4
  6. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/detail.html +14 -6
  7. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/files.html +20 -9
  8. invenio_app_rdm/records_ui/views/decorators.py +28 -17
  9. invenio_app_rdm/records_ui/views/records.py +20 -3
  10. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/CopyButton.js +10 -10
  11. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordVersionsList.js +37 -29
  12. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/index.js +6 -4
  13. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/theme.js +19 -3
  14. invenio_app_rdm/theme/templates/semantic-ui/invenio_previewer/latest_record.html +18 -0
  15. invenio_app_rdm/theme/templates/semantic-ui/invenio_previewer/rdm_abstract_previewer.html +30 -0
  16. invenio_app_rdm/upgrade_scripts/migrate_11_0_to_12_0.py +1 -0
  17. {invenio_app_rdm-14.0.0b4.dev3.dist-info → invenio_app_rdm-14.0.0b4.dev5.dist-info}/METADATA +14 -1
  18. {invenio_app_rdm-14.0.0b4.dev3.dist-info → invenio_app_rdm-14.0.0b4.dev5.dist-info}/RECORD +22 -20
  19. {invenio_app_rdm-14.0.0b4.dev3.dist-info → invenio_app_rdm-14.0.0b4.dev5.dist-info}/WHEEL +1 -1
  20. {invenio_app_rdm-14.0.0b4.dev3.dist-info → invenio_app_rdm-14.0.0b4.dev5.dist-info}/entry_points.txt +0 -0
  21. {invenio_app_rdm-14.0.0b4.dev3.dist-info → invenio_app_rdm-14.0.0b4.dev5.dist-info}/licenses/LICENSE +0 -0
  22. {invenio_app_rdm-14.0.0b4.dev3.dist-info → invenio_app_rdm-14.0.0b4.dev5.dist-info}/top_level.txt +0 -0
@@ -17,6 +17,6 @@
17
17
  #
18
18
  # See PEP 0440 for details - https://www.python.org/dev/peps/pep-0440
19
19
 
20
- __version__ = "14.0.0b4.dev3"
20
+ __version__ = "14.0.0b4.dev5"
21
21
 
22
22
  __all__ = ("__version__",)
@@ -6,6 +6,7 @@
6
6
  # under the terms of the MIT License; see LICENSE file for more details.
7
7
 
8
8
  """Invenio administration view module for audit logs."""
9
+
9
10
  from flask import current_app
10
11
  from invenio_administration.views.base import AdminResourceListView
11
12
  from invenio_i18n import lazy_gettext as _
@@ -138,7 +138,7 @@ class ModerationRequestDetailView(AdminResourceDetailView):
138
138
  g.identity, current_user
139
139
  )["avatar"]
140
140
  permissions = []
141
- if "reason" in request["payload"]:
141
+ if "reason" in request.get("payload", {}):
142
142
  reason_title = vocabulary_service.read(
143
143
  g.identity,
144
144
  ("removalreasons", request["payload"]["reason"]),
@@ -29,12 +29,14 @@ under the terms of the MIT License; see LICENSE file for more details.
29
29
  )
30
30
  }}
31
31
 
32
- <div class="twelve wide column mt-10">
33
- <p><strong>{{ _("Reason:") }}</strong> {{ invenio_request["payload"]["reason_label"] }}</p>
34
- {%- if invenio_request["payload"]["comment"] %}
35
- <p><strong>{{ _("Justification:") }}</strong> {{ invenio_request["payload"]["comment"] }}</p>
36
- {%- endif %}
37
- </div>
32
+ {%- if "payload" in invenio_request %}
33
+ <div class="twelve wide column mt-10">
34
+ <p><strong>{{ _("Reason:") }}</strong> {{ invenio_request["payload"]["reason_label"] }}</p>
35
+ {%- if invenio_request["payload"]["comment"] %}
36
+ <p><strong>{{ _("Justification:") }}</strong> {{ invenio_request["payload"]["comment"] }}</p>
37
+ {%- endif %}
38
+ </div>
39
+ {%- endif %}
38
40
 
39
41
  <div class="ui divider"></div>
40
42
  {%- endblock request_header %}
invenio_app_rdm/config.py CHANGED
@@ -3,7 +3,7 @@
3
3
  # Copyright (C) 2019-2025 CERN.
4
4
  # Copyright (C) 2019-2020 Northwestern University.
5
5
  # Copyright (C) 2021-2025 Graz University of Technology.
6
- # Copyright (C) 2022-2024 KTH Royal Institute of Technology.
6
+ # Copyright (C) 2022-2025 KTH Royal Institute of Technology.
7
7
  # Copyright (C) 2023 TU Wien
8
8
  #
9
9
  # Invenio App RDM is free software; you can redistribute it and/or modify it
@@ -87,6 +87,7 @@ from invenio_rdm_records.services.tasks import StatsRDMReindexTask
87
87
  from invenio_records_resources.references.entity_resolvers import ServiceResultResolver
88
88
  from invenio_requests.notifications.builders import (
89
89
  CommentRequestEventCreateNotificationBuilder,
90
+ CommentRequestEventReplyNotificationBuilder,
90
91
  )
91
92
  from invenio_requests.resources.requests.config import request_error_handlers
92
93
  from invenio_requests.services.requests import facets
@@ -1074,9 +1075,9 @@ COMMUNITIES_SHOW_BROWSE_MENU_ENTRY = False
1074
1075
  # ===================
1075
1076
 
1076
1077
  RDM_REQUESTS_ROUTES = {
1077
- "user-dashboard-request-details": "/me/requests/<request_pid_value>",
1078
- "community-dashboard-request-details": "/communities/<pid_value>/requests/<request_pid_value>",
1079
- "community-dashboard-invitation-details": "/communities/<pid_value>/invitations/<request_pid_value>",
1078
+ "user-dashboard-request-details": "/me/requests/<uuid:request_pid_value>",
1079
+ "community-dashboard-request-details": "/communities/<pid_value>/requests/<uuid:request_pid_value>",
1080
+ "community-dashboard-invitation-details": "/communities/<pid_value>/invitations/<uuid:request_pid_value>",
1080
1081
  }
1081
1082
 
1082
1083
  RDM_COMMUNITIES_ROUTES = {
@@ -1172,6 +1173,9 @@ PREVIEWER_PREFERENCE = [
1172
1173
  ]
1173
1174
  """Preferred previewers."""
1174
1175
 
1176
+ PREVIEWER_ABSTRACT_TEMPLATE = "invenio_previewer/rdm_abstract_previewer.html"
1177
+ """Override the abstract template with an RDM-specific one."""
1178
+
1175
1179
  RECORDS_RESOURCES_IMAGE_FORMATS = ["." + ext for ext in IIIF_FORMATS.keys()]
1176
1180
  """RECORDS_RESOURCES_IMAGE_FORMATS must contain all possible IIIF formats to ensure their metadata is extracted."""
1177
1181
 
@@ -1404,6 +1408,7 @@ NOTIFICATIONS_BUILDERS = {
1404
1408
  GrantUserAccessNotificationBuilder.type: GrantUserAccessNotificationBuilder,
1405
1409
  # Comment request event
1406
1410
  CommentRequestEventCreateNotificationBuilder.type: CommentRequestEventCreateNotificationBuilder,
1411
+ CommentRequestEventReplyNotificationBuilder.type: CommentRequestEventReplyNotificationBuilder,
1407
1412
  community_notifications.SubComReqCommentNotificationBuilder.type: community_notifications.SubComReqCommentNotificationBuilder,
1408
1413
  community_notifications.SubComInvCommentNotificationBuilder.type: community_notifications.SubComInvCommentNotificationBuilder,
1409
1414
  # Community inclusion
@@ -26,6 +26,9 @@
26
26
  {%- set title = record_ui["metadata"]["title"] %}
27
27
  {%- set metadata = record_ui["metadata"] %}
28
28
 
29
+ <!-- Shared namespace for files to allow overridability on child blocks while maintaining reference to parent values -->
30
+ {% set files_ns = namespace(preview_file=None, files=[]) %}
31
+
29
32
  {%- set can_curate_record = permissions is defined and (permissions.can_edit or permissions.can_review) %}
30
33
 
31
34
  <!-- preview_submission_request is set to true when coming from a community submission request -->
@@ -288,14 +291,19 @@
288
291
  aria-label="{{ _('Files') }}">
289
292
  {%- if permissions.can_read_files -%}
290
293
  {# record has files AND user can see files #}
291
- {%- set files = files | order_entries | selectattr("status", "==", "completed") | list %}
292
- {%- if files|length > 0 -%}
294
+ {# Shared namespace for files (outside blocks) #}
295
+ {%- set files_ns.files = files | order_entries | selectattr("status", "==", "completed") | list %}
296
+ {%- if files_ns.files|length > 0 -%}
293
297
  <h2 id="files-heading">{{ _('Files') }}</h2>
294
- {%- if files|has_previewable_files -%}
295
- {%-set preview_file = files|select_preview_file(default_preview=record_ui["files"]["default_preview"]) %}
296
- {{ preview_file_box(preview_file, record_ui["id"], is_preview, record, include_deleted) }}
298
+ {%- if files_ns.files|has_previewable_files -%}
299
+ {%-set files_ns.preview_file = files_ns.files|select_preview_file(default_preview=record_ui["files"]["default_preview"]) %}
300
+ {%- block record_file_preview -%}
301
+ {{ preview_file_box(files_ns.preview_file, record_ui["id"], is_preview, record, include_deleted) }}
302
+ {%- endblock record_file_preview -%}
297
303
  {%- endif -%}
298
- {{ file_list_box(files, record_ui["id"], is_preview, include_deleted, record, permissions) }}
304
+ {%- block record_file_list -%}
305
+ {{ file_list_box(files_ns.files, record_ui["id"], is_preview, include_deleted, record, permissions) }}
306
+ {%- endblock record_file_list -%}
299
307
  {% endif %}
300
308
  {% else %}
301
309
  {# record has files BUT user does not have permission to see files #}
@@ -31,8 +31,13 @@
31
31
  {%- endmacro %}
32
32
 
33
33
 
34
- {% macro preview_file_box(file, pid, is_preview, record, include_deleted) %}
34
+ {% macro preview_file_box(file, pid, is_preview, record, include_deleted, display_name=None) %}
35
35
  {%- set is_remote_file = file.transfer.type == transfer_types.REMOTE %}
36
+ {%- if display_name %}
37
+ {%- set human_readable_file_name = display_name(file) or file.key %}
38
+ {%- else %}
39
+ {%- set human_readable_file_name = file.key %}
40
+ {%- endif %}
36
41
  <div class="ui accordion panel mb-10 {{record.ui.access_status.id}}" href="#files-preview-accordion-panel">
37
42
  <h3 class="active title panel-heading {{ record.ui.access_status.id }} m-0">
38
43
  <div
@@ -44,7 +49,7 @@
44
49
  class="trigger"
45
50
  aria-label="{{ _('File preview') }}"
46
51
  >
47
- <span id="preview-file-title">{{ file.key }}</span>
52
+ <span id="preview-file-title">{{ human_readable_file_name }}</span>
48
53
  <i class="angle right icon" aria-hidden="true"></i>
49
54
  </div>
50
55
  </h3>
@@ -82,9 +87,10 @@ To access its content, please download it and open it locally.') }}
82
87
  download_endpoint='invenio_app_rdm_records.record_file_download',
83
88
  preview_endpoint='invenio_app_rdm_records.record_file_preview',
84
89
  is_media=false,
85
- permissions=None
90
+ permissions=None,
91
+ display_name=None
86
92
  ) %}
87
- <table class="ui striped table files fluid {{record.ui.access_status.id}}">
93
+ <table id="file-list-table" class="ui striped table files fluid {{record.ui.access_status.id}}">
88
94
  <thead>
89
95
  <tr>
90
96
  <th>{{_('Name')}}</th>
@@ -108,6 +114,11 @@ To access its content, please download it and open it locally.') }}
108
114
  {% for file in files %}
109
115
  {% if not file.access.hidden %}
110
116
  {%- set is_remote_file = file.transfer.type == transfer_types.REMOTE %}
117
+ {%- if display_name %}
118
+ {%- set human_readable_file_name = display_name(file) or file.key %}
119
+ {%- else %}
120
+ {%- set human_readable_file_name = file.key %}
121
+ {%- endif %}
111
122
  {% if is_preview %}
112
123
  {%- set file_url_download = url_for(download_endpoint, pid_value=pid, filename=file.key, download=1, preview=1) %}
113
124
  {%- set file_url_preview = url_for(preview_endpoint, pid_value=pid, filename=file.key, preview=1, include_deleted=include_deleted_value) %}
@@ -120,7 +131,7 @@ To access its content, please download it and open it locally.') }}
120
131
  <tr>
121
132
  <td class="ten wide">
122
133
  <div>
123
- <a href="{{ file_url_download }}">{{ file.key }}</a>
134
+ <a href="{{ file_url_download }}">{{ human_readable_file_name }}</a>
124
135
  </div>
125
136
  {%- if not is_remote_file %}
126
137
  <small class="ui text-muted font-tiny">{{ file.checksum or _("Checksum not yet calculated.") }}
@@ -151,7 +162,7 @@ To access its content, please download it and open it locally.') }}
151
162
  {%- endmacro %}
152
163
 
153
164
 
154
- {% macro file_list_box(files, pid, is_preview, include_deleted, record, permissions) %}
165
+ {% macro file_list_box(files, pid, is_preview, include_deleted, record, permissions, display_name=None) %}
155
166
  {%- set binary_sizes = not config.APP_RDM_DISPLAY_DECIMAL_FILE_SIZES %}
156
167
  <div class="ui accordion panel mb-10 {{ record.ui.access_status.id }}" href="#files-list-accordion-panel">
157
168
  <h3 class="active title panel-heading {{ record.ui.access_status.id }} m-0">
@@ -174,13 +185,13 @@ To access its content, please download it and open it locally.') }}
174
185
  </div>
175
186
  {% endif %}
176
187
  <div>
177
- {{ file_list(files, pid, is_preview, include_deleted, record=record,download_endpoint="invenio_app_rdm_records.record_file_download", permissions=permissions) }}
188
+ {{ file_list(files, pid, is_preview, include_deleted, record=record,download_endpoint="invenio_app_rdm_records.record_file_download", permissions=permissions, display_name=display_name) }}
178
189
  </div>
179
190
  </div>
180
191
  </div>
181
192
  {%- endmacro %}
182
193
 
183
- {% macro media_file_list_box(files, pid, is_preview, include_deleted, record, permissions) %}
194
+ {% macro media_file_list_box(files, pid, is_preview, include_deleted, record, permissions, display_name=None) %}
184
195
  {%- set binary_sizes = not config.APP_RDM_DISPLAY_DECIMAL_FILE_SIZES %}
185
196
  <div class="ui accordion panel mb-10 {{ record.access.record }}" href="#media-files-preview-accordion-panel">
186
197
  <h3 class="active title panel-heading {{ record.access.record }} m-0">
@@ -204,7 +215,7 @@ To access its content, please download it and open it locally.') }}
204
215
  </div>
205
216
  {% endif %}
206
217
  <div>
207
- {{ file_list(files, pid, is_preview, include_deleted, record=record, with_preview=false, download_endpoint="invenio_app_rdm_records.record_media_file_download", is_media=true, permissions=permissions) }}
218
+ {{ file_list(files, pid, is_preview, include_deleted, record=record, with_preview=false, download_endpoint="invenio_app_rdm_records.record_media_file_download", is_media=true, permissions=permissions, display_name=display_name) }}
208
219
  </div>
209
220
  </div>
210
221
  </div>
@@ -111,6 +111,30 @@ def pass_is_preview(f):
111
111
  return view
112
112
 
113
113
 
114
+ def pass_is_iframe(f):
115
+ """Decorate a view to check if it's being requested from inside an iframe."""
116
+
117
+ @wraps(f)
118
+ def view(**kwargs):
119
+ # See https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Sec-Fetch-Dest
120
+ header_value = request.headers.get("Sec-Fetch-Dest")
121
+ kwargs["is_iframe"] = header_value == "iframe"
122
+ return f(**kwargs)
123
+
124
+ return view
125
+
126
+
127
+ def pass_preview_file(f):
128
+ """Decorate a view to pass the preview file."""
129
+
130
+ @wraps(f)
131
+ def view(**kwargs):
132
+ kwargs["preview_file"] = request.args.get("preview_file")
133
+ return f(**kwargs)
134
+
135
+ return view
136
+
137
+
114
138
  # TODO to be improved as a request arg schema (following the REST views)
115
139
  def pass_include_deleted(f):
116
140
  """Decorate a view to check if it's a include deleted."""
@@ -155,6 +179,7 @@ def pass_record_or_draft(expand=False):
155
179
  def view(**kwargs):
156
180
  pid_value = kwargs.get("pid_value")
157
181
  is_preview = kwargs.get("is_preview")
182
+ preview_file = kwargs.get("preview_file")
158
183
  include_deleted = kwargs.get("include_deleted", False)
159
184
  read_kwargs = {
160
185
  "id_": pid_value,
@@ -163,23 +188,8 @@ def pass_record_or_draft(expand=False):
163
188
  }
164
189
 
165
190
  if is_preview:
166
- try:
167
- record = service().read_draft(**read_kwargs)
168
- except NoResultFound:
169
- try:
170
- record = service().read(
171
- include_deleted=include_deleted, **read_kwargs
172
- )
173
- except NoResultFound:
174
- # If the parent pid is being used we can get the id of the latest record and redirect
175
- latest_version = service().read_latest(**read_kwargs)
176
- return redirect(
177
- url_for(
178
- "invenio_app_rdm_records.record_detail",
179
- pid_value=latest_version.id,
180
- preview=1,
181
- )
182
- )
191
+ # read_draft internally handles NoResultFound and renders an error page
192
+ record = service().read_draft(**read_kwargs)
183
193
  else:
184
194
  try:
185
195
  record = service().read(
@@ -192,6 +202,7 @@ def pass_record_or_draft(expand=False):
192
202
  url_for(
193
203
  "invenio_app_rdm_records.record_detail",
194
204
  pid_value=latest_version.id,
205
+ preview_file=preview_file,
195
206
  )
196
207
  )
197
208
  kwargs["record"] = record
@@ -49,7 +49,9 @@ from .decorators import (
49
49
  pass_file_item,
50
50
  pass_file_metadata,
51
51
  pass_include_deleted,
52
+ pass_is_iframe,
52
53
  pass_is_preview,
54
+ pass_preview_file,
53
55
  pass_record_files,
54
56
  pass_record_from_pid,
55
57
  pass_record_latest,
@@ -147,7 +149,9 @@ class PreviewFile:
147
149
  `invenio_previewer.api.PreviewFile`.
148
150
  """
149
151
 
150
- def __init__(self, file_item, record_pid_value, record=None, url=None):
152
+ def __init__(
153
+ self, file_item, record_pid_value, record=None, url=None, is_iframe=False
154
+ ):
151
155
  """Create a new PreviewFile."""
152
156
  self.file = file_item
153
157
  self.data = file_item.data
@@ -160,6 +164,7 @@ class PreviewFile:
160
164
  pid_value=record_pid_value,
161
165
  filename=self.filename,
162
166
  )
167
+ self.is_iframe = is_iframe
163
168
 
164
169
  def is_local(self):
165
170
  """Check if file is local."""
@@ -185,12 +190,19 @@ class PreviewFile:
185
190
 
186
191
  @pass_is_preview
187
192
  @pass_include_deleted
193
+ @pass_preview_file
188
194
  @pass_record_or_draft(expand=True)
189
195
  @pass_record_files
190
196
  @pass_record_media_files
191
197
  @add_signposting_landing_page
192
198
  def record_detail(
193
- pid_value, record, files, media_files, is_preview=False, include_deleted=False
199
+ pid_value,
200
+ record,
201
+ files,
202
+ media_files,
203
+ is_preview=False,
204
+ include_deleted=False,
205
+ preview_file=None,
194
206
  ):
195
207
  """Record detail page (aka landing page)."""
196
208
  files_dict = None if files is None else files.to_dict()
@@ -202,6 +214,9 @@ def record_detail(
202
214
 
203
215
  record_ui = UIJSONSerializer().dump_obj(record.to_dict())
204
216
 
217
+ if preview_file:
218
+ record_ui["files"]["default_preview"] = preview_file
219
+
205
220
  record_deletion = evaluate_record_deletion(record._record, g.identity)
206
221
 
207
222
  # The deletion options are only needed if the user is allowed to delete the given record.
@@ -347,6 +362,7 @@ def record_export(
347
362
  @pass_include_deleted
348
363
  @pass_record_or_draft(expand=False)
349
364
  @pass_file_metadata
365
+ @pass_is_iframe
350
366
  def record_file_preview(
351
367
  pid_value,
352
368
  record=None,
@@ -354,6 +370,7 @@ def record_file_preview(
354
370
  file_metadata=None,
355
371
  is_preview=False,
356
372
  include_deleted=False,
373
+ is_iframe=False,
357
374
  **kwargs,
358
375
  ):
359
376
  """Render a preview of the specified file."""
@@ -365,7 +382,7 @@ def record_file_preview(
365
382
  )
366
383
 
367
384
  # Find a suitable previewer
368
- fileobj = PreviewFile(file_metadata, pid_value, record, url)
385
+ fileobj = PreviewFile(file_metadata, pid_value, record, url, is_iframe)
369
386
  # Try to see if specific previewer preference is set for the file
370
387
  file_previewer = (file_metadata.data.get("metadata") or {}).get("previewer")
371
388
  if file_previewer:
@@ -1,5 +1,5 @@
1
1
  // This file is part of InvenioRDM
2
- // Copyright (C) 2021 CERN.
2
+ // Copyright (C) 2021-2026 CERN.
3
3
  //
4
4
  // Invenio RDM Records is free software; you can redistribute it and/or modify it
5
5
  // under the terms of the MIT License; see LICENSE file for more details.
@@ -26,18 +26,18 @@ class SimpleCopyButton extends React.Component {
26
26
  };
27
27
 
28
28
  render() {
29
- const { hoverState, size } = this.props;
29
+ const { hoverState, className, uiProps } = this.props;
30
30
 
31
31
  return (
32
32
  <Button
33
- className="copy"
33
+ className={`copy ${className || ""}`}
34
34
  basic
35
- size={size}
36
35
  icon="copy"
37
36
  aria-label={i18next.t("Copy to clipboard")}
38
37
  onClick={this.handleClick} // Handle click to fetch from url if url passed, otherwise use text from props
39
38
  onMouseEnter={hoverState}
40
39
  onMouseLeave={hoverState}
40
+ {...uiProps}
41
41
  />
42
42
  );
43
43
  }
@@ -48,13 +48,15 @@ SimpleCopyButton.propTypes = {
48
48
  onCopy: PropTypes.func.isRequired,
49
49
  url: PropTypes.string,
50
50
  hoverState: PropTypes.func,
51
- size: PropTypes.string,
51
+ className: PropTypes.string,
52
+ uiProps: PropTypes.object,
52
53
  };
53
54
 
54
55
  SimpleCopyButton.defaultProps = {
55
56
  hoverState: null,
56
57
  url: null,
57
- size: "medium",
58
+ className: "",
59
+ uiProps: {},
58
60
  };
59
61
 
60
62
  export class CopyButton extends Component {
@@ -99,7 +101,7 @@ export class CopyButton extends Component {
99
101
  };
100
102
 
101
103
  render() {
102
- const { popUpPosition, text, url, size } = this.props;
104
+ const { popUpPosition, text, url, ...uiProps } = this.props;
103
105
  const { confirmationPopupMsg, confirmationPopupIsOpen, hoverPopupIsOpen } =
104
106
  this.state;
105
107
 
@@ -118,7 +120,7 @@ export class CopyButton extends Component {
118
120
  onCopy={this.onCopy}
119
121
  url={url}
120
122
  hoverState={this.hoverStateHandler}
121
- size={size}
123
+ uiProps={uiProps}
122
124
  />
123
125
  }
124
126
  />
@@ -131,12 +133,10 @@ CopyButton.propTypes = {
131
133
  popUpPosition: PropTypes.string,
132
134
  text: PropTypes.string,
133
135
  url: PropTypes.string,
134
- size: PropTypes.string,
135
136
  };
136
137
 
137
138
  CopyButton.defaultProps = {
138
139
  popUpPosition: "right center",
139
140
  text: "",
140
141
  url: "",
141
- size: "medium",
142
142
  };
@@ -12,6 +12,7 @@ import { Grid, Icon, Message, Placeholder, List, Divider } from "semantic-ui-rea
12
12
  import { i18next } from "@translations/invenio_app_rdm/i18next";
13
13
  import PropTypes from "prop-types";
14
14
  import { withCancel, http, ErrorMessage } from "react-invenio-forms";
15
+ import Overridable from "react-overridable";
15
16
 
16
17
  const deserializeRecord = (record) => ({
17
18
  id: record.id,
@@ -26,37 +27,44 @@ const deserializeRecord = (record) => ({
26
27
 
27
28
  const NUMBER_OF_VERSIONS = 5;
28
29
 
29
- const RecordVersionItem = ({ item, activeVersion }) => {
30
+ export const RecordVersionItem = ({ item, activeVersion }) => {
30
31
  const doi = _get(item.pids, "doi.identifier", "");
31
32
  return (
32
- <List.Item key={item.id} {...(activeVersion && { className: "version active" })}>
33
- <List.Content floated="left">
34
- {activeVersion ? (
35
- <span className="text-break">
36
- {i18next.t("Version {{- version}}", { version: item.version })}
37
- </span>
38
- ) : (
39
- <a href={`/records/${item.id}`} className="text-break">
40
- {i18next.t("Version {{- version}}", { version: item.version })}
41
- </a>
42
- )}
43
-
44
- {doi && (
45
- <a
46
- href={`https://doi.org/${doi}`}
47
- className={"doi" + (activeVersion ? " text-muted-darken" : " text-muted")}
48
- >
49
- {doi}
50
- </a>
51
- )}
52
- </List.Content>
53
-
54
- <List.Content floated="right">
55
- <small className={activeVersion ? "text-muted-darken" : "text-muted"}>
56
- {item.publication_date}
57
- </small>
58
- </List.Content>
59
- </List.Item>
33
+ <Overridable
34
+ id="InvenioAppRdm.RecordVersionsList.Item.container"
35
+ item={item}
36
+ activeVersion={activeVersion}
37
+ doi={doi}
38
+ >
39
+ <List.Item key={item.id} {...(activeVersion && { className: "version active" })}>
40
+ <List.Content floated="left">
41
+ {activeVersion ? (
42
+ <span className="text-break">
43
+ {i18next.t("Version {{- version}}", { version: item.version })}
44
+ </span>
45
+ ) : (
46
+ <a href={`/records/${item.id}`} className="text-break">
47
+ {i18next.t("Version {{- version}}", { version: item.version })}
48
+ </a>
49
+ )}
50
+
51
+ {doi && (
52
+ <a
53
+ href={`https://doi.org/${doi}`}
54
+ className={"doi" + (activeVersion ? " text-muted-darken" : " text-muted")}
55
+ >
56
+ {doi}
57
+ </a>
58
+ )}
59
+ </List.Content>
60
+
61
+ <List.Content floated="right">
62
+ <small className={activeVersion ? "text-muted-darken" : "text-muted"}>
63
+ {item.publication_date}
64
+ </small>
65
+ </List.Content>
66
+ </List.Item>
67
+ </Overridable>
60
68
  );
61
69
  };
62
70
 
@@ -52,10 +52,12 @@ function renderRecordManagement(element) {
52
52
  const recordVersionsAppDiv = document.getElementById("recordVersions");
53
53
  if (recordVersionsAppDiv) {
54
54
  ReactDOM.render(
55
- <RecordVersionsList
56
- record={JSON.parse(recordVersionsAppDiv.dataset.record)}
57
- isPreview={JSON.parse(recordVersionsAppDiv.dataset.preview)}
58
- />,
55
+ <OverridableContext.Provider value={overriddenComponents}>
56
+ <RecordVersionsList
57
+ record={JSON.parse(recordVersionsAppDiv.dataset.record)}
58
+ isPreview={JSON.parse(recordVersionsAppDiv.dataset.preview)}
59
+ />
60
+ </OverridableContext.Provider>,
59
61
  recordVersionsAppDiv
60
62
  );
61
63
  }
@@ -16,9 +16,25 @@ $("#record-conceptdoi-badge").on("click", function () {
16
16
  $("#conceptdoi-modal").modal("show");
17
17
  });
18
18
 
19
- $(".preview-link").on("click", function (event) {
20
- $("#preview-file-title").html(event.target.dataset.fileKey);
21
- });
19
+ $("#file-list-table")
20
+ .find(".preview-link")
21
+ .on("click", function (event) {
22
+ const fileKey = event.target.dataset.fileKey;
23
+ $("#preview-file-title").text(fileKey);
24
+
25
+ event.preventDefault(); // Prevent default link navigation for back button to navigate the record and not the iframe
26
+
27
+ const newUrl = new URL(window.location);
28
+ newUrl.searchParams.set("preview_file", fileKey); // .set method automatically encodes the value
29
+ window.history.replaceState(null, "", newUrl);
30
+
31
+ // Update iframe with the updated URL to the preview file without adding to browser history
32
+ const previewUrl = $(this).attr("href");
33
+ const iframe = document.getElementById("preview-iframe");
34
+ if (iframe && iframe.contentWindow) {
35
+ iframe.contentWindow.location.replace(previewUrl);
36
+ }
37
+ });
22
38
 
23
39
  // Export dropdown on landing page
24
40
  $(".dropdown.export").dropdown({
@@ -0,0 +1,18 @@
1
+ {# -*- coding: utf-8 -*-
2
+
3
+ This file is part of Invenio.
4
+ Copyright (C) 2026 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
+ {% if file.record.data["is_published"] and file.record.data["links"]["latest_html"] and not file.record.data["versions"]["is_latest"] %}
11
+ <div class="ui warning flashed attached manage message pl-10 pr-10">
12
+ <p>
13
+ {% trans link_start=('<a href="' + file.record.data["links"]["latest_html"] + '"><b>')|safe, link_end='</b></a>'|safe %}
14
+ You are viewing a file from an older version of this record. {{ link_start }}View latest record{{ link_end }}.
15
+ {% endtrans %}
16
+ </p>
17
+ </div>
18
+ {% endif %}
@@ -0,0 +1,30 @@
1
+ {# -*- coding: utf-8 -*-
2
+
3
+ This file is part of Invenio.
4
+ Copyright (C) 2026 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_previewer/base.html" %}
11
+
12
+ {%- block head %}
13
+ {% for css_bundle in css_bundles %}
14
+ {{ webpack[css_bundle] }}
15
+ {% endfor %}
16
+ {{ webpack['theme.css'] }}
17
+ {%- endblock %}
18
+
19
+ {%- block page_body %}
20
+ {%- if request.args.get('embed') %}
21
+ {%- include 'invenio_previewer/top.html' %}
22
+ {%- endif %}
23
+ {%- if not file.is_iframe %}
24
+ {%- include "invenio_previewer/latest_record.html" %}
25
+ {%- endif %}
26
+ {%- block panel %}{% endblock %}
27
+ {%- if request.args.get('embed') %}
28
+ {%- include 'invenio_previewer/bottom.html' %}
29
+ {%- endif %}
30
+ {%- endblock %}
@@ -38,6 +38,7 @@ This script has been tested with following data:
38
38
  - drafts visible
39
39
  - records visible
40
40
  """
41
+
41
42
  import sys
42
43
 
43
44
  from click import secho
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: invenio-app-rdm
3
- Version: 14.0.0b4.dev3
3
+ Version: 14.0.0b4.dev5
4
4
  Summary: Invenio Research Data Management.
5
5
  Home-page: https://github.com/inveniosoftware/invenio-app-rdm
6
6
  Author: CERN
@@ -101,6 +101,19 @@ https://inveniordm.docs.cern.ch
101
101
  Changes
102
102
  =======
103
103
 
104
+ Version v14.0.0b4.dev4 (released 2026-01-21)
105
+
106
+ - feat(CopyButton): Pass remaining props to customize UI & functionality
107
+ - refactor(RecordVersionsList): Make version items overridable
108
+
109
+ Version v14.0.0b4.dev4 (released 2026-01-15)
110
+
111
+ - refactor(ui): support custom file display name resolver
112
+ - fix: use UUID type for request identifiers
113
+ - feat(comment-replies): add single threading on comments
114
+ - fix(moderation.requests): handle empty payload key not in request
115
+ - feat(previewer): show message for outdated records
116
+
104
117
  Version v14.0.0b4.dev3 (released 2025-12-18)
105
118
 
106
119
  - fix(feed): styling for disabled reply input
@@ -1,22 +1,22 @@
1
- invenio_app_rdm/__init__.py,sha256=rGSHYOs4tBpVSabQLZvoALZZWU9ucXxzO_KuSME7pOI,704
1
+ invenio_app_rdm/__init__.py,sha256=ekTsVfOct-ISZRXM4igCnTpOnzlxQBGQvoAIMnmtetI,704
2
2
  invenio_app_rdm/cli.py,sha256=G6QqNU2W6n6ICtTMnpeKFXIsdorncDmVXwwwsGH5F2k,2746
3
- invenio_app_rdm/config.py,sha256=pigyCXGUMru2krv-ZJ15iosbm3UBk9dmiAQauYvzWbk,53632
3
+ invenio_app_rdm/config.py,sha256=OI25kBsLhnyYP3SMqLGyUt4iIpc0Xqho1dtRvLCA1L8,53937
4
4
  invenio_app_rdm/ext.py,sha256=K7syn5CU5If7yOclFeNOCZX_u5q6VB7NJEQVm41mlng,5286
5
5
  invenio_app_rdm/tasks.py,sha256=FyrIQXVuPjms-dNEnLrVmmdwrX_IykJ87gcSNgOR6O0,1373
6
6
  invenio_app_rdm/views.py,sha256=SDr9NwZEWQcgT_3GFRYdDf6eUaK9DfnoafIkhUf9nSI,785
7
7
  invenio_app_rdm/administration/__init__.py,sha256=8r9LeoE9fNHZSVS5QsCfVhRU7MAiEOWJk9MA3Y--4F8,251
8
8
  invenio_app_rdm/administration/audit_logs/__init__.py,sha256=jsBXeKSY5YNn1juF9sFyHPYo_XYpwdP3Dye-de7cMK0,318
9
- invenio_app_rdm/administration/audit_logs/audit_logs.py,sha256=6tZvqPKt54Hc8gL3Lz5LLwwKHABU3fWWhU5t0DHhgPk,2166
9
+ invenio_app_rdm/administration/audit_logs/audit_logs.py,sha256=kbBOH1Jn8zLfntYjy-WAuDdT3A12k8b3fmkhxJNJ16M,2167
10
10
  invenio_app_rdm/administration/domains/__init__.py,sha256=Qob5kqjRPxpuSE5yDV2tesN6tmaKp5JcxCxGA8Mrcak,487
11
11
  invenio_app_rdm/administration/domains/domains.py,sha256=vafLa-mqkg_tQLjx328E64P_4mksB5kjBlsfunvdatg,5599
12
12
  invenio_app_rdm/administration/moderation/__init__.py,sha256=5Jr_Kicz0xsybdyRr48amQDkLlalVbRz9Pq0zGrTqMg,404
13
- invenio_app_rdm/administration/moderation/requests.py,sha256=tFa26P9hue2NIHw1HevWt_lm_8tD71X_yaAkPYt0TL4,6264
13
+ invenio_app_rdm/administration/moderation/requests.py,sha256=44JD46PqJA42locRgIshXLliC4PPgL6btamoOZm2Qxk,6272
14
14
  invenio_app_rdm/administration/records/__init__.py,sha256=WpNHBm_Mk9FF8GzvrXWjL79URMSgBhpqgxvrLXNooqg,434
15
15
  invenio_app_rdm/administration/records/records.py,sha256=6nVyDwYLdipIDSnlXMRe6JuiIIo5CaVojeNJCOlTPjI,5371
16
16
  invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/audit_logs.html,sha256=kLP3lfZiwLB8N-78_xINymnD8TIjGMzeJIO1a1zO130,346
17
17
  invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/domains_search.html,sha256=NP8HPfOQPIR9psNDMFRXJH8fjok2AbXCentD_3Q1wWw,338
18
18
  invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/requests.html,sha256=kvM8b3m8p_yVJ0i1aCuNNj1-9KHJk4EsEI-Zxd8B2zo,340
19
- invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/requests_details.html,sha256=PMUVAHU3Pqqlfz9YepNJXPn-6IGRmUfirkWeybKCplA,3185
19
+ invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/requests_details.html,sha256=l9YnIK3pKDKtyoDpc7P5IZMnv617VwdiF4VZAYvknEo,3265
20
20
  invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/user_moderation.html,sha256=koXd8lV_KBgAl1Wll7aM3xR0NgYcOl2PiFqD2Xkcp2w,348
21
21
  invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/user_moderation_details.html,sha256=g6YZh9yWqDfzd5kMgIrO4c5k4iKa61y04RsuT_ZbMJI,350
22
22
  invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/users_search.html,sha256=BtuBmQ3RqRZ-bzYWRsToC3m7ULd-T2vMCLSwrTLwWF8,337
@@ -51,7 +51,7 @@ invenio_app_rdm/records_ui/utils.py,sha256=MGB4YAWrrE5Wu4RhbT2F5SAfVkm3PLe-jzD1B
51
51
  invenio_app_rdm/records_ui/previewer/__init__.py,sha256=T32i_ssGKONDpNB3gECpn20ubHvGYYVrNuIgCADioOM,267
52
52
  invenio_app_rdm/records_ui/previewer/iiif_simple.py,sha256=lGxB3g0hNVJDWnq5jV_KrKPwC-LR1C51DMjas1-UpBM,1589
53
53
  invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/deposit.html,sha256=aBdqSLQMi2nKKoC0dt3c7B8xluy3eE6l9j-M-rAa5Zc,3121
54
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/detail.html,sha256=Bi2LGkcXb9ftgJWterPeA8GtzZs8HhMipJlj4qA4g68,20849
54
+ invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/detail.html,sha256=th4UkmgB8-q65Os_hTJfgAyD6do3Koz_VoHd2U6h06w,21396
55
55
  invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/draft_not_found.html,sha256=_FPflgqVZ556Xw349mHPSFb0FOhxYkIHfmUUTX53_LU,624
56
56
  invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/export.html,sha256=2h-FGJvNKS9ASZ0mErL2vz5jXQYiLL8u8rTO2_D3FVQ,1166
57
57
  invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/iiif_preview.html,sha256=RningdsVBXsJ8qnQjzurf0Ty8R5Tq08eS31s53c3DNE,444
@@ -84,15 +84,15 @@ invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details
84
84
  invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/creatibutors.html,sha256=N53nwtlEZjxweCx70qFJa1s6uL1pPSzWZgk8p1vodE4,4277
85
85
  invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/detail.html,sha256=Ur6pFoCiL8K02X7D6QNgtMoS7eMiDo7BhExKx9fMke8,11052
86
86
  invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/doi.html,sha256=32Yknq5PgvJpYg9Z3Brod9wui9yrpDNE11_esG-20jw,1656
87
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/files.html,sha256=6OIavFXP1BeV1Xozkv-2SOea9M5RUwjRI6gEGzBUle4,9564
87
+ invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/files.html,sha256=wVmtCCyIJxB3h_Xs20-Cc2drVKOW6Z2g9t4KCHjZ1Qc,10137
88
88
  invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/locations.html,sha256=27-KyPqb05pu-yRXHvxCgZWRSi5bFP6xf7XBn91sbeA,1741
89
89
  invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/stats_popup.html,sha256=5SVzfIS15Aro2Itd2BiaLbMXm0cvvwk6ZCdYjuSwhBw,625
90
90
  invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/version.html,sha256=eA8-n81XUezkwPXvcG5v2sgLPQNTgr7hB36-_Gr-tVI,758
91
91
  invenio_app_rdm/records_ui/views/__init__.py,sha256=9DaDls04IQv7fYttDjLofIWGsRRjk-FwUYnIfxV3OWk,5840
92
- invenio_app_rdm/records_ui/views/decorators.py,sha256=t4Mt7bkidwq3tKE-3sMUSLIR7GxaOewwAng3s9bAMz0,16347
92
+ invenio_app_rdm/records_ui/views/decorators.py,sha256=t4lBAYfdzSKchd4wEA_yZasI4011vifxcthKXMIO7NY,16397
93
93
  invenio_app_rdm/records_ui/views/deposits.py,sha256=vckL56fcyOFcrQ0YSxPtx-jk7AAwzKQrxjIrXcIVSyQ,24636
94
94
  invenio_app_rdm/records_ui/views/filters.py,sha256=dtAjJ5NmPvxEYZJeldW5oxrj0D0AYXobNelii57Tfdo,7455
95
- invenio_app_rdm/records_ui/views/records.py,sha256=NAaIypSCr4Wrjahc4y7VRVXmeg2HTfLwl_MR9LW1ybQ,18201
95
+ invenio_app_rdm/records_ui/views/records.py,sha256=tQ6Gog1mfcaDd4hHa4HQwaNAHSJlUHfBIvdi54HgA-o,18504
96
96
  invenio_app_rdm/redirector/__init__.py,sha256=AYCTGmfbmkHW3YJXMqXlWBXcBrUsta-QmL9ULX2bjwA,243
97
97
  invenio_app_rdm/redirector/resource.py,sha256=XuH6ZK0HVE5LdXoorlm8aI3deizvnZ5gFa9d1ihYosk,3312
98
98
  invenio_app_rdm/redirector/views.py,sha256=CTJ3EGEFKfc0lFwNb9pwH7MbMLiqaWnF8LA3xGIwahc,563
@@ -175,7 +175,7 @@ invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/communityRecordsSear
175
175
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/communityRecordsSearch/components.js,sha256=k26jDWt0BWIrhnuGF-t0iNmudXdniO8YPkquF8VK7gk,271
176
176
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/communityRecordsSearch/index.js,sha256=8Ev-tdRIWl2HhB7Y8YR30dXK-A4ePyShOsb9A9X-GhQ,2193
177
177
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/CompactStats.js,sha256=_QNFYvYQJQgAjAWidxxGTX5YxAGhIUvZnOMxAKBnYxA,1374
178
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/CopyButton.js,sha256=tIWybsEB9V4qCwX0Yra8PDFIj-bEYvUistR_dcZR7IU,3554
178
+ invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/CopyButton.js,sha256=Ie79IcUP6zd9YNksD5nMAQo4xg5riuKFqW66ojZSJso,3611
179
179
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/DisplayPartOfCommunities.js,sha256=bSmhuwSWk4CW80mqa4ZZbjfa-_NsiJ1IxQ9veDy6sAM,2751
180
180
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/DisplayVerifiedCommunity.js,sha256=m3rT8jJ3440ZX22zZog8bHatWltYXwvmw_tu6tJUM9k,1506
181
181
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/FileModificationUntil.js,sha256=3GtEW_IaP6TBKzMBBX1eYD-DuJbM31ps-dbjdgpLfc8,1254
@@ -198,10 +198,10 @@ invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ManageB
198
198
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCitationField.js,sha256=XYfXsQejNeC1R0spndn0qDrqvz6w3bj5UlPEIgT4U24,4757
199
199
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCommunitiesList.js,sha256=w9iPhdQWJDpc9eXUFfUMqFp1GOjLHriAuVzAgIysHTs,5217
200
200
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordManagement.js,sha256=cViV1fQ_1xvd_JUV3toffX-nuWgkKiy7WGtZcg5tV5Y,4297
201
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordVersionsList.js,sha256=ZJaD4fW2z00tcektXVz0eLXu6oGLLW-NUjV86neuDjM,7141
201
+ invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordVersionsList.js,sha256=2wdyGkDYleScMDfWhUT-DS2_cF1l-aONrRhkrw7qZRs,7416
202
202
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/access.js,sha256=FVcpKl22zMi1GssbLZAj1pO98c6Em_wg_yBIdfBJor0,938
203
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/index.js,sha256=qFNRHzkO0lHv8sQGZchXQgrNKl-IcGqPAV-j4-E7NxE,5348
204
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/theme.js,sha256=TieqbbmJrxVKlkD5Kvsw6F-sbpucxSV9dv30Y6pXKjI,3144
203
+ invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/index.js,sha256=EPF96wIjBwDOzaC6Gsm_gBEb4ut5EiwMccvqZh_yPh0,5454
204
+ invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/theme.js,sha256=E-k0eKbkGZ7aF4eVojQmgWymSIzOzPHdysPLe2Kfwek,3837
205
205
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ManageDefaultBrandingAction/ManageDefaultBrandingAction.js,sha256=ti3NaV7kZ0cVl82Aj3l4b7cLjDiKmI2qGsjWEOKxLU0,3529
206
206
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/PendingCommunitiesModal/PendingCommunitiesModal.js,sha256=G9OwLxKqX73w_7D1k7BHOzMeLmokowMfJQg5Km7J8RA,1797
207
207
  invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/PendingCommunitiesModal/PendingCommunitiesSearch.js,sha256=8kiiICVaJ0m2K_5cPbiHo8tN8Q_AweSmlBIkx-aJ-dA,2753
@@ -410,6 +410,8 @@ invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/versioning.sv.h
410
410
  invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/macros/records_list.html,sha256=46so8aObvJUSCTiEx1TXV53pIjONqIK2DcCI_3HbyXA,1183
411
411
  invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/settings/notifications.html,sha256=7KfuuIbYtZT7DtxkBhP9U02JxEOgrAKO9AC1SDVY3uo,515
412
412
  invenio_app_rdm/theme/templates/semantic-ui/invenio_communities/default_static_page.html,sha256=X27Jhk2Z3h1JJY61a6WXhu8AtEDIYavUNprhG5t8Oy8,722
413
+ invenio_app_rdm/theme/templates/semantic-ui/invenio_previewer/latest_record.html,sha256=i38qVH_xZkONZeswAiCkJ4GZLHEPEYtWH6VNBPxP_2M,745
414
+ invenio_app_rdm/theme/templates/semantic-ui/invenio_previewer/rdm_abstract_previewer.html,sha256=0I_BOGNSvh8g-9PMC_7fR6j1u50hIlJJxCo0XCtjvpw,808
413
415
  invenio_app_rdm/theme/templates/themes/default/invenio_app_rdm/header.html,sha256=pPNIT9J_C4omwWuZWrAdq8rQANLaQmXeeKBmpAMxFtg,5910
414
416
  invenio_app_rdm/theme/templates/themes/default/invenio_app_rdm/site_footer.html,sha256=D8rFpAzWZ05hUj7kbBqvi-PqLRnEJhtL7UPYy5u0jHA,1644
415
417
  invenio_app_rdm/translations/messages.pot,sha256=6Zr8VhWZxAw55EJtmiET3GRkE-9jsQ6X9iuXaasxI3A,48847
@@ -475,7 +477,7 @@ invenio_app_rdm/upgrade_scripts/__init__.py,sha256=AlBBeGDr7RmylFE1ynJhFylaAlINQ
475
477
  invenio_app_rdm/upgrade_scripts/fix_migrated_records_from_1_0_to_2_0.py,sha256=SCUdvuQYGnjWLfm6Kd-f3swlOrxSNN3kO36OVEOkN7g,1760
476
478
  invenio_app_rdm/upgrade_scripts/fix_migrated_records_from_8_0_to_9_0.py,sha256=p6qTNjUMAJ-0tnrSwar7jtDX_sg6V9kFj7fzH-wrbkY,2769
477
479
  invenio_app_rdm/upgrade_scripts/migrate_10_0_to_11_0.py,sha256=TX6FCWXY4qM4z7IYzDO5qaMTheo3zAjFrmR1sXaEf4U,1333
478
- invenio_app_rdm/upgrade_scripts/migrate_11_0_to_12_0.py,sha256=Tp7jfT2JHrYCFzF2qIYqG7yr7k-GhX2zkw61CWJGA78,6941
480
+ invenio_app_rdm/upgrade_scripts/migrate_11_0_to_12_0.py,sha256=U3h09wf8Eb3TL3FdYDJeV2SauyaVwh3xO9pBhZQID-U,6942
479
481
  invenio_app_rdm/upgrade_scripts/migrate_12_0_to_13_0.py,sha256=pyO68jyGyKXVTcja8tpi2XgNx_FxXk7JhgDTV-wx3xM,8205
480
482
  invenio_app_rdm/upgrade_scripts/migrate_13_0_to_14_0.py,sha256=vSixZ-Md5esqabBNbWwN8mjEWSsMv0IroHA2gqy_GJ8,11247
481
483
  invenio_app_rdm/upgrade_scripts/migrate_1_0_records_to_2_0.py,sha256=mRDv_Ao5zMgA6X0aogMfvhspO1CIApKtDW_ziJp5fjI,3325
@@ -498,9 +500,9 @@ invenio_app_rdm/users_ui/views/__init__.py,sha256=SMdY2NJj9GICfr3Xuok7qdNYVtA2bJ
498
500
  invenio_app_rdm/users_ui/views/dashboard.py,sha256=iUn2PrODAwb8ugmMosJKAjPhUzjCiWiAWoXQr9RUFuc,1793
499
501
  invenio_app_rdm/users_ui/views/ui.py,sha256=W_eXM8dLVIrNHQB2UEh37C9BYoHauft6RyvcDNFHovA,1742
500
502
  invenio_app_rdm/utils/files.py,sha256=CruDyO2gDVadSlWEJD-WHpWHeOQ0juh-Ei9jz3D9yjc,3923
501
- invenio_app_rdm-14.0.0b4.dev3.dist-info/licenses/LICENSE,sha256=AZXFHRrZa5s4m9DV7zZr4bPGTMUvcEPCodeV_AmFI8k,1204
502
- invenio_app_rdm-14.0.0b4.dev3.dist-info/METADATA,sha256=VOqXVvwreG-606JG4_zpJxBoSpncw6ZhZrca73ufmYE,22022
503
- invenio_app_rdm-14.0.0b4.dev3.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
504
- invenio_app_rdm-14.0.0b4.dev3.dist-info/entry_points.txt,sha256=MwtT1SN5saWOgTYhNb5y0YGA9VGAi0kXN0cykIfsb4U,2405
505
- invenio_app_rdm-14.0.0b4.dev3.dist-info/top_level.txt,sha256=quZejDUw2vLfKQboNIuVLJ9fxZifdnCT_s2PNf1dfmk,16
506
- invenio_app_rdm-14.0.0b4.dev3.dist-info/RECORD,,
503
+ invenio_app_rdm-14.0.0b4.dev5.dist-info/licenses/LICENSE,sha256=AZXFHRrZa5s4m9DV7zZr4bPGTMUvcEPCodeV_AmFI8k,1204
504
+ invenio_app_rdm-14.0.0b4.dev5.dist-info/METADATA,sha256=0pdeo8AG-6J46a_Oj6FpB2wY4z6GVbn0MydocNwGWlc,22534
505
+ invenio_app_rdm-14.0.0b4.dev5.dist-info/WHEEL,sha256=Q6xS052dXadQWXcEVKSI037R6NoyqhUlJ5BcYz2iMP4,110
506
+ invenio_app_rdm-14.0.0b4.dev5.dist-info/entry_points.txt,sha256=MwtT1SN5saWOgTYhNb5y0YGA9VGAi0kXN0cykIfsb4U,2405
507
+ invenio_app_rdm-14.0.0b4.dev5.dist-info/top_level.txt,sha256=quZejDUw2vLfKQboNIuVLJ9fxZifdnCT_s2PNf1dfmk,16
508
+ invenio_app_rdm-14.0.0b4.dev5.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any