invenio-app-rdm 13.0.0b4.dev1__py2.py3-none-any.whl → 14.0.0b1.dev8__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 (247) hide show
  1. invenio_app_rdm/__init__.py +1 -1
  2. invenio_app_rdm/administration/moderation/__init__.py +11 -0
  3. invenio_app_rdm/administration/moderation/requests.py +175 -0
  4. invenio_app_rdm/administration/records/records.py +9 -7
  5. invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/requests.html +14 -0
  6. invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/requests_details.html +91 -0
  7. invenio_app_rdm/administration/user_moderation/user_moderation.py +4 -4
  8. invenio_app_rdm/administration/users/users.py +0 -5
  9. invenio_app_rdm/communities_ui/views/communities.py +9 -5
  10. invenio_app_rdm/config.py +73 -4
  11. invenio_app_rdm/ext.py +2 -2
  12. invenio_app_rdm/fixtures/pages.py +5 -2
  13. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/deposit.html +11 -0
  14. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/detail.html +2 -5
  15. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/citation.html +2 -2
  16. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/details.html +2 -2
  17. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/communities.html +8 -7
  18. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/external_resources.html +5 -6
  19. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/licenses.html +9 -13
  20. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/manage_menu.html +8 -5
  21. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/stats.html +2 -4
  22. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/detail.html +1 -1
  23. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/doi.html +7 -5
  24. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/files.html +21 -4
  25. invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/tombstone.html +6 -1
  26. invenio_app_rdm/records_ui/utils.py +93 -1
  27. invenio_app_rdm/records_ui/views/decorators.py +24 -14
  28. invenio_app_rdm/records_ui/views/deposits.py +100 -27
  29. invenio_app_rdm/records_ui/views/filters.py +11 -4
  30. invenio_app_rdm/records_ui/views/records.py +23 -13
  31. invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/file-modification/index.html +88 -0
  32. invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/guest-access-request/index.html +5 -5
  33. invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/record-deletion/index.html +95 -0
  34. invenio_app_rdm/requests_ui/views/requests.py +54 -87
  35. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/auditLogs/ViewRecentChanges.js +8 -8
  36. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/ImpersonateUserForm.js +12 -17
  37. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/RevisionsDiffViewer.js +14 -16
  38. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/SetQuotaAction.js +1 -1
  39. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/api/routes.js +1 -2
  40. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/requests/RequestsSearchResultItem.js +81 -0
  41. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/requests/RequestsSearchbarLayout.js +48 -0
  42. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/requests/index.js +22 -0
  43. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/communityRecordsSearch/CommunityRecordsSearchAppLayout.js +3 -4
  44. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/CopyButton.js +38 -19
  45. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/FileModificationUntil.js +45 -0
  46. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/RecordDeletion/DeletionModal.js +354 -0
  47. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/RecordDeletion/DeletionRadioGroup.js +44 -0
  48. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/RecordDeletion.js +81 -0
  49. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/RDMDepositForm.js +55 -5
  50. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/index.js +4 -1
  51. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/CommunitiesManagement.js +2 -2
  52. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ExportDropdown.js +7 -2
  53. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ManageButton.js +52 -19
  54. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCitationField.js +15 -14
  55. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCommunitiesListModal/RecordCommunitiesListModal.js +4 -4
  56. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCommunitySubmission/RecordCommunitySubmissionModal.js +1 -1
  57. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordManagement.js +17 -3
  58. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordVersionsList.js +16 -17
  59. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RemoveFromCommunity/RemoveFromCommunityAction.js +5 -5
  60. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/index.js +42 -40
  61. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/theme.js +9 -5
  62. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/requests/timeline/AccessRequestTimelineEdit.js +5 -5
  63. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/requests/timeline/AccessRequestTimelineRead.js +2 -2
  64. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/search/components.js +14 -19
  65. invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/theme.js +9 -0
  66. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/file_uploader/uppy.less +37 -0
  67. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/landing_page/licenses.less +5 -3
  68. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/globals/site.overrides +6 -1
  69. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/accordion.overrides +10 -1
  70. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/search.overrides +7 -0
  71. invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/search.variables +0 -0
  72. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/i18next.js +1 -1
  73. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/_generatedTranslations.js +66 -0
  74. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ar/messages.po +804 -137
  75. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ar/translations.json +277 -249
  76. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/bg/messages.po +689 -70
  77. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/bg/translations.json +102 -82
  78. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ca/messages.po +699 -80
  79. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ca/translations.json +112 -92
  80. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/cs/messages.po +821 -138
  81. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/cs/translations.json +290 -262
  82. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/da/messages.po +691 -66
  83. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/da/translations.json +91 -71
  84. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/de/messages.po +818 -138
  85. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/de/translations.json +260 -240
  86. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/el/messages.po +698 -78
  87. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/el/translations.json +108 -88
  88. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/en/messages.po +1000 -5
  89. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/en/translations.json +81 -28
  90. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/es/messages.po +810 -137
  91. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/es/translations.json +253 -233
  92. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/et/messages.po +746 -133
  93. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/et/translations.json +130 -110
  94. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/fa/messages.po +688 -69
  95. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/fa/translations.json +103 -79
  96. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/fr/messages.po +809 -126
  97. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/fr/translations.json +277 -257
  98. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/hr/messages.po +695 -70
  99. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/hr/translations.json +101 -79
  100. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/hu/messages.po +801 -135
  101. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/hu/translations.json +254 -234
  102. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/index.js +16 -65
  103. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/it/messages.po +712 -86
  104. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/it/translations.json +116 -96
  105. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ja/messages.po +683 -70
  106. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ja/translations.json +96 -78
  107. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ka/messages.po +689 -70
  108. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ka/translations.json +109 -85
  109. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ko/messages.po +889 -0
  110. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ko/translations.json +277 -0
  111. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/lt/messages.po +702 -71
  112. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/lt/translations.json +113 -85
  113. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/no/messages.po +689 -70
  114. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/no/translations.json +102 -82
  115. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/pl/messages.po +704 -70
  116. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/pl/translations.json +119 -91
  117. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/pt/messages.po +694 -69
  118. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/pt/translations.json +93 -73
  119. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ro/messages.po +717 -85
  120. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ro/translations.json +155 -133
  121. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ru/messages.po +806 -124
  122. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ru/translations.json +288 -260
  123. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/sk/messages.po +713 -82
  124. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/sk/translations.json +119 -91
  125. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/sv/messages.po +807 -141
  126. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/sv/translations.json +260 -240
  127. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/tr/messages.po +799 -128
  128. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/tr/translations.json +259 -239
  129. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/uk/messages.po +756 -131
  130. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/uk/translations.json +124 -96
  131. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/zh_CN/messages.po +736 -123
  132. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/zh_CN/translations.json +130 -108
  133. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/zh_TW/messages.po +683 -70
  134. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/zh_TW/translations.json +100 -78
  135. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/package.json +3 -37
  136. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/translations.pot +243 -94
  137. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/search.de.html +2 -2
  138. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/search.en.html +4 -4
  139. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/search.sv.html +4 -4
  140. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/intro_section.html +7 -6
  141. invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/macros/records_list.html +2 -1
  142. invenio_app_rdm/theme/templates/semantic-ui/invenio_communities/default_static_page.html +26 -0
  143. invenio_app_rdm/theme/webpack.py +3 -2
  144. invenio_app_rdm/translations/ar/LC_MESSAGES/messages.mo +0 -0
  145. invenio_app_rdm/translations/ar/LC_MESSAGES/messages.po +972 -376
  146. invenio_app_rdm/translations/bg/LC_MESSAGES/messages.mo +0 -0
  147. invenio_app_rdm/translations/bg/LC_MESSAGES/messages.po +907 -278
  148. invenio_app_rdm/translations/ca/LC_MESSAGES/messages.mo +0 -0
  149. invenio_app_rdm/translations/ca/LC_MESSAGES/messages.po +912 -283
  150. invenio_app_rdm/translations/cs/LC_MESSAGES/messages.mo +0 -0
  151. invenio_app_rdm/translations/cs/LC_MESSAGES/messages.po +1069 -405
  152. invenio_app_rdm/translations/da/LC_MESSAGES/messages.mo +0 -0
  153. invenio_app_rdm/translations/da/LC_MESSAGES/messages.po +908 -273
  154. invenio_app_rdm/translations/de/LC_MESSAGES/messages.mo +0 -0
  155. invenio_app_rdm/translations/de/LC_MESSAGES/messages.po +1017 -406
  156. invenio_app_rdm/translations/el/LC_MESSAGES/messages.mo +0 -0
  157. invenio_app_rdm/translations/el/LC_MESSAGES/messages.po +915 -286
  158. invenio_app_rdm/translations/es/LC_MESSAGES/messages.mo +0 -0
  159. invenio_app_rdm/translations/es/LC_MESSAGES/messages.po +963 -371
  160. invenio_app_rdm/translations/et/LC_MESSAGES/messages.mo +0 -0
  161. invenio_app_rdm/translations/et/LC_MESSAGES/messages.po +938 -362
  162. invenio_app_rdm/translations/fa/LC_MESSAGES/messages.mo +0 -0
  163. invenio_app_rdm/translations/fa/LC_MESSAGES/messages.po +906 -277
  164. invenio_app_rdm/translations/fr/LC_MESSAGES/messages.mo +0 -0
  165. invenio_app_rdm/translations/fr/LC_MESSAGES/messages.po +1032 -375
  166. invenio_app_rdm/translations/hr/LC_MESSAGES/messages.mo +0 -0
  167. invenio_app_rdm/translations/hr/LC_MESSAGES/messages.po +907 -278
  168. invenio_app_rdm/translations/hu/LC_MESSAGES/messages.mo +0 -0
  169. invenio_app_rdm/translations/hu/LC_MESSAGES/messages.po +985 -369
  170. invenio_app_rdm/translations/it/LC_MESSAGES/messages.mo +0 -0
  171. invenio_app_rdm/translations/it/LC_MESSAGES/messages.po +928 -298
  172. invenio_app_rdm/translations/ja/LC_MESSAGES/messages.mo +0 -0
  173. invenio_app_rdm/translations/ja/LC_MESSAGES/messages.po +907 -278
  174. invenio_app_rdm/translations/ka/LC_MESSAGES/messages.mo +0 -0
  175. invenio_app_rdm/translations/ka/LC_MESSAGES/messages.po +909 -280
  176. invenio_app_rdm/translations/ko/LC_MESSAGES/messages.mo +0 -0
  177. invenio_app_rdm/translations/ko/LC_MESSAGES/messages.po +1361 -0
  178. invenio_app_rdm/translations/lt/LC_MESSAGES/messages.mo +0 -0
  179. invenio_app_rdm/translations/lt/LC_MESSAGES/messages.po +910 -281
  180. invenio_app_rdm/translations/messages.pot +486 -303
  181. invenio_app_rdm/translations/no/LC_MESSAGES/messages.mo +0 -0
  182. invenio_app_rdm/translations/no/LC_MESSAGES/messages.po +907 -278
  183. invenio_app_rdm/translations/pl/LC_MESSAGES/messages.mo +0 -0
  184. invenio_app_rdm/translations/pl/LC_MESSAGES/messages.po +907 -278
  185. invenio_app_rdm/translations/pt/LC_MESSAGES/messages.mo +0 -0
  186. invenio_app_rdm/translations/pt/LC_MESSAGES/messages.po +906 -277
  187. invenio_app_rdm/translations/ro/LC_MESSAGES/messages.mo +0 -0
  188. invenio_app_rdm/translations/ro/LC_MESSAGES/messages.po +1042 -384
  189. invenio_app_rdm/translations/ru/LC_MESSAGES/messages.mo +0 -0
  190. invenio_app_rdm/translations/ru/LC_MESSAGES/messages.po +1022 -370
  191. invenio_app_rdm/translations/sk/LC_MESSAGES/messages.mo +0 -0
  192. invenio_app_rdm/translations/sk/LC_MESSAGES/messages.po +916 -287
  193. invenio_app_rdm/translations/sv/LC_MESSAGES/messages.mo +0 -0
  194. invenio_app_rdm/translations/sv/LC_MESSAGES/messages.po +989 -380
  195. invenio_app_rdm/translations/tr/LC_MESSAGES/messages.mo +0 -0
  196. invenio_app_rdm/translations/tr/LC_MESSAGES/messages.po +992 -341
  197. invenio_app_rdm/translations/uk/LC_MESSAGES/messages.mo +0 -0
  198. invenio_app_rdm/translations/uk/LC_MESSAGES/messages.po +935 -356
  199. invenio_app_rdm/translations/zh_CN/LC_MESSAGES/messages.mo +0 -0
  200. invenio_app_rdm/translations/zh_CN/LC_MESSAGES/messages.po +939 -347
  201. invenio_app_rdm/translations/zh_TW/LC_MESSAGES/messages.mo +0 -0
  202. invenio_app_rdm/translations/zh_TW/LC_MESSAGES/messages.po +907 -278
  203. invenio_app_rdm/upgrade_scripts/migrate_12_0_to_13_0.py +190 -62
  204. {invenio_app_rdm-13.0.0b4.dev1.dist-info → invenio_app_rdm-14.0.0b1.dev8.dist-info}/METADATA +118 -7
  205. {invenio_app_rdm-13.0.0b4.dev1.dist-info → invenio_app_rdm-14.0.0b1.dev8.dist-info}/RECORD +209 -225
  206. {invenio_app_rdm-13.0.0b4.dev1.dist-info → invenio_app_rdm-14.0.0b1.dev8.dist-info}/entry_points.txt +2 -0
  207. {invenio_app_rdm-13.0.0b4.dev1.dist-info → invenio_app_rdm-14.0.0b1.dev8.dist-info}/top_level.txt +0 -1
  208. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/i18next-scanner.config.js +0 -64
  209. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/package-lock.json +0 -1512
  210. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/scripts/compileCatalog.js +0 -40
  211. invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/scripts/initCatalog.js +0 -20
  212. tests/__init__.py +0 -8
  213. tests/api/__init__.py +0 -8
  214. tests/api/conftest.py +0 -24
  215. tests/api/test_protect_files_rest.py +0 -73
  216. tests/api/test_record_api.py +0 -175
  217. tests/api/test_stats_api.py +0 -26
  218. tests/conftest.py +0 -390
  219. tests/fixtures/__init__.py +0 -8
  220. tests/fixtures/app_data/oai_sets.yaml +0 -3
  221. tests/fixtures/app_data/pages/about.html +0 -1
  222. tests/fixtures/app_data/pages.yaml +0 -4
  223. tests/fixtures/conftest.py +0 -27
  224. tests/fixtures/test_cli.py +0 -25
  225. tests/fixtures/test_fixtures.py +0 -46
  226. tests/mock_module/__init__.py +0 -7
  227. tests/mock_module/templates/mock_mail.html +0 -27
  228. tests/mock_module/views.py +0 -32
  229. tests/redirector/__init__.py +0 -8
  230. tests/redirector/conftest.py +0 -54
  231. tests/redirector/test_redirector.py +0 -28
  232. tests/test_tasks.py +0 -209
  233. tests/test_utils.py +0 -67
  234. tests/test_version.py +0 -16
  235. tests/test_views.py +0 -43
  236. tests/ui/__init__.py +0 -8
  237. tests/ui/conftest.py +0 -115
  238. tests/ui/test_deposits.py +0 -115
  239. tests/ui/test_export_formats.py +0 -37
  240. tests/ui/test_file_download.py +0 -73
  241. tests/ui/test_filters.py +0 -10
  242. tests/ui/test_robotstxt.py +0 -35
  243. tests/ui/test_signposting_ui.py +0 -95
  244. tests/ui/test_sitemaps.py +0 -85
  245. tests/ui/test_stats_ui.py +0 -92
  246. {invenio_app_rdm-13.0.0b4.dev1.dist-info → invenio_app_rdm-14.0.0b1.dev8.dist-info}/WHEEL +0 -0
  247. {invenio_app_rdm-13.0.0b4.dev1.dist-info → invenio_app_rdm-14.0.0b1.dev8.dist-info}/licenses/LICENSE +0 -0
@@ -11,9 +11,10 @@
11
11
 
12
12
  from flask import current_app, g, render_template
13
13
  from flask_login import current_user, login_required
14
+ from invenio_checks.api import ChecksAPI
14
15
  from invenio_communities.config import COMMUNITIES_ROLES
15
16
  from invenio_communities.members.services.request import CommunityInvitation
16
- from invenio_communities.proxies import current_communities, current_identities_cache
17
+ from invenio_communities.proxies import current_identities_cache
17
18
  from invenio_communities.subcommunities.services.request import (
18
19
  SubCommunityInvitationRequest,
19
20
  SubCommunityRequest,
@@ -21,17 +22,20 @@ from invenio_communities.subcommunities.services.request import (
21
22
  from invenio_communities.utils import identity_cache_key
22
23
  from invenio_communities.views.communities import render_community_theme_template
23
24
  from invenio_communities.views.decorators import pass_community
25
+ from invenio_i18n.ext import current_i18n
24
26
  from invenio_pidstore.errors import PIDDoesNotExistError
25
27
  from invenio_rdm_records.proxies import current_rdm_records_service
26
28
  from invenio_rdm_records.requests import CommunityInclusion, CommunitySubmission
27
29
  from invenio_rdm_records.resources.serializers import UIJSONSerializer
30
+ from invenio_rdm_records.services.errors import RecordDeletedException
28
31
  from invenio_rdm_records.services.generators import CommunityInclusionNeed
29
32
  from invenio_records_resources.services.errors import PermissionDeniedError
30
33
  from invenio_requests.customizations import AcceptAction
31
34
  from invenio_requests.resolvers.registry import ResolverRegistry
32
35
  from invenio_requests.views.decorators import pass_request
33
36
  from invenio_users_resources.proxies import current_user_resources
34
- from sqlalchemy import case
37
+ from invenio_vocabularies.proxies import current_service as vocabulary_service
38
+ from marshmallow_utils.fields.babel import gettext_from_dict
35
39
  from sqlalchemy.orm.exc import NoResultFound
36
40
 
37
41
  from ...records_ui.utils import get_external_resources
@@ -53,10 +57,9 @@ def _resolve_topic_record(request):
53
57
  user_owns_request = str(creator_id) == str(current_user.id)
54
58
 
55
59
  if request["is_closed"] and not user_owns_request:
56
- return dict(permissions={}, record_ui=None, record=None, record_uuid=None)
60
+ return dict(permissions={}, record_ui=None, record=None)
57
61
 
58
62
  record = None
59
- record_uuid = None
60
63
  # parse the topic field to get the draft/record pid `record:abcd-efgh`
61
64
  entity = ResolverRegistry.resolve_entity_proxy(request["topic"])
62
65
  pid = entity._parse_ref_dict_id()
@@ -85,16 +88,12 @@ def _resolve_topic_record(request):
85
88
  break
86
89
  # read published record
87
90
  record = current_rdm_records_service.read(g.identity, pid, expand=True)
88
- record_uuid = current_rdm_records_service.record_cls.pid.resolve(pid).id
89
91
  else:
90
92
  # read draft
91
93
  record = current_rdm_records_service.read_draft(
92
94
  g.identity, pid, expand=True
93
95
  )
94
- record_uuid = current_rdm_records_service.draft_cls.pid.resolve(
95
- pid, registered_only=False
96
- ).id
97
- except (NoResultFound, PIDDoesNotExistError):
96
+ except (NoResultFound, PIDDoesNotExistError, RecordDeletedException):
98
97
  # We catch PIDDoesNotExistError because a published record with
99
98
  # a soft-deleted draft will raise this error. The lines below
100
99
  # will catch the case that a id does not exists and raise a
@@ -103,8 +102,7 @@ def _resolve_topic_record(request):
103
102
  try:
104
103
  # read published record
105
104
  record = current_rdm_records_service.read(g.identity, pid, expand=True)
106
- record_uuid = current_rdm_records_service.record_cls.pid.resolve(pid).id
107
- except NoResultFound:
105
+ except (NoResultFound, RecordDeletedException):
108
106
  # record tab not displayed when the record is not found
109
107
  # the request is probably not open anymore
110
108
  pass
@@ -126,10 +124,9 @@ def _resolve_topic_record(request):
126
124
  permissions=permissions,
127
125
  record_ui=record_ui,
128
126
  record=record,
129
- record_uuid=record_uuid,
130
127
  )
131
128
 
132
- return dict(permissions={}, record_ui=None, record=None, record_uuid=None)
129
+ return dict(permissions={}, record_ui=None, record=None)
133
130
 
134
131
 
135
132
  def _resolve_record_or_draft_files(record, request):
@@ -174,72 +171,6 @@ def _resolve_record_or_draft_media_files(record, request):
174
171
  return None
175
172
 
176
173
 
177
- def _resolve_checks(record_uuid, request, community=None):
178
- """Resolve the checks for this draft/record related to the community and the request."""
179
- # FIXME: Move this logic to invenio-checks
180
-
181
- # Early exit if checks are not enabled.
182
- enabled = current_app.config.get("CHECKS_ENABLED", False)
183
-
184
- if not enabled:
185
- return None
186
-
187
- # Early exit if not draft submission nor record inclusion
188
- request_type = request["type"]
189
- is_draft_submission = request_type == CommunitySubmission.type_id
190
- is_record_inclusion = request_type == CommunityInclusion.type_id
191
-
192
- if not is_draft_submission and not is_record_inclusion:
193
- return None
194
-
195
- # Early exit if there is no record UUID (for instance for some closed requests)
196
- if not record_uuid:
197
- return None
198
-
199
- # Resolve the target community from the request if the community was not passed as an argument
200
- if not community:
201
- community_uuid = request["receiver"]["community"]
202
- community = current_communities.service.read(
203
- id_=community_uuid, identity=g.identity
204
- )
205
-
206
- # Collect the community UUID and the potential parent community UUID
207
- communities = []
208
- community_parent_id = community.to_dict().get("parent", {}).get("id")
209
- if community_parent_id:
210
- # Add the parent community first for later ordering of check configs
211
- communities.append(community_parent_id)
212
- communities.append(community.id)
213
-
214
- # Early exit if no check config found for the communities
215
- from invenio_checks.models import CheckConfig, CheckRun
216
-
217
- check_configs = (
218
- CheckConfig.query.filter(CheckConfig.community_id.in_(communities))
219
- .order_by(
220
- # Order by the communities (parent first if any) and then by check IDs for deterministic ordering
221
- case((CheckConfig.community_id == communities[0], 0), else_=1),
222
- CheckConfig.check_id,
223
- )
224
- .all()
225
- )
226
-
227
- if not check_configs:
228
- return None
229
-
230
- # Find check runs for the given check configs
231
- check_config_ids = [check_config.id for check_config in check_configs]
232
- checks = CheckRun.query.filter(
233
- CheckRun.config_id.in_(check_config_ids),
234
- CheckRun.record_id == record_uuid,
235
- ).all()
236
- # For a given record, there is one check run corresponding to one check config
237
- # Order the check runs by the same order as the check configs for deterministic ordering
238
- checks = sorted(checks, key=lambda check: check_config_ids.index(check.config_id))
239
-
240
- return checks
241
-
242
-
243
174
  @login_required
244
175
  @pass_request(expand=True)
245
176
  def user_dashboard_request_view(request, **kwargs):
@@ -254,17 +185,38 @@ def user_dashboard_request_view(request, **kwargs):
254
185
  has_topic = request["topic"] is not None
255
186
  has_record_topic = has_topic and "record" in request["topic"]
256
187
  has_community_topic = has_topic and "community" in request["topic"]
188
+ is_record_inclusion = request_type == CommunityInclusion.type_id
189
+ request_permissions = request.has_permissions_to(["action_accept"])
257
190
 
258
191
  if has_record_topic:
259
192
  topic = _resolve_topic_record(request)
260
193
  record_ui = topic["record_ui"]
261
194
  record = topic["record"]
262
- record_uuid = topic["record_uuid"]
263
195
  is_draft = record_ui["is_draft"] if record_ui else False
264
- checks = _resolve_checks(record_uuid, request)
196
+ is_published = record_ui["is_published"] if record_ui else False
197
+ has_draft = record._record.has_draft if record else False
265
198
 
266
199
  files = _resolve_record_or_draft_files(record_ui, request)
267
200
  media_files = _resolve_record_or_draft_media_files(record_ui, request)
201
+
202
+ checks = None
203
+ if current_app.config.get("CHECKS_ENABLED", False) and record:
204
+ if is_record_inclusion and has_draft:
205
+ checks = ChecksAPI.get_runs(record._record, is_draft=True)
206
+ else:
207
+ checks = ChecksAPI.get_runs(record._record)
208
+
209
+ if request_type == "record-deletion":
210
+ reason_title = vocabulary_service.read(
211
+ g.identity,
212
+ ("removalreasons", request["payload"]["reason"]),
213
+ ).to_dict()
214
+ request["payload"]["reason_label"] = gettext_from_dict(
215
+ reason_title["title"],
216
+ current_i18n.locale,
217
+ current_app.config.get("BABEL_DEFAULT_LOCALE", "en"),
218
+ )
219
+
268
220
  return render_template(
269
221
  f"invenio_requests/{request_type}/index.html",
270
222
  base_template="invenio_app_rdm/users/base.html",
@@ -273,9 +225,11 @@ def user_dashboard_request_view(request, **kwargs):
273
225
  record_ui=record_ui,
274
226
  record=record,
275
227
  checks=checks,
276
- permissions=topic["permissions"],
228
+ permissions={**topic["permissions"], **request_permissions},
277
229
  is_preview=is_draft, # preview only when draft
278
230
  is_draft=is_draft,
231
+ is_published=is_published,
232
+ has_draft=has_draft,
279
233
  request_is_accepted=request_is_accepted,
280
234
  files=files,
281
235
  media_files=media_files,
@@ -293,7 +247,7 @@ def user_dashboard_request_view(request, **kwargs):
293
247
  user_avatar=avatar,
294
248
  invenio_request=request.to_dict(),
295
249
  request_is_accepted=request_is_accepted,
296
- permissions={},
250
+ permissions={**request_permissions},
297
251
  include_deleted=False,
298
252
  )
299
253
 
@@ -306,7 +260,7 @@ def user_dashboard_request_view(request, **kwargs):
306
260
  user_avatar=avatar,
307
261
  record=record,
308
262
  record_ui=record_ui,
309
- permissions=topic["permissions"],
263
+ permissions={**topic["permissions"], **request_permissions},
310
264
  invenio_request=request.to_dict(),
311
265
  request_is_accepted=request_is_accepted,
312
266
  include_deleted=False,
@@ -336,18 +290,29 @@ def community_dashboard_request_view(request, community, community_ui, **kwargs)
336
290
  permissions = community.has_permissions_to(
337
291
  ["update", "read", "search_requests", "search_invites", "submit_record"]
338
292
  )
293
+ request_permissions = request.has_permissions_to(["action_accept"])
294
+ # Add request specific permissions so that reviewers can be selected from community curators
295
+ permissions.update(request_permissions)
339
296
 
340
297
  if is_draft_submission or is_record_inclusion:
341
298
  topic = _resolve_topic_record(request)
342
299
  record_ui = topic["record_ui"]
343
300
  record = topic["record"]
344
- record_uuid = topic["record_uuid"]
345
301
  is_draft = record_ui["is_draft"] if record_ui else False
346
- checks = _resolve_checks(record_uuid, request, community)
347
-
302
+ is_published = record_ui["is_published"] if record_ui else False
303
+ has_draft = record._record.has_draft if record else False
348
304
  permissions.update(topic["permissions"])
305
+
349
306
  files = _resolve_record_or_draft_files(record_ui, request)
350
307
  media_files = _resolve_record_or_draft_media_files(record_ui, request)
308
+
309
+ checks = None
310
+ if current_app.config.get("CHECKS_ENABLED", False) and record:
311
+ if is_record_inclusion and has_draft:
312
+ checks = ChecksAPI.get_runs(record._record, is_draft=True)
313
+ else:
314
+ checks = ChecksAPI.get_runs(record._record)
315
+
351
316
  return render_community_theme_template(
352
317
  f"invenio_requests/{request_type}/index.html",
353
318
  theme=community.to_dict().get("theme", {}),
@@ -361,6 +326,8 @@ def community_dashboard_request_view(request, community, community_ui, **kwargs)
361
326
  permissions=permissions,
362
327
  is_preview=is_draft, # preview only when draft
363
328
  is_draft=is_draft,
329
+ has_draft=has_draft,
330
+ is_published=is_published,
364
331
  request_is_accepted=request_is_accepted,
365
332
  files=files,
366
333
  media_files=media_files,
@@ -24,6 +24,14 @@ export class ViewRecentChanges extends Component {
24
24
  };
25
25
  }
26
26
 
27
+ componentDidMount() {
28
+ this.fetchPreviousRevision();
29
+ }
30
+
31
+ componentWillUnmount() {
32
+ this.cancellableAction && this.cancellableAction.cancel();
33
+ }
34
+
27
35
  async fetchPreviousRevision() {
28
36
  const { resource } = this.props;
29
37
  const {
@@ -60,14 +68,6 @@ export class ViewRecentChanges extends Component {
60
68
  }
61
69
  }
62
70
 
63
- componentDidMount() {
64
- this.fetchPreviousRevision();
65
- }
66
-
67
- componentWillUnmount() {
68
- this.cancellableAction && this.cancellableAction.cancel();
69
- }
70
-
71
71
  handleModalClose = () => {
72
72
  const { actionCancelCallback } = this.props;
73
73
  actionCancelCallback();
@@ -10,7 +10,6 @@
10
10
  import React, { Component } from "react";
11
11
  import PropTypes from "prop-types";
12
12
  import { i18next } from "@translations/invenio_app_rdm/i18next";
13
- import { Trans } from "react-i18next";
14
13
  import { Formik } from "formik";
15
14
  import _get from "lodash/get";
16
15
 
@@ -121,15 +120,13 @@ export class ImpersonateUserForm extends Component {
121
120
  control={Checkbox}
122
121
  fieldPath="acceptImpersonation"
123
122
  label={
124
- <Trans
125
- defaults={i18next.t(
126
- "You are about to impersonate user <bold>{{email}}(id: {{id}})</bold>.",
127
- { email: user.email, id: user.id }
128
- )}
129
- values={{ email: user.email, id: user.id }}
130
- components={{ bold: <b /> }}
131
- shouldUnescape
132
- />
123
+ <>
124
+ {i18next.t("You are about to impersonate user ")}
125
+ <b>
126
+ {user.email} (id: {user.id})
127
+ </b>
128
+ .
129
+ </>
133
130
  }
134
131
  checked={_get(values, "acceptImpersonation") === true}
135
132
  onChange={({ data, formikProps }) => {
@@ -152,13 +149,11 @@ export class ImpersonateUserForm extends Component {
152
149
  control={Checkbox}
153
150
  fieldPath="acceptToLogout"
154
151
  label={
155
- <Trans
156
- defaults={i18next.t(
157
- "You <bold>MUST</bold> logout after completing your inquiry."
158
- )}
159
- components={{ bold: <b /> }}
160
- shouldUnescape
161
- />
152
+ <>
153
+ {i18next.t("You ")}
154
+ <b>{i18next.t("MUST")}</b>
155
+ {i18next.t(" logout after completing your inquiry.")}
156
+ </>
162
157
  }
163
158
  checked={_get(values, "acceptToLogout") === true}
164
159
  onChange={({ data, formikProps }) => {
@@ -24,20 +24,6 @@ export class RevisionsDiffViewer extends Component {
24
24
  ignoreCaseForKey: false,
25
25
  recursiveEqual: true,
26
26
  });
27
-
28
- this.viewerProps = {
29
- indent: 4,
30
- lineNumbers: true,
31
- highlightInlineDiff: true,
32
- inlineDiffOptions: {
33
- mode: "word",
34
- wordSeparator: " ",
35
- },
36
- hideUnchangedLines: true,
37
- syntaxHighlight: false,
38
- virtual: true,
39
- };
40
-
41
27
  this.state = {
42
28
  currentDiff: undefined,
43
29
  };
@@ -58,13 +44,13 @@ export class RevisionsDiffViewer extends Component {
58
44
  };
59
45
 
60
46
  render() {
61
- const { currentDiff } = this.state;
47
+ const { currentDiff, viewerProps } = this.state;
62
48
 
63
49
  return currentDiff ? (
64
50
  <Grid>
65
51
  <Grid.Column width={16}>
66
52
  <Container fluid>
67
- <Viewer diff={currentDiff} {...this.viewerProps} />
53
+ <Viewer diff={currentDiff} {...viewerProps} />
68
54
  </Container>
69
55
  </Grid.Column>
70
56
  </Grid>
@@ -79,4 +65,16 @@ RevisionsDiffViewer.propTypes = {
79
65
 
80
66
  RevisionsDiffViewer.defaultProps = {
81
67
  diff: {},
68
+ viewerProps: {
69
+ indent: 4,
70
+ lineNumbers: true,
71
+ highlightInlineDiff: true,
72
+ inlineDiffOptions: {
73
+ mode: "word",
74
+ wordSeparator: " ",
75
+ },
76
+ hideUnchangedLines: true,
77
+ syntaxHighlight: false,
78
+ virtual: true,
79
+ },
82
80
  };
@@ -78,7 +78,7 @@ export class SetQuotaAction extends Component {
78
78
  <p>
79
79
  <strong>{i18next.t("Note")}:</strong>{" "}
80
80
  {i18next.t(
81
- "This is the default quota that will be applied to any NEW records created by this user it will NOT update quota of existing records."
81
+ "This is the default quota that will be applied to any NEW records created by this user - it will NOT update quota of existing records."
82
82
  )}
83
83
  </p>
84
84
  </Modal.Content>
@@ -1,12 +1,11 @@
1
1
  /*
2
2
  * This file is part of Invenio.
3
- * Copyright (C) 2023 CERN.
3
+ * Copyright (C) 2023-2025 CERN.
4
4
  *
5
5
  * Invenio is free software; you can redistribute it and/or modify it
6
6
  * under the terms of the MIT License; see LICENSE file for more details.
7
7
  */
8
8
 
9
- import { last } from "lodash";
10
9
  import _get from "lodash/get";
11
10
 
12
11
  const APIRoutesGenerators = {
@@ -0,0 +1,81 @@
1
+ /*
2
+ * This file is part of Invenio.
3
+ * Copyright (C) 2025 CERN.
4
+ *
5
+ * InvenioAppRdm 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 PropTypes from "prop-types";
10
+ import React, { Component } from "react";
11
+ import { Table } from "semantic-ui-react";
12
+ import { withState } from "react-searchkit";
13
+ import { AdminUIRoutes } from "@js/invenio_administration/src/routes.js";
14
+ import { UserListItemCompact, toRelativeTime } from "react-invenio-forms";
15
+ import { i18next } from "@translations/invenio_app_rdm/i18next";
16
+
17
+ class SearchResultItemComponent extends Component {
18
+ refreshAfterAction = () => {
19
+ const { updateQueryState, currentQueryState } = this.props;
20
+ updateQueryState(currentQueryState);
21
+ };
22
+
23
+ render() {
24
+ const { result, columns, idKeyPath, listUIEndpoint } = this.props;
25
+ return (
26
+ <Table.Row>
27
+ <Table.Cell
28
+ key={`${columns[0][1]["text"]}-${columns[0][1]["order"]}`}
29
+ data-label={columns[0][1]["text"]}
30
+ className="word-break-all"
31
+ >
32
+ <a href={AdminUIRoutes.detailsView(listUIEndpoint, result, idKeyPath)}>
33
+ {/* TODO we need a better way to get the (translatable) label of a request type
34
+ https://github.com/inveniosoftware/invenio-requests/issues/414 */}
35
+ {result.type === "record-deletion" && "Record deletion"}
36
+ </a>
37
+ </Table.Cell>
38
+ <Table.Cell
39
+ key={`${columns[1][1]["text"]}-${columns[1][1]["order"]}`}
40
+ data-label={columns[1][1]["text"]}
41
+ className="word-break-all"
42
+ >
43
+ <UserListItemCompact
44
+ user={result.expanded.created_by}
45
+ id={result.created_by.user}
46
+ // TODO linkToDetailView= filter by user?
47
+ />
48
+ {toRelativeTime(result.created)}
49
+ </Table.Cell>
50
+ <Table.Cell
51
+ key={`${columns[2][1]["text"]}-${columns[2][1]["order"]}`}
52
+ data-label={columns[2][1]["text"]}
53
+ className="word-break-all"
54
+ >
55
+ {result.expanded.last_reply ? (
56
+ <>
57
+ <UserListItemCompact
58
+ user={result.expanded.last_reply.created_by}
59
+ id={result.last_reply.created_by.user}
60
+ />
61
+ {toRelativeTime(result.last_reply.created)}
62
+ </>
63
+ ) : (
64
+ i18next.t("No replies")
65
+ )}
66
+ </Table.Cell>
67
+ </Table.Row>
68
+ );
69
+ }
70
+ }
71
+
72
+ SearchResultItemComponent.propTypes = {
73
+ result: PropTypes.object.isRequired,
74
+ columns: PropTypes.array.isRequired,
75
+ updateQueryState: PropTypes.func.isRequired,
76
+ currentQueryState: PropTypes.object.isRequired,
77
+ idKeyPath: PropTypes.string.isRequired,
78
+ listUIEndpoint: PropTypes.string.isRequired,
79
+ };
80
+
81
+ export const SearchResultItem = withState(SearchResultItemComponent);
@@ -0,0 +1,48 @@
1
+ /*
2
+ * // This file is part of Invenio-Requests
3
+ * // Copyright (C) 2025 CERN.
4
+ * //
5
+ * // Invenio-Requests 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 PropTypes from "prop-types";
10
+ import React, { Component } from "react";
11
+ import { RequestStatusFilter } from "@js/invenio_requests/search";
12
+ import { SearchBar, Sort } from "react-searchkit";
13
+
14
+ export class RequestsSearchbarLayout extends Component {
15
+ render() {
16
+ const { config } = this.props;
17
+
18
+ return (
19
+ <>
20
+ {/* auto column grid used instead of SUI grid for better searchbar width adjustment */}
21
+ <div className="auto-column-grid">
22
+ <div className="flex column-mobile">
23
+ <div className="mobile only rel-mb-1 flex align-items-center justify-space-between">
24
+ <RequestStatusFilter keepFiltersOnUpdate />
25
+ </div>
26
+
27
+ <div className="tablet only computer only rel-mr-2">
28
+ <RequestStatusFilter keepFiltersOnUpdate />
29
+ </div>
30
+ <div className="full-width">
31
+ <SearchBar fluid />
32
+ </div>
33
+ </div>
34
+ <div className="flex align-items-center column-mobile">
35
+ <div className="full-width flex align-items-center justify-end column-mobile">
36
+ <Sort values={config.sortOptions} />
37
+ </div>
38
+ </div>
39
+ </div>
40
+ <div className="rel-mb-1" />
41
+ </>
42
+ );
43
+ }
44
+ }
45
+
46
+ RequestsSearchbarLayout.propTypes = {
47
+ config: PropTypes.object.isRequired,
48
+ };
@@ -0,0 +1,22 @@
1
+ // This file is part of InvenioCommunities
2
+ // Copyright (C) 2025 CERN.
3
+ //
4
+ // Invenio RDM is free software; you can redistribute it and/or modify it
5
+ // under the terms of the MIT License; see LICENSE file for more details.
6
+
7
+ import { initDefaultSearchComponents } from "@js/invenio_administration";
8
+ import { createSearchAppInit } from "@js/invenio_search_ui";
9
+ import { RequestsSearchbarLayout } from "./RequestsSearchbarLayout";
10
+ import { SearchResultItem } from "./RequestsSearchResultItem";
11
+
12
+ const domContainer = document.getElementById("invenio-search-config");
13
+
14
+ const defaultComponents = initDefaultSearchComponents(domContainer);
15
+
16
+ const overridenComponents = {
17
+ ...defaultComponents,
18
+ "SearchApp.searchbarContainer": RequestsSearchbarLayout,
19
+ "InvenioAdministration.SearchResultItem.layout": SearchResultItem,
20
+ };
21
+
22
+ createSearchAppInit(overridenComponents, true, "invenio-search-config", false);
@@ -9,7 +9,6 @@ import { Count, Sort } from "react-searchkit";
9
9
  import { Button, Container, Grid } from "semantic-ui-react";
10
10
  import { GridResponsiveSidebarColumn } from "react-invenio-forms";
11
11
  import PropTypes from "prop-types";
12
- import { Trans } from "react-i18next";
13
12
 
14
13
  export const CommunityRecordsSearchAppLayout = ({ config, appName }) => {
15
14
  const [sidebarVisible, setSidebarVisible] = React.useState(false);
@@ -35,9 +34,9 @@ export const CommunityRecordsSearchAppLayout = ({ config, appName }) => {
35
34
  <Grid.Column width={4} textAlign="left">
36
35
  <Count
37
36
  label={(cmp) => (
38
- <Trans key="communityRecordsSearch" count={cmp}>
39
- {cmp} results found
40
- </Trans>
37
+ <>
38
+ {cmp} {i18next.t("results found")}
39
+ </>
41
40
  )}
42
41
  />
43
42
  </Grid.Column>