From 5fd9aabb703c0e467b4bdb07d70ae1b0f6d1d4ca Mon Sep 17 00:00:00 2001 From: milanmajchrak <90026355+milanmajchrak@users.noreply.github.com> Date: Thu, 21 Nov 2024 08:21:05 +0100 Subject: [PATCH 01/44] Update namespace config and docker compose files (#730) * Updated docker compose and aai.js to work properly with `namespace` and update docker compose files following current customisation. * Added doc and undo one removal because it is not needed to remove * Removed two IT: (#737) 1. Author does not have a two input fields. 2. Test for checking the notice step will be transformed into UI test, because we do not want to keep such specific collection for generic IT. --- cypress/e2e/submission-ui.cy.ts | 22 ---------------------- docker/docker-compose-rest.yml | 15 +++++++++------ docker/docker-compose.yml | 13 +++++++------ src/aai/aai.js | 2 +- 4 files changed, 17 insertions(+), 35 deletions(-) diff --git a/cypress/e2e/submission-ui.cy.ts b/cypress/e2e/submission-ui.cy.ts index db41ba66756..63c8ec79d9d 100644 --- a/cypress/e2e/submission-ui.cy.ts +++ b/cypress/e2e/submission-ui.cy.ts @@ -230,18 +230,6 @@ describe('Create a new submission', () => { createItemProcess.showErrorNotSupportedLicense(); }); - // Author field should consist of two input fields - it('Author field should consist of two input fields', { - retries: { - runMode: 6, - openMode: 6, - }, - defaultCommandTimeout: 10000 - },() => { - createItemProcess.checkAuthorFirstnameField(); - createItemProcess.checkAuthorLastnameField(); - }); - it('The submission should not have the Notice Step', { retries: { runMode: 6, @@ -261,16 +249,6 @@ describe('Create a new submission in the clariah collection', () => { // This page is restricted, so we will be shown the login form. Fill it out & submit. cy.loginViaForm(TEST_ADMIN_USER, TEST_ADMIN_PASSWORD); }); - - it('The submission should have the Notice Step', { - retries: { - runMode: 6, - openMode: 6, - }, - defaultCommandTimeout: 10000 - },() => { - createItemProcess.checkClarinNoticeStep(); - }); }); function addEUSponsor(euSponsorOrder) { diff --git a/docker/docker-compose-rest.yml b/docker/docker-compose-rest.yml index 55543984ccb..c0ce3479cb7 100644 --- a/docker/docker-compose-rest.yml +++ b/docker/docker-compose-rest.yml @@ -63,11 +63,11 @@ services: # BE server port - published: 808${INSTANCE} target: 8080 - host_ip: 127.0.0.1 + host_ip: ${HOST_IP:-127.0.0.1} # original debug port - published: 800${INSTANCE} target: 8000 - host_ip: 127.0.0.1 + host_ip: ${HOST_IP:-127.0.0.1} # handle binary port as per https://www.handle.net/hnr_support.html (5th paragraph) - published: 264${INSTANCE} target: 2641 @@ -80,7 +80,8 @@ services: tty: true volumes: - dspace_logs:/dspace/log - - assetstore:/dspace/assetstore + - #assetstore:/dspace/assetstore + - /opt/DATA/assetstore:/dspace/assetstore # Mount DSpace's solr configs to a volume, so that we can share to 'dspacesolr' container (see below) - solr_configs:/dspace/solr - handle_server:/dspace/handle-server @@ -95,6 +96,7 @@ services: - '-c' - | while (! /dev/null 2>&1; do sleep 1; done; + pushd ../webapps && unlink server && ln -s /dspace/webapps/server/ 'repository#server' && popd /dspace/bin/dspace database migrate force custom_run.sh /dspace/bin/start-handle-server @@ -112,7 +114,7 @@ services: ports: - published: 543${INSTANCE} target: 543${INSTANCE} - host_ip: 127.0.0.1 + host_ip: ${HOST_IP:-127.0.0.1} stdin_open: true tty: true volumes: @@ -133,7 +135,7 @@ services: ports: - published: 898${INSTANCE} target: 898${INSTANCE} - host_ip: 127.0.0.1 + host_ip: ${HOST_IP:-127.0.0.1} stdin_open: true tty: true working_dir: /var/solr/data @@ -164,7 +166,8 @@ services: cp -r -u /opt/solr/server/solr/configsets/dspace/statistics/* statistics exec solr -p 898${INSTANCE} -f -m 4g volumes: - assetstore: + # Commented out because there are a lot of files in the assetstore + #assetstore: pgdata: solr_data: # Special volume used to share Solr configs from 'dspace' to 'dspacesolr' container (see above) diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 001a6b91b0a..55d2354204c 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -17,15 +17,16 @@ services: TZ: ${TIMEZONE:-Europe/Bratislava} DSPACE_UI_SSL: 'false' DSPACE_UI_HOST: dspace-angular - DSPACE_UI_PORT: 4000 - DSPACE_UI_NAMESPACE: / + DSPACE_UI_PORT: ${UI_PORT:-4000} + DSPACE_UI_NAMESPACE: ${DSPACE_UI_NAMESPACE:-/} DSPACE_REST_SSL: ${DSPACE_SSL:-false} DSPACE_REST_HOST: ${DSPACE_HOST:-localhost} - DSPACE_REST_PORT: ${DSPACE_REST_PORT} - DSPACE_REST_NAMESPACE: /server + DSPACE_REST_PORT: ${DSPACE_REST_PORT:-8080} + DSPACE_REST_NAMESPACE: ${DSPACE_REST_NAMESPACE:-/server} image: ${DSPACE_UI_IMAGE:-dataquest/dspace-angular:dspace-7_x} volumes: - ./config.prod.yml:/app/config/config.prod.yml + - ./aai.js:/app/dist/browser/aai.js # - ./dspace-ui.json:/app/docker/dspace-ui.json:rw build: context: .. @@ -36,9 +37,9 @@ services: ports: - published: 400${INSTANCE} target: 4000 - host_ip: 127.0.0.1 + host_ip: ${HOST_IP:-127.0.0.1} - published: 987${INSTANCE} target: 987${INSTANCE} - host_ip: 127.0.0.1 + host_ip: ${HOST_IP:-127.0.0.1} stdin_open: true tty: true diff --git a/src/aai/aai.js b/src/aai/aai.js index d669631e6eb..730e8c6b725 100644 --- a/src/aai/aai.js +++ b/src/aai/aai.js @@ -3,7 +3,7 @@ function AAI() { var host = 'https://' + window.location.hostname, ourEntityID = host.match("lindat.mff.cuni.cz") ? "https://ufal-point.mff.cuni.cz" : host; - var namespace = ''; + var namespace = 'repository'; this.defaults = { //host : 'https://ufal-point.mff.cuni.cz', host : host, //better default (useful when testing on ufal-point-dev) From 0fef93844414f5d9b496038538128010d6275726 Mon Sep 17 00:00:00 2001 From: milanmajchrak <90026355+milanmajchrak@users.noreply.github.com> Date: Fri, 6 Dec 2024 09:28:23 +0100 Subject: [PATCH 02/44] UFAL/Resolve conflicts before merge (#764) * Removed dynamic overflow because every content must be scrollable.. (#716) * add tar for preview (#713) * add tar for preview * UFAL/Enhanced type-bind feature (#714) * The type-bind is loaded from the cfg and correctly rendered * Done some refactoring * Update tests following the type-bind enhancement * Fixed linting error. * Removed unwanted changes and fixed wrong refactored code. * Updated error message when tests failed * Update README.md * UFAL/Show sesznam license on approval page (#722) * Added static files from the SEZNAM license. * Refactored fetching html content from the static files. The logic was moved into the common service. * Show Seznam static license on approval page. * Updated constant name LICENSE_NAME_SEZNAM - added the _CZ to make it more clear that is Czech license * UFAL/share submission by email (#720) * Added share submission button into workspaceitem actions page. * Added notification about the success of the sharing the submission. * Created share submission module, page with routing. That page could access only the administrator. * WIP - created a new page `change-submitter-page`. * Created page when the user could take the workspace item as its own. * Pretified the code and added some docs * Updated tests following the new feature * Fixed unwanted changes, updated docs * UFAL/Autocomplete enhancement (#718) * Added support for searching results from specific solr indexes. Updated autocomplete component to search values from custom solr index. The autocomplete component could have attribute for resolving the custom index from the submission-forms definition. * Show suggestions for `solr-handle_title_ac` and `solr-subject_ac` * Fixed tests * Formatted language suggestions, added docs and fixed tests. * Refactored the code following the review requirements. * Fixed type in the word pretify * UFAL/License page - wrong layout in Firefox (#721) * Removed flex class and used width style instead of col * Removed unsued class * Changed style in the html into classes * Migrated Vanilla cs messages into clarin 7.6.1. cs messages (#669) * Migrated Vanilla cs messages into clarin 7.6.1. cs messages * updated translation * Updated cs localization for subcommunities and subcollections * Changed `prispeveku` to `prispevku` * Updated messages for the 'supervised' and 'claim' sentenses --------- Co-authored-by: Ondrej Kosarko * UFAL/Share submission with user not only admin (#728) * The submitter information cannot be displayed in some cases, but show a few information about the Item * Added missing trailing comma * Fixed docs * Updated messages following last commit to upstream. (#731) * Updated dspace prefix to lindat (#734) * Added notification when the shibboleth authentication is failed (#732) * Removed two IT: (#737) 1. Author does not have a two input fields. 2. Test for checking the notice step will be transformed into UI test, because we do not want to keep such specific collection for generic IT. * Update all static licenses (#726) * added licenses from ufal commit dcbe87e02931dee78b13c4b3995a6cef3aeacd32 * added missing static licenses * remove static from licenses path * no_static_ as const * checkstyle * Use NAMESPACES from the .env (#727) * Use NAMESPACES from the .env * Created symbolic link for the tomcat folder * Updated docker compose files - can load more properties from the `.env` * Update deploy.yml to increase timeout (#738) Because some tests were canceled during processing. * Use only 4000, not the {UI_PORT} from the .env because in the container it is always 4000 (#740) * Update docker-compose-rest.yml Uncommented /repository/ namespace in the docker-compose.yml. It is only for one deploy. * Update docker-compose-rest.yml Undo exposing server on the /repository/ path * Use only / and /server namespaces, not the values from the .env because in the container it is always `/` and `/server` (#741) * Expose tomcat `/server` on `/repository/server` * Take a customized docker-compose-rest.yml which exposes the server on /repository/server * Updated a path to take right docker-compose files * Undo using only default namespaced `/` and `/server` * Use custom `docker-compose.yml` from the testing server * UFAL/Shibboleth fixed wrong redirect after login with verification token (#733) * Used hardredirect instead of the standard router.redirect because the user could be stucked on the loading page * Added doc why * Added missing whitespace * Use path `./assets` instead of `/assets` (#742) * new download instruction for cmd using zip from backend (#739) * Get UI base URL from BE (#744) * Check that the custom type bind field in configured in the `submission-forms` when it is configured in the cfg property (#745) * Searching by type is changed to 'type' instead of 'itemtype' because it was changed in the autocomplete enhnancement (#749) * Use `autoLogin` method (#747) * UFAL/Matomo statistics using angulartics2 (#748) * Modified matomo tracking in footer component * Do not use routerless Matomo because we want to track view on every page redirect * The Matomo statistics are tracked properly. * Prettyfied the code * Fix linting error * Fixed unit tests following the matomo statistics update * Fixed linting error * Added a document title in the footer * Added category to the eventTrack because it is required for the Matomo. * Refactored using matomo statistics - added into browser init service, because the Matomo statistics wasn't rendered on production * Changed matomo-settings location --------- Co-authored-by: Matus Kasak * Update db-import action Try a commit when the import worked. * Update import-db action - use main branch * Added a translation for the searching filter `subjectFirstValue` (redirect from home page). (#752) * Ensure the redirect URL starts with a slash (#753) * Added volume into docker-compose (#754) * UFAL/Load the matomo configuration from the environment (#755) * Added volume into docker-compose * Take a matomo configuration from the environment * Fetch the matomo properties from the config, not from the environment (#756) * Load the szn license in oninit method (#757) * UFAL/Temporary fix for the type-bind. The form automatically refreshes after the type is changed. (#761) * The Save action is automatically dispatched when the type is changed * Updated the handleFormSave method name to `dispatchFormSaveAndReinitialize` * Added missing function to mock object * Execute autoregistration component only in client side (#762) * The Autocomplete Component is dynamically loaded as a standalone component only in the browser using the Loader component. (#763) * UFAL/footer header images (#760) * Footer images upload to assets/images/footer/ and change of images src attributes * Changed src paths to start with ./ --------- Co-authored-by: Juraj Roka * ufal/customize the footer (#759) * Footer details update by Lindat live instance's footer * Copied UI tests fix from the dtq-dev --------- Co-authored-by: Juraj Roka Co-authored-by: milanmajchrak --------- Co-authored-by: Paurikova2 <107862249+Paurikova2@users.noreply.github.com> Co-authored-by: Jozef Misutka <332350+vidiecan@users.noreply.github.com> Co-authored-by: Ondrej Kosarko Co-authored-by: Matus Kasak Co-authored-by: jurinecko <95219754+jr-rk@users.noreply.github.com> Co-authored-by: Juraj Roka --- .github/workflows/deploy.yml | 20 +- README.md | 5 + config/config.example.yml | 4 + docker/docker-compose-rest.yml | 4 + docker/docker-compose.yml | 3 +- docker/matomo-settings.ts | 7 + src/aai/aai.js | 19 +- src/app/app-routing.module.ts | 5 + ...arin-license-agreement-page.component.html | 4 + ...clarin-license-agreement-page.component.ts | 32 +- .../change-submitter-page.component.html | 33 + .../change-submitter-page.component.scss | 3 + .../change-submitter-page.component.spec.ts | 72 + .../change-submitter-page.component.ts | 188 + .../clarin-license-table.component.html | 37 +- .../clarin-license-table.component.scss | 13 + .../core/data/metadata-value-data.service.ts | 12 +- src/app/footer/footer.component.html | 45 +- src/app/footer/footer.component.spec.ts | 6 - .../clarin-files-section.component.ts | 4 +- .../file-description.component.html | 4 +- .../file-description.component.ts | 11 +- .../autoregistration-loader.component.ts | 34 + .../autoregistration.component.ts | 52 +- .../login-page/login-page-routing.module.ts | 4 +- src/app/login-page/login-page.module.ts | 4 +- .../pagenotfound/pagenotfound.component.html | 2 +- .../share-submission-page.component.html | 6 + .../share-submission-page.component.scss | 3 + .../share-submission-page.component.spec.ts | 40 + .../share-submission-page.component.ts | 23 + .../share-submission-routing.module.ts | 28 + .../share-submission.module.ts | 19 + .../clarin-item-box-view.component.ts | 2 +- src/app/shared/clarin-shared-util.ts | 2 +- .../ds-dynamic-type-bind-relation.service.ts | 4 +- .../ds-dynamic-autocomplete.component.spec.ts | 23 +- .../ds-dynamic-autocomplete.component.ts | 155 +- .../ds-dynamic-autocomplete.model.ts | 7 +- .../ds-dynamic-autocomplete.service.ts | 13 +- ...mic-sponsor-autocomplete.component.spec.ts | 34 +- ...-dynamic-sponsor-autocomplete.component.ts | 14 +- .../ds-dynamic-sponsor-autocomplete.model.ts | 3 + .../form/builder/form-builder.service.spec.ts | 5 +- .../form/builder/form-builder.service.ts | 172 +- .../form/builder/models/form-field.model.ts | 6 + .../parsers/autocomplete-field-parser.ts | 4 + .../form/builder/parsers/field-parser.ts | 3 + .../form/builder/parsers/row-parser.spec.ts | 22 +- .../shared/form/builder/parsers/row-parser.ts | 6 +- src/app/shared/html-content.service.ts | 37 +- .../log-in-container.component.spec.ts | 5 + .../shared/log-in/log-in.component.spec.ts | 5 + .../log-in-password.component.spec.ts | 5 + .../password/log-in-password.component.ts | 27 +- .../shared/mocks/form-builder-service.mock.ts | 3 +- .../workspaceitem-actions.component.html | 14 + .../workspaceitem-actions.component.spec.ts | 11 + .../workspaceitem-actions.component.ts | 51 + .../static-page/static-page.component.spec.ts | 13 +- src/app/static-page/static-page.component.ts | 42 +- .../dspace/view-tracker.component.ts | 3 +- .../sections/form/section-form.component.ts | 35 +- src/assets/i18n/cs.json5 | 5791 ++++++++++++----- src/assets/i18n/en.json5 | 52 +- .../footer/LINDAT-CLARIAH-cz-gray_0.svg | 26 + src/assets/images/footer/b-centre.png | Bin 0 -> 11687 bytes .../images/footer/core-trust-seal-mono.png | Bin 0 -> 26723 bytes src/assets/images/footer/k-centre.png | Bin 0 -> 13740 bytes src/assets/images/footer/twitter-circular.svg | 7 + src/config/app-config.interface.ts | 2 + src/config/default-app-config.ts | 7 + src/config/matomo-config.ts | 11 + src/environments/environment.production.ts | 2 +- src/environments/environment.test.ts | 7 +- src/environments/environment.ts | 2 +- src/main.browser.ts | 23 + src/modules/app/browser-app.module.ts | 6 +- src/modules/app/browser-init.service.ts | 3 + .../Qwant_LongEval_BY-NC-SA_License.html | 371 ++ src/static-files/about.html | 2 +- src/static-files/cs/about.html | 2 +- src/static-files/cs/dummy.html | 5 + src/static-files/cs/faq.html | 38 +- src/static-files/cs/item-lifecycle.html | 26 +- src/static-files/cs/szn-dataset-license.html | 82 + src/static-files/cs/theaitre-license.html | 56 + src/static-files/deep-sequoia-licence.html | 20 + src/static-files/faq.html | 44 +- .../hplt-dataset-license-1.0.html | 36 + src/static-files/item-lifecycle.html | 38 +- src/static-files/licence-mwe-1.3.html | 78 + src/static-files/license-corefud-1.1.html | 115 + src/static-files/license-corefud-1.2.html | 131 + src/static-files/license-lb.html | 108 + src/static-files/license-ud-2.10.html | 969 +++ src/static-files/license-ud-2.11.html | 1030 +++ src/static-files/license-ud-2.12.html | 1038 +++ src/static-files/license-ud-2.13.html | 1094 ++++ src/static-files/license-ud-2.14.html | 1189 ++++ src/static-files/license-umr-1.0.html | 66 + src/static-files/szn-dataset-license.html | 48 + src/static-files/theaitre-license.html | 55 + .../dspace/app/header/header.component.html | 6 +- 104 files changed, 12151 insertions(+), 1907 deletions(-) create mode 100644 docker/matomo-settings.ts create mode 100644 src/app/change-submitter-page/change-submitter-page.component.html create mode 100644 src/app/change-submitter-page/change-submitter-page.component.scss create mode 100644 src/app/change-submitter-page/change-submitter-page.component.spec.ts create mode 100644 src/app/change-submitter-page/change-submitter-page.component.ts create mode 100644 src/app/login-page/autoregistration/autoregistration-loader.component.ts create mode 100644 src/app/share-submission/share-submission-page/share-submission-page.component.html create mode 100644 src/app/share-submission/share-submission-page/share-submission-page.component.scss create mode 100644 src/app/share-submission/share-submission-page/share-submission-page.component.spec.ts create mode 100644 src/app/share-submission/share-submission-page/share-submission-page.component.ts create mode 100644 src/app/share-submission/share-submission-page/share-submission-routing.module.ts create mode 100644 src/app/share-submission/share-submission.module.ts create mode 100644 src/assets/images/footer/LINDAT-CLARIAH-cz-gray_0.svg create mode 100644 src/assets/images/footer/b-centre.png create mode 100644 src/assets/images/footer/core-trust-seal-mono.png create mode 100644 src/assets/images/footer/k-centre.png create mode 100644 src/assets/images/footer/twitter-circular.svg create mode 100644 src/config/matomo-config.ts create mode 100644 src/static-files/Qwant_LongEval_BY-NC-SA_License.html create mode 100644 src/static-files/cs/dummy.html create mode 100644 src/static-files/cs/szn-dataset-license.html create mode 100644 src/static-files/cs/theaitre-license.html create mode 100644 src/static-files/deep-sequoia-licence.html create mode 100644 src/static-files/hplt-dataset-license-1.0.html create mode 100644 src/static-files/licence-mwe-1.3.html create mode 100644 src/static-files/license-corefud-1.1.html create mode 100644 src/static-files/license-corefud-1.2.html create mode 100644 src/static-files/license-lb.html create mode 100644 src/static-files/license-ud-2.10.html create mode 100644 src/static-files/license-ud-2.11.html create mode 100644 src/static-files/license-ud-2.12.html create mode 100644 src/static-files/license-ud-2.13.html create mode 100644 src/static-files/license-ud-2.14.html create mode 100644 src/static-files/license-umr-1.0.html create mode 100644 src/static-files/szn-dataset-license.html create mode 100644 src/static-files/theaitre-license.html diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 3644944c947..3270d2491f1 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -57,6 +57,10 @@ jobs: working-directory: build-scripts/run/ run: | ./start.sh dspace-$INSTANCE + cd ../.. + # use customized docker-compose file for the `85` port because the server is exposed with the namespace `repository` + # `/repository/server` + docker compose --env-file $ENVFILE -p dspace-$INSTANCE -f docker/docker-compose.yml -f docker/docker-compose-rest.yml -f /opt/dspace-envs/5/docker-compose-rest.yml -f /opt/dspace-envs/5/docker-compose.yml up -d --no-build deploy-8: if: inputs.INSTANCE == '*' || inputs.INSTANCE == '8' @@ -147,7 +151,7 @@ jobs: playwright-after-deploy8: runs-on: ubuntu-latest needs: deploy-8 - timeout-minutes: 15 + timeout-minutes: 45 if: '!inputs.IMPORT' steps: - name: run playwright @@ -177,14 +181,14 @@ jobs: echo $RES # if last result is not success, return -1 and fail if [[ $RES != \"success\" ]]; then - echo "playwright tests have failed! check appropriate action run" + echo "playwright tests have failed! check appropriate action run in the dspace-ui-tests repository" exit 1 fi; rest-tests-after-deploy8: runs-on: ubuntu-latest needs: playwright-after-deploy8 - timeout-minutes: 15 + timeout-minutes: 45 steps: - name: run rest-tests run: | @@ -210,7 +214,7 @@ jobs: echo $RES # if last result is not success, return -1 and fail if [[ $RES != \"success\" ]]; then - echo "rest-tests have failed! check appropriate action run" + echo "rest-tests have failed! check appropriate action run in the dspace-rest-test repository" exit 1 fi; @@ -219,7 +223,7 @@ jobs: runs-on: ubuntu-latest needs: import-8 if: inputs.IMPORT - timeout-minutes: 15 + timeout-minutes: 45 steps: - name: run playwright run: | @@ -249,14 +253,14 @@ jobs: # if last result is not success, return -1 and fail if [[ $RES != \"success\" ]]; then - echo "playwright tests have failed! check appropriate action run" + echo "playwright tests have failed! check appropriate action run in the dspace-ui-tests repository" exit 1 fi; rest-tests-after-import8: runs-on: ubuntu-latest needs: playwright-after-import8 - timeout-minutes: 15 + timeout-minutes: 45 steps: - name: run rest-tests run: | @@ -282,6 +286,6 @@ jobs: echo $RES # if last result is not success, return -1 and fail if [[ $RES != \"success\" ]]; then - echo "rest-tests have failed! check appropriate action run" + echo "rest-tests have failed! check appropriate action run in the dspace-rest-test repository" exit 1 fi; diff --git a/README.md b/README.md index 053d55b040f..0be2f23c29d 100644 --- a/README.md +++ b/README.md @@ -569,3 +569,8 @@ The full license is available in the [LICENSE](LICENSE) file or online at http:/ DSpace uses third-party libraries which may be distributed under different licenses. Those licenses are listed in the [LICENSES_THIRD_PARTY](LICENSES_THIRD_PARTY) file. + +Additional tools +---------------- + +This project is tested with BrowserStack. diff --git a/config/config.example.yml b/config/config.example.yml index 9aae1fc79b4..8e23e60a8da 100644 --- a/config/config.example.yml +++ b/config/config.example.yml @@ -393,3 +393,7 @@ vocabularies: comcolSelectionSort: sortField: 'dc.title' sortDirection: 'ASC' + +matomo: + hostUrl: http://localhost:8135/ + siteId: 1 diff --git a/docker/docker-compose-rest.yml b/docker/docker-compose-rest.yml index c0ce3479cb7..999909f4321 100644 --- a/docker/docker-compose-rest.yml +++ b/docker/docker-compose-rest.yml @@ -94,6 +94,10 @@ services: entrypoint: - /bin/bash - '-c' + # When customizing the namespace, add the following command to the entrypoint command below (after `while ...`): + # `pushd ../webapps && unlink server && ln -s /dspace/webapps/server/ 'repository#server' && popd` + # This will create a symlink from the webapps directory to the server directory with the custom namespace + # (e.g. /dspace/webapps/server -> /dspace/webapps/repository#server) - | while (! /dev/null 2>&1; do sleep 1; done; pushd ../webapps && unlink server && ln -s /dspace/webapps/server/ 'repository#server' && popd diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 55d2354204c..659d8bbdb2c 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -17,7 +17,8 @@ services: TZ: ${TIMEZONE:-Europe/Bratislava} DSPACE_UI_SSL: 'false' DSPACE_UI_HOST: dspace-angular - DSPACE_UI_PORT: ${UI_PORT:-4000} + # Use only `4000`, not the {UI_PORT} from the .env because in the container it is always `4000` + DSPACE_UI_PORT: 4000 DSPACE_UI_NAMESPACE: ${DSPACE_UI_NAMESPACE:-/} DSPACE_REST_SSL: ${DSPACE_SSL:-false} DSPACE_REST_HOST: ${DSPACE_HOST:-localhost} diff --git a/docker/matomo-settings.ts b/docker/matomo-settings.ts new file mode 100644 index 00000000000..e0217cfb66b --- /dev/null +++ b/docker/matomo-settings.ts @@ -0,0 +1,7 @@ +/** + * Matomo settings for tracking statistics. This file could be mounted in the docker container. + */ +export const matomoSettings = { + hostUrl: 'http://localhost:8135/', + siteId: '1' +}; diff --git a/src/aai/aai.js b/src/aai/aai.js index 730e8c6b725..208a22d3b4d 100644 --- a/src/aai/aai.js +++ b/src/aai/aai.js @@ -38,7 +38,10 @@ if (redirectUrlFromLogin != null && redirectUrlFromLogin !== '') { // Redirect from the login page with retrieved redirect URL - redirectUrl = window.location.origin + (namespace === '' ? namespace : '/' + namespace) + redirectUrlFromLogin; + var baseUrl = window.location.origin + formatNamespace(namespace); + var redirectPath = ensureLeadingSlash(redirectUrlFromLogin); + + redirectUrl = baseUrl + redirectPath; } // Encode the redirect URL @@ -129,6 +132,20 @@ var cookieString = name + '=' + value + ';expires=' + expirationDate.toUTCString() + ';path=/'; document.cookie = cookieString; } + + /** + * Return empty string if namespace is empty, otherwise return namespace with leading slash. + */ + function formatNamespace(namespace) { + return namespace === '' ? '' : ensureLeadingSlash(namespace); + } + + /** + * Ensure that the path starts with a leading slash. + */ + function ensureLeadingSlash(path) { + return path.startsWith('/') ? path : '/' + path; + } } if (!window.aai) { diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 967cc55d9bc..0c02926c3f7 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -265,6 +265,11 @@ import { STATIC_PAGE_PATH } from './static-page/static-page-routing-paths'; path: STATIC_PAGE_PATH, loadChildren: () => import('./static-page/static-page.module').then((m) => m.StaticPageModule), }, + { + path: 'share-submission', + loadChildren: () => import('./share-submission/share-submission.module').then((m) => m.ShareSubmissionModule), + canActivate: [AuthenticatedGuard, EndUserAgreementCurrentUserGuard] + }, { path: '**', pathMatch: 'full', component: ThemedPageNotFoundComponent } ] } diff --git a/src/app/bitstream-page/clarin-license-agreement-page/clarin-license-agreement-page.component.html b/src/app/bitstream-page/clarin-license-agreement-page/clarin-license-agreement-page.component.html index b73952718d5..86ee4eb1a14 100644 --- a/src/app/bitstream-page/clarin-license-agreement-page/clarin-license-agreement-page.component.html +++ b/src/app/bitstream-page/clarin-license-agreement-page/clarin-license-agreement-page.component.html @@ -14,6 +14,10 @@ - + [(ngModel)]="searchQuery"> + @@ -31,7 +30,7 @@
{{ 'handle-table.title' | translate }}
-
+
{{ 'handle-table.title' | translate }} - {{handle?.url}} + + {{handle?.url}} + {{handle?.resourceTypeID}} - - {{handle?.id}} + + + {{handle?.resourceId}} + + + {{handle?.resourceId}} + diff --git a/src/app/handle-page/handle-table/handle-table.component.spec.ts b/src/app/handle-page/handle-table/handle-table.component.spec.ts index a7600298315..b13dd509ab0 100644 --- a/src/app/handle-page/handle-table/handle-table.component.spec.ts +++ b/src/app/handle-page/handle-table/handle-table.component.spec.ts @@ -128,7 +128,7 @@ describe('HandleTableComponent', () => { url: mockHandle.url, currentPage: (component as any).options.currentPage, resourceType: mockHandle.resourceTypeID, - resourceId: mockHandle.id + resourceId: mockHandle.resourceId } }; // should unselect diff --git a/src/app/handle-page/handle-table/handle-table.component.ts b/src/app/handle-page/handle-table/handle-table.component.ts index a08b93770fa..4aed5177cd5 100644 --- a/src/app/handle-page/handle-table/handle-table.component.ts +++ b/src/app/handle-page/handle-table/handle-table.component.ts @@ -1,10 +1,10 @@ -import { ChangeDetectorRef, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { BehaviorSubject, combineLatest as observableCombineLatest, fromEvent } from 'rxjs'; +import { ChangeDetectorRef, Component, OnInit } from '@angular/core'; +import { BehaviorSubject, combineLatest } from 'rxjs'; import { RemoteData } from '../../core/data/remote-data'; import { PaginatedList } from '../../core/data/paginated-list.model'; import { HandleDataService } from '../../core/data/handle-data.service'; import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model'; -import { debounceTime, distinctUntilChanged, switchMap, take } from 'rxjs/operators'; +import { scan, switchMap, take } from 'rxjs/operators'; import { getFirstSucceededRemoteData, getRemoteDataPayload } from '../../core/shared/operators'; import { PaginationService } from '../../core/pagination/pagination.service'; import { @@ -28,6 +28,9 @@ import { SITE, SUCCESSFUL_RESPONSE_START_CHAR } from '../../core/handle/handle.resource-type'; +import { getCommunityPageRoute } from '../../community-page/community-page-routing-paths'; +import { getCollectionPageRoute } from '../../collection-page/collection-page-routing-paths'; +import { getEntityPageRoute } from '../../item-page/item-page-routing-paths'; /** * Constants for converting the searchQuery for the server @@ -55,11 +58,6 @@ export class HandleTableComponent implements OnInit { private notificationsService: NotificationsService,) { } - /** - * The reference for the input html element - */ - @ViewChild('searchInput', {static: true}) searchInput: ElementRef; - /** * The list of Handle object as BehaviorSubject object */ @@ -150,13 +148,20 @@ export class HandleTableComponent implements OnInit { this.isLoading = true; // load the current pagination and sorting options - const currentPagination$ = this.paginationService.getCurrentPagination(this.options.id, this.options); - const currentSort$ = this.paginationService.getCurrentSort(this.options.id, this.sortConfiguration); - - observableCombineLatest([currentPagination$, currentSort$]).pipe( - switchMap(([currentPagination, currentSort]) => { + const currentPagination$ = this.getCurrentPagination(); + const currentSort$ = this.getCurrentSort(); + const searchTerm$ = new BehaviorSubject(this.searchQuery); + + combineLatest([currentPagination$, currentSort$, searchTerm$]).pipe( + scan((prevState, [currentPagination, currentSort, searchTerm]) => { + // If search term has changed, reset to page 1; otherwise, keep current page + const currentPage = prevState.searchTerm !== searchTerm ? 1 : currentPagination.currentPage; + return { currentPage, currentPagination, currentSort, searchTerm }; + }, { searchTerm: '', currentPage: 1, currentPagination: this.getCurrentPagination(), + currentSort: this.getCurrentSort() }), + switchMap(({ currentPage, currentPagination, currentSort, searchTerm }) => { return this.handleDataService.findAll({ - currentPage: currentPagination.currentPage, + currentPage: currentPage, elementsPerPage: currentPagination.pageSize, sort: {field: currentSort.field, direction: currentSort.direction} }, false @@ -169,6 +174,29 @@ export class HandleTableComponent implements OnInit { }); } + getItemPageRoute(id: string): string { + return getEntityPageRoute(null, id); + } + + type2route(type: string): (id: string) => string { + switch (type) { + case COMMUNITY: + return getCommunityPageRoute; + case COLLECTION: + return getCollectionPageRoute; + case ITEM: + return this.getItemPageRoute; + } + } + + getHandleTargetPageRoute(handle: Handle): string { + return this.type2route(handle.resourceTypeID)(handle.resourceId); + } + + shouldLink(handle: Handle): boolean { + return handle.resourceTypeID !== SITE; + } + /** * Updates the page */ @@ -216,7 +244,7 @@ export class HandleTableComponent implements OnInit { this.switchSelectedHandle(this.selectedHandle); this.router.navigate([this.handleRoute, this.editHandlePath], { queryParams: { id: handle.id, _selflink: handle._links.self.href, handle: handle.handle, - url: handle.url, resourceType: handle.resourceTypeID, resourceId: handle.id, + url: handle.url, resourceType: handle.resourceTypeID, resourceId: handle.resourceId, currentPage: this.options.currentPage } }, ); } @@ -325,29 +353,6 @@ export class HandleTableComponent implements OnInit { }, 250 ); } - /** - * If the user is typing the searchQuery is changing. - */ - setSearchQuery() { - if (isEmpty(this.searchOption)) { - return; - } - - fromEvent(this.searchInput.nativeElement,'keyup') - .pipe( - debounceTime(300), - distinctUntilChanged() - ) - .subscribe( cc => { - this.searchHandles(this.searchInput.nativeElement.value); - setTimeout(() => { - // click to refresh table data because without click it still shows wrong data - document.getElementById('clarin-dc-search-box').click(); - }, 25); - }); - - } - /** * The search option is selected from the dropdown menu. * @param event with the selected value @@ -360,7 +365,7 @@ export class HandleTableComponent implements OnInit { * Update the sortConfiguration based on the `searchOption` and the `searchQuery` but parse that attributes at first. * @param searchQuery */ - searchHandles(searchQuery = '') { + searchHandles() { if (isEmpty(this.searchOption)) { return; } @@ -368,7 +373,7 @@ export class HandleTableComponent implements OnInit { // parse searchQuery for the server request // the new sorting query is in the format e.g. `handle:123456`, `resourceTypeId:2`, `url:internal` let parsedSearchOption = ''; - let parsedSearchQuery = searchQuery; + let parsedSearchQuery = this.searchQuery; switch (this.searchOption) { case this.handleOption: parsedSearchOption = HANDLE_SEARCH_OPTION; @@ -376,16 +381,16 @@ export class HandleTableComponent implements OnInit { case this.internalOption: // if the handle doesn't have the URL - is internal, if it does - is external parsedSearchOption = URL_SEARCH_OPTION; - if (searchQuery === 'Yes' || searchQuery === 'yes') { + if (this.searchQuery.toLowerCase() === 'yes') { parsedSearchQuery = 'internal'; - } else if (searchQuery === 'No' || searchQuery === 'no') { + } else if (this.searchQuery.toLowerCase() === 'no') { parsedSearchQuery = 'external'; } break; case this.resourceTypeOption: parsedSearchOption = RESOURCE_TYPE_SEARCH_OPTION; // parse resourceType from string to the number because the resourceType is integer on the server - switch (searchQuery) { + switch (this.searchQuery) { case ITEM: parsedSearchQuery = '' + 2; break; @@ -415,4 +420,18 @@ export class HandleTableComponent implements OnInit { private initializeSortingOptions() { this.sortConfiguration = defaultSortConfiguration; } + + /** + * Get the current pagination options. + */ + private getCurrentPagination() { + return this.paginationService.getCurrentPagination(this.options.id, defaultPagination); + } + + /** + * Get the current sorting options. + */ + private getCurrentSort() { + return this.paginationService.getCurrentSort(this.options.id, defaultSortConfiguration); + } } diff --git a/src/app/header/header.component.spec.ts b/src/app/header/header.component.spec.ts index ccf8b196219..f5581090d08 100644 --- a/src/app/header/header.component.spec.ts +++ b/src/app/header/header.component.spec.ts @@ -12,6 +12,7 @@ import { MenuService } from '../shared/menu/menu.service'; import { MenuServiceStub } from '../shared/testing/menu-service.stub'; import { HostWindowService } from '../shared/host-window.service'; import { HostWindowServiceStub } from '../shared/testing/host-window-service.stub'; +import { LocaleService } from '../core/locale/locale.service'; let comp: HeaderComponent; let fixture: ComponentFixture; @@ -19,6 +20,11 @@ let fixture: ComponentFixture; describe('HeaderComponent', () => { const menuService = new MenuServiceStub(); + // Mock LocaleService + const localeServiceMock = { + getCurrentLanguageCode: () => 'en' // returns default language code + }; + // waitForAsync beforeEach beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ @@ -29,7 +35,8 @@ describe('HeaderComponent', () => { declarations: [HeaderComponent], providers: [ { provide: HostWindowService, useValue: new HostWindowServiceStub(0) }, - { provide: MenuService, useValue: menuService } + { provide: MenuService, useValue: menuService }, + { provide: LocaleService, useValue: localeServiceMock } ], schemas: [NO_ERRORS_SCHEMA] }) diff --git a/src/app/header/header.component.ts b/src/app/header/header.component.ts index 5153a19be47..0a847d1b289 100644 --- a/src/app/header/header.component.ts +++ b/src/app/header/header.component.ts @@ -3,6 +3,7 @@ import { Observable } from 'rxjs'; import { MenuService } from '../shared/menu/menu.service'; import { MenuID } from '../shared/menu/menu-id.model'; import { HostWindowService } from '../shared/host-window.service'; +import { LocaleService } from '../core/locale/locale.service'; /** * Represents the header with the logo and simple navigation @@ -24,6 +25,7 @@ export class HeaderComponent implements OnInit { constructor( protected menuService: MenuService, protected windowService: HostWindowService, + private localeService: LocaleService, ) { } @@ -34,4 +36,41 @@ export class HeaderComponent implements OnInit { public toggleNavbar(): void { this.menuService.toggleMenu(this.menuID); } + + /** + * Returns the current language code from the locale service + * @returns {string} The current language code + */ + getLangCode(): string { + return this.localeService.getCurrentLanguageCode(); + } + + /** + * Returns the current language code only if it's Czech ('cs'), otherwise returns an empty string + * @returns {string} The language code if Czech, empty string otherwise + */ + getLangCodeIfCzech(): string { + return this.localeService.getCurrentLanguageCode() === 'cs' ? this.localeService.getCurrentLanguageCode() : ''; + } + + /** + * Translates English slugs to their Czech equivalents when the current language is Czech + * @param {string} slug - The English slug to translate + * @returns {string} The translated slug if in Czech, the original slug if in English, or empty string if translation not found + */ + translateSlug(slug: string): string { + const currentLang = this.localeService.getCurrentLanguageCode(); + if (currentLang === 'en') { + return slug; + } + + const translations = { + 'partners': 'partneri', + 'integration': 'integrace', + 'partnership': 'partnerstvi', + 'services': 'sluzby' + }; + + return translations[slug] || ''; + } } diff --git a/src/app/item-page/clarin-license-info/clarin-license-info.component.ts b/src/app/item-page/clarin-license-info/clarin-license-info.component.ts index be7be7b3bfc..7b1c3104257 100644 --- a/src/app/item-page/clarin-license-info/clarin-license-info.component.ts +++ b/src/app/item-page/clarin-license-info/clarin-license-info.component.ts @@ -99,7 +99,7 @@ export class ClarinLicenseInfoComponent implements OnInit { } /** - * Check if current english is Czech + * Check if current language is Czech */ isCsLocale() { return this.localeService.getCurrentLanguageCode() === 'cs'; diff --git a/src/app/item-page/edit-item-page/item-license-mapper/item-license-mapper.component.html b/src/app/item-page/edit-item-page/item-license-mapper/item-license-mapper.component.html index 8a79919ca72..294aec7e8b7 100644 --- a/src/app/item-page/edit-item-page/item-license-mapper/item-license-mapper.component.html +++ b/src/app/item-page/edit-item-page/item-license-mapper/item-license-mapper.component.html @@ -26,7 +26,7 @@

{{'item.edit.license.head' | translate}}

diff --git a/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.html b/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.html index 2b2f211a316..4778ab0b795 100644 --- a/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.html +++ b/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.html @@ -60,18 +60,30 @@
-
    - - - - - -
    {{ fileInput.fileInfo[0]?.content }}
    -
    - -
    +
      + +
      +
      {{'item.preview.no-preview' | translate}} + +
      +
      + + + + + + + + + + +
      {{ fileInput.fileInfo[0]?.content }}
      +
      + + + +
      +
diff --git a/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.ts b/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.ts index 6a2b69acdce..f8dc723c5a8 100644 --- a/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.ts +++ b/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.ts @@ -1,7 +1,8 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input, OnInit } from '@angular/core'; import { MetadataBitstream } from 'src/app/core/metadata/metadata-bitstream.model'; import { HALEndpointService } from '../../../../../core/shared/hal-endpoint.service'; -import {Router} from '@angular/router'; +import { Router } from '@angular/router'; +import { ConfigurationDataService } from '../../../../../core/data/configuration-data.service'; const allowedPreviewFormats = ['text/plain', 'text/html', 'application/zip', 'application/x-tar']; @Component({ @@ -9,14 +10,24 @@ const allowedPreviewFormats = ['text/plain', 'text/html', 'application/zip', 'ap templateUrl: './file-description.component.html', styleUrls: ['./file-description.component.scss'], }) -export class FileDescriptionComponent { +export class FileDescriptionComponent implements OnInit { MIME_TYPE_IMAGES_PATH = './assets/images/mime/'; MIME_TYPE_DEFAULT_IMAGE_NAME = 'application-octet-stream.png'; @Input() fileInput: MetadataBitstream; - constructor(protected halService: HALEndpointService, private router: Router) { } + emailToContact: string; + + constructor(protected halService: HALEndpointService, + private router: Router, + private configService: ConfigurationDataService) { } + + ngOnInit(): void { + this.configService.findByPropertyName('lr.help.mail').subscribe(remoteData => { + this.emailToContact = remoteData.payload.values[0]; + }); + } public downloadFile() { void this.router.navigateByUrl('bitstreams/' + this.fileInput.id + '/download'); @@ -45,4 +56,9 @@ export class FileDescriptionComponent { const imgElement = event.target as HTMLImageElement; imgElement.src = this.MIME_TYPE_IMAGES_PATH + this.MIME_TYPE_DEFAULT_IMAGE_NAME; } + + isArchive(format: string): boolean { + return format === 'application/zip' || format === 'application/x-tar'; + } + } diff --git a/src/app/item-page/simple/field-components/preview-section/preview-section.component.html b/src/app/item-page/simple/field-components/preview-section/preview-section.component.html index 8404f491b4f..cd937f7b465 100644 --- a/src/app/item-page/simple/field-components/preview-section/preview-section.component.html +++ b/src/app/item-page/simple/field-components/preview-section/preview-section.component.html @@ -1,3 +1,10 @@ + +
+
+
{{'item.preview.loading-files' | translate}} + +
+
diff --git a/src/app/item-page/simple/field-components/preview-section/preview-section.component.spec.ts b/src/app/item-page/simple/field-components/preview-section/preview-section.component.spec.ts index 7b14feefd87..827b53a4cd6 100644 --- a/src/app/item-page/simple/field-components/preview-section/preview-section.component.spec.ts +++ b/src/app/item-page/simple/field-components/preview-section/preview-section.component.spec.ts @@ -7,20 +7,33 @@ import { PreviewSectionComponent } from './preview-section.component'; import { ResourceType } from 'src/app/core/shared/resource-type'; import { HALLink } from 'src/app/core/shared/hal-link.model'; import { Item } from 'src/app/core/shared/item.model'; +import { ConfigurationDataService } from '../../../../core/data/configuration-data.service'; +import { TranslateLoader, TranslateModule } from '@ngx-translate/core'; +import { TranslateLoaderMock } from '../../../../shared/mocks/translate-loader.mock'; describe('PreviewSectionComponent', () => { let component: PreviewSectionComponent; let fixture: ComponentFixture; let mockRegistryService: any; + let mockConfigService: any; beforeEach(async () => { + mockConfigService = jasmine.createSpyObj(['findByPropertyName']); mockRegistryService = jasmine.createSpyObj('RegistryService', [ 'getMetadataBitstream', ]); await TestBed.configureTestingModule({ + imports: [TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock + } + })], declarations: [PreviewSectionComponent], - providers: [{ provide: RegistryService, useValue: mockRegistryService }], + providers: [ + { provide: RegistryService, useValue: mockRegistryService }, + { provide: ConfigurationDataService, useValue: mockConfigService }], }).compileComponents(); }); diff --git a/src/app/item-page/simple/field-components/preview-section/preview-section.component.ts b/src/app/item-page/simple/field-components/preview-section/preview-section.component.ts index ac8b5df4dd4..efcfcaba609 100644 --- a/src/app/item-page/simple/field-components/preview-section/preview-section.component.ts +++ b/src/app/item-page/simple/field-components/preview-section/preview-section.component.ts @@ -4,6 +4,7 @@ import { MetadataBitstream } from 'src/app/core/metadata/metadata-bitstream.mode import { RegistryService } from 'src/app/core/registry/registry.service'; import { Item } from 'src/app/core/shared/item.model'; import { getAllSucceededRemoteListPayload } from 'src/app/core/shared/operators'; +import { ConfigurationDataService } from '../../../../core/data/configuration-data.service'; @Component({ selector: 'ds-preview-section', @@ -14,8 +15,10 @@ export class PreviewSectionComponent implements OnInit { @Input() item: Item; listOfFiles: BehaviorSubject = new BehaviorSubject([] as any); + emailToContact: string; - constructor(protected registryService: RegistryService) {} // Modified + constructor(protected registryService: RegistryService, + private configService: ConfigurationDataService) {} // Modified ngOnInit(): void { this.registryService @@ -24,5 +27,10 @@ export class PreviewSectionComponent implements OnInit { .subscribe((data: MetadataBitstream[]) => { this.listOfFiles.next(data); }); + this.configService.findByPropertyName('lr.help.mail')?.subscribe(remoteData => { + this.emailToContact = remoteData.payload.values[0]; + }); } + + } diff --git a/src/app/shared/mocks/handle-mock.ts b/src/app/shared/mocks/handle-mock.ts index c5bff91510b..45c161d7285 100644 --- a/src/app/shared/mocks/handle-mock.ts +++ b/src/app/shared/mocks/handle-mock.ts @@ -19,6 +19,7 @@ export const mockHandle = Object.assign(new Handle(), { handle: '123456', resourceTypeID: 0, url: 'handle.url', + resourceId: 'a43666e5-d477-4957-8e63-74baf6955d97', _links: { self: { href: 'url.123456' diff --git a/src/app/statistics/angulartics/dspace/view-tracker.component.ts b/src/app/statistics/angulartics/dspace/view-tracker.component.ts index edb8165967a..9febc08b004 100644 --- a/src/app/statistics/angulartics/dspace/view-tracker.component.ts +++ b/src/app/statistics/angulartics/dspace/view-tracker.component.ts @@ -36,12 +36,14 @@ export class ViewTrackerComponent implements OnInit, OnDestroy { this.sub = this.referrerService.getReferrer() .pipe(take(1)) .subscribe((referrer: string) => { + let dc_identifier = this.object?.firstMetadataValue('dc.identifier.uri'); this.angulartics2.eventTrack.next({ action: 'page_view', properties: { object: this.object, referrer, category: 'page_view', + dc_identifier: dc_identifier }, }); }); diff --git a/src/assets/i18n/cs.json5 b/src/assets/i18n/cs.json5 index cbd5a71cc42..cd0da6dccbe 100644 --- a/src/assets/i18n/cs.json5 +++ b/src/assets/i18n/cs.json5 @@ -2458,6 +2458,10 @@ "handle-table.edit-handle.form-archive-input-check": "Archivovat starý Handle?", // "handle-table.edit-handle.form-button-submit": "Submit", "handle-table.edit-handle.form-button-submit": "Odeslat", + //"handle-table.edit-handle.form-id-input-text": "ID", + "handle-table.edit-handle.form-id-input-text": "ID", + //"handle-table.edit-handle.form-id-input-placeholder": "...", + "handle-table.edit-handle.form-id-input-placeholder": "...", // "handle-page.title": "Handles", "handle-page.title": "Handle", // "handle-table.title": "Handle List", @@ -3376,6 +3380,10 @@ "item.preview.authors.show.everyone": "Zobraz všechny autory", // "item.preview.authors.et.al": " ; et al.", "item.preview.authors.et.al": "; et al.", + // "item.preview.loading-files": "Loading files... This may take a few seconds as file previews are being generated. If the process takes too long, please contact the system administrator", + "item.preview.loading-files": "Načítání souborů... Může to trvat několik sekund, protože se generují náhledy souborů. Pokud proces trvá příliš dlouho, kontaktujte prosím správce systému", + // "item.preview.no-preview": "The file preview wasn't successfully generated, please contact the system administrator", + "item.preview.no-preview": "Náhled souboru nebyl úspěšně vygenerován, kontaktujte prosím správce systému", // "item.refbox.modal.copy.instruction": ["Press", "ctrl + c", "to copy"], "item.refbox.modal.copy.instruction": ["Stiskněte", "ctrl + c", "pro kopírování"], // "item.refbox.modal.submit": "Ok", diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index b282b3bf685..7c8a91cfdbd 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -2019,6 +2019,9 @@ "handle-table.edit-handle.form-button-submit": "Submit", + "handle-table.edit-handle.form-id-input-text": "ID", + + "handle-table.edit-handle.form-id-input-placeholder": "...", "handle-page.title": "Handles", @@ -2829,6 +2832,10 @@ "item.preview.authors.et.al": " ; et al.", + "item.preview.loading-files": "Loading files... This may take a few seconds as file previews are being generated. If the process takes too long, please contact the system administrator", + + "item.preview.no-preview": "The file preview wasn't successfully generated, please contact the system administrator", + "item.refbox.modal.copy.instruction": ["Press", "ctrl + c", "to copy"], "item.refbox.modal.submit": "Ok", diff --git a/src/config/default-app-config.ts b/src/config/default-app-config.ts index b396f233c6e..0dd72b617e4 100644 --- a/src/config/default-app-config.ts +++ b/src/config/default-app-config.ts @@ -433,6 +433,7 @@ export class DefaultAppConfig implements AppConfig { // Matomo configuration matomo: MatomoConfig = { hostUrl: 'http://localhost:8135/', - siteId: '1' + siteId: '1', + dimensionId: 1 }; } diff --git a/src/config/matomo-config.ts b/src/config/matomo-config.ts index dbd61a9f4c9..548f02aee4c 100644 --- a/src/config/matomo-config.ts +++ b/src/config/matomo-config.ts @@ -8,4 +8,6 @@ export class MatomoConfig implements Config { public hostUrl: string; public siteId: string; + + public dimensionId: number; } diff --git a/src/environments/environment.test.ts b/src/environments/environment.test.ts index 0178fe83a0e..d780956a0d0 100644 --- a/src/environments/environment.test.ts +++ b/src/environments/environment.test.ts @@ -320,5 +320,6 @@ export const environment: BuildConfig = { matomo: { hostUrl: 'http://localhost:8135/', siteId: '1', + dimensionId: 1 } }; diff --git a/src/modules/app/browser-init.service.ts b/src/modules/app/browser-init.service.ts index 2a0dc6662fb..1159b1392b4 100644 --- a/src/modules/app/browser-init.service.ts +++ b/src/modules/app/browser-init.service.ts @@ -102,6 +102,21 @@ export class BrowserInitService extends InitService { this.initRouteListeners(); this.themeService.listenForThemeChanges(true); this.trackAuthTokenExpiration(); + // ideally we'd add the custom dimension to the 'trackPageView' action only, but don't have that information + // in pageTrack context. So we add it to page_view events, and remove it after the page view. + // page_view events are fired via view-track.component, and exposes dc.identifier.uri via properties + this.angulartics2Matomo.eventTrack = function (action: string, properties?: any) { + if (action === 'page_view') { + if (properties.dc_identifier) { + (window as any)._paq.push(['setCustomDimension', environment.matomo.dimensionId, properties.dc_identifier]); + } + } + }; + let pageTrack = this.angulartics2Matomo.pageTrack; + this.angulartics2Matomo.pageTrack = function (path: string) { + pageTrack.call(this, path); + (window as any)._paq.push(['deleteCustomDimension', environment.matomo.dimensionId]); + }; this.angulartics2Matomo.startTracking(); this.initKlaro(); diff --git a/src/themes/dspace/app/header/header.component.html b/src/themes/dspace/app/header/header.component.html index db6ab5ce03e..58b9baf7516 100644 --- a/src/themes/dspace/app/header/header.component.html +++ b/src/themes/dspace/app/header/header.component.html @@ -17,34 +17,34 @@
From a68083353503ecf4803440e5566cc2d23a0b966d Mon Sep 17 00:00:00 2001 From: milanmajchrak Date: Fri, 4 Apr 2025 13:48:46 +0200 Subject: [PATCH 19/44] Removed accidentally added a `custom_run.sh` into wrong place. --- docker/docker-compose-rest.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/docker/docker-compose-rest.yml b/docker/docker-compose-rest.yml index 3bfd5a332b8..5dd5f995ed5 100644 --- a/docker/docker-compose-rest.yml +++ b/docker/docker-compose-rest.yml @@ -104,7 +104,6 @@ services: while (! /dev/null 2>&1; do sleep 1; done; pushd ../webapps && (unlink server || true) && (ln -s /dspace/webapps/server/ 'repository#server' || true) && popd /dspace/bin/dspace database migrate force - custom_run.sh /dspace/bin/start-handle-server ./custom_run.sh # DSpace database container From 6f6e2c50a1193ab1d6a53cf13d1eb0a8aee4ec37 Mon Sep 17 00:00:00 2001 From: milanmajchrak Date: Fri, 4 Apr 2025 14:07:08 +0200 Subject: [PATCH 20/44] Removed a duplicity code from the `build.yml` which causes that the action wasn't executed. --- .github/workflows/build.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6ed0dc8145a..3d697dd0c37 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,14 +5,10 @@ name: Build # Run this Build for pushes to our main and all PRs on: - schedule: - - cron: '0 */4 * * *' push: branches: - dtq-dev - customer/* - schedule: - - cron: '0 */4 * * *' pull_request: workflow_dispatch: From 6322abf3e6be94095fd8f3e4234555ce08fa3c1f Mon Sep 17 00:00:00 2001 From: milanmajchrak <90026355+milanmajchrak@users.noreply.github.com> Date: Fri, 4 Apr 2025 16:05:15 +0200 Subject: [PATCH 21/44] UFAL/Redirect to `/lindat` after clicking on the Lindat icon in the home page (#828) * Redirect to `/lindat` after clicking on the Lindat icon in the home page --- src/app/home-page/home-page.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/home-page/home-page.component.html b/src/app/home-page/home-page.component.html index 452f5e753c2..96b424c04f5 100644 --- a/src/app/home-page/home-page.component.html +++ b/src/app/home-page/home-page.component.html @@ -32,7 +32,7 @@
- + From 186f40dd610d63a1534408eba8e497a9ff1eb009 Mon Sep 17 00:00:00 2001 From: milanmajchrak <90026355+milanmajchrak@users.noreply.github.com> Date: Tue, 22 Apr 2025 18:44:09 +0200 Subject: [PATCH 22/44] New Release merge - 2025/Apr/22 (#840) * Updated redirecting from the menu to the correct pages(#832) * Updated the no file preview message and removed still loading spinner in file preview section (#837) * Creating docker-compose file useful for building clarin-dspace on MAC computers * Add link to communities and collections on home page --- .github/workflows/deploy.yml | 2 +- docker/docker-compose-mac.yml | 11 +++++++++++ src/app/header/header.component.ts | 8 ++++---- src/app/home-page/home-page.component.html | 2 ++ .../file-description.component.html | 5 ++--- .../file-description.component.ts | 11 +++++++++-- .../preview-section.component.ts | 2 +- src/assets/i18n/cs.json5 | 4 ++-- src/assets/i18n/en.json5 | 2 +- .../dspace/app/header/header.component.html | 18 +++++++++--------- 10 files changed, 42 insertions(+), 23 deletions(-) create mode 100644 docker/docker-compose-mac.yml diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 46dc30fc251..c0c54177a3d 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -45,7 +45,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Call the deploy action with predefined inputs - uses: ./.github/actions/deploy-dspace # Path to your custom action + uses: ./.github/workflows/deploy.yml with: INSTANCE: '8' IMPORT: true diff --git a/docker/docker-compose-mac.yml b/docker/docker-compose-mac.yml new file mode 100644 index 00000000000..664900fe80e --- /dev/null +++ b/docker/docker-compose-mac.yml @@ -0,0 +1,11 @@ +services: + dspacesolr: + platform: linux/amd64 + dspacedb: + platform: linux/amd64 + dspace: + platform: linux/amd64 + dspace-angular: + platform: linux/amd64 + dspace-cli: + platform: linux/amd64 diff --git a/src/app/header/header.component.ts b/src/app/header/header.component.ts index 0a847d1b289..5c3d5ed6c17 100644 --- a/src/app/header/header.component.ts +++ b/src/app/header/header.component.ts @@ -50,7 +50,7 @@ export class HeaderComponent implements OnInit { * @returns {string} The language code if Czech, empty string otherwise */ getLangCodeIfCzech(): string { - return this.localeService.getCurrentLanguageCode() === 'cs' ? this.localeService.getCurrentLanguageCode() : ''; + return this.localeService.getCurrentLanguageCode() === 'cs' ? 'cs' : ''; } /** @@ -65,9 +65,9 @@ export class HeaderComponent implements OnInit { } const translations = { - 'partners': 'partneri', - 'integration': 'integrace', - 'partnership': 'partnerstvi', + 'partners': this.getLangCodeIfCzech() + '/' + 'partneri', + 'integration': this.getLangCodeIfCzech() + '/' + 'integrace', + 'partnership': this.getLangCodeIfCzech() + '/' + 'partnerstvi', 'services': 'sluzby' }; diff --git a/src/app/home-page/home-page.component.html b/src/app/home-page/home-page.component.html index 96b424c04f5..eb28e8b757d 100644 --- a/src/app/home-page/home-page.component.html +++ b/src/app/home-page/home-page.component.html @@ -61,6 +61,8 @@
diff --git a/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.html b/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.html index 4778ab0b795..3d029dfef6c 100644 --- a/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.html +++ b/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.html @@ -61,9 +61,8 @@
    - -
    -
    {{'item.preview.no-preview' | translate}} +
    +
    {{ 'item.preview.no-preview' | translate }}
    diff --git a/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.ts b/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.ts index f8dc723c5a8..c02d94f956b 100644 --- a/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.ts +++ b/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.ts @@ -3,6 +3,7 @@ import { MetadataBitstream } from 'src/app/core/metadata/metadata-bitstream.mode import { HALEndpointService } from '../../../../../core/shared/hal-endpoint.service'; import { Router } from '@angular/router'; import { ConfigurationDataService } from '../../../../../core/data/configuration-data.service'; +import { getFirstSucceededRemoteData } from '../../../../../core/shared/operators'; const allowedPreviewFormats = ['text/plain', 'text/html', 'application/zip', 'application/x-tar']; @Component({ @@ -24,8 +25,10 @@ export class FileDescriptionComponent implements OnInit { private configService: ConfigurationDataService) { } ngOnInit(): void { - this.configService.findByPropertyName('lr.help.mail').subscribe(remoteData => { - this.emailToContact = remoteData.payload.values[0]; + this.configService.findByPropertyName('lr.help.mail') + .pipe(getFirstSucceededRemoteData()) + .subscribe(remoteData => { + this.emailToContact = remoteData?.payload?.values?.[0]; }); } @@ -61,4 +64,8 @@ export class FileDescriptionComponent implements OnInit { return format === 'application/zip' || format === 'application/x-tar'; } + hasNoPreview() { + // this.fileInput.fileInfo.length === 0 means that the file has no preview + return this.fileInput?.fileInfo?.length === 0; + } } diff --git a/src/app/item-page/simple/field-components/preview-section/preview-section.component.ts b/src/app/item-page/simple/field-components/preview-section/preview-section.component.ts index efcfcaba609..3f485e70f08 100644 --- a/src/app/item-page/simple/field-components/preview-section/preview-section.component.ts +++ b/src/app/item-page/simple/field-components/preview-section/preview-section.component.ts @@ -28,7 +28,7 @@ export class PreviewSectionComponent implements OnInit { this.listOfFiles.next(data); }); this.configService.findByPropertyName('lr.help.mail')?.subscribe(remoteData => { - this.emailToContact = remoteData.payload.values[0]; + this.emailToContact = remoteData.payload?.values?.[0]; }); } diff --git a/src/assets/i18n/cs.json5 b/src/assets/i18n/cs.json5 index cd0da6dccbe..4eec3150fcc 100644 --- a/src/assets/i18n/cs.json5 +++ b/src/assets/i18n/cs.json5 @@ -3382,8 +3382,8 @@ "item.preview.authors.et.al": "; et al.", // "item.preview.loading-files": "Loading files... This may take a few seconds as file previews are being generated. If the process takes too long, please contact the system administrator", "item.preview.loading-files": "Načítání souborů... Může to trvat několik sekund, protože se generují náhledy souborů. Pokud proces trvá příliš dlouho, kontaktujte prosím správce systému", - // "item.preview.no-preview": "The file preview wasn't successfully generated, please contact the system administrator", - "item.preview.no-preview": "Náhled souboru nebyl úspěšně vygenerován, kontaktujte prosím správce systému", + // "item.preview.no-preview": "The file preview has not been generated yet. Please try again later or contact the system administrator", + "item.preview.no-preview": "Náhled souboru zatím nebyl vygenerován. Zkuste to prosím znovu později, nebo kontaktujte správce systému", // "item.refbox.modal.copy.instruction": ["Press", "ctrl + c", "to copy"], "item.refbox.modal.copy.instruction": ["Stiskněte", "ctrl + c", "pro kopírování"], // "item.refbox.modal.submit": "Ok", diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 7c8a91cfdbd..59b75e666cb 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -2834,7 +2834,7 @@ "item.preview.loading-files": "Loading files... This may take a few seconds as file previews are being generated. If the process takes too long, please contact the system administrator", - "item.preview.no-preview": "The file preview wasn't successfully generated, please contact the system administrator", + "item.preview.no-preview": "The file preview has not been generated yet. Please try again later or contact the system administrator", "item.refbox.modal.copy.instruction": ["Press", "ctrl + c", "to copy"], diff --git a/src/themes/dspace/app/header/header.component.html b/src/themes/dspace/app/header/header.component.html index 58b9baf7516..ac7d8326859 100644 --- a/src/themes/dspace/app/header/header.component.html +++ b/src/themes/dspace/app/header/header.component.html @@ -17,34 +17,34 @@
    From db7d0e7959f91326518dc05733d6f91637c5a2a5 Mon Sep 17 00:00:00 2001 From: milanmajchrak <90026355+milanmajchrak@users.noreply.github.com> Date: Fri, 16 May 2025 10:28:22 +0200 Subject: [PATCH 23/44] New Release merge - 2025/May/16 (#856) * Updated the no file preview message (#837) * Added spacing between clarin & dspace logo (#848) * Do not load Seznam license every time (#844) * Fixed encoding of the filename from the URL (#838) (#851) * Do not mount the Solr configs; copy them each time instead. (#850) * Fix the bulk access (#852) * Video files previews (https://github.com/ufal/dspace-angular/pull/30) --- .github/workflows/build.yml | 2 + .github/workflows/import-weekly.yml | 13 ++ Acknowledgment-ReadMe.md | 13 ++ docker/docker-compose-rest.yml | 23 +-- src/app/app.module.ts | 3 + ...clarin-license-agreement-page.component.ts | 9 +- .../legacy-bitstream-url.resolver.ts | 3 +- .../core/metadata/metadata-bitstream.model.ts | 2 +- .../bitstream-url-serializer.spec.ts | 43 +++++ .../bitstream-url-serializer.ts | 27 ++++ .../clarin-files-section.component.spec.ts | 2 +- .../clarin-files-section.component.ts | 2 +- .../file-description.component.html | 9 +- .../file-description.component.spec.ts | 21 ++- .../file-description.component.ts | 150 +++++++++++++++++- .../preview-section.component.spec.ts | 2 +- .../preview-section.component.ts | 2 +- src/app/login-page/login-page.component.html | 10 +- src/app/shared/clarin-shared-util.ts | 13 ++ .../object-list/object-list.component.html | 4 +- .../object-list/object-list.component.ts | 11 ++ 21 files changed, 326 insertions(+), 38 deletions(-) create mode 100644 .github/workflows/import-weekly.yml create mode 100644 Acknowledgment-ReadMe.md create mode 100644 src/app/core/url-serializer/bitstream-url-serializer.spec.ts create mode 100644 src/app/core/url-serializer/bitstream-url-serializer.ts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3d697dd0c37..fcbdd8dfa9f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,6 +9,8 @@ on: branches: - dtq-dev - customer/* + schedule: + - cron: '0 */4 * * *' pull_request: workflow_dispatch: diff --git a/.github/workflows/import-weekly.yml b/.github/workflows/import-weekly.yml new file mode 100644 index 00000000000..6ca37989703 --- /dev/null +++ b/.github/workflows/import-weekly.yml @@ -0,0 +1,13 @@ +name: Import Weekly + +on: + schedule: + - cron: '0 0 * * 0' # every Sunday at midnight UTC + +jobs: + deploy: + uses: ./.github/workflows/deploy.yml + with: + INSTANCE: '8' + IMPORT: true + ERASE_DB: true diff --git a/Acknowledgment-ReadMe.md b/Acknowledgment-ReadMe.md new file mode 100644 index 00000000000..b2caaf86282 --- /dev/null +++ b/Acknowledgment-ReadMe.md @@ -0,0 +1,13 @@ +

    + EOSC CZ Logo +

    + +--- + +This project output was developed with financial contributions from the [EOSC CZ](https://www.eosc.cz/projekty/narodni-podpora-pro-eosc) initiative through the project **National Repository Platform for Research Data** (CZ.02.01.01/00/23_014/0008787), funded by the Programme Johannes Amos Comenius (P JAC) of the Ministry of Education, Youth and Sports of the Czech Republic (MEYS). + +--- + +

    + EU and MŠMT Logos +

    diff --git a/docker/docker-compose-rest.yml b/docker/docker-compose-rest.yml index 5dd5f995ed5..00cd919873a 100644 --- a/docker/docker-compose-rest.yml +++ b/docker/docker-compose-rest.yml @@ -133,9 +133,6 @@ services: restart: unless-stopped container_name: dspacesolr${INSTANCE} image: ${DSPACE_SOLR_IMAGE:-dataquest/dspace-solr:dspace-7_x} - # Needs main 'dspace' container to start first to guarantee access to solr_configs - depends_on: - - dspace networks: dspacenet: ports: @@ -146,9 +143,6 @@ services: tty: true working_dir: /var/solr/data volumes: - # Mount our "solr_configs" volume available under the Solr's configsets folder (in a 'dspace' subfolder) - # This copies the Solr configs from main 'dspace' container into 'dspacesolr' via that volume - - solr_configs:/opt/solr/server/solr/configsets/dspace # Keep Solr data directory between reboots - solr_data:/var/solr/data - solr_logs:/var/solr/logs @@ -162,14 +156,14 @@ services: - '-c' - | init-var-solr - precreate-core authority /opt/solr/server/solr/configsets/dspace/authority - cp -r -u /opt/solr/server/solr/configsets/dspace/authority/* authority - precreate-core oai /opt/solr/server/solr/configsets/dspace/oai - cp -r -u /opt/solr/server/solr/configsets/dspace/oai/* oai - precreate-core search /opt/solr/server/solr/configsets/dspace/search - cp -r -u /opt/solr/server/solr/configsets/dspace/search/* search - precreate-core statistics /opt/solr/server/solr/configsets/dspace/statistics - cp -r -u /opt/solr/server/solr/configsets/dspace/statistics/* statistics + precreate-core authority /opt/solr/server/solr/configsets/authority + cp -r /opt/solr/server/solr/configsets/authority/* authority + precreate-core oai /opt/solr/server/solr/configsets/oai + cp -r /opt/solr/server/solr/configsets/oai/* oai + precreate-core search /opt/solr/server/solr/configsets/search + cp -r /opt/solr/server/solr/configsets/search/* search + precreate-core statistics /opt/solr/server/solr/configsets/statistics + cp -r /opt/solr/server/solr/configsets/statistics/* statistics exec solr -p 898${INSTANCE} -f -m 4g volumes: # Commented out because there are a lot of files in the assetstore @@ -177,7 +171,6 @@ volumes: pgdata: solr_data: # Special volume used to share Solr configs from 'dspace' to 'dspacesolr' container (see above) - solr_configs: dspace_logs: solr_logs: handle_server: diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 9c88a883289..0e8e8dcfaa6 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -31,6 +31,8 @@ import { APP_CONFIG, AppConfig } from '../config/app-config.interface'; import { StoreDevModules } from '../config/store/devtools'; import { RootModule } from './root.module'; import { ScriptLoaderService } from './clarin-navbar-top/script-loader-service'; +import { UrlSerializer } from '@angular/router'; +import { BitstreamUrlSerializer } from './core/url-serializer/bitstream-url-serializer'; export function getConfig() { return environment; @@ -105,6 +107,7 @@ const PROVIDERS = [ useClass: LogInterceptor, multi: true }, + { provide: UrlSerializer, useClass: BitstreamUrlSerializer }, // register the dynamic matcher used by form. MUST be provided by the app module ...DYNAMIC_MATCHER_PROVIDERS, ]; diff --git a/src/app/bitstream-page/clarin-license-agreement-page/clarin-license-agreement-page.component.ts b/src/app/bitstream-page/clarin-license-agreement-page/clarin-license-agreement-page.component.ts index fe5e6368593..0a16184d0e6 100644 --- a/src/app/bitstream-page/clarin-license-agreement-page/clarin-license-agreement-page.component.ts +++ b/src/app/bitstream-page/clarin-license-agreement-page/clarin-license-agreement-page.component.ts @@ -169,10 +169,13 @@ export class ClarinLicenseAgreementPageComponent implements OnInit { * Load the content for the special license. This content is shown directly in this approval page. */ loadLicenseContentSeznam() { - this.htmlContentService.getHmtlContentByPathAndLocale(this.LICENSE_PATH_SEZNAM_CZ).then(content => { - this.licenseContentSeznam.next(content); + this.item$.subscribe((item) => { + if (item.firstMetadataValue('dc.rights') === this.LICENSE_NAME_SEZNAM) { + this.htmlContentService.getHmtlContentByPathAndLocale(this.LICENSE_PATH_SEZNAM_CZ).then(content => { + this.licenseContentSeznam.next(content); + }); + } }); - return true; } public accept() { diff --git a/src/app/bitstream-page/legacy-bitstream-url.resolver.ts b/src/app/bitstream-page/legacy-bitstream-url.resolver.ts index 948bec24731..54c44d41152 100644 --- a/src/app/bitstream-page/legacy-bitstream-url.resolver.ts +++ b/src/app/bitstream-page/legacy-bitstream-url.resolver.ts @@ -6,6 +6,7 @@ import { Bitstream } from '../core/shared/bitstream.model'; import { getFirstCompletedRemoteData } from '../core/shared/operators'; import { hasNoValue } from '../shared/empty.util'; import { BitstreamDataService } from '../core/data/bitstream-data.service'; +import { encodeRFC3986URIComponent } from '../shared/clarin-shared-util'; /** * This class resolves a bitstream based on the DSpace 6 XMLUI or JSPUI bitstream download URLs @@ -40,7 +41,7 @@ export class LegacyBitstreamUrlResolver implements Resolve return this.bitstreamDataService.findByItemHandle( `${prefix}/${suffix}`, sequenceId, - filename, + encodeRFC3986URIComponent(filename), ).pipe( getFirstCompletedRemoteData() ); diff --git a/src/app/core/metadata/metadata-bitstream.model.ts b/src/app/core/metadata/metadata-bitstream.model.ts index c5eed0594a4..eace9ba1121 100644 --- a/src/app/core/metadata/metadata-bitstream.model.ts +++ b/src/app/core/metadata/metadata-bitstream.model.ts @@ -31,7 +31,7 @@ export class MetadataBitstream extends ListableObject implements HALResource { * The identifier of this metadata field */ @autoserialize - id: number; + id: string; /** * The name of this bitstream diff --git a/src/app/core/url-serializer/bitstream-url-serializer.spec.ts b/src/app/core/url-serializer/bitstream-url-serializer.spec.ts new file mode 100644 index 00000000000..b19717d3d39 --- /dev/null +++ b/src/app/core/url-serializer/bitstream-url-serializer.spec.ts @@ -0,0 +1,43 @@ +import { TestBed } from '@angular/core/testing'; +import { BitstreamUrlSerializer } from './bitstream-url-serializer'; +import { DefaultUrlSerializer, UrlTree } from '@angular/router'; + +describe('BitstreamUrlSerializer', () => { + let serializer: BitstreamUrlSerializer; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [BitstreamUrlSerializer] + }); + serializer = TestBed.inject(BitstreamUrlSerializer); + }); + + it('should be created', () => { + expect(serializer).toBeTruthy(); + }); + + it('should not modify URLs that do not start with /bitstream/', () => { + const url = '/some/other/path/file.pdf'; + const result = serializer.parse(url); + const expected = new DefaultUrlSerializer().parse(url); + expect(result).toEqual(expected); + }); + + it('should encode special characters in the filename in /bitstream/ URLs', () => { + const originalUrl = '/bitstream/id/123/456/some file(name)[v1].pdf'; + const expectedEncodedFilename = 'some%20file%28name%29%5Bv1%5D.pdf'; + const expectedUrl = `/bitstream/id/123/456/${expectedEncodedFilename}`; + + const result: UrlTree = serializer.parse(originalUrl); + + const resultUrl = new DefaultUrlSerializer().serialize(result); + expect(resultUrl).toBe(expectedUrl); + }); + + it('should not modify /bitstream/ URL if there is no filename', () => { + const url = '/bitstream/id/123/456'; + const result = serializer.parse(url); + const expected = new DefaultUrlSerializer().parse(url); + expect(result).toEqual(expected); + }); +}); diff --git a/src/app/core/url-serializer/bitstream-url-serializer.ts b/src/app/core/url-serializer/bitstream-url-serializer.ts new file mode 100644 index 00000000000..01c6bfa1e30 --- /dev/null +++ b/src/app/core/url-serializer/bitstream-url-serializer.ts @@ -0,0 +1,27 @@ +import { Injectable } from '@angular/core'; +import { DefaultUrlSerializer, UrlTree } from '@angular/router'; +import { encodeRFC3986URIComponent } from '../../shared/clarin-shared-util'; + +/** + * This class intercepts the parsing of URLs to ensure that the filename in the URL is properly encoded. + * But it only does this for URLs that start with '/bitstream/'. + */ +@Injectable({ providedIn: 'root' }) +export class BitstreamUrlSerializer extends DefaultUrlSerializer { + FILENAME_INDEX = 5; + // Intercept parsing of every URL + parse(url: string): UrlTree { + if (url.startsWith('/bitstream/')) { + // Split the URL to isolate the filename + const parts = url.split('/'); + if (parts.length > this.FILENAME_INDEX) { + // Fetch the filename from the URL + const filename = parts.slice(this.FILENAME_INDEX).join(); + const encodedFilename = encodeRFC3986URIComponent(filename); + // Reconstruct the URL with the encoded filename + url = [...parts.slice(0, this.FILENAME_INDEX), encodedFilename].join('/'); + } + } + return super.parse(url); + } +} diff --git a/src/app/item-page/clarin-files-section/clarin-files-section.component.spec.ts b/src/app/item-page/clarin-files-section/clarin-files-section.component.spec.ts index f5e795d4d0e..a1455425ebf 100644 --- a/src/app/item-page/clarin-files-section/clarin-files-section.component.spec.ts +++ b/src/app/item-page/clarin-files-section/clarin-files-section.component.spec.ts @@ -23,7 +23,7 @@ describe('ClarinFilesSectionComponent', () => { let halService: HALEndpointService; // Set up the mock service's getMetadataBitstream method to return a simple stream const metadatabitstream = new MetadataBitstream(); - metadatabitstream.id = 123; + metadatabitstream.id = '70ccc608-f6a5-4c96-ab2d-53bc56ae8ebe'; metadatabitstream.name = 'test'; metadatabitstream.description = 'test'; metadatabitstream.fileSize = 1024; diff --git a/src/app/item-page/clarin-files-section/clarin-files-section.component.ts b/src/app/item-page/clarin-files-section/clarin-files-section.component.ts index f9092be3020..cd7575d4d62 100644 --- a/src/app/item-page/clarin-files-section/clarin-files-section.component.ts +++ b/src/app/item-page/clarin-files-section/clarin-files-section.component.ts @@ -80,7 +80,7 @@ export class ClarinFilesSectionComponent implements OnInit { ngOnInit(): void { this.registryService - .getMetadataBitstream(this.itemHandle, 'ORIGINAL,TEXT,THUMBNAIL') + .getMetadataBitstream(this.itemHandle, 'ORIGINAL') .pipe(getAllSucceededRemoteListPayload()) .subscribe((data: MetadataBitstream[]) => { this.listOfFiles.next(data); diff --git a/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.html b/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.html index 3d029dfef6c..91287138d49 100644 --- a/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.html +++ b/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.html @@ -1,13 +1,15 @@
    -
    {{'item.file.description.name' | translate}}
    -
    +
    {{ fileInput.name }}
    {{'item.file.description.size' | translate}}
    @@ -29,7 +31,8 @@
    Preview { let component: FileDescriptionComponent; let fixture: ComponentFixture; let halService: HALEndpointService; + let bitstreamDataService: BitstreamDataService; beforeEach(async () => { const configurationDataService = jasmine.createSpyObj('configurationDataService', { @@ -32,6 +41,10 @@ describe('FileDescriptionComponent', () => { getRootHref: 'root url', }); + bitstreamDataService = jasmine.createSpyObj('bitstreamDataService', { + findById: createSuccessfulRemoteDataObject$(new Bitstream()), + }); + await TestBed.configureTestingModule({ imports: [TranslateModule.forRoot({ loader: { @@ -42,7 +55,11 @@ describe('FileDescriptionComponent', () => { declarations: [FileDescriptionComponent, FileSizePipe], providers: [ { provide: ConfigurationDataService, useValue: configurationDataService }, - { provide: HALEndpointService, useValue: halService } + { provide: HALEndpointService, useValue: halService }, + { provide: AuthService, useClass: AuthServiceStub }, + { provide: FileService, useClass: FileServiceStub }, + { provide: AuthorizationDataService, useClass: AuthorizationDataServiceStub }, + { provide: BitstreamDataService, useValue: bitstreamDataService }, ] }).compileComponents(); }); @@ -53,7 +70,7 @@ describe('FileDescriptionComponent', () => { // Mock the input value const fileInput = new MetadataBitstream(); - fileInput.id = 123; + fileInput.id = '66efe81e-2950-483d-a065-bbdacd689f95'; fileInput.name = 'testFile'; fileInput.description = 'test description'; fileInput.fileSize = 2048; diff --git a/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.ts b/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.ts index c02d94f956b..f59479a9f3c 100644 --- a/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.ts +++ b/src/app/item-page/simple/field-components/preview-section/file-description/file-description.component.ts @@ -1,9 +1,20 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { Component, ElementRef, Input, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { MetadataBitstream } from 'src/app/core/metadata/metadata-bitstream.model'; import { HALEndpointService } from '../../../../../core/shared/hal-endpoint.service'; import { Router } from '@angular/router'; import { ConfigurationDataService } from '../../../../../core/data/configuration-data.service'; -import { getFirstSucceededRemoteData } from '../../../../../core/shared/operators'; +import { getFirstCompletedRemoteData, getFirstSucceededRemoteData } from '../../../../../core/shared/operators'; +import { BitstreamDataService } from '../../../../../core/data/bitstream-data.service'; +import { Bitstream } from '../../../../../core/shared/bitstream.model'; +import { RemoteData } from '../../../../../core/data/remote-data'; +import { followLink } from '../../../../../shared/utils/follow-link-config.model'; +import { fromEvent, merge, Observable, of, Subscription } from 'rxjs'; +import { FileService } from '../../../../../core/shared/file.service'; +import { distinctUntilChanged, switchMap, take } from 'rxjs/operators'; +import { FeatureID } from '../../../../../core/data/feature-authorization/feature-id'; +import { hasValue } from '../../../../../shared/empty.util'; +import { AuthorizationDataService } from '../../../../../core/data/feature-authorization/authorization-data.service'; +import { AuthService } from '../../../../../core/auth/auth.service'; const allowedPreviewFormats = ['text/plain', 'text/html', 'application/zip', 'application/x-tar']; @Component({ @@ -11,17 +22,30 @@ const allowedPreviewFormats = ['text/plain', 'text/html', 'application/zip', 'ap templateUrl: './file-description.component.html', styleUrls: ['./file-description.component.scss'], }) -export class FileDescriptionComponent implements OnInit { +export class FileDescriptionComponent implements OnInit, OnDestroy { MIME_TYPE_IMAGES_PATH = './assets/images/mime/'; MIME_TYPE_DEFAULT_IMAGE_NAME = 'application-octet-stream.png'; @Input() fileInput: MetadataBitstream; + @ViewChild('videoPreview') videoElement: ElementRef; + emailToContact: string; + content_url$: Observable; + content_url: string; + thumbnail_url$: Observable; + handlers_added = false; + playPromise: Promise; + + private subscriptions: Subscription = new Subscription(); constructor(protected halService: HALEndpointService, private router: Router, + private bitstreamService: BitstreamDataService, + private auth: AuthService, + private authDataService: AuthorizationDataService, + private fileService: FileService, private configService: ConfigurationDataService) { } ngOnInit(): void { @@ -30,6 +54,122 @@ export class FileDescriptionComponent implements OnInit { .subscribe(remoteData => { this.emailToContact = remoteData?.payload?.values?.[0]; }); + this.content_url$ = this.bitstreamService.findById(this.fileInput.id, true, false, followLink('thumbnail')) + .pipe(getFirstCompletedRemoteData(), + switchMap((remoteData: RemoteData) => { + if (remoteData.hasSucceeded) { + if (remoteData.payload?.thumbnail){ + this.thumbnail_url$ = remoteData.payload?.thumbnail.pipe( + switchMap((thumbnailRD: RemoteData) => { + if (thumbnailRD.hasSucceeded) { + return this.buildUrl(thumbnailRD.payload?._links.content.href); + } else { + return of(''); + } + }), + ); + } else { + this.thumbnail_url$ = of(''); + } + return of(remoteData.payload?._links.content.href); + } + } + )); + this.content_url$.pipe(take(1)).subscribe((url) => { + this.content_url = url; + }); + } + + ngAfterViewInit() { + const video = this.videoElement?.nativeElement; + + if (video) { + const error$ = fromEvent(video, 'error'); + this.subscriptions.add( + error$.subscribe((event) => { + //console.log('error', video.error.message); + if (hasValue(video.src)) { + this.auth.isAuthenticated().pipe( + switchMap((isLoggedIn) => { + if (isLoggedIn) { + return this.authDataService.isAuthorized(FeatureID.CanDownload, this.content_url.replace('/content', '')); + } else { + return of(false); + } + }), + ).subscribe((isAuthorized: boolean) => { + if (isAuthorized) { + this.add_short_lived_token_handling_to_video_playback(video); + this.resetSource(); + } else { + video.src = null; + } + }); + } + }) + ); + } + } + + private add_short_lived_token_handling_to_video_playback(video: HTMLVideoElement) { + if (this.handlers_added) { + return; + } + + const seeking$ = fromEvent(video, 'seeking').pipe( + switchMap((event: Event) => { + //console.log('seeking'); + return of(video.currentTime); + }), + distinctUntilChanged(), + ); + const stalled$ = fromEvent(video, 'stalled').pipe( + switchMap((event: Event) => { + //console.log('stalled'); + return of(video.currentTime); + }), + distinctUntilChanged(), + ); + this.subscriptions.add( + merge(seeking$, stalled$).subscribe((currentTime) => { + this.resetSource(currentTime); + }) + ); + + this.handlers_added = true; + + } + + private resetSource(currentTime?) { + const video = this.videoElement?.nativeElement; + //console.log("networkState in resetSource", video.networkState); + if (this.playPromise) { + this.playPromise?.then(_ => { + //playback has started + // don't want to see The play() request was interrupted by... + // https://developer.chrome.com/blog/play-request-was-interrupted + this.updateSource(video, currentTime); + }).catch(_ => { + //do nothing + }); + } else { + this.updateSource(video, currentTime); + } + } + + private updateSource(video, currentTime) { + //console.log("Updating the src"); + this.buildUrl(this.content_url).subscribe(result => { + video.src = result; + if (currentTime) { + video.currentTime = currentTime; + } + this.playPromise = video.play(); + }); + } + + private buildUrl(url: string): Observable { + return url ? this.fileService.retrieveFileDownloadLink(url) : of(url); } public downloadFile() { @@ -68,4 +208,8 @@ export class FileDescriptionComponent implements OnInit { // this.fileInput.fileInfo.length === 0 means that the file has no preview return this.fileInput?.fileInfo?.length === 0; } + + ngOnDestroy(): void { + this.subscriptions.unsubscribe(); + } } diff --git a/src/app/item-page/simple/field-components/preview-section/preview-section.component.spec.ts b/src/app/item-page/simple/field-components/preview-section/preview-section.component.spec.ts index 827b53a4cd6..1bac02083e7 100644 --- a/src/app/item-page/simple/field-components/preview-section/preview-section.component.spec.ts +++ b/src/app/item-page/simple/field-components/preview-section/preview-section.component.spec.ts @@ -43,7 +43,7 @@ describe('PreviewSectionComponent', () => { // Set up the mock service's getMetadataBitstream method to return a simple stream const metadatabitstream = new MetadataBitstream(); - metadatabitstream.id = 123; + metadatabitstream.id = '5974f1cf-f2ef-4e4c-8f6d-85ad6c52efde'; metadatabitstream.name = 'test'; metadatabitstream.description = 'test'; metadatabitstream.fileSize = 1024; diff --git a/src/app/item-page/simple/field-components/preview-section/preview-section.component.ts b/src/app/item-page/simple/field-components/preview-section/preview-section.component.ts index 3f485e70f08..d8dd5faad53 100644 --- a/src/app/item-page/simple/field-components/preview-section/preview-section.component.ts +++ b/src/app/item-page/simple/field-components/preview-section/preview-section.component.ts @@ -22,7 +22,7 @@ export class PreviewSectionComponent implements OnInit { ngOnInit(): void { this.registryService - .getMetadataBitstream(this.item.handle, 'ORIGINAL,TEXT,THUMBNAIL') + .getMetadataBitstream(this.item.handle, 'ORIGINAL') .pipe(getAllSucceededRemoteListPayload()) .subscribe((data: MetadataBitstream[]) => { this.listOfFiles.next(data); diff --git a/src/app/login-page/login-page.component.html b/src/app/login-page/login-page.component.html index 3b9cd4484eb..565ab883c01 100644 --- a/src/app/login-page/login-page.component.html +++ b/src/app/login-page/login-page.component.html @@ -1,10 +1,12 @@
    - - - - +
    + + + + +

    {{"login.form.header" | translate}}

    diff --git a/src/app/shared/clarin-shared-util.ts b/src/app/shared/clarin-shared-util.ts index f82987f9e0f..1603ed85c14 100644 --- a/src/app/shared/clarin-shared-util.ts +++ b/src/app/shared/clarin-shared-util.ts @@ -87,3 +87,16 @@ export function makeLinks(text: string): string { const regex = /(?:https?|ftp):\/\/[^\s)]+|www\.[^\s)]+/g; return text?.replace(regex, (url) => `${url}`); } + +/** + * Encode special characters in a URI part to ensure it is safe for use in a URL. + * The special characters are `()[]` and the space character. + * @param uriPart + */ +export function encodeRFC3986URIComponent(uriPart: string) { + // Decode the filename to handle any encoded characters + const decodedFileName = decodeURIComponent(uriPart); + // Encode special characters in the filename + return encodeURIComponent(decodedFileName) + .replace(/[()]/g, c => '%' + c.charCodeAt(0).toString(16).toUpperCase()); +} diff --git a/src/app/shared/object-list/object-list.component.html b/src/app/shared/object-list/object-list.component.html index 33caa182f18..0bbf45d36d0 100644 --- a/src/app/shared/object-list/object-list.component.html +++ b/src/app/shared/object-list/object-list.component.html @@ -16,14 +16,14 @@ (prev)="goPrev()" (next)="goNext()">
      -
      +
      -
      +
    • Date: Fri, 16 May 2025 10:46:08 +0200 Subject: [PATCH 24/44] Do not use solr config volumes in the docker-compose-rest --- docker/docker-compose-rest.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/docker/docker-compose-rest.yml b/docker/docker-compose-rest.yml index 00cd919873a..8a63bad7550 100644 --- a/docker/docker-compose-rest.yml +++ b/docker/docker-compose-rest.yml @@ -81,8 +81,6 @@ services: - dspace_logs:/dspace/log - assetstore:/dspace/assetstore #- /opt/DATA/assetstore:/dspace/assetstore - # Mount DSpace's solr configs to a volume, so that we can share to 'dspacesolr' container (see below) - - solr_configs:/dspace/solr - handle_server:/dspace/handle-server - ./local.cfg:/dspace/config/local.cfg # Ensure that the database is ready BEFORE starting tomcat From 8eec9d06ff2234929def11cbedc70cd22aba512c Mon Sep 17 00:00:00 2001 From: milanmajchrak <90026355+milanmajchrak@users.noreply.github.com> Date: Mon, 19 May 2025 14:59:19 +0200 Subject: [PATCH 25/44] UFAL/Do not add `dtoken` into the URL if it is null (#860) --- .../clarin-zip-download-page.component.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/app/bitstream-page/clarin-zip-download-page/clarin-zip-download-page.component.ts b/src/app/bitstream-page/clarin-zip-download-page/clarin-zip-download-page.component.ts index e0654edcb43..e0f13d16150 100644 --- a/src/app/bitstream-page/clarin-zip-download-page/clarin-zip-download-page.component.ts +++ b/src/app/bitstream-page/clarin-zip-download-page/clarin-zip-download-page.component.ts @@ -71,8 +71,11 @@ export class ClarinZipDownloadPageComponent extends ClarinBitstreamDownloadPageC this.bitstreams$.next([...current, ...bitstreamsRD.payload.page]); this.bitstreamRD$ = createSuccessfulRemoteDataObject$(this.bitstreams$.getValue()[0]); this.dtoken = isUndefined(this.route.snapshot.queryParams.dtoken) ? null : this.route.snapshot.queryParams.dtoken; - this.zipDownloadLink.next(this.halService.getRootHref() + - `/core/items/${itemRD.payload.uuid}/allzip?handleId=${itemRD?.payload?.handle}&dtoken=${this.dtoken}`); + const baseUrl = this.halService.getRootHref() + + `/core/items/${itemRD.payload.uuid}/allzip?handleId=${itemRD?.payload?.handle}`; + // Do not add `dtoken` into the URL if it is null + const dtokenParam = this.dtoken ? `&dtoken=${this.dtoken}` : ''; + this.zipDownloadLink.next(baseUrl + dtokenParam); super.ngOnInit(); } }); From 4bfa47708429dfbe38c83f8655a92e0a00c7ec5f Mon Sep 17 00:00:00 2001 From: milanmajchrak <90026355+milanmajchrak@users.noreply.github.com> Date: Tue, 17 Jun 2025 02:07:06 +0200 Subject: [PATCH 26/44] New Release merge - 2025/Jun/17 (#878) --- .github/workflows/deploy.yml | 66 +- config/config.lindat.ui.tests.json | 10 + docker/docker-compose-rest.yml | 9 +- ...larin-bitstream-download-page.component.ts | 2 +- ...arin-license-agreement-page.component.html | 2 +- ...clarin-license-agreement-page.component.ts | 2 +- .../define-license-form.component.ts | 4 +- .../bitstream-url-serializer.spec.ts | 11 + .../bitstream-url-serializer.ts | 18 +- src/app/footer/footer.component.html | 29 +- .../logout-page/logout-page.component.html | 12 +- .../LINDAT-Web-Crawl-Licence.html | 69 + src/static-files/license-corefud-1.3.html | 143 ++ src/static-files/license-pcedt2.html | 9 +- src/static-files/license-selexini.html | 45 + src/static-files/license-ud-2.15.html | 1242 +++++++++++++++ src/static-files/license-ud-2.16.html | 1333 +++++++++++++++++ src/static-files/license-umr-2.0.html | 75 + .../dspace/app/header/header.component.html | 5 +- 19 files changed, 3000 insertions(+), 86 deletions(-) create mode 100644 config/config.lindat.ui.tests.json create mode 100644 src/static-files/LINDAT-Web-Crawl-Licence.html create mode 100644 src/static-files/license-corefud-1.3.html create mode 100644 src/static-files/license-selexini.html create mode 100644 src/static-files/license-ud-2.15.html create mode 100644 src/static-files/license-ud-2.16.html create mode 100644 src/static-files/license-umr-2.0.html diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index c0c54177a3d..579a0568af1 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -2,8 +2,6 @@ name: Deploy DSpace on: - schedule: - - cron: '0 21 * * 6' # Runs every Saturday at 9 PM workflow_call: inputs: INSTANCE: @@ -39,18 +37,6 @@ on: type: boolean jobs: - import-every-week: - # Only run this job when triggered by the schedule event - if: github.event_name == 'schedule' - runs-on: ubuntu-latest - steps: - - name: Call the deploy action with predefined inputs - uses: ./.github/workflows/deploy.yml - with: - INSTANCE: '8' - IMPORT: true - ERASE_DB: true - deploy-5: if: inputs.INSTANCE == '*' || inputs.INSTANCE == '5' runs-on: dspace-dep-1 @@ -164,41 +150,39 @@ jobs: docker exec $DNAME /bin/bash -c "cd /dspace/bin && ./dspace healthcheck -v" playwright-after-deploy8: - runs-on: ubuntu-latest + runs-on: dspace-test-1 needs: deploy-8 timeout-minutes: 45 if: '!inputs.IMPORT' steps: - - name: run playwright - run: | - # wait until FE stabilizes a bit - sleep 3m - - curl -H "Accept: application/vnd.github.everest-preview+json" \ - -H "Authorization: token ${{ secrets.DEPLOY_DEV5_GH_ACTION_DISPATCH }}" \ - --request POST \ - https://api.github.com/repos/dataquest-dev/\ - dspace-ui-tests/actions/workflows/cron-test.yml/dispatches \ - --data "{\"ref\":\"refs/heads/master\"}" 2> /dev/null + - name: Checkout Playwright tests + uses: actions/checkout@v4 + with: + repository: dataquest-dev/dspace-ui-tests + path: dspace-ui-tests + token: ${{ secrets.DEPLOY_DEV5_GH_ACTION_DISPATCH }} - # wait for it to start - sleep 30s + - name: Checkout main repository + uses: actions/checkout@v4 + with: + path: this-repository - # get result of last job - RES=$(curl -H "Accept: application/vnd.github.everest-preview+json" -H "Authorization: token ${{ secrets.DEPLOY_DEV5_GH_ACTION_DISPATCH }}" https://api.github.com/repos/dataquest-dev/dspace-ui-tests/actions/workflows/cron-test.yml/runs?per_page=1 2> /dev/null | jq .workflow_runs[0].conclusion) + - name: Copy customer config to UI tests repository for merging + run: | + cp this-repository/config/config.lindat.ui.tests.json dspace-ui-tests/customer-constants/ - # while job did not finish, sleep - while [[ $RES == 'null' ]]; do - sleep 10s - RES=$(curl -H "Accept: application/vnd.github.everest-preview+json" -H "Authorization: token ${{ secrets.DEPLOY_DEV5_GH_ACTION_DISPATCH }}" https://api.github.com/repos/dataquest-dev/dspace-ui-tests/actions/workflows/cron-test.yml/runs?per_page=1 2> /dev/null | jq .workflow_runs[0].conclusion) - done; + - name: test + working-directory: dspace-ui-tests/scripts + env: + HOME_URL: https://dev-5.pc:8443/repository/ + NAME: LINDAT + run: | + ./test.sh - echo $RES - # if last result is not success, return -1 and fail - if [[ $RES != \"success\" ]]; then - echo "playwright tests have failed! check appropriate action run in the dspace-ui-tests repository" - exit 1 - fi; + - uses: mazoea/ga-maz/end@master + with: + CHOWN_DIR: ./ + if: ${{ always() }} rest-tests-after-deploy8: runs-on: ubuntu-latest diff --git a/config/config.lindat.ui.tests.json b/config/config.lindat.ui.tests.json new file mode 100644 index 00000000000..c9bba0dc46c --- /dev/null +++ b/config/config.lindat.ui.tests.json @@ -0,0 +1,10 @@ +{ + "locators": { + "title": "LINDAT/CLARIAH-CZ Repository Home" + }, + "urls": { + "oaipmh_response": "https://dev-5.pc:8443/repository/server/oai/request?verb=ListRecords&metadataPrefix=oai_dc", + "redirect_to_login": "https://dev-5.pc:8443/repository/login?redirectUrl=http:%2F%2Fdev-5.pc:82%2Fhome", + "not_exposed_data": "https://dev-5.pc:8443/repository/server/oai/request?verb=GetRecord&metadataPrefix=cmdi&identifier=oai:dev-5.pc:20.500.12800/1-4740" + } +} diff --git a/docker/docker-compose-rest.yml b/docker/docker-compose-rest.yml index 8a63bad7550..f281be8a7cc 100644 --- a/docker/docker-compose-rest.yml +++ b/docker/docker-compose-rest.yml @@ -70,7 +70,12 @@ services: # handle binary port as per https://www.handle.net/hnr_support.html (5th paragraph) - published: 264${INSTANCE} target: 2641 - host_ip: 127.0.0.1 + protocol: tcp + host_ip: ${HOST_IP:-127.0.0.1} + - published: 264${INSTANCE} + target: 2641 + protocol: udp + host_ip: ${HOST_IP:-127.0.0.1} # handle http port as per https://www.handle.net/hnr_support.html (5th paragraph) - published: 801${INSTANCE} target: 8010 @@ -100,7 +105,7 @@ services: # (e.g. /dspace/webapps/server -> /dspace/webapps/repository#server) - | while (! /dev/null 2>&1; do sleep 1; done; - pushd ../webapps && (unlink server || true) && (ln -s /dspace/webapps/server/ 'repository#server' || true) && popd + pushd /usr/local/tomcat/webapps && (unlink server || true) && (ln -s /dspace/webapps/server/ `echo -n "${DSPACE_REST_NAMESPACE}" | sed -e 's#^/##' -e 'sx/x#x'` || true) && popd /dspace/bin/dspace database migrate force /dspace/bin/start-handle-server ./custom_run.sh diff --git a/src/app/bitstream-page/clarin-bitstream-download-page/clarin-bitstream-download-page.component.ts b/src/app/bitstream-page/clarin-bitstream-download-page/clarin-bitstream-download-page.component.ts index 04d2fe87bb9..91540cfddf5 100644 --- a/src/app/bitstream-page/clarin-bitstream-download-page/clarin-bitstream-download-page.component.ts +++ b/src/app/bitstream-page/clarin-bitstream-download-page/clarin-bitstream-download-page.component.ts @@ -87,7 +87,7 @@ export class ClarinBitstreamDownloadPageComponent implements OnInit { const clarinIsAuthorized$ = this.rdbService.buildFromRequestUUID(requestId); // Clarin authorization will check dtoken parameter from the request const dtoken = isNotEmpty(this.dtoken) ? '?dtoken=' + this.dtoken : ''; - const isAuthorized$ = this.authorizationService.isAuthorized(FeatureID.CanDownload, isNotEmpty(bitstream) ? bitstream.self + dtoken : undefined); + const isAuthorized$ = this.authorizationService.isAuthorized(FeatureID.CanDownload, isNotEmpty(bitstream) ? bitstream.self + dtoken : undefined, undefined, false); const isLoggedIn$ = this.auth.isAuthenticated(); return observableCombineLatest([clarinIsAuthorized$, isAuthorized$, isLoggedIn$, observableOf(bitstream)]); }), diff --git a/src/app/bitstream-page/clarin-license-agreement-page/clarin-license-agreement-page.component.html b/src/app/bitstream-page/clarin-license-agreement-page/clarin-license-agreement-page.component.html index 86ee4eb1a14..16c57f29ea1 100644 --- a/src/app/bitstream-page/clarin-license-agreement-page/clarin-license-agreement-page.component.html +++ b/src/app/bitstream-page/clarin-license-agreement-page/clarin-license-agreement-page.component.html @@ -25,7 +25,7 @@
    - CLARIN CENTRE B - CLARIN CENTRE K - CoreTrustSeal Certification + CLARIN CENTRE B + CLARIN CENTRE K + CoreTrustSeal Certification
    - THE LINDAT/CLARIAH-CZ PROJECT (LM2018101; formerly LM2010013, LM2015071) IS FULLY SUPPORTED BY THE MINISTRY OF EDUCATION, SPORTS AND YOUTH OF THE CZECH REPUBLIC UNDER THE PROGRAMME LM OF "LARGE INFRASTRUCTURES" + THE LINDAT/CLARIAH-CZ PROJECT (LM2023062; formerly LM2010013, LM2015071, LM2018101) IS FULLY SUPPORTED BY THE MINISTRY OF EDUCATION, SPORTS AND YOUTH OF THE CZECH REPUBLIC UNDER THE PROGRAMME LM OF "LARGE INFRASTRUCTURES"
    Icons © Smashicons and Freepik from flaticon.com licensed by CC 3.0 BY
    -
    website © 2024 by ÚFAL
    - +
    website © 2025 by ÚFAL
    diff --git a/src/app/logout-page/logout-page.component.html b/src/app/logout-page/logout-page.component.html index 5da524f3fbd..8c94b1653d8 100644 --- a/src/app/logout-page/logout-page.component.html +++ b/src/app/logout-page/logout-page.component.html @@ -1,10 +1,12 @@
    -
    - - - - +
    +
    + + + + +

    {{"logout.form.header" | translate}}

    diff --git a/src/static-files/LINDAT-Web-Crawl-Licence.html b/src/static-files/LINDAT-Web-Crawl-Licence.html new file mode 100644 index 00000000000..e118cc0a28e --- /dev/null +++ b/src/static-files/LINDAT-Web-Crawl-Licence.html @@ -0,0 +1,69 @@ +
    +

    LINDAT Web Crawl Licence

    +
    (2024/12/13)
    +
    +
    +

    License Terms

    +

    LINDAT Web Crawl Licence (further as “Agreement”) between The +publisher of the dataset (“The Publisher”) and The user of the dataset +(“The User”).

    +

    The User agrees to use the collection data set collected by The +Publisher (the "Collection"). The User agrees to abide by the following +understandings, terms and conditions. These understandings, terms and +conditions apply equally to all or to part of the Collection, including +any updates or new versions of the Collection supplied under this +Agreement.

    +

    Copyright

    +

    The Collection has been obtained by crawling the Internet. Due to the +size of the Collection it has not been practicable to obtain permission +from copyright owners to provide the Collection for the uses permitted +under this Agreement (“Permitted Uses”).

    +

    The User understands that all the documents in the Collection are +documents which have been at some time made publicly available on the +Internet and which have been collected using a process which respects +the commonly accepted methods (such as robots.txt) for indicating that +the documents should not be so collected.

    +

    Owners of copyright in individual documents may choose to request +deletion of these documents from the Collection.

    +

    The limitation on permitted use contained in the following section is +intended to reduce the risk of any action being brought by copyright +owners, but if this happens The User agrees to bear all associated +liability.

    +

    Permitted Uses

    +

    The Collection may only be used for research and development of +natural-language processing, information-retrieval or +document-understanding systems.

    +

    Summaries, analyses and interpretations of the linguistic properties +of the Collection may be derived and published, provided it is not +possible to reconstruct the Collection from these summaries.

    +

    Small excerpts of the Collection may be displayed to others or +published in a scientific or technical context, solely for the purpose +of describing the research and development carried out and related +issues.

    +

    All efforts must be made not to infringe the rights of any third +party including, but not limited to, the authors and publishers of any +excerpts used in accordance with the clauses above in this “Permitted +Uses” section.

    +

    The User must make sure that they only display the Collection to or +share the Collection with persons who also signed this Agreement with +The Publisher.

    +

    Agreement to Delete Data on Request

    +

    The User undertakes to delete within thirty days of receiving notice +all copies of any nominated document that is part of the Collection +whenever requested to do so by either The Publisher or by the owner of +copyright for the particular document.

    +

    No Warranty

    +

    The Collection is provided "as is", without warranty of any kind, +express or implied, including but not limited to the warranties of +merchantability, fitness for a particular purpose and noninfringement. +In no event shall The Publisher be liable for any claim, damages or +other liability, whether in an action of contract, tort or otherwise, +arising in any way of the use of the Collection.

    +

    Termination

    +

    Either The Publisher or The User may terminate this Agreement at any time +by notifying the other party in writing. On termination of the Agreement +The User shall destroy all copies of the Collection.

    +

    Applicable Law

    +

    This Agreement is governed by the laws of the Czech Republic.

    +
    +
    diff --git a/src/static-files/license-corefud-1.3.html b/src/static-files/license-corefud-1.3.html new file mode 100644 index 00000000000..81c6989b680 --- /dev/null +++ b/src/static-files/license-corefud-1.3.html @@ -0,0 +1,143 @@ +
    +

    CorefUD v1.3 License Agreement

    +
    + (2025/04/10) +
    +
    +
    +

    CorefUD v1.3 License Terms

    +

    CorefUD v1.3 (referred to as “CorefUD” in the rest of this document) + is a collection of linguistic data. Each of the corpora has its own license terms + and you (the “User”) are responsible for complying with the license terms + applicable to those parts of CorefUD which you use. If you do not agree with the license terms, + you must stop using CorefUD and destroy all copies of CorefUD data that you have obtained.

    +
    +

    You are specifically reminded that some of the corpora + permit only non-commercial usage.

    +
    +

    The license for every corpus included in the release is specified in the appropriate + corpus directory.

    +
    + +

    Overview of the corpora and their license terms

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CorpusLicense
    CorefUD_Ancient_Greek-PROIELCC BY-NC-SA 4.0
    CorefUD_Ancient_Hebrew-PTNKCC BY-NC 4.0
    CorefUD_Catalan-AnCoraCC BY 4.0
    CorefUD_Czech-PCEDTCC BY-NC-SA 3.0
    CorefUD_Czech-PDTCC BY-NC-SA 4.0
    CorefUD_English-GUMCC BY-NC-SA 4.0
    CorefUD_English-LitBankCC BY 4.0
    CorefUD_English-ParCorFullCC BY-NC 4.0
    CorefUD_French-ANCORCC BY-NC-SA 4.0
    CorefUD_French-DemocratCC BY-SA 4.0
    CorefUD_German-ParCorFullCC BY-NC 4.0
    CorefUD_German-PotsdamCCCC BY-NC-SA 4.0
    CorefUD_Hindi-HDTBCC BY-NC-SA 4.0
    CorefUD_Hungarian-KorKorCC BY 4.0
    CorefUD_Hungarian-SzegedKorefCC BY 4.0
    CorefUD_Korean-ECMTCC BY 4.0
    CorefUD_Lithuanian-LCCCLARIN-LT End User License
    CorefUD_Norwegian-BokmaalNARCCC BY-SA 4.0
    CorefUD_Norwegian-NynorskNARCCC BY-SA 4.0
    CorefUD_Old_Church_Slavonic-PROIELCC BY-NC-SA 4.0
    CorefUD_Polish-PCCCC BY 3.0
    CorefUD_Russian-RuCorCC BY-SA 4.0
    CorefUD_Spanish-AnCoraCC BY 4.0
    CorefUD_Turkish-ITCCCC BY-NC-SA 4.0
    + +

    Licenses

    + + + + + + + + + + + + + +
    LicenseURL
    CC BY 3.0http://creativecommons.org/licenses/by/3.0/
    CC BY 4.0http://creativecommons.org/licenses/by/4.0/
    CC BY-NC 4.0http://creativecommons.org/licenses/by-nc/4.0/
    CC BY-NC-SA 3.0http://creativecommons.org/licenses/by-nc-sa/3.0/
    CC BY-NC-SA 4.0http://creativecommons.org/licenses/by-nc-sa/4.0/
    CC BY-SA 4.0http://creativecommons.org/licenses/by-sa/4.0/
    CLARIN-LT End User Licensehttps://clarin.vdu.lt/licenses/eula/PUB_CLARIN-LT_End-User-Licence-Agreement_EN-LT.htm
    +
    +
    diff --git a/src/static-files/license-pcedt2.html b/src/static-files/license-pcedt2.html index 812228ada8a..f1a30fa7972 100644 --- a/src/static-files/license-pcedt2.html +++ b/src/static-files/license-pcedt2.html @@ -6,7 +6,8 @@ -->

    Prague Czech English Dependency Treebank 2.0 License Agreement

    @@ -51,11 +52,11 @@

    Prague Czech English Dependency Treeba

    Prague Czech English Dependency Treebank 2.0 (PCEDT) is a parallel, bilingual corpus. The English Part is based on Penn Treebank 3 and - therefore to use PCEDT, you need a license for Treebank 3. + therefore to use PCEDT, you need a license for Treebank 3.

    The dependency annotation of the English data, as well as all the Czech data - is licensed under the terms of CC-BY-NC-SA 3.0. + is licensed under the terms of CC-BY-NC-SA 3.0.

    @@ -65,7 +66,7 @@

    Prague Czech English Dependency Treeba

    By accepting this license and downloading the data you declare you have a valid - license for Treebank 3. + license for Treebank 3.

    diff --git a/src/static-files/license-selexini.html b/src/static-files/license-selexini.html new file mode 100644 index 00000000000..84ce59e4f11 --- /dev/null +++ b/src/static-files/license-selexini.html @@ -0,0 +1,45 @@ +
    +

    The SELEXINI Corpora License Agreement

    +
    + (2025/01/10) +
    +
    +
    +

    License Terms

    +

    The SELEXINI Corpora is a collection of linguistic data. Each of the corpora has its own license terms and you (the “User”) are responsible for complying with the license terms applicable to those parts which you use. If you do not agree with the license terms, you must stop using the corpora and destroy all copies of the data that you have obtained.

    +
    +

    The licenses for the annotations (columns 1,3-10) and words are different, which is indicated in the table below. All files in the bin/ and trial/ folders are licensed under CC BY 4.0.

    +
    + +

    Overview of the corpora and their license terms

    + + + + + + + + + + + + + + + + +
    Original CorporaWords (column 2)Annotations (columns 1,3-10)
    HPLTCC0CC BY-NC-SA
    BigScienceRAILCC BY-NC-SA
    + +

    Licenses

    + + + + + + + + + +
    LicenseURL
    CC0https://creativecommons.org/public-domain/cc0
    RAILhttps://huggingface.co/spaces/bigscience/license
    CC BY-NC-SAhttps://creativecommons.org/licenses/by-nc-sa/4.0/
    +
    +
    diff --git a/src/static-files/license-ud-2.15.html b/src/static-files/license-ud-2.15.html new file mode 100644 index 00000000000..df99a9ef5de --- /dev/null +++ b/src/static-files/license-ud-2.15.html @@ -0,0 +1,1242 @@ +
    +

    Universal Dependencies v2.15 License Agreement

    +
    + (2024/11/15) +
    +
    +
    +

    Universal Dependencies v2.15 License Terms

    +

    Universal Dependencies v2.15 (referred to as “UD” in the rest of this document) + is a collection of linguistic data and tools. Each of the treebanks has its own license terms + and you (the “User”) are responsible for complying with the license terms + applicable to those parts of UD which you use. If you do not agree with the license terms, + you must stop using UD and destroy all copies of UD data that you have obtained.

    +
    +

    You are specifically reminded that some of the treebanks + permit only non-commercial usage.

    +
    +

    The additional software tools are provided as-is (without any warranty) and are redistributed + under GNU GPL Version 2.

    +
    +

    The license for every treebank included in the release is specified in the appropriate + treebank directory.

    +
    + +

    Overview of the treebanks and their license terms

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TreebankLicense
    Abaza-ATBCC BY-SA 4.0
    Abkhaz-AbNCCC BY-SA 4.0
    Afrikaans-AfriBoomsCC BY-SA 4.0
    Akkadian-PISANDUBCC BY-SA 4.0
    Akkadian-RIAOCC BY-SA 3.0
    Akuntsu-TuDeTCC BY-SA 4.0
    Albanian-STAFCC BY-SA 4.0
    Albanian-TSACC BY-SA 4.0
    Amharic-ATTCC BY-SA 4.0
    Ancient_Greek-PROIELCC BY-NC-SA 3.0
    Ancient_Greek-PTNKCC BY-SA 4.0
    Ancient_Greek-PerseusCC BY-NC-SA 2.5
    Ancient_Hebrew-PTNKCC BY-NC 4.0
    Apurina-UFPACC BY-SA 4.0
    Arabic-NYUADCC BY-SA 4.0
    Arabic-PADTCC BY-NC-SA 3.0
    Arabic-PUDCC BY-SA 3.0
    Armenian-ArmTDPCC BY-SA 4.0
    Armenian-BSUTCC BY-SA 4.0
    Assyrian-ASCC BY-SA 4.0
    Azerbaijani-TueCLCC BY-SA 4.0
    Bambara-CRBCC BY-SA 4.0
    Basque-BDTCC BY-NC-SA 3.0
    Bavarian-MaiBaamCC BY-SA 4.0
    Beja-AutogrammCC BY-SA 4.0
    Belarusian-HSECC BY-SA 4.0
    Bengali-BRUCC BY-SA 4.0
    Bhojpuri-BHTBCC BY-SA 4.0
    Bororo-BDTCC BY-SA 4.0
    Breton-KEBCC BY-SA 4.0
    Bulgarian-BTBCC BY-NC-SA 3.0
    Buryat-BDTCC BY-SA 4.0
    Cantonese-HKCC BY-SA 4.0
    Cappadocian-AMGiCCC BY-SA 4.0
    Cappadocian-TueCLCC BY-SA 4.0
    Catalan-AnCoraCC BY 4.0
    Cebuano-GJACC BY-SA 4.0
    Chinese-BeginnerCC BY-NC-SA 3.0
    Chinese-CFLCC BY-SA 4.0
    Chinese-GSDCC BY-SA 4.0
    Chinese-GSDSimpCC BY-SA 4.0
    Chinese-HKCC BY-SA 4.0
    Chinese-PUDCC BY-SA 3.0
    Chinese-PatentCharCC BY-NC-SA 3.0
    Chukchi-HSECC BY-SA 4.0
    Classical_Armenian-CAVaLCC BY-NC-SA 4.0
    Classical_Chinese-KyotoPD
    Classical_Chinese-TueCLCC BY-SA 4.0
    Coptic-ScriptoriumCC BY 4.0
    Croatian-SETCC BY-SA 4.0
    Czech-CACCC BY-SA 4.0
    Czech-CLTTCC BY-SA 4.0
    Czech-FicTreeCC BY-NC-SA 4.0
    Czech-PDTCC BY-NC-SA 4.0
    Czech-PUDCC BY-SA 4.0
    Czech-PoetryCC BY-SA 4.0
    Danish-DDTCC BY-SA 4.0
    Dutch-AlpinoCC BY-SA 4.0
    Dutch-LassySmallCC BY-SA 4.0
    Egyptian-UJaenCC BY-SA 4.0
    English-AtisCC BY-SA 4.0
    English-CTeTexCC BY-SA 4.0
    English-ESLSpokCC BY-SA 4.0
    English-EWTCC BY-SA 4.0
    English-GENTLECC BY-NC-SA 4.0
    English-GUMCC BY-NC-SA 4.0
    English-GUMRedditCC BY 4.0
    English-LinESCC BY-NC-SA 4.0
    English-PUDCC BY-SA 3.0
    English-ParTUTCC BY-NC-SA 4.0
    English-PronounsCC BY-SA 4.0
    Erzya-JRCC BY-SA 4.0
    Estonian-EDTCC BY-NC-SA 4.0
    Estonian-EWTCC BY-NC-SA 4.0
    Faroese-FarPaHCCC BY-SA 4.0
    Faroese-OFTCC BY-SA 4.0
    Finnish-FTBCC BY 4.0
    Finnish-OODCC BY-SA 4.0
    Finnish-PUDCC BY-SA 4.0
    Finnish-TDTCC BY-SA 4.0
    French-FQBLGPL-LR
    French-GSDCC BY-SA 4.0
    French-PUDCC BY-SA 3.0
    French-ParTUTCC BY-NC-SA 4.0
    French-ParisStoriesCC BY-SA 4.0
    French-RhapsodieCC BY-SA 4.0
    French-SequoiaLGPL-LR
    Frisian_Dutch-FameCC BY-SA 4.0
    Galician-CTGCC BY-NC-SA 3.0
    Galician-PUDCC BY-SA 4.0
    Galician-TreeGalLGPL-LR
    Georgian-GLCCC BY-SA 4.0
    German-GSDCC BY-SA 4.0
    German-HDTCC BY-SA 4.0
    German-LITCC BY-NC-SA 4.0
    German-PUDCC BY-SA 3.0
    Gheg-GPSCC BY-SA 4.0
    Gothic-PROIELCC BY-NC-SA 3.0
    Greek-GDTCC BY-NC-SA 3.0
    Greek-GUDCC BY-SA 4.0
    Guajajara-TuDeTCC BY-SA 4.0
    Guarani-OldTuDeTCC BY-SA 4.0
    Gujarati-GujTBCC BY-SA 4.0
    Gwichin-TueCLCC BY-SA 4.0
    Haitian_Creole-AutogrammCC BY-SA 4.0
    Hausa-NorthernAutogrammCC BY-SA 4.0
    Hausa-SouthernAutogrammCC BY-SA 4.0
    Hebrew-HTBCC BY-NC-SA 4.0
    Hebrew-IAHLTknessetCC BY-SA 4.0
    Hebrew-IAHLTwikiCC BY-SA 4.0
    Highland_Puebla_Nahuatl-ITMLCC BY-SA 4.0
    Hindi-HDTBCC BY-NC-SA 4.0
    Hindi-PUDCC BY-SA 3.0
    Hittite-HitTBCC BY-SA 4.0
    Hungarian-SzegedCC BY-NC-SA 3.0
    Icelandic-GCCC BY-SA 4.0
    Icelandic-IcePaHCCC BY-SA 4.0
    Icelandic-ModernCC BY-SA 4.0
    Icelandic-PUDCC BY-SA 4.0
    Indonesian-CSUICC BY-SA 4.0
    Indonesian-GSDCC BY-SA 4.0
    Indonesian-PUDCC BY-SA 3.0
    Irish-CadhanCC BY-SA 4.0
    Irish-IDTCC BY-SA 3.0
    Irish-TwittIrishCC BY-SA 4.0
    Italian-ISDTCC BY-NC-SA 3.0
    Italian-MarkITCC BY 4.0
    Italian-OldCC BY-SA 4.0
    Italian-PUDCC BY-SA 3.0
    Italian-ParTUTCC BY-NC-SA 4.0
    Italian-ParlaMintCC BY-SA 4.0
    Italian-PoSTWITACC BY-NC-SA 4.0
    Italian-TWITTIROCC BY-SA 4.0
    Italian-VITCC BY-NC-SA 3.0
    Italian-ValicoCC BY-SA 4.0
    Japanese-BCCWJCC BY-NC-SA 4.0
    Japanese-BCCWJLUWCC BY-NC-SA 4.0
    Japanese-GSDCC BY-SA 4.0
    Japanese-GSDLUWCC BY-SA 4.0
    Japanese-PUDCC BY-SA 3.0
    Japanese-PUDLUWCC BY-SA 3.0
    Javanese-CSUICC BY-SA 4.0
    Kaapor-TuDeTCC BY-SA 4.0
    Kangri-KDTBCC BY-SA 4.0
    Karelian-KKPPCC BY-SA 4.0
    Karo-TuDeTCC BY-SA 4.0
    Kazakh-KTBCC BY-SA 4.0
    Khunsari-AHACC BY-SA 4.0
    Kiche-IUCC BY-SA 4.0
    Komi_Permyak-UHCC BY-SA 4.0
    Komi_Zyrian-IKDPCC BY-SA 4.0
    Komi_Zyrian-LatticeCC BY-SA 4.0
    Korean-GSDCC BY-SA 4.0
    Korean-KSLCC BY-SA 4.0
    Korean-KaistCC BY-SA 4.0
    Korean-PUDCC BY-SA 3.0
    Kurmanji-MGCC BY-SA 4.0
    Kyrgyz-KTMUCC BY-SA 4.0
    Kyrgyz-TueCLCC BY-SA 4.0
    Latgalian-CairoCC BY-SA 4.0
    Latin-CIRCSECC BY-SA 4.0
    Latin-ITTBCC BY-NC-SA 3.0
    Latin-LLCTCC BY-SA 4.0
    Latin-PROIELCC BY-NC-SA 3.0
    Latin-PerseusCC BY-NC-SA 2.5
    Latin-UDanteCC BY-NC-SA 3.0
    Latvian-CairoCC BY-SA 4.0
    Latvian-LVTBCC BY-SA 4.0
    Ligurian-GLTC-UDA 1.0
    Lithuanian-ALKSNISCC BY-SA 4.0
    Lithuanian-HSECC BY-SA 4.0
    Livvi-KKPPCC BY-SA 4.0
    Low_Saxon-LSDCCC BY-SA 4.0
    Luxembourgish-LuxBankCC BY-SA 4.0
    Macedonian-MTBCC BY-SA 4.0
    Madi-JarawaraCC BY-SA 4.0
    Maghrebi_Arabic_French-ArabiziCC BY-SA 4.0
    Makurap-TuDeTCC BY-SA 4.0
    Malayalam-UFALCC BY-SA 4.0
    Maltese-MUDTCC BY-SA 4.0
    Manx-CadhanGNU GPL 3.0
    Marathi-UFALCC BY-SA 4.0
    Mbya_Guarani-DooleyCC BY-NC-SA 4.0
    Mbya_Guarani-ThomasCC BY-NC-SA 4.0
    Middle_French-PROFITEROLECC BY-NC-SA 4.0
    Moksha-JRCC BY-SA 4.0
    Munduruku-TuDeTCC BY-SA 4.0
    Naija-NSCCC BY-SA 4.0
    Nayini-AHACC BY-SA 4.0
    Neapolitan-RBCC BY-SA 4.0
    Nheengatu-CompLinCC BY-NC-SA 4.0
    North_Sami-GiellaCC BY-SA 4.0
    Northwest_Gbaya-AutogrammCC BY-SA 4.0
    Norwegian-BokmaalCC BY-SA 4.0
    Norwegian-NynorskCC BY-SA 4.0
    Old_Church_Slavonic-PROIELCC BY-NC-SA 4.0
    Old_East_Slavic-BirchbarkCC BY-SA 4.0
    Old_East_Slavic-RNCCC BY-SA 4.0
    Old_East_Slavic-RuthenianCC BY-SA 4.0
    Old_East_Slavic-TOROTCC BY-NC-SA 4.0
    Old_French-PROFITEROLECC BY-NC-SA 3.0
    Old_Irish-DipSGGCC BY-NC-SA 4.0
    Old_Irish-DipWBGCC BY-SA 4.0
    Old_Turkish-ClausalCC0 1.0
    Ottoman_Turkish-BOUNCC BY-SA 4.0
    Ottoman_Turkish-DUDUCC BY-SA 4.0
    Pashto-SikaramCC BY-SA 4.0
    Paumari-TueCLCC BY-SA 4.0
    Persian-PerDTCC BY-SA 4.0
    Persian-SerajiCC BY-SA 4.0
    Pesh-ChibErgISCC BY-SA 4.0
    Phrygian-KULCC BY-SA 4.0
    Polish-LFGGNU GPL 3.0
    Polish-PDBCC BY-NC-SA 4.0
    Polish-PUDCC BY-SA 4.0
    Pomak-PhilotisCC BY-NC-SA 3.0
    Portuguese-BosqueCC BY-SA 4.0
    Portuguese-CINTILCC BY-NC-ND 4.0
    Portuguese-DANTEStocksCC BY 4.0
    Portuguese-GSDCC BY-SA 4.0
    Portuguese-PUDCC BY-SA 3.0
    Portuguese-PetroGoldCC BY-SA 4.0
    Portuguese-PorttinariCC BY 4.0
    Romanian-ArTCC BY-SA 4.0
    Romanian-NonstandardCC BY-SA 4.0
    Romanian-RRTCC BY-SA 4.0
    Romanian-SiMoNERoCC BY-SA 4.0
    Romanian-TueCLCC BY-SA 4.0
    Russian-GSDCC BY-SA 4.0
    Russian-PUDCC BY-SA 3.0
    Russian-PoetryCC BY-SA 4.0
    Russian-SynTagRusCC BY-NC-SA 4.0
    Russian-TaigaCC BY-SA 4.0
    Sanskrit-UFALCC BY-SA 4.0
    Sanskrit-VedicCC BY-SA 4.0
    Scottish_Gaelic-ARCOSGCC BY-SA 4.0
    Serbian-SETCC BY-SA 4.0
    Sinhala-STBCC BY-SA 4.0
    Skolt_Sami-GiellagasCC BY-SA 4.0
    Slovak-SNKCC BY-SA 4.0
    Slovenian-SSJCC BY-SA 4.0
    Slovenian-SSTCC BY-SA 4.0
    Soi-AHACC BY-SA 4.0
    South_Levantine_Arabic-MADARCC BY-SA 4.0
    Spanish-AnCoraCC BY 4.0
    Spanish-COSERCC BY-SA 4.0
    Spanish-GSDCC BY-SA 4.0
    Spanish-PUDCC BY-SA 3.0
    Spanish_Sign_Language-LSECC BY-SA 4.0
    Swedish-LinESCC BY-NC-SA 4.0
    Swedish-PUDCC BY-SA 4.0
    Swedish-TalbankenCC BY-SA 4.0
    Swedish_Sign_Language-SSLCCC BY-SA 4.0
    Swiss_German-UZHCC BY-SA 4.0
    Tagalog-TRGCC BY-SA 4.0
    Tagalog-UgnayanCC BY-NC-SA 4.0
    Tamil-MWTTCC BY-SA 4.0
    Tamil-TTBCC BY-NC-SA 3.0
    Tatar-NMCTTCC BY-SA 4.0
    Teko-TuDeTCC BY-SA 4.0
    Telugu-MTGCC BY-SA 4.0
    Telugu_English-TECTCC BY-SA 4.0
    Thai-PUDCC BY-SA 3.0
    Tswana-PopapoleloCC BY-SA 4.0
    Tupinamba-TuDeTCC BY-SA 4.0
    Turkish-AtisCC BY-SA 4.0
    Turkish-BOUNCC BY-SA 4.0
    Turkish-FrameNetCC BY-SA 4.0
    Turkish-GBCC BY-SA 4.0
    Turkish-IMSTCC BY-NC-SA 4.0
    Turkish-KenetCC BY-SA 4.0
    Turkish-PUDCC BY-SA 3.0
    Turkish-PennCC BY-SA 4.0
    Turkish-TourismCC BY-SA 4.0
    Turkish_German-SAGTCC BY-NC-SA 4.0
    Ukrainian-IUCC BY-NC-SA 4.0
    Ukrainian-ParlaMintCC BY-SA 4.0
    Umbrian-IKUVINACC BY-SA 4.0
    Upper_Sorbian-UFALCC BY-SA 4.0
    Urdu-UDTBCC BY-NC-SA 4.0
    Uyghur-UDTCC BY-SA 4.0
    Uzbek-UTCC BY-SA 4.0
    Veps-VWTCC BY-SA 4.0
    Vietnamese-TueCLCC BY-SA 4.0
    Vietnamese-VTBCC BY-SA 4.0
    Warlpiri-UFALCC BY-SA 4.0
    Welsh-CCGCC BY-SA 4.0
    Western_Armenian-ArmTDPCC BY-SA 4.0
    Western_Sierra_Puebla_Nahuatl-ITMLCC BY-SA 4.0
    Wolof-WTBCC BY-SA 4.0
    Xavante-XDTCC BY-SA 4.0
    Xibe-XDTCC BY-NC-SA 3.0
    Yakut-YKTDTCC BY-SA 4.0
    Yoruba-YTBCC BY-SA 4.0
    Yupik-SLICC BY-SA 4.0
    Zaar-AutogrammCC BY-SA 4.0
    + +

    Licenses

    + + + + + + + + + + + + + + + + + + + + + +
    LicenseURL
    C-UDA 1.0https://cdla.dev/computational-use-of-data-agreement-v1-0/
    CC BY 4.0http://creativecommons.org/licenses/by/4.0/
    CC BY-NC 4.0http://creativecommons.org/licenses/by-nc/4.0/
    CC BY-NC-ND 3.0http://creativecommons.org/licenses/by-nc-nd/3.0/
    CC BY-NC-ND 4.0http://creativecommons.org/licenses/by-nc-nd/4.0/
    CC BY-NC-SA 2.5http://creativecommons.org/licenses/by-nc-sa/2.5/
    CC BY-NC-SA 3.0http://creativecommons.org/licenses/by-nc-sa/3.0/
    CC BY-NC-SA 4.0http://creativecommons.org/licenses/by-nc-sa/4.0/
    CC BY-SA 3.0http://creativecommons.org/licenses/by-sa/3.0/
    CC BY-SA 4.0http://creativecommons.org/licenses/by-sa/4.0/
    CC0 1.0http://creativecommons.org/publicdomain/zero/1.0/
    GNU GPL 2.0http://opensource.org/licenses/GPL-2.0
    GNU GPL 3.0http://opensource.org/licenses/GPL-3.0
    LGPL-LRhttps://spdx.org/licenses/LGPLLR.html
    PDpublic domain
    +
    +
    diff --git a/src/static-files/license-ud-2.16.html b/src/static-files/license-ud-2.16.html new file mode 100644 index 00000000000..e6d43871bf6 --- /dev/null +++ b/src/static-files/license-ud-2.16.html @@ -0,0 +1,1333 @@ +
    +

    Universal Dependencies v2.16 License Agreement

    +
    + (2025/05/15) +
    +
    +
    +

    Universal Dependencies v2.16 License Terms

    +

    Universal Dependencies v2.16 (referred to as “UD” in the rest of this document) + is a collection of linguistic data and tools. Each of the treebanks has its own license terms + and you (the “User”) are responsible for complying with the license terms + applicable to those parts of UD which you use. If you do not agree with the license terms, + you must stop using UD and destroy all copies of UD data that you have obtained.

    +
    +

    You are specifically reminded that some of the treebanks + permit only non-commercial usage.

    +
    +

    The additional software tools are provided as-is (without any warranty) and are redistributed + under GNU GPL Version 3.

    +
    +

    The license for every treebank included in the release is specified in the appropriate + treebank directory.

    +
    + +

    Overview of the treebanks and their license terms

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TreebankLicense
    Abaza-ATBCC BY-SA 4.0
    Abkhaz-AbNCCC BY-SA 4.0
    Afrikaans-AfriBoomsCC BY-SA 4.0
    Akkadian-PISANDUBCC BY-SA 4.0
    Akkadian-RIAOCC BY-SA 3.0
    Akuntsu-TuDeTCC BY-SA 4.0
    Albanian-STAFCC BY-SA 4.0
    Albanian-TSACC BY-SA 4.0
    Alemannic-UZHCC BY-SA 4.0
    Amharic-ATTCC BY-SA 4.0
    Ancient_Greek-PROIELCC BY-NC-SA 3.0
    Ancient_Greek-PTNKCC BY-SA 4.0
    Ancient_Greek-PerseusCC BY-NC-SA 2.5
    Ancient_Hebrew-PTNKCC BY-NC 4.0
    Apurina-UFPACC BY-SA 4.0
    Arabic-NYUADCC BY-SA 4.0
    Arabic-PADTCC BY-NC-SA 3.0
    Arabic-PUDCC BY-SA 3.0
    Armenian-ArmTDPCC BY-SA 4.0
    Armenian-BSUTCC BY-SA 4.0
    Assyrian-ASCC BY-SA 4.0
    Azerbaijani-TueCLCC BY-SA 4.0
    Bambara-CRBCC BY-SA 4.0
    Basque-BDTCC BY-NC-SA 3.0
    Bavarian-MaiBaamCC BY-SA 4.0
    Beja-AutogrammCC BY-SA 4.0
    Belarusian-HSECC BY-SA 4.0
    Bengali-BRUCC BY-SA 4.0
    Bhojpuri-BHTBCC BY-SA 4.0
    Bokota-ChibErgISCC BY-SA 4.0
    Bororo-BDTCC BY-SA 4.0
    Breton-KEBCC BY-SA 4.0
    Bulgarian-BTBCC BY-NC-SA 3.0
    Buryat-BDTCC BY-SA 4.0
    Cantonese-HKCC BY-SA 4.0
    Cappadocian-AMGiCCC BY-SA 4.0
    Cappadocian-TueCLCC BY-SA 4.0
    Catalan-AnCoraCC BY 4.0
    Cebuano-GJACC BY-SA 4.0
    Chinese-BeginnerCC BY-NC-SA 3.0
    Chinese-CFLCC BY-SA 4.0
    Chinese-GSDCC BY-SA 4.0
    Chinese-GSDSimpCC BY-SA 4.0
    Chinese-HKCC BY-SA 4.0
    Chinese-PUDCC BY-SA 3.0
    Chinese-PatentCharCC BY-NC-SA 3.0
    Chukchi-HSECC BY-SA 4.0
    Classical_Armenian-CAVaLCC BY-NC-SA 4.0
    Classical_Chinese-KyotoPD
    Classical_Chinese-TueCLCC BY-SA 4.0
    Coptic-BohairicCC BY 4.0
    Coptic-ScriptoriumCC BY 4.0
    Croatian-SETCC BY-SA 4.0
    Czech-CACCC BY-SA 4.0
    Czech-CLTTCC BY-SA 4.0
    Czech-FicTreeCC BY-NC-SA 4.0
    Czech-PDTCCC BY-NC-SA 4.0
    Czech-PUDCC BY-SA 4.0
    Czech-PoetryCC BY-SA 4.0
    Danish-DDTCC BY-SA 4.0
    Dutch-AlpinoCC BY-SA 4.0
    Dutch-LassySmallCC BY-SA 4.0
    Egyptian-UJaenCC BY-SA 4.0
    English-AtisCC BY-SA 4.0
    English-CHILDESCC BY-SA 4.0
    English-CTeTexCC BY-SA 4.0
    English-ESLSpokCC BY-SA 4.0
    English-EWTCC BY-SA 4.0
    English-GENTLECC BY-NC-SA 4.0
    English-GUMCC BY-NC-SA 4.0
    English-GUMRedditCC BY 4.0
    English-LinESCC BY-NC-SA 4.0
    English-PUDCC BY-SA 3.0
    English-ParTUTCC BY-NC-SA 4.0
    English-PronounsCC BY-SA 4.0
    Erzya-JRCC BY-SA 4.0
    Esperanto-CairoCC BY-SA 4.0
    Esperanto-PragoCC BY-SA 4.0
    Estonian-EDTCC BY-NC-SA 4.0
    Estonian-EWTCC BY-NC-SA 4.0
    Faroese-FarPaHCCC BY-SA 4.0
    Faroese-OFTCC BY-SA 4.0
    Finnish-FTBCC BY 4.0
    Finnish-OODCC BY-SA 4.0
    Finnish-PUDCC BY-SA 4.0
    Finnish-TDTCC BY-SA 4.0
    French-ALTSCC BY-SA 4.0
    French-FQBLGPL-LR
    French-GSDCC BY-SA 4.0
    French-PUDCC BY-SA 3.0
    French-ParTUTCC BY-NC-SA 4.0
    French-ParisStoriesCC BY-SA 4.0
    French-RhapsodieCC BY-SA 4.0
    French-SequoiaLGPL-LR
    Frisian_Dutch-FameCC BY-SA 4.0
    Galician-CTGCC BY-NC-SA 3.0
    Galician-PUDCC BY-SA 4.0
    Galician-TreeGalLGPL-LR
    Georgian-GLCCC BY-SA 4.0
    Georgian-GNCCC BY-SA 4.0
    German-GSDCC BY-SA 4.0
    German-HDTCC BY-SA 4.0
    German-LITCC BY-NC-SA 4.0
    German-PUDCC BY-SA 3.0
    Gheg-GPSCC BY-SA 4.0
    Gothic-PROIELCC BY-NC-SA 3.0
    Greek-CretanCC BY-SA 4.0
    Greek-GDTCC BY-NC-SA 3.0
    Greek-GUDCC BY-SA 4.0
    Greek-LesbianCC BY-SA 4.0
    Guajajara-TuDeTCC BY-SA 4.0
    Guarani-OldTuDeTCC BY-SA 4.0
    Gujarati-GujTBCC BY-SA 4.0
    Gwichin-TueCLCC BY-SA 4.0
    Haitian_Creole-AdolpheCC BY-SA 4.0
    Haitian_Creole-AutogrammCC BY-SA 4.0
    Hausa-NorthernAutogrammCC BY-SA 4.0
    Hausa-SouthernAutogrammCC BY-SA 4.0
    Hebrew-HTBCC BY-NC-SA 4.0
    Hebrew-IAHLTknessetCC BY-SA 4.0
    Hebrew-IAHLTwikiCC BY-SA 4.0
    Highland_Puebla_Nahuatl-ITMLCC BY-SA 4.0
    Hindi-HDTBCC BY-NC-SA 4.0
    Hindi-PUDCC BY-SA 3.0
    Hittite-HitTBCC BY-SA 4.0
    Hungarian-SzegedCC BY-NC-SA 3.0
    Icelandic-GCCC BY-SA 4.0
    Icelandic-IcePaHCCC BY-SA 4.0
    Icelandic-ModernCC BY-SA 4.0
    Icelandic-PUDCC BY-SA 4.0
    Ika-ChibErgISCC BY-SA 4.0
    Indonesian-CSUICC BY-SA 4.0
    Indonesian-GSDCC BY-SA 4.0
    Indonesian-PUDCC BY-SA 3.0
    Irish-CadhanCC BY-SA 4.0
    Irish-IDTCC BY-SA 3.0
    Irish-TwittIrishCC BY-SA 4.0
    Italian-ISDTCC BY-NC-SA 3.0
    Italian-MarkITCC BY 4.0
    Italian-OldCC BY-SA 4.0
    Italian-PUDCC BY-SA 3.0
    Italian-ParTUTCC BY-NC-SA 4.0
    Italian-ParlaMintCC BY-SA 4.0
    Italian-PoSTWITACC BY-NC-SA 4.0
    Italian-TWITTIROCC BY-SA 4.0
    Italian-VITCC BY-NC-SA 3.0
    Italian-ValicoCC BY-SA 4.0
    Japanese-BCCWJCC BY-NC-SA 4.0
    Japanese-BCCWJLUWCC BY-NC-SA 4.0
    Japanese-GSDCC BY-SA 4.0
    Japanese-GSDLUWCC BY-SA 4.0
    Japanese-PUDCC BY-SA 3.0
    Japanese-PUDLUWCC BY-SA 3.0
    Javanese-CSUICC BY-SA 4.0
    Kaapor-TuDeTCC BY-SA 4.0
    Kangri-KDTBCC BY-SA 4.0
    Karelian-KKPPCC BY-SA 4.0
    Karo-TuDeTCC BY-SA 4.0
    Kazakh-KTBCC BY-SA 4.0
    Khoekhoe-KDTCC BY-SA 4.0
    Khunsari-AHACC BY-SA 4.0
    Kiche-IUCC BY-SA 4.0
    Komi_Permyak-UHCC BY-SA 4.0
    Komi_Zyrian-IKDPCC BY-SA 4.0
    Komi_Zyrian-LatticeCC BY-SA 4.0
    Korean-GSDCC BY-SA 4.0
    Korean-KSLCC BY-SA 4.0
    Korean-KaistCC BY-SA 4.0
    Korean-LittlePrinceCC BY-SA 4.0
    Korean-PUDCC BY-SA 3.0
    Kurmanji-MGCC BY-SA 4.0
    Kyrgyz-KTMUCC BY-SA 4.0
    Kyrgyz-TueCLCC BY-SA 4.0
    Latgalian-CairoCC BY-SA 4.0
    Latin-CIRCSECC BY-SA 4.0
    Latin-ITTBCC BY-NC-SA 3.0
    Latin-LLCTCC BY-SA 4.0
    Latin-PROIELCC BY-NC-SA 3.0
    Latin-PerseusCC BY-NC-SA 2.5
    Latin-UDanteCC BY-NC-SA 3.0
    Latvian-CairoCC BY-SA 4.0
    Latvian-LVTBCC BY-SA 4.0
    Ligurian-GLTC-UDA 1.0
    Lithuanian-ALKSNISCC BY-SA 4.0
    Lithuanian-HSECC BY-SA 4.0
    Livvi-KKPPCC BY-SA 4.0
    Low_Saxon-LSDCCC BY-SA 4.0
    Luxembourgish-LuxBankCC BY-SA 4.0
    Macedonian-MTBCC BY-SA 4.0
    Madi-JarawaraCC BY-SA 4.0
    Maghrebi_Arabic_French-ArabiziCC BY-SA 4.0
    Makurap-TuDeTCC BY-SA 4.0
    Malayalam-UFALCC BY-SA 4.0
    Maltese-MUDTCC BY-SA 4.0
    Manx-CadhanCC BY-SA 4.0
    Marathi-UFALCC BY-SA 4.0
    Mbya_Guarani-DooleyCC BY-NC-SA 4.0
    Mbya_Guarani-ThomasCC BY-NC-SA 4.0
    Middle_French-PROFITEROLECC BY-NC-SA 4.0
    Moksha-JRCC BY-SA 4.0
    Munduruku-TuDeTCC BY-SA 4.0
    Naga-SuansuCC BY-SA 4.0
    Naija-NSCCC BY-SA 4.0
    Nayini-AHACC BY-SA 4.0
    Neapolitan-RBCC BY-SA 4.0
    Nenets-TundraCC BY-SA 4.0
    Nheengatu-CompLinCC BY-NC-SA 4.0
    North_Sami-GiellaCC BY-SA 4.0
    Northwest_Gbaya-AutogrammCC BY-SA 4.0
    Norwegian-BokmaalCC BY-SA 4.0
    Norwegian-NynorskCC BY-SA 4.0
    Occitan-CorAGCC BY-SA 4.0
    Occitan-TTBCC BY-NC-SA 4.0
    Odia-ODTBCC BY-SA 4.0
    Old_Church_Slavonic-PROIELCC BY-NC-SA 4.0
    Old_East_Slavic-BirchbarkCC BY-SA 4.0
    Old_East_Slavic-RNCCC BY-SA 4.0
    Old_East_Slavic-RuthenianCC BY-SA 4.0
    Old_East_Slavic-TOROTCC BY-NC-SA 4.0
    Old_English-CairoCC BY-SA 4.0
    Old_French-PROFITEROLECC BY-NC-SA 3.0
    Old_Irish-DipSGGCC BY-NC-SA 4.0
    Old_Irish-DipWBGCC BY-SA 4.0
    Old_Turkish-ClausalCC0 1.0
    Ottoman_Turkish-BOUNCC BY-SA 4.0
    Ottoman_Turkish-DUDUCC BY-SA 4.0
    Pashto-SikaramCC BY-SA 4.0
    Paumari-TueCLCC BY-SA 4.0
    Persian-PerDTCC BY-SA 4.0
    Persian-SerajiCC BY-SA 4.0
    Pesh-ChibErgISCC BY-SA 4.0
    Phrygian-KULCC BY-SA 4.0
    Polish-LFGGNU GPL 3.0
    Polish-PDBCC BY-NC-SA 4.0
    Polish-PUDCC BY-SA 4.0
    Pomak-PhilotisCC BY-NC-SA 3.0
    Portuguese-BosqueCC BY-SA 4.0
    Portuguese-CINTILCC BY-NC-ND 4.0
    Portuguese-DANTEStocksCC BY 4.0
    Portuguese-GSDCC BY-SA 4.0
    Portuguese-PUDCC BY-SA 3.0
    Portuguese-PetroGoldCC BY-SA 4.0
    Portuguese-PorttinariCC BY 4.0
    Romanian-ArTCC BY-SA 4.0
    Romanian-NonstandardCC BY-SA 4.0
    Romanian-RRTCC BY-SA 4.0
    Romanian-SiMoNERoCC BY-SA 4.0
    Romanian-TueCLCC BY-SA 4.0
    Russian-GSDCC BY-SA 4.0
    Russian-PUDCC BY-SA 3.0
    Russian-PoetryCC BY-SA 4.0
    Russian-SynTagRusCC BY-NC-SA 4.0
    Russian-TaigaCC BY-SA 4.0
    Sanskrit-UFALCC BY-SA 4.0
    Sanskrit-VedicCC BY-SA 4.0
    Scottish_Gaelic-ARCOSGCC BY-SA 4.0
    Serbian-SETCC BY-SA 4.0
    Sindhi-IsraCC BY-SA 4.0
    Sinhala-STBCC BY-SA 4.0
    Skolt_Sami-GiellagasCC BY-SA 4.0
    Slovak-SNKCC BY-SA 4.0
    Slovenian-SSJCC BY-SA 4.0
    Slovenian-SSTCC BY-SA 4.0
    Soi-AHACC BY-SA 4.0
    South_Levantine_Arabic-MADARCC BY-SA 4.0
    Spanish-AnCoraCC BY 4.0
    Spanish-COSERCC BY-SA 4.0
    Spanish-GSDCC BY-SA 4.0
    Spanish-PUDCC BY-SA 3.0
    Spanish_Sign_Language-LSECC BY-SA 4.0
    Swedish-LinESCC BY-NC-SA 4.0
    Swedish-PUDCC BY-SA 4.0
    Swedish-TalbankenCC BY-SA 4.0
    Swedish_Sign_Language-SSLCCC BY-SA 4.0
    Tagalog-TRGCC BY-SA 4.0
    Tagalog-UgnayanCC BY-NC-SA 4.0
    Tamil-MWTTCC BY-SA 4.0
    Tamil-TTBCC BY-NC-SA 3.0
    Tatar-NMCTTCC BY-SA 4.0
    Teko-TuDeTCC BY-SA 4.0
    Telugu-MTGCC BY-SA 4.0
    Telugu_English-TECTCC BY-SA 4.0
    Thai-PUDCC BY-SA 3.0
    Tswana-PopapoleloCC BY-SA 4.0
    Tupinamba-TuDeTCC BY-SA 4.0
    Turkish-AtisCC BY-SA 4.0
    Turkish-BOUNCC BY-SA 4.0
    Turkish-FrameNetCC BY-SA 4.0
    Turkish-GBCC BY-SA 4.0
    Turkish-IMSTCC BY-NC-SA 4.0
    Turkish-KenetCC BY-SA 4.0
    Turkish-PUDCC BY-SA 3.0
    Turkish-PennCC BY-SA 4.0
    Turkish-TourismCC BY-SA 4.0
    Turkish-TueCLCC BY-SA 4.0
    Turkish_English-BUTRCC BY-SA 4.0
    Turkish_German-SAGTCC BY-NC-SA 4.0
    Ukrainian-IUCC BY-NC-SA 4.0
    Ukrainian-ParlaMintCC BY-SA 4.0
    Umbrian-IKUVINACC BY-SA 4.0
    Upper_Sorbian-UFALCC BY-SA 4.0
    Urdu-UDTBCC BY-NC-SA 4.0
    Uyghur-UDTCC BY-SA 4.0
    Uzbek-TueCLCC BY-SA 4.0
    Uzbek-UTCC BY-SA 4.0
    Veps-VWTCC BY-SA 4.0
    Vietnamese-TueCLCC BY-SA 4.0
    Vietnamese-VTBCC BY-SA 4.0
    Warlpiri-UFALCC BY-SA 4.0
    Welsh-CCGCC BY-SA 4.0
    Western_Armenian-ArmTDPCC BY-SA 4.0
    Western_Sierra_Puebla_Nahuatl-ITMLCC BY-SA 4.0
    Wolof-WTBCC BY-SA 4.0
    Xavante-XDTCC BY-SA 4.0
    Xibe-XDTCC BY-NC-SA 3.0
    Yakut-YKTDTCC BY-SA 4.0
    Yoruba-YTBCC BY-SA 4.0
    Yupik-SLICC BY-SA 4.0
    Zaar-AutogrammCC BY-SA 4.0
    + +

    Licenses

    + + + + + + + + + + + + + + + + + + + + +
    LicenseURL
    C-UDA 1.0https://cdla.dev/computational-use-of-data-agreement-v1-0/
    CC BY 4.0http://creativecommons.org/licenses/by/4.0/
    CC BY-NC 4.0http://creativecommons.org/licenses/by-nc/4.0/
    CC BY-NC-ND 3.0http://creativecommons.org/licenses/by-nc-nd/3.0/
    CC BY-NC-ND 4.0http://creativecommons.org/licenses/by-nc-nd/4.0/
    CC BY-NC-SA 2.5http://creativecommons.org/licenses/by-nc-sa/2.5/
    CC BY-NC-SA 3.0http://creativecommons.org/licenses/by-nc-sa/3.0/
    CC BY-NC-SA 4.0http://creativecommons.org/licenses/by-nc-sa/4.0/
    CC BY-SA 3.0http://creativecommons.org/licenses/by-sa/3.0/
    CC BY-SA 4.0http://creativecommons.org/licenses/by-sa/4.0/
    CC0 1.0http://creativecommons.org/publicdomain/zero/1.0/
    GNU GPL 3.0http://opensource.org/licenses/GPL-3.0
    LGPL-LRhttps://spdx.org/licenses/LGPLLR.html
    PDpublic domain
    +
    +
    diff --git a/src/static-files/license-umr-2.0.html b/src/static-files/license-umr-2.0.html new file mode 100644 index 00000000000..8f745886992 --- /dev/null +++ b/src/static-files/license-umr-2.0.html @@ -0,0 +1,75 @@ +
    +

    Uniform Meaning Representation v2.0 License Agreement

    +
    + (2024/12/23) +
    +
    +
    +

    Uniform Meaning Representation v2.0 License Terms

    +

    Uniform Meaning Representation v2.0 (referred to as “UMR” in the rest of this document) + is a collection of linguistic data. Each of the graphbanks has its own license terms + and you (the “User”) are responsible for complying with the license terms + applicable to those parts of UMR which you use. If you do not agree with the license terms, + you must stop using UMR and destroy all copies of UMR data that you have obtained.

    +
    +

    You are specifically reminded that some of the graphbanks + permit only non-commercial usage.

    +
    +

    The license for every graphbank included in the release is specified in the appropriate + graphbank directory.

    +
    + +

    Overview of the graphbanks and their license terms

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GraphbankLicense
    Arapaho-UMRCC BY-NC-ND 4.0
    Chinese-UMRCC BY-NC-ND 4.0
    Czech-UMRCC BY-NC-SA 4.0
    English-UMRCC BY-SA 4.0
    Kukama-UMRCC BY-NC-ND 4.0
    Latin-UMRCC BY-NC-SA 4.0
    Navajo-UMRCC BY-NC-ND 4.0
    Sanapana-UMRCC BY-NC-ND 4.0
    + +

    Licenses

    + + + + + + + + + +
    LicenseURL
    CC BY-NC-ND 4.0http://creativecommons.org/licenses/by-nc-nd/4.0/
    CC BY-NC-SA 4.0http://creativecommons.org/licenses/by-nc-sa/4.0/
    CC BY-SA 4.0http://creativecommons.org/licenses/by-sa/4.0/
    +
    +
    diff --git a/src/themes/dspace/app/header/header.component.html b/src/themes/dspace/app/header/header.component.html index ac7d8326859..d73f926ef72 100644 --- a/src/themes/dspace/app/header/header.component.html +++ b/src/themes/dspace/app/header/header.component.html @@ -1,7 +1,7 @@

-
From 7d93d5e69a56d7a3146ecee3cab731cb3dff4d81 Mon Sep 17 00:00:00 2001 From: milanmajchrak <90026355+milanmajchrak@users.noreply.github.com> Date: Tue, 17 Jun 2025 17:35:00 +0200 Subject: [PATCH 27/44] UFAL/Publisher search redirect not work #880 --- .../clarin-item-box-view.component.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/app/shared/clarin-item-box-view/clarin-item-box-view.component.ts b/src/app/shared/clarin-item-box-view/clarin-item-box-view.component.ts index 687ee86dfdd..120f07fcc9c 100644 --- a/src/app/shared/clarin-item-box-view/clarin-item-box-view.component.ts +++ b/src/app/shared/clarin-item-box-view/clarin-item-box-view.component.ts @@ -147,16 +147,21 @@ export class ClarinItemBoxViewComponent implements OnInit { this.itemUri = getItemPageRoute(this.item); this.itemDescription = this.item?.firstMetadataValue('dc.description'); this.itemPublisher = this.item?.firstMetadataValue('dc.publisher'); - this.publisherRedirectLink = this.baseUrl + '/search?f.publisher=' + encodeURIComponent(this.itemPublisher) - + ',equals'; this.itemDate = this.clarinDateService.composeItemDate(this.item); await this.assignBaseUrl(); + this.publisherRedirectLink = this.getSearchEndpoint() + '?f.publisher=' + encodeURIComponent(this.itemPublisher) + + ',equals'; this.getItemCommunity(); this.loadItemLicense(); this.getItemFilesSize(); } + private getSearchEndpoint(): string { + // Return the search endpoint URL for with the base URL. Remove trailing slashes to ensure a clean URL. + return this.baseUrl.replace(/\/+$/, '') + '/search'; + } + private getItemFilesSize() { if (isNull(this.item)) { return; @@ -193,8 +198,7 @@ export class ClarinItemBoxViewComponent implements OnInit { .pipe(getFirstSucceededRemoteDataPayload()) .subscribe((community: Community) => { this.itemCommunity.next(community); - const encodedRedirectLink = this.baseUrl + - '/search?f.items_owning_community=' + encodeURIComponent(this.dsoNameService.getName(community)) + ',equals'; + const encodedRedirectLink = this.getSearchEndpoint() + '?f.items_owning_community=' + encodeURIComponent(this.dsoNameService.getName(community)) + ',equals'; this.communitySearchRedirect.next(encodedRedirectLink); }); }); From c99c834a051b94da87c6ec781c309ed39fe94c3b Mon Sep 17 00:00:00 2001 From: jurinecko <95219754+jr-rk@users.noreply.github.com> Date: Fri, 20 Jun 2025 13:48:40 +0200 Subject: [PATCH 28/44] UFAL/License Administration Labels & Required Info checkboxes should work properly (#881) * hotfix - finding index of unchecked box properly to formName arg --- .../define-license-form.component.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/app/clarin-licenses/clarin-license-table/modal/define-license-form/define-license-form.component.ts b/src/app/clarin-licenses/clarin-license-table/modal/define-license-form/define-license-form.component.ts index 89caeb72f2c..c8353b11f9e 100644 --- a/src/app/clarin-licenses/clarin-license-table/modal/define-license-form/define-license-form.component.ts +++ b/src/app/clarin-licenses/clarin-license-table/modal/define-license-form/define-license-form.component.ts @@ -169,8 +169,17 @@ export class DefineLicenseFormComponent implements OnInit { if (event.target.checked) { form.push(checkBoxValue); } else { - let index = form.findIndex(item => item.id === checkBoxValue.id); - form.splice(index, 1); + // Required Info needs to be checked by some other property, because id is glitching + const index = form.findIndex(item => + item && ( + formName === 'requiredInfo' + ? item.name === checkBoxValue.name + : checkBoxValue.id === item.id) + ); + + if (index !== -1) { + form.splice(index, 1); + } } } From 7c9405f520438c845308b735dd54971e4c276c9d Mon Sep 17 00:00:00 2001 From: jurinecko <95219754+jr-rk@users.noreply.github.com> Date: Fri, 20 Jun 2025 16:50:21 +0200 Subject: [PATCH 29/44] UFAL/Searching problems in Manage Handles table (#882) * locked searchbar when searchOption is not picked * edited Resource Type search option to not be case-sensitive * edited Resource Type search option to show nothing when there is no match * try to set lowercase constants without toLowerCase method * Added full list of handles for empty Resource Type search option * refactored empty searchQueries handling and added comment for invalid resourcetype search inputs --- .../handle-table/handle-table.component.html | 3 +- .../handle-table/handle-table.component.ts | 73 ++++++++++--------- src/assets/i18n/cs.json5 | 2 +- src/assets/i18n/en.json5 | 2 +- 4 files changed, 43 insertions(+), 37 deletions(-) diff --git a/src/app/handle-page/handle-table/handle-table.component.html b/src/app/handle-page/handle-table/handle-table.component.html index fe9c49bf7f4..7eb92d78e65 100644 --- a/src/app/handle-page/handle-table/handle-table.component.html +++ b/src/app/handle-page/handle-table/handle-table.component.html @@ -21,7 +21,8 @@
{{ 'handle-table.title' | translate }}
+ [(ngModel)]="searchQuery" + [disabled]="!searchOption"> diff --git a/src/app/handle-page/handle-table/handle-table.component.ts b/src/app/handle-page/handle-table/handle-table.component.ts index 4aed5177cd5..2c86e160e0c 100644 --- a/src/app/handle-page/handle-table/handle-table.component.ts +++ b/src/app/handle-page/handle-table/handle-table.component.ts @@ -373,40 +373,45 @@ export class HandleTableComponent implements OnInit { // parse searchQuery for the server request // the new sorting query is in the format e.g. `handle:123456`, `resourceTypeId:2`, `url:internal` let parsedSearchOption = ''; - let parsedSearchQuery = this.searchQuery; - switch (this.searchOption) { - case this.handleOption: - parsedSearchOption = HANDLE_SEARCH_OPTION; - break; - case this.internalOption: - // if the handle doesn't have the URL - is internal, if it does - is external - parsedSearchOption = URL_SEARCH_OPTION; - if (this.searchQuery.toLowerCase() === 'yes') { - parsedSearchQuery = 'internal'; - } else if (this.searchQuery.toLowerCase() === 'no') { - parsedSearchQuery = 'external'; - } - break; - case this.resourceTypeOption: - parsedSearchOption = RESOURCE_TYPE_SEARCH_OPTION; - // parse resourceType from string to the number because the resourceType is integer on the server - switch (this.searchQuery) { - case ITEM: - parsedSearchQuery = '' + 2; - break; - case COLLECTION: - parsedSearchQuery = '' + 3; - break; - case COMMUNITY: - parsedSearchQuery = '' + 4; - break; - case SITE: - parsedSearchQuery = '' + 5; - } - break; - default: - parsedSearchOption = ''; - break; + let parsedSearchQuery = ''; + if (this.searchQuery) { + parsedSearchQuery = this.searchQuery; + switch (this.searchOption) { + case this.handleOption: + parsedSearchOption = HANDLE_SEARCH_OPTION; + break; + case this.internalOption: + // if the handle doesn't have the URL - is internal, if it does - is external + parsedSearchOption = URL_SEARCH_OPTION; + if (this.searchQuery.toLowerCase() === 'yes') { + parsedSearchQuery = 'internal'; + } else if (this.searchQuery.toLowerCase() === 'no') { + parsedSearchQuery = 'external'; + } + break; + case this.resourceTypeOption: + parsedSearchOption = RESOURCE_TYPE_SEARCH_OPTION; + // parse resourceType from string to the number because the resourceType is integer on the server + switch (this.searchQuery.toLowerCase()) { + case ITEM.toLowerCase(): + parsedSearchQuery = '' + 2; + break; + case COLLECTION.toLowerCase(): + parsedSearchQuery = '' + 3; + break; + case COMMUNITY.toLowerCase(): + parsedSearchQuery = '' + 4; + break; + case SITE.toLowerCase(): + parsedSearchQuery = '' + 5; + break; + // no results for invalid search inputs + default: + parsedSearchQuery = '' + -1; + break; + } + break; + } } this.sortConfiguration.field = parsedSearchOption + ':' + parsedSearchQuery; diff --git a/src/assets/i18n/cs.json5 b/src/assets/i18n/cs.json5 index 4eec3150fcc..77766d61c2a 100644 --- a/src/assets/i18n/cs.json5 +++ b/src/assets/i18n/cs.json5 @@ -2469,7 +2469,7 @@ // "handle-table.table.handle": "Handle", "handle-table.table.handle": "Handle", // "handle-table.table.internal": "Internal", - "handle-table.table.internal": "Interní", + "handle-table.table.internal": "Je interní", // "handle-table.table.is-internal": "Yes", "handle-table.table.is-internal": "Ano", // "handle-table.table.not-internal": "No", diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 59b75e666cb..05d19d89105 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -2029,7 +2029,7 @@ "handle-table.table.handle": "Handle", - "handle-table.table.internal": "Internal", + "handle-table.table.internal": "Is Internal", "handle-table.table.is-internal": "Yes", From 96fa9f6c56590684161a3af7288a155ff7334a27 Mon Sep 17 00:00:00 2001 From: milanmajchrak <90026355+milanmajchrak@users.noreply.github.com> Date: Thu, 10 Jul 2025 16:36:08 +0200 Subject: [PATCH 30/44] New Release merge - 2025/July/10 (#912) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Removed dynamic overflow because every content must be scrollable.. (#716) * add tar for preview (#713) * add tar for preview * UFAL/Enhanced type-bind feature (#714) * The type-bind is loaded from the cfg and correctly rendered * Done some refactoring * Update tests following the type-bind enhancement * Fixed linting error. * Removed unwanted changes and fixed wrong refactored code. * Updated error message when tests failed * Update README.md * UFAL/Show sesznam license on approval page (#722) * Added static files from the SEZNAM license. * Refactored fetching html content from the static files. The logic was moved into the common service. * Show Seznam static license on approval page. * Updated constant name LICENSE_NAME_SEZNAM - added the _CZ to make it more clear that is Czech license * UFAL/share submission by email (#720) * Added share submission button into workspaceitem actions page. * Added notification about the success of the sharing the submission. * Created share submission module, page with routing. That page could access only the administrator. * WIP - created a new page `change-submitter-page`. * Created page when the user could take the workspace item as its own. * Pretified the code and added some docs * Updated tests following the new feature * Fixed unwanted changes, updated docs * UFAL/Autocomplete enhancement (#718) * Added support for searching results from specific solr indexes. Updated autocomplete component to search values from custom solr index. The autocomplete component could have attribute for resolving the custom index from the submission-forms definition. * Show suggestions for `solr-handle_title_ac` and `solr-subject_ac` * Fixed tests * Formatted language suggestions, added docs and fixed tests. * Refactored the code following the review requirements. * Fixed type in the word pretify * UFAL/License page - wrong layout in Firefox (#721) * Removed flex class and used width style instead of col * Removed unsued class * Changed style in the html into classes * Migrated Vanilla cs messages into clarin 7.6.1. cs messages (#669) * Migrated Vanilla cs messages into clarin 7.6.1. cs messages * updated translation * Updated cs localization for subcommunities and subcollections * Changed `prispeveku` to `prispevku` * Updated messages for the 'supervised' and 'claim' sentenses --------- Co-authored-by: Ondrej Kosarko * UFAL/Share submission with user not only admin (#728) * The submitter information cannot be displayed in some cases, but show a few information about the Item * Added missing trailing comma * Fixed docs * Updated messages following last commit to upstream. (#731) * Updated dspace prefix to lindat (#734) * Added notification when the shibboleth authentication is failed (#732) * Removed two IT: (#737) 1. Author does not have a two input fields. 2. Test for checking the notice step will be transformed into UI test, because we do not want to keep such specific collection for generic IT. * Update all static licenses (#726) * added licenses from ufal commit dcbe87e02931dee78b13c4b3995a6cef3aeacd32 * added missing static licenses * remove static from licenses path * no_static_ as const * checkstyle * Use NAMESPACES from the .env (#727) * Use NAMESPACES from the .env * Created symbolic link for the tomcat folder * Updated docker compose files - can load more properties from the `.env` * Update deploy.yml to increase timeout (#738) Because some tests were canceled during processing. * Use only 4000, not the {UI_PORT} from the .env because in the container it is always 4000 (#740) * Update docker-compose-rest.yml Uncommented /repository/ namespace in the docker-compose.yml. It is only for one deploy. * Update docker-compose-rest.yml Undo exposing server on the /repository/ path * Use only / and /server namespaces, not the values from the .env because in the container it is always `/` and `/server` (#741) * Expose tomcat `/server` on `/repository/server` * Take a customized docker-compose-rest.yml which exposes the server on /repository/server * Updated a path to take right docker-compose files * Undo using only default namespaced `/` and `/server` * Use custom `docker-compose.yml` from the testing server * UFAL/Shibboleth fixed wrong redirect after login with verification token (#733) * Used hardredirect instead of the standard router.redirect because the user could be stucked on the loading page * Added doc why * Added missing whitespace * Use path `./assets` instead of `/assets` (#742) * new download instruction for cmd using zip from backend (#739) * Get UI base URL from BE (#744) * Check that the custom type bind field in configured in the `submission-forms` when it is configured in the cfg property (#745) * Searching by type is changed to 'type' instead of 'itemtype' because it was changed in the autocomplete enhnancement (#749) * Use `autoLogin` method (#747) * UFAL/Matomo statistics using angulartics2 (#748) * Modified matomo tracking in footer component * Do not use routerless Matomo because we want to track view on every page redirect * The Matomo statistics are tracked properly. * Prettyfied the code * Fix linting error * Fixed unit tests following the matomo statistics update * Fixed linting error * Added a document title in the footer * Added category to the eventTrack because it is required for the Matomo. * Refactored using matomo statistics - added into browser init service, because the Matomo statistics wasn't rendered on production * Changed matomo-settings location --------- Co-authored-by: Matus Kasak * Update db-import action Try a commit when the import worked. * Update import-db action - use main branch * Added a translation for the searching filter `subjectFirstValue` (redirect from home page). (#752) * Ensure the redirect URL starts with a slash (#753) * Added volume into docker-compose (#754) * UFAL/Load the matomo configuration from the environment (#755) * Added volume into docker-compose * Take a matomo configuration from the environment * Fetch the matomo properties from the config, not from the environment (#756) * Load the szn license in oninit method (#757) * UFAL/Temporary fix for the type-bind. The form automatically refreshes after the type is changed. (#761) * The Save action is automatically dispatched when the type is changed * Updated the handleFormSave method name to `dispatchFormSaveAndReinitialize` * Added missing function to mock object * Execute autoregistration component only in client side (#762) * The Autocomplete Component is dynamically loaded as a standalone component only in the browser using the Loader component. (#763) * UFAL/footer header images (#760) * Footer images upload to assets/images/footer/ and change of images src attributes * Changed src paths to start with ./ --------- Co-authored-by: Juraj Roka * ufal/customize the footer (#759) * Footer details update by Lindat live instance's footer * Copied UI tests fix from the dtq-dev --------- Co-authored-by: Juraj Roka Co-authored-by: milanmajchrak * Copied fixes from the lindat branch (#770) * Copied PR 769 * Used root URL to compose download URL with namespace (#768) * Cherry-picked docker compose rest * The dtq-dev is run on /repository branch * Waiting for the http://dev-5.pc:8$INSTANCE/server/api changed to http://dev-5.pc:8$INSTANCE/repository/server/api * Added `repository` namespace to discojuice * Run UI integration tests every hour * Update actions/upload-artifact@v3 to v4 Because it was deprecated and UI tests cannot be run * Run build CRON every 4 hours * Update deploy.yml - changed runner * Update deploy.yml - updated runner everywhere * Update deploy.yml - use `dspace-dep-1` runner again * Fixed failing Integration tests (#773) * Commented out sometimes failing accessibility tests and added wait method to the submission ui test * Cherry picked fix for unique artifact name. --------- Co-authored-by: Tim Donohue * Update import action.yml - use `/repository` namespace in the import action * Merge pull request #2694 from hutattedonmyarm/dspace-7_x (#777) [Port dspace-7_x] Enable type-bind for checkbox inputs during submission Co-authored-by: Tim Donohue * Update build.yml - added a option to manually run build action * save logs * missing $ * print log file name for check * removed superfluous space * renamed log file -> added 'log' at the end of the name * Ufal/License issues (#779) * Fixed pagination when searching licenses by the name. * Fixed Editing license: 1. wrong checked checkboxes for the required info and extended license labels and removed errors from the console. * Update action.yml - defined log_file * Update action.yml - log import into a specific path * Update action.yml - continuously copy logs from the import into another file * Update action.yml - import logging - show path info * Update action.yml - log import - copy logs after they are created * Update action.yml - Start appending when the first file is added to the __logs folder * Added a new workflow which runs a build workflow in every customer * Fixed copying of the import logs to the dev machine (#786) * The copying of the import logs are not creating a new `tail` job every 2s * Call the import every week (#787) * UFAL/Use namespace in the redirect URL (#794) * Use current activated route as a parameter to the `createUrlTree` to compose correct redirect url (#796) * UFAL/Fixed CMD download command - added name (#798) * UFAL/Fixed editing the license - required info is removed/added following the checked checkbox Co-authored-by: Juraj Roka * UFAL/Copy the refbox content correctly (#801) * Copy the refbox content correctly * Added missing parts of the modal * UFAL/The current version redirect - get the base href using the DOCUMENT (#800) * Get the base href using the DOCUMENT * UFAL/Start the handle server before tomca * Sync with ufal main (#799) * Merge pull request #7 from uib-ub/fix-warnings Address warnings in dockerfiles and composer files * Show resource id (not handle id) in manage handles (ufal/dspace-angular#22) * show the resourceId in handle-table * show the resourceId and handle id in edit-handle --------- Co-authored-by: Marvin * use i18n --------- Co-authored-by: Marvin * UFAL/Edit item - fixed license redirect Co-authored-by: Juraj Roka * Add custom dimension (handle) to pageTrack of matomo (#823) * Add custom dimension (handle) to pageTrack of matomo This extends/overrides the pageTrack/eventTrack methods of angulartics matomo plugin and hooks into the event tracking (view-tracker.component) that's there for DSpace internal statistics. * Fix linting issues and PR review comments * Fix tests - misconfigured test env * UFAL/Change menu options redirects (#816) * Change menu options redirects * Fix some menu options redirects by Coderabbit's nitpick comments * Adding cs/en by current language and translating slugs in About-menu * Unit tests - Edit of component.spec file * Typos in comments * UFAL/Preview - fixed loading files (#825) * Show loading icon when loading the files with a asking to contant the administrator when it took so long * The (listOfFiles | async) could be null add a `?` check after it. * UFAL/Handle table issues - Fixed table responsivity and searching (#822) * Fixed table responsivity and searching * Move `table-responsive` to div because it ensures more consistent responsiveness across browsers * Use `combineLatest` because it is more common for RxJS, refactor if condition * UFAL/Redirect to `/lindat` after clicking on the Lindat icon in the home page (#828) * Redirect to `/lindat` after clicking on the Lindat icon in the home page * Update deploy.yml - use correct deploy action for the weekly import * UFAL/Menu options links edit (#832) * Changed the getLangCodeIfCzech links * Changed the dropdown-menu and services links * Ufal dtq sync (#836) * Creating docker-compose file useful for building clarin-dspace on MAC computers (cherry picked from commit 7de4761ed360b9ab3d67e35e42263b7aa6bfea54) * Add link to communities and collections on home page (cherry picked from commit 4673e39bffd4af265337057bc2bdae45e5e63f2e) --------- Co-authored-by: Milan Kuchtiak * UFAL/Updated the no file preview message and refactored some code (#837) * Updated the no file preview message and refactored some code. * Added a non null check when accessing the object properties and the message is refactored. * Run Python import weekly * UFAL/Added spacing between clarin & dspace logo (#848) * Added spacing between clarin & dspace logo * Spacing is prettier and when clarin logo is removed, dspace logo is centered * Ufal/seznam license request (#844) * Fix of unwanted Seznam Dataset License request while using other licenses * ZCU-PUB/Fixed encoding of the filename from the URL (#838) (#851) * Added an URL serializer to fix encoding of the special characters from the URL e.g., `[`, `(` because the filename wasn't properly parsed * Added some unit tests for encoding the bitstream filename url * UFAL/Do not mount the Solr configs; copy them each time instead. (#850) * UFAL/Fix the bulk access (#852) * Do not use the clarin item view box for the bulk access * Removed unused import * Clarify the `showClarinViewBox` is boolean * Use the constant for the hardcoded bulk access list id * Ufal dtq sync 2025 05 14 (#855) * Create Acknowledgment-ReadMe.md Acnkowledgment of NRP project (cherry picked from commit ad889b25549290c857b14abca73afc27a6463f8f) * Video files previews This uses the thumbnail as poster (if available) and correctly sets the source of the video currently only works for anonymously accessible files. (cherry picked from commit 4832c2f2661baa00326311aa39198a66b4bc811c) * Handle video previews for restricted items append a shortlived token at the right time (error, seeking, stalled) (cherry picked from commit 2c12d7d142a60a4be0a99b77df5cd4dc7d49d455) * Display only ORIGINAL bitstreams Thumbnails, when available, should be shown istead of the generic MIME_TYPE_IMAGE. Content of the TEXT bundle should not be shown at all this is usually automatically extracted "text layer" of a PDF, useful for indexing, but don't want people downloading it. (cherry picked from commit 3862442f003a2f568fbc652322d237c90ece1905) * fix linter and test errors (cherry picked from commit f85209673074972c822645ca309f682cc43b6cf7) * Code review follow up the listOfFiles should really not contain files from "TEXT" or "THUMBNAIL" bundles. * code review unsubscribe error$, seeking$ and $stalled * code review - thumbnail might be undefined * code review - consistent formatting * UFAL/Do not add `dtoken` into the URL if it is null (#860) (#861) * UFAL/Added same spacing styles via bootstrap as in login page (#862) * UFAL/Fixed editing of extended license labels * UFAL/License agreement page component errors (#867) * Design fix - added spaces between links * Fix of firstMedataValue null properties * UFAL/Ask Only Once license not downloading bitstream without page reload after agreeing (#874) * Changed logic (condition) of retrieving file download link * Saved the original logic, but changed caching parameter * The filename wasn't properly encoded when it has ?sequence...&isAllowed in the URL, because that query part of the URL was encoded as the filename. (#873) * UI tests for each customer (#865) * Playright after deploy running here * Using different token * Corrected path in copying json file * Checkout only branch in UI tests not master * Added copilot changes --------- Co-authored-by: Matus Kasak * Ufal dtq sync062025 (#877) * use `$DSPACE_REST_NAMESPACE` for the webapps symlink (cherry picked from commit 9ea936eb7fa1a42e547dbeecd5737d4ac48d3db7) * Licenses sync (cherry picked from commit 4ee2f1c24cdacc448ce61e15409fd3435c7de44e) * update header/footer based on latest lindat-common 3.5.0 (cherry picked from commit 7b2f299d64d7b9e45e1f35b115e4237f56df39fc) * expose both tcp & udp ports of the handle server (cherry picked from commit 46bc93607d85985ccef0771ca2a40f91ec6531c4) * Update docker-compose-rest.yml replace ../webapps with /usr/local/tomcat/webapps --------- Co-authored-by: Ondrej Kosarko Co-authored-by: Ondrej Kosarko * UFAL/License Administration Labels & Required Info checkboxes should work properly (#881) * hotfix - finding index of unchecked box properly to formName arg * UFAL/Searching problems in Manage Handles table (#882) * locked searchbar when searchOption is not picked * edited Resource Type search option to not be case-sensitive * edited Resource Type search option to show nothing when there is no match * try to set lowercase constants without toLowerCase method * Added full list of handles for empty Resource Type search option * refactored empty searchQueries handling and added comment for invalid resourcetype search inputs * Updating UI tests after import (#887) Co-authored-by: Matus Kasak * UFAL/Show openaire input field every time the EU funding type is selected (#897) * Show openaire input field every time the EU type is selected * UFAL/Publisher search redirect not work #880 (#904) Co-authored-by: milanmajchrak <90026355+milanmajchrak@users.noreply.github.com> * Ufal/commits from ok lindat (#903) * copied static content that was not already in cs/. Otherwise license page (when without .html) might show an error when UI is in Czech and there's no translation. (cherry picked from commit 9e7eea0b856d8da4948c37867a7e5dcee9f248c6) * Update header.component.html I'm expecting the image to take me to lindat.cz. There's no other obvious way to navigate out of the repository * This is the change from https://github.com/ufal/clarin-dspace/pull/1222/commits/5fc241444260617c6ae221585aa464f5eafe5eb2 but applied on v7 * Adding a note about the proprietor change --------- Co-authored-by: Ondrej Kosarko Co-authored-by: Michal Kren * UFAL/show-no-spinner-when-item-has-no-files (#902) * show msg about no files when item has no files, show no spinenr * check if files are array * check files size * fix error * optimize template with hasNoFiles flag * used behaviourSubject for hasNoFiles / aynchronous * Trigger automated ui tests (#905) * Created trigger for running UI tests for each customer daily * Corrected spaces * Changed name of the tests --------- Co-authored-by: Matus Kasak * UFAL/License agreement loading spinner after submitting (#892) * Added loading spinner icon after 'I agree' button is clicked * Removed type annotation and rephrased comment * Changes isLoading to async object * Edited loading spinner visibility method - consistency fix * UFAL/User cannot see his submission (#910) * The user always see it's submissions page --------- Co-authored-by: Paurikova2 --------- Co-authored-by: Paurikova2 <107862249+Paurikova2@users.noreply.github.com> Co-authored-by: Jozef Misutka <332350+vidiecan@users.noreply.github.com> Co-authored-by: Ondrej Kosarko Co-authored-by: Matus Kasak Co-authored-by: jurinecko <95219754+jr-rk@users.noreply.github.com> Co-authored-by: Juraj Roka Co-authored-by: Tim Donohue Co-authored-by: Paurikova2 Co-authored-by: Ondřej Košarko Co-authored-by: Marvin Co-authored-by: Milan Kuchtiak Co-authored-by: Kasinhou <129340513+Kasinhou@users.noreply.github.com> Co-authored-by: Ondrej Kosarko Co-authored-by: Ondrej Kosarko Co-authored-by: Michal Kren --- .github/workflows/deploy.yml | 51 +- .github/workflows/playwright-tests.yml | 39 + .github/workflows/trigger-ui-tests.yml | 30 + ...arin-license-agreement-page.component.html | 8 +- ...clarin-license-agreement-page.component.ts | 11 +- src/app/core/roles/role.service.ts | 8 +- .../preview-section.component.html | 32 +- .../preview-section.component.ts | 4 +- .../models/ds-dynamic-complex.model.ts | 9 +- .../cs/LINDAT-Web-Crawl-Licence.html | 69 + .../cs/Qwant_LongEval_BY-NC-SA_License.html | 371 +++++ src/static-files/cs/deep-sequoia-licence.html | 20 + src/static-files/cs/disco-juice.html | 76 + .../cs/hplt-dataset-license-1.0.html | 36 + src/static-files/cs/licence-TAUS_QT21.html | 181 +++ src/static-files/cs/licence-UD-1.1.html | 159 ++ src/static-files/cs/licence-UD-1.2.html | 252 ++++ src/static-files/cs/licence-UD-1.3.html | 338 +++++ src/static-files/cs/licence-UD-1.4.html | 385 +++++ src/static-files/cs/licence-UD-2.0.html | 415 +++++ src/static-files/cs/licence-UD-2.1.html | 575 +++++++ src/static-files/cs/licence-UD-2.2.html | 680 +++++++++ src/static-files/cs/licence-UD-2.3.html | 714 +++++++++ src/static-files/cs/licence-UD-2.4.html | 800 ++++++++++ src/static-files/cs/licence-UD-2.5.html | 848 +++++++++++ src/static-files/cs/licence-UDer-0.5.html | 95 ++ src/static-files/cs/licence-UDer-1.0.html | 182 +++ src/static-files/cs/licence-UDer-1.1.html | 202 +++ src/static-files/cs/licence-hamledt-2.0.html | 241 +++ src/static-files/cs/licence-hamledt-3.0.html | 429 ++++++ src/static-files/cs/licence-hamledt.html | 85 ++ src/static-files/cs/licence-mwe-1.0.html | 185 +++ src/static-files/cs/licence-mwe-1.1.html | 72 + src/static-files/cs/licence-mwe-1.2-raw.html | 138 ++ src/static-files/cs/licence-mwe-1.2.html | 65 + src/static-files/cs/licence-mwe-1.3.html | 78 + src/static-files/cs/licence-mwe-literal.html | 55 + src/static-files/cs/licence-pdtsl.html | 70 + src/static-files/cs/licence-unisegs-1.0.html | 229 +++ src/static-files/cs/license-NLPC-WeC.html | 134 ++ src/static-files/cs/license-PAWS.html | 99 ++ src/static-files/cs/license-cnc-data.html | 76 + src/static-files/cs/license-cnc.html | 153 ++ src/static-files/cs/license-corefud-0.1.html | 100 ++ src/static-files/cs/license-corefud-0.2.html | 99 ++ src/static-files/cs/license-corefud-1.1.html | 115 ++ src/static-files/cs/license-corefud-1.2.html | 131 ++ src/static-files/cs/license-corefud-1.3.html | 143 ++ src/static-files/cs/license-lb.html | 108 ++ src/static-files/cs/license-pcedt2.html | 103 ++ src/static-files/cs/license-pdt2.html | 120 ++ src/static-files/cs/license-selexini.html | 45 + .../cs/license-templateXXXX-versionXX.html | 76 + src/static-files/cs/license-ud-1.0.html | 53 + src/static-files/cs/license-ud-2.10.html | 969 ++++++++++++ src/static-files/cs/license-ud-2.11.html | 1030 +++++++++++++ src/static-files/cs/license-ud-2.12.html | 1038 +++++++++++++ src/static-files/cs/license-ud-2.13.html | 1094 ++++++++++++++ src/static-files/cs/license-ud-2.14.html | 1189 +++++++++++++++ src/static-files/cs/license-ud-2.15.html | 1242 +++++++++++++++ src/static-files/cs/license-ud-2.16.html | 1333 +++++++++++++++++ src/static-files/cs/license-ud-2.6.html | 706 +++++++++ src/static-files/cs/license-ud-2.7.html | 787 ++++++++++ src/static-files/cs/license-ud-2.8.html | 863 +++++++++++ src/static-files/cs/license-ud-2.9.html | 924 ++++++++++++ src/static-files/cs/license-umr-1.0.html | 66 + src/static-files/cs/license-umr-2.0.html | 75 + src/static-files/cs/search.html | 12 + src/static-files/cs/terms-of-service.html | 174 +++ src/static-files/license-cnc-data.html | 12 +- .../dspace/app/header/header.component.html | 2 +- 71 files changed, 21248 insertions(+), 60 deletions(-) create mode 100644 .github/workflows/playwright-tests.yml create mode 100644 .github/workflows/trigger-ui-tests.yml create mode 100644 src/static-files/cs/LINDAT-Web-Crawl-Licence.html create mode 100644 src/static-files/cs/Qwant_LongEval_BY-NC-SA_License.html create mode 100644 src/static-files/cs/deep-sequoia-licence.html create mode 100644 src/static-files/cs/disco-juice.html create mode 100644 src/static-files/cs/hplt-dataset-license-1.0.html create mode 100644 src/static-files/cs/licence-TAUS_QT21.html create mode 100644 src/static-files/cs/licence-UD-1.1.html create mode 100644 src/static-files/cs/licence-UD-1.2.html create mode 100644 src/static-files/cs/licence-UD-1.3.html create mode 100644 src/static-files/cs/licence-UD-1.4.html create mode 100644 src/static-files/cs/licence-UD-2.0.html create mode 100644 src/static-files/cs/licence-UD-2.1.html create mode 100644 src/static-files/cs/licence-UD-2.2.html create mode 100644 src/static-files/cs/licence-UD-2.3.html create mode 100644 src/static-files/cs/licence-UD-2.4.html create mode 100644 src/static-files/cs/licence-UD-2.5.html create mode 100644 src/static-files/cs/licence-UDer-0.5.html create mode 100644 src/static-files/cs/licence-UDer-1.0.html create mode 100644 src/static-files/cs/licence-UDer-1.1.html create mode 100644 src/static-files/cs/licence-hamledt-2.0.html create mode 100644 src/static-files/cs/licence-hamledt-3.0.html create mode 100644 src/static-files/cs/licence-hamledt.html create mode 100644 src/static-files/cs/licence-mwe-1.0.html create mode 100644 src/static-files/cs/licence-mwe-1.1.html create mode 100644 src/static-files/cs/licence-mwe-1.2-raw.html create mode 100644 src/static-files/cs/licence-mwe-1.2.html create mode 100644 src/static-files/cs/licence-mwe-1.3.html create mode 100644 src/static-files/cs/licence-mwe-literal.html create mode 100644 src/static-files/cs/licence-pdtsl.html create mode 100644 src/static-files/cs/licence-unisegs-1.0.html create mode 100644 src/static-files/cs/license-NLPC-WeC.html create mode 100644 src/static-files/cs/license-PAWS.html create mode 100644 src/static-files/cs/license-cnc-data.html create mode 100644 src/static-files/cs/license-cnc.html create mode 100644 src/static-files/cs/license-corefud-0.1.html create mode 100644 src/static-files/cs/license-corefud-0.2.html create mode 100644 src/static-files/cs/license-corefud-1.1.html create mode 100644 src/static-files/cs/license-corefud-1.2.html create mode 100644 src/static-files/cs/license-corefud-1.3.html create mode 100644 src/static-files/cs/license-lb.html create mode 100644 src/static-files/cs/license-pcedt2.html create mode 100644 src/static-files/cs/license-pdt2.html create mode 100644 src/static-files/cs/license-selexini.html create mode 100644 src/static-files/cs/license-templateXXXX-versionXX.html create mode 100644 src/static-files/cs/license-ud-1.0.html create mode 100644 src/static-files/cs/license-ud-2.10.html create mode 100644 src/static-files/cs/license-ud-2.11.html create mode 100644 src/static-files/cs/license-ud-2.12.html create mode 100644 src/static-files/cs/license-ud-2.13.html create mode 100644 src/static-files/cs/license-ud-2.14.html create mode 100644 src/static-files/cs/license-ud-2.15.html create mode 100644 src/static-files/cs/license-ud-2.16.html create mode 100644 src/static-files/cs/license-ud-2.6.html create mode 100644 src/static-files/cs/license-ud-2.7.html create mode 100644 src/static-files/cs/license-ud-2.8.html create mode 100644 src/static-files/cs/license-ud-2.9.html create mode 100644 src/static-files/cs/license-umr-1.0.html create mode 100644 src/static-files/cs/license-umr-2.0.html create mode 100644 src/static-files/cs/search.html create mode 100644 src/static-files/cs/terms-of-service.html diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 579a0568af1..334e5531fd7 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -224,37 +224,34 @@ jobs: if: inputs.IMPORT timeout-minutes: 45 steps: - - name: run playwright - run: | - # wait until FE stabilizes a bit - sleep 3m - - curl -H "Accept: application/vnd.github.everest-preview+json" \ - -H "Authorization: token ${{ secrets.DEPLOY_DEV5_GH_ACTION_DISPATCH }}" \ - --request POST \ - https://api.github.com/repos/dataquest-dev/\ - dspace-ui-tests/actions/workflows/cron-test.yml/dispatches \ - --data "{\"ref\":\"refs/heads/master\"}" 2> /dev/null - - # wait for it to start - sleep 30s + - name: Checkout Playwright tests + uses: actions/checkout@v4 + with: + repository: dataquest-dev/dspace-ui-tests + path: dspace-ui-tests + token: ${{ secrets.DEPLOY_DEV5_GH_ACTION_DISPATCH }} - # get result of last job - RES=$(curl -H "Accept: application/vnd.github.everest-preview+json" -H "Authorization: token ${{ secrets.DEPLOY_DEV5_GH_ACTION_DISPATCH }}" https://api.github.com/repos/dataquest-dev/dspace-ui-tests/actions/workflows/cron-test.yml/runs?per_page=1 2> /dev/null | jq .workflow_runs[0].conclusion) + - name: Checkout main repository + uses: actions/checkout@v4 + with: + path: this-repository - # while job did not finish, sleep - while [[ $RES == 'null' ]]; do - sleep 10s - RES=$(curl -H "Accept: application/vnd.github.everest-preview+json" -H "Authorization: token ${{ secrets.DEPLOY_DEV5_GH_ACTION_DISPATCH }}" https://api.github.com/repos/dataquest-dev/dspace-ui-tests/actions/workflows/cron-test.yml/runs?per_page=1 2> /dev/null | jq .workflow_runs[0].conclusion) - done; + - name: Copy customer config to UI tests repository for merging + run: | + cp this-repository/config/config.lindat.ui.tests.json dspace-ui-tests/customer-constants/ - echo $RES - # if last result is not success, return -1 and fail - if [[ $RES != \"success\" ]]; then + - name: test + working-directory: dspace-ui-tests/scripts + env: + HOME_URL: https://dev-5.pc:8443/repository/ + NAME: LINDAT + run: | + ./test.sh - echo "playwright tests have failed! check appropriate action run in the dspace-ui-tests repository" - exit 1 - fi; + - uses: mazoea/ga-maz/end@master + with: + CHOWN_DIR: ./ + if: ${{ always() }} rest-tests-after-import8: runs-on: ubuntu-latest diff --git a/.github/workflows/playwright-tests.yml b/.github/workflows/playwright-tests.yml new file mode 100644 index 00000000000..4cfe6f64e45 --- /dev/null +++ b/.github/workflows/playwright-tests.yml @@ -0,0 +1,39 @@ +name: Playwright tests + +on: + workflow_dispatch: + workflow_call: + +jobs: + playwright-tests: + runs-on: dspace-test-1 + timeout-minutes: 45 + steps: + - name: Checkout Playwright tests + uses: actions/checkout@v4 + with: + repository: dataquest-dev/dspace-ui-tests + path: dspace-ui-tests + token: ${{ secrets.DEPLOY_DEV5_GH_ACTION_DISPATCH }} + + - name: Checkout main repository + uses: actions/checkout@v4 + with: + path: this-repository + + - name: Copy customer config to UI tests repository for merging + run: | + cp this-repository/config/config.lindat.ui.tests.json dspace-ui-tests/customer-constants/ + + - name: test + working-directory: dspace-ui-tests/scripts + env: + HOME_URL: https://dev-5.pc:8443/repository/ + NAME: LINDAT + run: | + ./test.sh + + - uses: mazoea/ga-maz/end@master + with: + CHOWN_DIR: ./ + if: ${{ always() }} \ No newline at end of file diff --git a/.github/workflows/trigger-ui-tests.yml b/.github/workflows/trigger-ui-tests.yml new file mode 100644 index 00000000000..22dfc03fdf6 --- /dev/null +++ b/.github/workflows/trigger-ui-tests.yml @@ -0,0 +1,30 @@ +name: Trigger UI Tests for All Customer Branches + +on: + workflow_dispatch: + workflow_call: + schedule: + - cron: '0 5 * * *' + +permissions: + actions: write # Grants permission to trigger workflows + contents: read # Access to repository contents + +jobs: + trigger-builds: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Get and Trigger Customer Branch UI Tests + run: | + # Authenticate with GitHub CLI using the token + echo ${{ secrets.GITHUB_TOKEN }} | gh auth login --with-token + + git fetch --prune origin + BRANCHES=$(git ls-remote --heads origin | awk -F'/' '{print $3"/"$4}' | grep '^customer/') + for branch in $(echo "$BRANCHES" | sed -e 's/[\[\]"]//g' -e 's/,/\n/g'); do + echo "Triggering UI tests for branch: $branch" + gh workflow run playwright-tests.yml --ref $branch + done \ No newline at end of file diff --git a/src/app/bitstream-page/clarin-license-agreement-page/clarin-license-agreement-page.component.html b/src/app/bitstream-page/clarin-license-agreement-page/clarin-license-agreement-page.component.html index 16c57f29ea1..2ea2687c0a7 100644 --- a/src/app/bitstream-page/clarin-license-agreement-page/clarin-license-agreement-page.component.html +++ b/src/app/bitstream-page/clarin-license-agreement-page/clarin-license-agreement-page.component.html @@ -88,8 +88,14 @@