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.
- invenio_app_rdm/__init__.py +1 -1
- invenio_app_rdm/administration/moderation/__init__.py +11 -0
- invenio_app_rdm/administration/moderation/requests.py +175 -0
- invenio_app_rdm/administration/records/records.py +9 -7
- invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/requests.html +14 -0
- invenio_app_rdm/administration/templates/semantic-ui/invenio_app_rdm/administration/requests_details.html +91 -0
- invenio_app_rdm/administration/user_moderation/user_moderation.py +4 -4
- invenio_app_rdm/administration/users/users.py +0 -5
- invenio_app_rdm/communities_ui/views/communities.py +9 -5
- invenio_app_rdm/config.py +73 -4
- invenio_app_rdm/ext.py +2 -2
- invenio_app_rdm/fixtures/pages.py +5 -2
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/deposit.html +11 -0
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/detail.html +2 -5
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/citation.html +2 -2
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/details.html +2 -2
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/communities.html +8 -7
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/external_resources.html +5 -6
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/licenses.html +9 -13
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/side_bar/manage_menu.html +8 -5
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/details/stats.html +2 -4
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/detail.html +1 -1
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/doi.html +7 -5
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/macros/files.html +21 -4
- invenio_app_rdm/records_ui/templates/semantic-ui/invenio_app_rdm/records/tombstone.html +6 -1
- invenio_app_rdm/records_ui/utils.py +93 -1
- invenio_app_rdm/records_ui/views/decorators.py +24 -14
- invenio_app_rdm/records_ui/views/deposits.py +100 -27
- invenio_app_rdm/records_ui/views/filters.py +11 -4
- invenio_app_rdm/records_ui/views/records.py +23 -13
- invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/file-modification/index.html +88 -0
- invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/guest-access-request/index.html +5 -5
- invenio_app_rdm/requests_ui/templates/semantic-ui/invenio_requests/record-deletion/index.html +95 -0
- invenio_app_rdm/requests_ui/views/requests.py +54 -87
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/auditLogs/ViewRecentChanges.js +8 -8
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/ImpersonateUserForm.js +12 -17
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/RevisionsDiffViewer.js +14 -16
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/components/SetQuotaAction.js +1 -1
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/api/routes.js +1 -2
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/requests/RequestsSearchResultItem.js +81 -0
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/requests/RequestsSearchbarLayout.js +48 -0
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/requests/index.js +22 -0
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/communityRecordsSearch/CommunityRecordsSearchAppLayout.js +3 -4
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/CopyButton.js +38 -19
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/FileModificationUntil.js +45 -0
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/RecordDeletion/DeletionModal.js +354 -0
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/RecordDeletion/DeletionRadioGroup.js +44 -0
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/components/RecordDeletion.js +81 -0
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/RDMDepositForm.js +55 -5
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/deposit/index.js +4 -1
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/CommunitiesManagement.js +2 -2
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ExportDropdown.js +7 -2
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/ManageButton.js +52 -19
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCitationField.js +15 -14
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCommunitiesListModal/RecordCommunitiesListModal.js +4 -4
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordCommunitySubmission/RecordCommunitySubmissionModal.js +1 -1
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordManagement.js +17 -3
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RecordVersionsList.js +16 -17
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/RemoveFromCommunity/RemoveFromCommunityAction.js +5 -5
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/index.js +42 -40
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/landing_page/theme.js +9 -5
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/requests/timeline/AccessRequestTimelineEdit.js +5 -5
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/requests/timeline/AccessRequestTimelineRead.js +2 -2
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/search/components.js +14 -19
- invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/theme.js +9 -0
- invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/file_uploader/uppy.less +37 -0
- invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/landing_page/licenses.less +5 -3
- invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/globals/site.overrides +6 -1
- invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/accordion.overrides +10 -1
- invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/search.overrides +7 -0
- invenio_app_rdm/theme/assets/semantic-ui/less/invenio_app_rdm/theme/modules/search.variables +0 -0
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/i18next.js +1 -1
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/_generatedTranslations.js +66 -0
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ar/messages.po +804 -137
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ar/translations.json +277 -249
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/bg/messages.po +689 -70
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/bg/translations.json +102 -82
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ca/messages.po +699 -80
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ca/translations.json +112 -92
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/cs/messages.po +821 -138
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/cs/translations.json +290 -262
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/da/messages.po +691 -66
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/da/translations.json +91 -71
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/de/messages.po +818 -138
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/de/translations.json +260 -240
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/el/messages.po +698 -78
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/el/translations.json +108 -88
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/en/messages.po +1000 -5
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/en/translations.json +81 -28
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/es/messages.po +810 -137
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/es/translations.json +253 -233
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/et/messages.po +746 -133
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/et/translations.json +130 -110
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/fa/messages.po +688 -69
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/fa/translations.json +103 -79
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/fr/messages.po +809 -126
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/fr/translations.json +277 -257
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/hr/messages.po +695 -70
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/hr/translations.json +101 -79
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/hu/messages.po +801 -135
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/hu/translations.json +254 -234
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/index.js +16 -65
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/it/messages.po +712 -86
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/it/translations.json +116 -96
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ja/messages.po +683 -70
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ja/translations.json +96 -78
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ka/messages.po +689 -70
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ka/translations.json +109 -85
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ko/messages.po +889 -0
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ko/translations.json +277 -0
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/lt/messages.po +702 -71
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/lt/translations.json +113 -85
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/no/messages.po +689 -70
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/no/translations.json +102 -82
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/pl/messages.po +704 -70
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/pl/translations.json +119 -91
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/pt/messages.po +694 -69
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/pt/translations.json +93 -73
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ro/messages.po +717 -85
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ro/translations.json +155 -133
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ru/messages.po +806 -124
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/ru/translations.json +288 -260
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/sk/messages.po +713 -82
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/sk/translations.json +119 -91
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/sv/messages.po +807 -141
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/sv/translations.json +260 -240
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/tr/messages.po +799 -128
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/tr/translations.json +259 -239
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/uk/messages.po +756 -131
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/uk/translations.json +124 -96
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/zh_CN/messages.po +736 -123
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/zh_CN/translations.json +130 -108
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/zh_TW/messages.po +683 -70
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/messages/zh_TW/translations.json +100 -78
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/package.json +3 -37
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/translations.pot +243 -94
- invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/search.de.html +2 -2
- invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/search.en.html +4 -4
- invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/help/search.sv.html +4 -4
- invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/intro_section.html +7 -6
- invenio_app_rdm/theme/templates/semantic-ui/invenio_app_rdm/macros/records_list.html +2 -1
- invenio_app_rdm/theme/templates/semantic-ui/invenio_communities/default_static_page.html +26 -0
- invenio_app_rdm/theme/webpack.py +3 -2
- invenio_app_rdm/translations/ar/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/ar/LC_MESSAGES/messages.po +972 -376
- invenio_app_rdm/translations/bg/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/bg/LC_MESSAGES/messages.po +907 -278
- invenio_app_rdm/translations/ca/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/ca/LC_MESSAGES/messages.po +912 -283
- invenio_app_rdm/translations/cs/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/cs/LC_MESSAGES/messages.po +1069 -405
- invenio_app_rdm/translations/da/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/da/LC_MESSAGES/messages.po +908 -273
- invenio_app_rdm/translations/de/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/de/LC_MESSAGES/messages.po +1017 -406
- invenio_app_rdm/translations/el/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/el/LC_MESSAGES/messages.po +915 -286
- invenio_app_rdm/translations/es/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/es/LC_MESSAGES/messages.po +963 -371
- invenio_app_rdm/translations/et/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/et/LC_MESSAGES/messages.po +938 -362
- invenio_app_rdm/translations/fa/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/fa/LC_MESSAGES/messages.po +906 -277
- invenio_app_rdm/translations/fr/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/fr/LC_MESSAGES/messages.po +1032 -375
- invenio_app_rdm/translations/hr/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/hr/LC_MESSAGES/messages.po +907 -278
- invenio_app_rdm/translations/hu/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/hu/LC_MESSAGES/messages.po +985 -369
- invenio_app_rdm/translations/it/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/it/LC_MESSAGES/messages.po +928 -298
- invenio_app_rdm/translations/ja/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/ja/LC_MESSAGES/messages.po +907 -278
- invenio_app_rdm/translations/ka/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/ka/LC_MESSAGES/messages.po +909 -280
- invenio_app_rdm/translations/ko/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/ko/LC_MESSAGES/messages.po +1361 -0
- invenio_app_rdm/translations/lt/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/lt/LC_MESSAGES/messages.po +910 -281
- invenio_app_rdm/translations/messages.pot +486 -303
- invenio_app_rdm/translations/no/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/no/LC_MESSAGES/messages.po +907 -278
- invenio_app_rdm/translations/pl/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/pl/LC_MESSAGES/messages.po +907 -278
- invenio_app_rdm/translations/pt/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/pt/LC_MESSAGES/messages.po +906 -277
- invenio_app_rdm/translations/ro/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/ro/LC_MESSAGES/messages.po +1042 -384
- invenio_app_rdm/translations/ru/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/ru/LC_MESSAGES/messages.po +1022 -370
- invenio_app_rdm/translations/sk/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/sk/LC_MESSAGES/messages.po +916 -287
- invenio_app_rdm/translations/sv/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/sv/LC_MESSAGES/messages.po +989 -380
- invenio_app_rdm/translations/tr/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/tr/LC_MESSAGES/messages.po +992 -341
- invenio_app_rdm/translations/uk/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/uk/LC_MESSAGES/messages.po +935 -356
- invenio_app_rdm/translations/zh_CN/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/zh_CN/LC_MESSAGES/messages.po +939 -347
- invenio_app_rdm/translations/zh_TW/LC_MESSAGES/messages.mo +0 -0
- invenio_app_rdm/translations/zh_TW/LC_MESSAGES/messages.po +907 -278
- invenio_app_rdm/upgrade_scripts/migrate_12_0_to_13_0.py +190 -62
- {invenio_app_rdm-13.0.0b4.dev1.dist-info → invenio_app_rdm-14.0.0b1.dev8.dist-info}/METADATA +118 -7
- {invenio_app_rdm-13.0.0b4.dev1.dist-info → invenio_app_rdm-14.0.0b1.dev8.dist-info}/RECORD +209 -225
- {invenio_app_rdm-13.0.0b4.dev1.dist-info → invenio_app_rdm-14.0.0b1.dev8.dist-info}/entry_points.txt +2 -0
- {invenio_app_rdm-13.0.0b4.dev1.dist-info → invenio_app_rdm-14.0.0b1.dev8.dist-info}/top_level.txt +0 -1
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/i18next-scanner.config.js +0 -64
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/package-lock.json +0 -1512
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/scripts/compileCatalog.js +0 -40
- invenio_app_rdm/theme/assets/semantic-ui/translations/invenio_app_rdm/scripts/initCatalog.js +0 -20
- tests/__init__.py +0 -8
- tests/api/__init__.py +0 -8
- tests/api/conftest.py +0 -24
- tests/api/test_protect_files_rest.py +0 -73
- tests/api/test_record_api.py +0 -175
- tests/api/test_stats_api.py +0 -26
- tests/conftest.py +0 -390
- tests/fixtures/__init__.py +0 -8
- tests/fixtures/app_data/oai_sets.yaml +0 -3
- tests/fixtures/app_data/pages/about.html +0 -1
- tests/fixtures/app_data/pages.yaml +0 -4
- tests/fixtures/conftest.py +0 -27
- tests/fixtures/test_cli.py +0 -25
- tests/fixtures/test_fixtures.py +0 -46
- tests/mock_module/__init__.py +0 -7
- tests/mock_module/templates/mock_mail.html +0 -27
- tests/mock_module/views.py +0 -32
- tests/redirector/__init__.py +0 -8
- tests/redirector/conftest.py +0 -54
- tests/redirector/test_redirector.py +0 -28
- tests/test_tasks.py +0 -209
- tests/test_utils.py +0 -67
- tests/test_version.py +0 -16
- tests/test_views.py +0 -43
- tests/ui/__init__.py +0 -8
- tests/ui/conftest.py +0 -115
- tests/ui/test_deposits.py +0 -115
- tests/ui/test_export_formats.py +0 -37
- tests/ui/test_file_download.py +0 -73
- tests/ui/test_filters.py +0 -10
- tests/ui/test_robotstxt.py +0 -35
- tests/ui/test_signposting_ui.py +0 -95
- tests/ui/test_sitemaps.py +0 -85
- tests/ui/test_stats_ui.py +0 -92
- {invenio_app_rdm-13.0.0b4.dev1.dist-info → invenio_app_rdm-14.0.0b1.dev8.dist-info}/WHEEL +0 -0
- {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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
{
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
)}
|
|
159
|
-
|
|
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} {...
|
|
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
|
|
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>
|
invenio_app_rdm/theme/assets/semantic-ui/js/invenio_app_rdm/administration/records/api/routes.js
CHANGED
|
@@ -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
|
-
|
|
39
|
-
{cmp} results found
|
|
40
|
-
|
|
37
|
+
<>
|
|
38
|
+
{cmp} {i18next.t("results found")}
|
|
39
|
+
</>
|
|
41
40
|
)}
|
|
42
41
|
/>
|
|
43
42
|
</Grid.Column>
|