mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 01:54:15 +00:00
Merge remote-tracking branch 'origin/main' into retrieve-name-with-dsonameservice-main
# Conflicts: # src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.ts
This commit is contained in:
@@ -15,3 +15,6 @@ trim_trailing_whitespace = false
|
||||
|
||||
[*.ts]
|
||||
quote_type = single
|
||||
|
||||
[*.json5]
|
||||
ij_json_keep_blank_lines_in_code = 3
|
||||
|
@@ -7,7 +7,8 @@
|
||||
"eslint-plugin-jsdoc",
|
||||
"eslint-plugin-deprecation",
|
||||
"unused-imports",
|
||||
"eslint-plugin-lodash"
|
||||
"eslint-plugin-lodash",
|
||||
"eslint-plugin-jsonc"
|
||||
],
|
||||
"overrides": [
|
||||
{
|
||||
@@ -224,6 +225,42 @@
|
||||
"@angular-eslint/template/no-negated-async": "off",
|
||||
"@angular-eslint/template/eqeqeq": "off"
|
||||
}
|
||||
},
|
||||
{
|
||||
"files": [
|
||||
"*.json5"
|
||||
],
|
||||
"extends": [
|
||||
"plugin:jsonc/recommended-with-jsonc"
|
||||
],
|
||||
"rules": {
|
||||
"no-irregular-whitespace": "error",
|
||||
"no-trailing-spaces": "error",
|
||||
"jsonc/comma-dangle": [
|
||||
"error",
|
||||
"always-multiline"
|
||||
],
|
||||
"jsonc/indent": [
|
||||
"error",
|
||||
2
|
||||
],
|
||||
"jsonc/key-spacing": [
|
||||
"error",
|
||||
{
|
||||
"beforeColon": false,
|
||||
"afterColon": true,
|
||||
"mode": "strict"
|
||||
}
|
||||
],
|
||||
"jsonc/no-dupe-keys": "off",
|
||||
"jsonc/quotes": [
|
||||
"error",
|
||||
"double",
|
||||
{
|
||||
"avoidEscape": false
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
50
.github/workflows/build.yml
vendored
50
.github/workflows/build.yml
vendored
@@ -68,7 +68,7 @@ jobs:
|
||||
# https://github.com/actions/cache/blob/main/examples.md#node---yarn
|
||||
- name: Get Yarn cache directory
|
||||
id: yarn-cache-dir-path
|
||||
run: echo "::set-output name=dir::$(yarn cache dir)"
|
||||
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
|
||||
- name: Cache Yarn dependencies
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
@@ -93,12 +93,16 @@ jobs:
|
||||
- name: Run specs (unit tests)
|
||||
run: yarn run test:headless
|
||||
|
||||
# Upload code coverage report to artifact (for one version of Node only),
|
||||
# so that it can be shared with the 'codecov' job (see below)
|
||||
# NOTE: Angular CLI only supports code coverage for specs. See https://github.com/angular/angular-cli/issues/6286
|
||||
# Upload coverage reports to Codecov (for one version of Node only)
|
||||
# https://github.com/codecov/codecov-action
|
||||
- name: Upload coverage to Codecov.io
|
||||
uses: codecov/codecov-action@v3
|
||||
if: matrix.node-version == '16.x'
|
||||
- name: Upload code coverage report to Artifact
|
||||
uses: actions/upload-artifact@v3
|
||||
if: matrix.node-version == '18.x'
|
||||
with:
|
||||
name: dspace-angular coverage report
|
||||
path: 'coverage/dspace-angular/lcov.info'
|
||||
retention-days: 14
|
||||
|
||||
# Using docker-compose start backend using CI configuration
|
||||
# and load assetstore from a cached copy
|
||||
@@ -112,11 +116,10 @@ jobs:
|
||||
# https://github.com/cypress-io/github-action
|
||||
# (NOTE: to run these e2e tests locally, just use 'ng e2e')
|
||||
- name: Run e2e tests (integration tests)
|
||||
uses: cypress-io/github-action@v4
|
||||
uses: cypress-io/github-action@v5
|
||||
with:
|
||||
# Run tests in Chrome, headless mode
|
||||
# Run tests in Chrome, headless mode (default)
|
||||
browser: chrome
|
||||
headless: true
|
||||
# Start app before running tests (will be stopped automatically after tests finish)
|
||||
start: yarn run serve:ssr
|
||||
# Wait for backend & frontend to be available
|
||||
@@ -176,3 +179,32 @@ jobs:
|
||||
|
||||
- name: Shutdown Docker containers
|
||||
run: docker-compose -f ./docker/docker-compose-ci.yml down
|
||||
|
||||
# Codecov upload is a separate job in order to allow us to restart this separate from the entire build/test
|
||||
# job above. This is necessary because Codecov uploads seem to randomly fail at times.
|
||||
# See https://community.codecov.com/t/upload-issues-unable-to-locate-build-via-github-actions-api/3954
|
||||
codecov:
|
||||
# Must run after 'tests' job above
|
||||
needs: tests
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
|
||||
# Download artifacts from previous 'tests' job
|
||||
- name: Download coverage artifacts
|
||||
uses: actions/download-artifact@v3
|
||||
|
||||
# Now attempt upload to Codecov using its action.
|
||||
# NOTE: We use a retry action to retry the Codecov upload if it fails the first time.
|
||||
#
|
||||
# Retry action: https://github.com/marketplace/actions/retry-action
|
||||
# Codecov action: https://github.com/codecov/codecov-action
|
||||
- name: Upload coverage to Codecov.io
|
||||
uses: Wandalen/wretry.action@v1.0.36
|
||||
with:
|
||||
action: codecov/codecov-action@v3
|
||||
# Try upload 5 times max
|
||||
attempt_limit: 5
|
||||
# Run again in 30 seconds
|
||||
attempt_delay: 30000
|
||||
|
30
.github/workflows/docker.yml
vendored
30
.github/workflows/docker.yml
vendored
@@ -88,3 +88,33 @@ jobs:
|
||||
# Use tags / labels provided by 'docker/metadata-action' above
|
||||
tags: ${{ steps.meta_build.outputs.tags }}
|
||||
labels: ${{ steps.meta_build.outputs.labels }}
|
||||
|
||||
#####################################################
|
||||
# Build/Push the 'dspace/dspace-angular' image ('-dist' tag)
|
||||
#####################################################
|
||||
# https://github.com/docker/metadata-action
|
||||
# Get Metadata for docker_build_dist step below
|
||||
- name: Sync metadata (tags, labels) from GitHub to Docker for 'dspace-angular-dist' image
|
||||
id: meta_build_dist
|
||||
uses: docker/metadata-action@v4
|
||||
with:
|
||||
images: dspace/dspace-angular
|
||||
tags: ${{ env.IMAGE_TAGS }}
|
||||
# As this is a "dist" image, its tags are all suffixed with "-dist". Otherwise, it uses the same
|
||||
# tagging logic as the primary 'dspace/dspace-angular' image above.
|
||||
flavor: ${{ env.TAGS_FLAVOR }}
|
||||
suffix=-dist
|
||||
|
||||
- name: Build and push 'dspace-angular-dist' image
|
||||
id: docker_build_dist
|
||||
uses: docker/build-push-action@v3
|
||||
with:
|
||||
context: .
|
||||
file: ./Dockerfile.dist
|
||||
platforms: ${{ env.PLATFORMS }}
|
||||
# For pull requests, we run the Docker build (to ensure no PR changes break the build),
|
||||
# but we ONLY do an image push to DockerHub if it's NOT a PR
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
# Use tags / labels provided by 'docker/metadata-action' above
|
||||
tags: ${{ steps.meta_build_dist.outputs.tags }}
|
||||
labels: ${{ steps.meta_build_dist.outputs.labels }}
|
||||
|
2
.github/workflows/issue_opened.yml
vendored
2
.github/workflows/issue_opened.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
||||
# Only add to project board if issue is flagged as "needs triage" or has no labels
|
||||
# NOTE: By default we flag new issues as "needs triage" in our issue template
|
||||
if: (contains(github.event.issue.labels.*.name, 'needs triage') || join(github.event.issue.labels.*.name) == '')
|
||||
uses: actions/add-to-project@v0.3.0
|
||||
uses: actions/add-to-project@v0.5.0
|
||||
# Note, the authentication token below is an ORG level Secret.
|
||||
# It must be created/recreated manually via a personal access token with admin:org, project, public_repo permissions
|
||||
# See: https://docs.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token#permissions-for-the-github_token
|
||||
|
2
.github/workflows/label_merge_conflicts.yml
vendored
2
.github/workflows/label_merge_conflicts.yml
vendored
@@ -23,7 +23,7 @@ jobs:
|
||||
steps:
|
||||
# See: https://github.com/prince-chrismc/label-merge-conflicts-action
|
||||
- name: Auto-label PRs with merge conflicts
|
||||
uses: prince-chrismc/label-merge-conflicts-action@v2
|
||||
uses: prince-chrismc/label-merge-conflicts-action@v3
|
||||
# Add "merge conflict" label if a merge conflict is detected. Remove it when resolved.
|
||||
# Note, the authentication token is created automatically
|
||||
# See: https://docs.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token
|
||||
|
15
Dockerfile
15
Dockerfile
@@ -2,20 +2,27 @@
|
||||
# See https://github.com/DSpace/dspace-angular/tree/main/docker for usage details
|
||||
|
||||
FROM node:18-alpine
|
||||
WORKDIR /app
|
||||
ADD . /app/
|
||||
EXPOSE 4000
|
||||
|
||||
# Ensure Python and other build tools are available
|
||||
# These are needed to install some node modules, especially on linux/arm64
|
||||
RUN apk add --update python3 make g++ && rm -rf /var/cache/apk/*
|
||||
|
||||
WORKDIR /app
|
||||
ADD . /app/
|
||||
EXPOSE 4000
|
||||
|
||||
# We run yarn install with an increased network timeout (5min) to avoid "ESOCKETTIMEDOUT" errors from hub.docker.com
|
||||
# See, for example https://github.com/yarnpkg/yarn/issues/5540
|
||||
RUN yarn install --network-timeout 300000
|
||||
|
||||
# When running in dev mode, 4GB of memory is required to build & launch the app.
|
||||
# This default setting can be overridden as needed in your shell, via an env file or in docker-compose.
|
||||
# See Docker environment var precedence: https://docs.docker.com/compose/environment-variables/envvars-precedence/
|
||||
ENV NODE_OPTIONS="--max_old_space_size=4096"
|
||||
|
||||
# On startup, run in DEVELOPMENT mode (this defaults to live reloading enabled, etc).
|
||||
# Listen / accept connections from all IP addresses.
|
||||
# NOTE: At this time it is only possible to run Docker container in Production mode
|
||||
# if you have a public IP. See https://github.com/DSpace/dspace-angular/issues/1485
|
||||
# if you have a public URL. See https://github.com/DSpace/dspace-angular/issues/1485
|
||||
ENV NODE_ENV development
|
||||
CMD yarn serve --host 0.0.0.0
|
||||
|
31
Dockerfile.dist
Normal file
31
Dockerfile.dist
Normal file
@@ -0,0 +1,31 @@
|
||||
# This image will be published as dspace/dspace-angular:$DSPACE_VERSION-dist
|
||||
# See https://github.com/DSpace/dspace-angular/tree/main/docker for usage details
|
||||
|
||||
# Test build:
|
||||
# docker build -f Dockerfile.dist -t dspace/dspace-angular:dspace-7_x-dist .
|
||||
|
||||
FROM node:18-alpine as build
|
||||
|
||||
# Ensure Python and other build tools are available
|
||||
# These are needed to install some node modules, especially on linux/arm64
|
||||
RUN apk add --update python3 make g++ && rm -rf /var/cache/apk/*
|
||||
|
||||
WORKDIR /app
|
||||
COPY package.json yarn.lock ./
|
||||
RUN yarn install --network-timeout 300000
|
||||
|
||||
ADD . /app/
|
||||
RUN yarn build:prod
|
||||
|
||||
FROM node:18-alpine
|
||||
RUN npm install --global pm2
|
||||
|
||||
COPY --chown=node:node --from=build /app/dist /app/dist
|
||||
COPY --chown=node:node config /app/config
|
||||
COPY --chown=node:node docker/dspace-ui.json /app/dspace-ui.json
|
||||
|
||||
WORKDIR /app
|
||||
USER node
|
||||
ENV NODE_ENV production
|
||||
EXPOSE 4000
|
||||
CMD pm2-runtime start dspace-ui.json --json
|
@@ -266,7 +266,8 @@
|
||||
"options": {
|
||||
"lintFilePatterns": [
|
||||
"src/**/*.ts",
|
||||
"src/**/*.html"
|
||||
"src/**/*.html",
|
||||
"src/**/*.json5"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
@@ -122,8 +122,6 @@ describe('New Submission page', () => {
|
||||
|
||||
// Wait for upload to complete before proceeding
|
||||
cy.wait('@upload');
|
||||
// Close the upload success notice
|
||||
cy.get('[data-dismiss="alert"]').click({multiple: true});
|
||||
|
||||
// Wait for deposit button to not be disabled & click it.
|
||||
cy.get('button#deposit').should('not.be.disabled').click();
|
||||
|
@@ -6,7 +6,20 @@
|
||||
If you wish to run DSpace on Docker in production, we recommend building your own Docker images. You are welcome to borrow ideas/concepts from the below images in doing so. But, the below images should not be used "as is" in any production scenario.
|
||||
***
|
||||
|
||||
## 'Dockerfile' in root directory
|
||||
## Overview
|
||||
The scripts in this directory can be used to start the DSpace User Interface (frontend) in Docker.
|
||||
Optionally, the backend (REST API) might also be started in Docker.
|
||||
|
||||
For additional options/settings in starting the backend (REST API) in Docker, see the Docker Compose
|
||||
documentation for the backend: https://github.com/DSpace/DSpace/blob/main/dspace/src/main/docker-compose/README.md
|
||||
|
||||
## Root directory
|
||||
|
||||
The root directory of this project contains all the Dockerfiles which may be referenced by
|
||||
the Docker compose scripts in this 'docker' folder.
|
||||
|
||||
### Dockerfile
|
||||
|
||||
This Dockerfile is used to build a *development* DSpace 7 Angular UI image, published as 'dspace/dspace-angular'
|
||||
|
||||
```
|
||||
@@ -20,7 +33,18 @@ Admins to our DockerHub repo can manually publish with the following command.
|
||||
docker push dspace/dspace-angular:dspace-7_x
|
||||
```
|
||||
|
||||
## docker directory
|
||||
### Dockerfile.dist
|
||||
|
||||
The `Dockerfile.dist` is used to generate a *production* build and runtime environment.
|
||||
|
||||
```bash
|
||||
# build the latest image
|
||||
docker build -f Dockerfile.dist -t dspace/dspace-angular:dspace-7_x-dist .
|
||||
```
|
||||
|
||||
A default/demo version of this image is built *automatically*.
|
||||
|
||||
## 'docker' directory
|
||||
- docker-compose.yml
|
||||
- Starts DSpace Angular with Docker Compose from the current branch. This file assumes that a DSpace 7 REST instance will also be started in Docker.
|
||||
- docker-compose-rest.yml
|
||||
@@ -45,23 +69,47 @@ docker-compose -f docker/docker-compose.yml build
|
||||
|
||||
## To start DSpace (REST and Angular) from your branch
|
||||
|
||||
This command provides a quick way to start both the frontend & backend from this single codebase
|
||||
```
|
||||
docker-compose -p d7 -f docker/docker-compose.yml -f docker/docker-compose-rest.yml up -d
|
||||
```
|
||||
|
||||
Keep in mind, you may also start the backend by cloning the 'DSpace/DSpace' GitHub repository separately. See the next section.
|
||||
|
||||
|
||||
## Run DSpace REST and DSpace Angular from local branches.
|
||||
|
||||
This section assumes that you have clones *both* the 'DSpace/DSpace' and 'DSpace/dspace-angular' GitHub
|
||||
repositories. When both are available locally, you can spin up both in Docker and have them work together.
|
||||
|
||||
_The system will be started in 2 steps. Each step shares the same docker network._
|
||||
|
||||
From DSpace/DSpace (build as needed)
|
||||
From 'DSpace/DSpace' clone (build first as needed):
|
||||
```
|
||||
docker-compose -p d7 up -d
|
||||
```
|
||||
|
||||
From DSpace/DSpace-angular
|
||||
NOTE: More detailed instructions on starting the backend via Docker can be found in the [Docker Compose instructions for the Backend](https://github.com/DSpace/DSpace/blob/main/dspace/src/main/docker-compose/README.md).
|
||||
|
||||
From 'DSpace/dspace-angular' clone (build first as needed)
|
||||
```
|
||||
docker-compose -p d7 -f docker/docker-compose.yml up -d
|
||||
```
|
||||
|
||||
At this point, you should be able to access the UI from http://localhost:4000,
|
||||
and the backend at http://localhost:8080/server/
|
||||
|
||||
## Run DSpace Angular dist build with DSpace Demo site backend
|
||||
|
||||
This allows you to run the Angular UI in *production* mode, pointing it at the demo backend
|
||||
(https://api7.dspace.org/server/).
|
||||
|
||||
```
|
||||
docker-compose -f docker/docker-compose-dist.yml pull
|
||||
docker-compose -f docker/docker-compose-dist.yml build
|
||||
docker-compose -p d7 -f docker/docker-compose-dist.yml up -d
|
||||
```
|
||||
|
||||
## Ingest test data from AIPDIR
|
||||
|
||||
Create an administrator
|
||||
@@ -87,9 +135,10 @@ Load assetstore content and trigger a re-index of the repository
|
||||
docker-compose -p d7 -f docker/cli.yml -f docker/cli.assetstore.yml run --rm dspace-cli
|
||||
```
|
||||
|
||||
## End to end testing of the rest api (runs in travis).
|
||||
_In this instance, only the REST api runs in Docker using the Entities dataset. Travis will perform CI testing of Angular using Node to drive the tests._
|
||||
## End to end testing of the REST API (runs in GitHub Actions CI).
|
||||
_In this instance, only the REST api runs in Docker using the Entities dataset. GitHub Actions will perform CI testing of Angular using Node to drive the tests. See `.github/workflows/build.yml` for more details._
|
||||
|
||||
This command is only really useful for testing our Continuous Integration process.
|
||||
```
|
||||
docker-compose -p d7ci -f docker/docker-compose-travis.yml up -d
|
||||
docker-compose -p d7ci -f docker/docker-compose-ci.yml up -d
|
||||
```
|
||||
|
40
docker/docker-compose-dist.yml
Normal file
40
docker/docker-compose-dist.yml
Normal file
@@ -0,0 +1,40 @@
|
||||
#
|
||||
# The contents of this file are subject to the license and copyright
|
||||
# detailed in the LICENSE and NOTICE files at the root of the source
|
||||
# tree and available online at
|
||||
#
|
||||
# http://www.dspace.org/license/
|
||||
#
|
||||
|
||||
# Docker Compose for running the DSpace Angular UI dist build
|
||||
# for previewing with the DSpace Demo site backend
|
||||
version: '3.7'
|
||||
networks:
|
||||
dspacenet:
|
||||
services:
|
||||
dspace-angular:
|
||||
container_name: dspace-angular
|
||||
environment:
|
||||
DSPACE_UI_SSL: 'false'
|
||||
DSPACE_UI_HOST: dspace-angular
|
||||
DSPACE_UI_PORT: '4000'
|
||||
DSPACE_UI_NAMESPACE: /
|
||||
# NOTE: When running the UI in production mode (which the -dist image does),
|
||||
# these DSPACE_REST_* variables MUST point at a public, HTTPS URL.
|
||||
# This is because Server Side Rendering (SSR) currently requires a public URL,
|
||||
# see this bug: https://github.com/DSpace/dspace-angular/issues/1485
|
||||
DSPACE_REST_SSL: 'true'
|
||||
DSPACE_REST_HOST: api7.dspace.org
|
||||
DSPACE_REST_PORT: 443
|
||||
DSPACE_REST_NAMESPACE: /server
|
||||
image: dspace/dspace-angular:dspace-7_x-dist
|
||||
build:
|
||||
context: ..
|
||||
dockerfile: Dockerfile.dist
|
||||
networks:
|
||||
dspacenet:
|
||||
ports:
|
||||
- published: 4000
|
||||
target: 4000
|
||||
stdin_open: true
|
||||
tty: true
|
@@ -39,7 +39,7 @@ services:
|
||||
# proxies.trusted.ipranges: This setting is required for a REST API running in Docker to trust requests
|
||||
# from the host machine. This IP range MUST correspond to the 'dspacenet' subnet defined above.
|
||||
proxies__P__trusted__P__ipranges: '172.23.0'
|
||||
image: dspace/dspace:dspace-7_x-test
|
||||
image: "${DOCKER_OWNER:-dspace}/dspace:${DSPACE_VER:-dspace-7_x-test}"
|
||||
depends_on:
|
||||
- dspacedb
|
||||
networks:
|
||||
@@ -82,8 +82,7 @@ services:
|
||||
# DSpace Solr container
|
||||
dspacesolr:
|
||||
container_name: dspacesolr
|
||||
# Uses official Solr image at https://hub.docker.com/_/solr/
|
||||
image: solr:8.11-slim
|
||||
image: "${DOCKER_OWNER:-dspace}/dspace-solr:${DSPACE_VER:-dspace-7_x}"
|
||||
# Needs main 'dspace' container to start first to guarantee access to solr_configs
|
||||
depends_on:
|
||||
- dspace
|
||||
@@ -96,28 +95,26 @@ 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
|
||||
# Initialize all DSpace Solr cores using the mounted local configsets (see above), then start Solr
|
||||
# * First, run precreate-core to create the core (if it doesn't yet exist). If exists already, this is a no-op
|
||||
# * Second, copy updated configs from mounted configsets to this core. If it already existed, this updates core
|
||||
# to the latest configs. If it's a newly created core, this is a no-op.
|
||||
# * Second, copy configsets to this core:
|
||||
# Updates to Solr configs require the container to be rebuilt/restarted:
|
||||
# `docker-compose -p d7 -f docker/docker-compose.yml -f docker/docker-compose-rest.yml up -d --build dspacesolr`
|
||||
entrypoint:
|
||||
- /bin/bash
|
||||
- '-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 -f
|
||||
volumes:
|
||||
assetstore:
|
||||
|
11
docker/dspace-ui.json
Normal file
11
docker/dspace-ui.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"apps": [
|
||||
{
|
||||
"name": "dspace-ui",
|
||||
"cwd": "/app",
|
||||
"script": "dist/server/main.js",
|
||||
"instances": "max",
|
||||
"exec_mode": "cluster"
|
||||
}
|
||||
]
|
||||
}
|
@@ -163,13 +163,14 @@
|
||||
"compression-webpack-plugin": "^9.2.0",
|
||||
"copy-webpack-plugin": "^6.4.1",
|
||||
"cross-env": "^7.0.3",
|
||||
"cypress": "^12.0.1",
|
||||
"cypress": "12.9.0",
|
||||
"cypress-axe": "^1.1.0",
|
||||
"deep-freeze": "0.0.1",
|
||||
"eslint": "^8.2.0",
|
||||
"eslint-plugin-deprecation": "^1.3.2",
|
||||
"eslint-plugin-import": "^2.25.4",
|
||||
"eslint-plugin-jsdoc": "^39.6.4",
|
||||
"eslint-plugin-jsonc": "^2.6.0",
|
||||
"eslint-plugin-lodash": "^7.4.0",
|
||||
"eslint-plugin-unused-imports": "^2.0.0",
|
||||
"express-static-gzip": "^2.1.5",
|
||||
|
@@ -96,11 +96,17 @@ export class BatchImportPageComponent {
|
||||
if (isNotEmpty(rd.payload)) {
|
||||
this.router.navigateByUrl(getProcessDetailRoute(rd.payload.processId));
|
||||
}
|
||||
} else {
|
||||
if (rd.statusCode === 413) {
|
||||
const title = this.translate.get('process.new.notification.error.title');
|
||||
const content = this.translate.get('process.new.notification.error.max-upload.content');
|
||||
this.notificationsService.error(title, content);
|
||||
} else {
|
||||
const title = this.translate.get('process.new.notification.error.title');
|
||||
const content = this.translate.get('process.new.notification.error.content');
|
||||
this.notificationsService.error(title, content);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@@ -17,6 +17,7 @@ export const AuthActionTypes = {
|
||||
AUTHENTICATED_SUCCESS: type('dspace/auth/AUTHENTICATED_SUCCESS'),
|
||||
CHECK_AUTHENTICATION_TOKEN: type('dspace/auth/CHECK_AUTHENTICATION_TOKEN'),
|
||||
CHECK_AUTHENTICATION_TOKEN_COOKIE: type('dspace/auth/CHECK_AUTHENTICATION_TOKEN_COOKIE'),
|
||||
SET_AUTH_COOKIE_STATUS: type('dspace/auth/SET_AUTH_COOKIE_STATUS'),
|
||||
RETRIEVE_AUTH_METHODS: type('dspace/auth/RETRIEVE_AUTH_METHODS'),
|
||||
RETRIEVE_AUTH_METHODS_SUCCESS: type('dspace/auth/RETRIEVE_AUTH_METHODS_SUCCESS'),
|
||||
RETRIEVE_AUTH_METHODS_ERROR: type('dspace/auth/RETRIEVE_AUTH_METHODS_ERROR'),
|
||||
@@ -150,6 +151,19 @@ export class CheckAuthenticationTokenCookieAction implements Action {
|
||||
public type: string = AuthActionTypes.CHECK_AUTHENTICATION_TOKEN_COOKIE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the authentication cookie status to flag an external authentication response.
|
||||
*/
|
||||
export class SetAuthCookieStatus implements Action {
|
||||
public type: string = AuthActionTypes.SET_AUTH_COOKIE_STATUS;
|
||||
|
||||
payload = false;
|
||||
|
||||
constructor(exists: boolean) {
|
||||
this.payload = exists;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sign out.
|
||||
* @class LogOutAction
|
||||
@@ -425,6 +439,7 @@ export type AuthActions
|
||||
| AuthenticationSuccessAction
|
||||
| CheckAuthenticationTokenAction
|
||||
| CheckAuthenticationTokenCookieAction
|
||||
| SetAuthCookieStatus
|
||||
| RedirectWhenAuthenticationIsRequiredAction
|
||||
| RedirectWhenTokenExpiredAction
|
||||
| AddAuthenticationMessageAction
|
||||
|
@@ -214,12 +214,15 @@ describe('AuthEffects', () => {
|
||||
authenticated: true
|
||||
})
|
||||
);
|
||||
spyOn((authEffects as any).authService, 'setExternalAuthStatus');
|
||||
actions = hot('--a-', { a: { type: AuthActionTypes.CHECK_AUTHENTICATION_TOKEN_COOKIE } });
|
||||
|
||||
const expected = cold('--b-', { b: new RetrieveTokenAction() });
|
||||
|
||||
expect(authEffects.checkTokenCookie$).toBeObservable(expected);
|
||||
authEffects.checkTokenCookie$.subscribe(() => {
|
||||
expect(authServiceStub.setExternalAuthStatus).toHaveBeenCalled();
|
||||
expect(authServiceStub.isExternalAuthentication).toBeTrue();
|
||||
expect((authEffects as any).authorizationsService.invalidateAuthorizationsRequestCache).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
@@ -153,6 +153,7 @@ export class AuthEffects {
|
||||
return this.authService.checkAuthenticationCookie().pipe(
|
||||
map((response: AuthStatus) => {
|
||||
if (response.authenticated) {
|
||||
this.authService.setExternalAuthStatus(true);
|
||||
this.authorizationsService.invalidateAuthorizationsRequestCache();
|
||||
return new RetrieveTokenAction();
|
||||
} else {
|
||||
|
@@ -8,6 +8,7 @@ import {
|
||||
AuthenticationErrorAction,
|
||||
AuthenticationSuccessAction,
|
||||
CheckAuthenticationTokenAction,
|
||||
SetAuthCookieStatus,
|
||||
CheckAuthenticationTokenCookieAction,
|
||||
LogOutAction,
|
||||
LogOutErrorAction,
|
||||
@@ -219,6 +220,28 @@ describe('authReducer', () => {
|
||||
expect(newState).toEqual(state);
|
||||
});
|
||||
|
||||
it('should set the authentication cookie status in response to a SET_AUTH_COOKIE_STATUS action', () => {
|
||||
initialState = {
|
||||
authenticated: true,
|
||||
loaded: false,
|
||||
blocking: false,
|
||||
loading: true,
|
||||
externalAuth: false,
|
||||
idle: false
|
||||
};
|
||||
const action = new SetAuthCookieStatus(true);
|
||||
const newState = authReducer(initialState, action);
|
||||
state = {
|
||||
authenticated: true,
|
||||
loaded: false,
|
||||
blocking: false,
|
||||
loading: true,
|
||||
externalAuth: true,
|
||||
idle: false
|
||||
};
|
||||
expect(newState).toEqual(state);
|
||||
});
|
||||
|
||||
it('should properly set the state, in response to a LOG_OUT action', () => {
|
||||
initialState = {
|
||||
authenticated: true,
|
||||
|
@@ -10,7 +10,7 @@ import {
|
||||
RedirectWhenTokenExpiredAction,
|
||||
RefreshTokenSuccessAction,
|
||||
RetrieveAuthenticatedEpersonSuccessAction,
|
||||
RetrieveAuthMethodsSuccessAction,
|
||||
RetrieveAuthMethodsSuccessAction, SetAuthCookieStatus,
|
||||
SetRedirectUrlAction
|
||||
} from './auth.actions';
|
||||
// import models
|
||||
@@ -59,6 +59,8 @@ export interface AuthState {
|
||||
// all authentication Methods enabled at the backend
|
||||
authMethods?: AuthMethod[];
|
||||
|
||||
externalAuth?: boolean,
|
||||
|
||||
// true when the current user is idle
|
||||
idle: boolean;
|
||||
|
||||
@@ -73,6 +75,7 @@ const initialState: AuthState = {
|
||||
blocking: true,
|
||||
loading: false,
|
||||
authMethods: [],
|
||||
externalAuth: false,
|
||||
idle: false
|
||||
};
|
||||
|
||||
@@ -104,6 +107,11 @@ export function authReducer(state: any = initialState, action: AuthActions): Aut
|
||||
loading: true,
|
||||
});
|
||||
|
||||
case AuthActionTypes.SET_AUTH_COOKIE_STATUS:
|
||||
return Object.assign({}, state, {
|
||||
externalAuth: (action as SetAuthCookieStatus).payload
|
||||
});
|
||||
|
||||
case AuthActionTypes.AUTHENTICATED_ERROR:
|
||||
case AuthActionTypes.RETRIEVE_AUTHENTICATED_EPERSON_ERROR:
|
||||
return Object.assign({}, state, {
|
||||
|
@@ -25,7 +25,7 @@ import {
|
||||
import { CookieService } from '../services/cookie.service';
|
||||
import {
|
||||
getAuthenticatedUserId,
|
||||
getAuthenticationToken,
|
||||
getAuthenticationToken, getExternalAuthCookieStatus,
|
||||
getRedirectUrl,
|
||||
isAuthenticated,
|
||||
isAuthenticatedLoaded,
|
||||
@@ -36,7 +36,7 @@ import { AppState } from '../../app.reducer';
|
||||
import {
|
||||
CheckAuthenticationTokenAction,
|
||||
RefreshTokenAction,
|
||||
ResetAuthenticationMessagesAction,
|
||||
ResetAuthenticationMessagesAction, SetAuthCookieStatus,
|
||||
SetRedirectUrlAction,
|
||||
SetUserAsIdleAction,
|
||||
UnsetUserAsIdleAction
|
||||
@@ -156,6 +156,24 @@ export class AuthService {
|
||||
return this.store.pipe(select(isAuthenticatedLoaded));
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to set the external authentication status when authenticating via an
|
||||
* external authentication system (e.g. Shibboleth).
|
||||
* @param external
|
||||
*/
|
||||
public setExternalAuthStatus(external: boolean) {
|
||||
this.store.dispatch(new SetAuthCookieStatus(external));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if an external authentication system (e.g. Shibboleth) is being used
|
||||
* for authentication. Returns false otherwise.
|
||||
*/
|
||||
public isExternalAuthentication(): Observable<boolean> {
|
||||
return this.store.pipe(
|
||||
select(getExternalAuthCookieStatus));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the href link to authenticated user
|
||||
* @returns {string}
|
||||
|
@@ -116,6 +116,8 @@ const _getRedirectUrl = (state: AuthState) => state.redirectUrl;
|
||||
|
||||
const _getAuthenticationMethods = (state: AuthState) => state.authMethods;
|
||||
|
||||
const _getExternalAuthCookieStatus = (state: AuthState) => state.externalAuth;
|
||||
|
||||
/**
|
||||
* Returns true if the user is idle.
|
||||
* @function _isIdle
|
||||
@@ -178,6 +180,16 @@ export const isAuthenticated = createSelector(getAuthState, _isAuthenticated);
|
||||
*/
|
||||
export const isAuthenticatedLoaded = createSelector(getAuthState, _isAuthenticatedLoaded);
|
||||
|
||||
/**
|
||||
* Returns the authentication cookie status. Expect to be true when external authentication
|
||||
* is used.
|
||||
* @function getExternalAuthCookieStatus
|
||||
* @param {AuthState} state
|
||||
* @param {any} props
|
||||
* @return {boolean}
|
||||
*/
|
||||
export const getExternalAuthCookieStatus = createSelector(getAuthState, _getExternalAuthCookieStatus);
|
||||
|
||||
/**
|
||||
* Returns true if the authentication request is loading.
|
||||
* @function isAuthenticationLoading
|
||||
|
@@ -176,6 +176,7 @@ import { VocabularyEntryDetailsDataService } from './submission/vocabularies/voc
|
||||
import { IdentifierData } from '../shared/object-list/identifier-data/identifier-data.model';
|
||||
import { Subscription } from '../shared/subscriptions/models/subscription.model';
|
||||
import { SupervisionOrderDataService } from './supervision-order/supervision-order-data.service';
|
||||
import { ItemRequest } from './shared/item-request.model';
|
||||
|
||||
/**
|
||||
* When not in production, endpoint responses can be mocked for testing purposes
|
||||
@@ -369,6 +370,7 @@ export const models =
|
||||
AccessStatusObject,
|
||||
IdentifierData,
|
||||
Subscription,
|
||||
ItemRequest,
|
||||
];
|
||||
|
||||
@NgModule({
|
||||
|
@@ -246,10 +246,10 @@ export abstract class BaseItemDataService extends IdentifiableDataService<Item>
|
||||
* Get the endpoint to move the item
|
||||
* @param itemId
|
||||
*/
|
||||
public getMoveItemEndpoint(itemId: string): Observable<string> {
|
||||
public getMoveItemEndpoint(itemId: string, inheritPolicies: boolean): Observable<string> {
|
||||
return this.halService.getEndpoint(this.linkPath).pipe(
|
||||
map((endpoint: string) => this.getIDHref(endpoint, itemId)),
|
||||
map((endpoint: string) => `${endpoint}/owningCollection`),
|
||||
map((endpoint: string) => `${endpoint}/owningCollection?inheritPolicies=${inheritPolicies}`)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -258,14 +258,14 @@ export abstract class BaseItemDataService extends IdentifiableDataService<Item>
|
||||
* @param itemId
|
||||
* @param collection
|
||||
*/
|
||||
public moveToCollection(itemId: string, collection: Collection): Observable<RemoteData<any>> {
|
||||
public moveToCollection(itemId: string, collection: Collection, inheritPolicies: boolean): Observable<RemoteData<any>> {
|
||||
const options: HttpOptions = Object.create({});
|
||||
let headers = new HttpHeaders();
|
||||
headers = headers.append('Content-Type', 'text/uri-list');
|
||||
options.headers = headers;
|
||||
|
||||
const requestId = this.requestService.generateRequestId();
|
||||
const hrefObs = this.getMoveItemEndpoint(itemId);
|
||||
const hrefObs = this.getMoveItemEndpoint(itemId, inheritPolicies);
|
||||
|
||||
hrefObs.pipe(
|
||||
find((href: string) => hasValue(href)),
|
||||
|
@@ -7,7 +7,7 @@ import { FooterComponent } from './footer.component';
|
||||
*/
|
||||
@Component({
|
||||
selector: 'ds-themed-footer',
|
||||
styleUrls: ['footer.component.scss'],
|
||||
styleUrls: [],
|
||||
templateUrl: '../shared/theme-support/themed.component.html',
|
||||
})
|
||||
export class ThemedFooterComponent extends ThemedComponent<FooterComponent> {
|
||||
@@ -20,6 +20,6 @@ export class ThemedFooterComponent extends ThemedComponent<FooterComponent> {
|
||||
}
|
||||
|
||||
protected importUnthemedComponent(): Promise<any> {
|
||||
return import(`./footer.component`);
|
||||
return import('./footer.component');
|
||||
}
|
||||
}
|
||||
|
@@ -3,11 +3,11 @@ import { ThemedComponent } from '../shared/theme-support/themed.component';
|
||||
import { HeaderNavbarWrapperComponent } from './header-navbar-wrapper.component';
|
||||
|
||||
/**
|
||||
* Themed wrapper for BreadcrumbsComponent
|
||||
* Themed wrapper for {@link HeaderNavbarWrapperComponent}
|
||||
*/
|
||||
@Component({
|
||||
selector: 'ds-themed-header-navbar-wrapper',
|
||||
styleUrls: ['./themed-header-navbar-wrapper.component.scss'],
|
||||
styleUrls: [],
|
||||
templateUrl: '../shared/theme-support/themed.component.html',
|
||||
})
|
||||
export class ThemedHeaderNavbarWrapperComponent extends ThemedComponent<HeaderNavbarWrapperComponent> {
|
||||
@@ -20,6 +20,6 @@ export class ThemedHeaderNavbarWrapperComponent extends ThemedComponent<HeaderNa
|
||||
}
|
||||
|
||||
protected importUnthemedComponent(): Promise<any> {
|
||||
return import(`./header-navbar-wrapper.component`);
|
||||
return import('./header-navbar-wrapper.component');
|
||||
}
|
||||
}
|
||||
|
@@ -8,8 +8,6 @@ import { Component } from '@angular/core';
|
||||
templateUrl: '../shared/theme-support/themed.component.html',
|
||||
})
|
||||
export class ThemedHomePageComponent extends ThemedComponent<HomePageComponent> {
|
||||
protected inAndOutputNames: (keyof HomePageComponent & keyof this)[];
|
||||
|
||||
|
||||
protected getComponentName(): string {
|
||||
return 'HomePageComponent';
|
||||
|
@@ -134,9 +134,10 @@ describe('ItemMoveComponent', () => {
|
||||
});
|
||||
comp.selectedCollectionName = 'selected-collection-id';
|
||||
comp.selectedCollection = collection1;
|
||||
comp.inheritPolicies = false;
|
||||
comp.moveToCollection();
|
||||
|
||||
expect(itemDataService.moveToCollection).toHaveBeenCalledWith('item-id', collection1);
|
||||
expect(itemDataService.moveToCollection).toHaveBeenCalledWith('item-id', collection1, false);
|
||||
});
|
||||
it('should call notificationsService success message on success', () => {
|
||||
comp.moveToCollection();
|
||||
|
@@ -106,7 +106,7 @@ export class ItemMoveComponent implements OnInit {
|
||||
*/
|
||||
moveToCollection() {
|
||||
this.processing = true;
|
||||
const move$ = this.itemDataService.moveToCollection(this.item.id, this.selectedCollection)
|
||||
const move$ = this.itemDataService.moveToCollection(this.item.id, this.selectedCollection, this.inheritPolicies)
|
||||
.pipe(getFirstCompletedRemoteData());
|
||||
|
||||
move$.subscribe((response: RemoteData<any>) => {
|
||||
|
@@ -1,4 +1,4 @@
|
||||
import { Component, Input, OnInit } from '@angular/core';
|
||||
import { Component, Input, OnChanges, OnInit } from '@angular/core';
|
||||
import { NgxGalleryImage, NgxGalleryOptions } from '@kolkov/ngx-gallery';
|
||||
import { MediaViewerItem } from '../../../core/shared/media-viewer-item.model';
|
||||
import { NgxGalleryAnimation } from '@kolkov/ngx-gallery';
|
||||
@@ -13,15 +13,16 @@ import { AuthService } from '../../../core/auth/auth.service';
|
||||
templateUrl: './media-viewer-image.component.html',
|
||||
styleUrls: ['./media-viewer-image.component.scss'],
|
||||
})
|
||||
export class MediaViewerImageComponent implements OnInit {
|
||||
export class MediaViewerImageComponent implements OnChanges, OnInit {
|
||||
@Input() images: MediaViewerItem[];
|
||||
@Input() preview?: boolean;
|
||||
@Input() image?: string;
|
||||
|
||||
thumbnailPlaceholder = './assets/images/replacement_image.svg';
|
||||
|
||||
galleryOptions: NgxGalleryOptions[];
|
||||
galleryImages: NgxGalleryImage[];
|
||||
galleryOptions: NgxGalleryOptions[] = [];
|
||||
|
||||
galleryImages: NgxGalleryImage[] = [];
|
||||
|
||||
/**
|
||||
* Whether or not the current user is authenticated
|
||||
@@ -33,11 +34,7 @@ export class MediaViewerImageComponent implements OnInit {
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Thi method sets up the gallery settings and data
|
||||
*/
|
||||
ngOnInit(): void {
|
||||
this.isAuthenticated$ = this.authService.isAuthenticated();
|
||||
ngOnChanges(): void {
|
||||
this.galleryOptions = [
|
||||
{
|
||||
preview: this.preview !== undefined ? this.preview : true,
|
||||
@@ -53,7 +50,6 @@ export class MediaViewerImageComponent implements OnInit {
|
||||
previewFullscreen: true,
|
||||
},
|
||||
];
|
||||
|
||||
if (this.image) {
|
||||
this.galleryImages = [
|
||||
{
|
||||
@@ -67,6 +63,11 @@ export class MediaViewerImageComponent implements OnInit {
|
||||
}
|
||||
}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.isAuthenticated$ = this.authService.isAuthenticated();
|
||||
this.ngOnChanges();
|
||||
}
|
||||
|
||||
/**
|
||||
* This method convert an array of MediaViewerItem into NgxGalleryImage array
|
||||
* @param medias input NgxGalleryImage array
|
||||
|
@@ -1,23 +1,22 @@
|
||||
<video
|
||||
crossorigin="anonymous"
|
||||
#media
|
||||
[src]="filteredMedias[currentIndex].bitstream._links.content.href"
|
||||
[src]="medias[currentIndex].bitstream._links.content.href"
|
||||
id="singleVideo"
|
||||
[poster]="
|
||||
filteredMedias[currentIndex].thumbnail ||
|
||||
replacements[filteredMedias[currentIndex].format]
|
||||
medias[currentIndex].thumbnail ||
|
||||
replacements[medias[currentIndex].format]
|
||||
"
|
||||
preload="none"
|
||||
controls
|
||||
>
|
||||
<ng-container *ngIf="getMediaCap(filteredMedias[currentIndex].bitstream.name) as capInfos">
|
||||
<ng-container *ngIf="getMediaCap(medias[currentIndex].bitstream.name, captions) as capInfos">
|
||||
<ng-container *ngFor="let capInfo of capInfos">
|
||||
<track [src]="capInfo.src" [label]="capInfo.langLabel" [srclang]="capInfo.srclang" />
|
||||
</ng-container>
|
||||
</ng-container>
|
||||
|
||||
</video>
|
||||
<div class="buttons" *ngIf="filteredMedias?.length > 1">
|
||||
<div class="buttons" *ngIf="medias?.length > 1">
|
||||
<button
|
||||
class="btn btn-primary previous"
|
||||
[disabled]="currentIndex === 0"
|
||||
@@ -28,7 +27,7 @@
|
||||
|
||||
<button
|
||||
class="btn btn-primary next"
|
||||
[disabled]="currentIndex === filteredMedias.length - 1"
|
||||
[disabled]="currentIndex === medias.length - 1"
|
||||
(click)="nextMedia()"
|
||||
>
|
||||
{{ "media-viewer.next" | translate }}
|
||||
@@ -44,7 +43,7 @@
|
||||
<div ngbDropdownMenu aria-labelledby="dropdownBasic1">
|
||||
<button
|
||||
ngbDropdownItem
|
||||
*ngFor="let item of filteredMedias; index as indexOfelement"
|
||||
*ngFor="let item of medias; index as indexOfelement"
|
||||
class="list-element"
|
||||
(click)="selectedMedia(indexOfelement)"
|
||||
>
|
||||
|
@@ -83,7 +83,6 @@ describe('MediaViewerVideoComponent', () => {
|
||||
fixture = TestBed.createComponent(MediaViewerVideoComponent);
|
||||
component = fixture.componentInstance;
|
||||
component.medias = mockMediaViewerItem;
|
||||
component.filteredMedias = mockMediaViewerItem;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
@@ -94,7 +93,6 @@ describe('MediaViewerVideoComponent', () => {
|
||||
describe('should show controller buttons when the having mode then one video', () => {
|
||||
beforeEach(() => {
|
||||
component.medias = mockMediaViewerItems;
|
||||
component.filteredMedias = mockMediaViewerItems;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
|
@@ -1,8 +1,9 @@
|
||||
import { Component, Input, OnInit } from '@angular/core';
|
||||
import { Component, Input } from '@angular/core';
|
||||
import { MediaViewerItem } from '../../../core/shared/media-viewer-item.model';
|
||||
import { DSONameService } from '../../../core/breadcrumbs/dso-name.service';
|
||||
import { languageHelper } from './language-helper';
|
||||
import { CaptionInfo } from './caption-info';
|
||||
import { Bitstream } from 'src/app/core/shared/bitstream.model';
|
||||
|
||||
/**
|
||||
* This component renders a video viewer and playlist for the media viewer
|
||||
@@ -12,12 +13,13 @@ import { CaptionInfo} from './caption-info';
|
||||
templateUrl: './media-viewer-video.component.html',
|
||||
styleUrls: ['./media-viewer-video.component.scss'],
|
||||
})
|
||||
export class MediaViewerVideoComponent implements OnInit {
|
||||
export class MediaViewerVideoComponent {
|
||||
@Input() medias: MediaViewerItem[];
|
||||
|
||||
filteredMedias: MediaViewerItem[];
|
||||
@Input() captions: Bitstream[] = [];
|
||||
|
||||
isCollapsed = false;
|
||||
|
||||
isCollapsed: boolean;
|
||||
currentIndex = 0;
|
||||
|
||||
replacements = {
|
||||
@@ -30,11 +32,6 @@ export class MediaViewerVideoComponent implements OnInit {
|
||||
) {
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
this.isCollapsed = false;
|
||||
this.filteredMedias = this.medias.filter((media) => media.format === 'audio' || media.format === 'video');
|
||||
}
|
||||
|
||||
/**
|
||||
* This method check if there is caption file for the media
|
||||
* The caption file name is the media name plus "-" following two letter
|
||||
@@ -45,29 +42,24 @@ export class MediaViewerVideoComponent implements OnInit {
|
||||
* Two letter language code reference
|
||||
* https://www.w3schools.com/tags/ref_language_codes.asp
|
||||
*/
|
||||
getMediaCap(name: string): CaptionInfo[] {
|
||||
let filteredCapMedias: MediaViewerItem[];
|
||||
let capInfos: CaptionInfo[] = [];
|
||||
filteredCapMedias = this.medias
|
||||
.filter((media) => media.mimetype === 'text/vtt')
|
||||
.filter((media) => media.bitstream.name.substring(0, (media.bitstream.name.length - 7) ).toLowerCase() === name.toLowerCase());
|
||||
getMediaCap(name: string, captions: Bitstream[]): CaptionInfo[] {
|
||||
const capInfos: CaptionInfo[] = [];
|
||||
const filteredCapMedias: Bitstream[] = captions
|
||||
.filter((media: Bitstream) => media.name.substring(0, (media.name.length - 7)).toLowerCase() === name.toLowerCase());
|
||||
|
||||
if (filteredCapMedias) {
|
||||
filteredCapMedias
|
||||
.forEach((media, index) => {
|
||||
let srclang: string = media.bitstream.name.slice(-6, -4).toLowerCase();
|
||||
for (const media of filteredCapMedias) {
|
||||
let srclang: string = media.name.slice(-6, -4).toLowerCase();
|
||||
capInfos.push(new CaptionInfo(
|
||||
media.bitstream._links.content.href,
|
||||
media._links.content.href,
|
||||
srclang,
|
||||
languageHelper[srclang]
|
||||
languageHelper[srclang],
|
||||
));
|
||||
});
|
||||
}
|
||||
return capInfos;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method sets the reviced index into currentIndex
|
||||
* This method sets the received index into currentIndex
|
||||
* @param index Selected index
|
||||
*/
|
||||
selectedMedia(index: number) {
|
||||
@@ -75,14 +67,14 @@ export class MediaViewerVideoComponent implements OnInit {
|
||||
}
|
||||
|
||||
/**
|
||||
* This method increade the number of the currentIndex
|
||||
* This method increases the number of the currentIndex
|
||||
*/
|
||||
nextMedia() {
|
||||
this.currentIndex++;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method decrese the number of the currentIndex
|
||||
* This method decreases the number of the currentIndex
|
||||
*/
|
||||
prevMedia() {
|
||||
this.currentIndex--;
|
||||
|
@@ -2,6 +2,7 @@ import { Component, Input } from '@angular/core';
|
||||
import { ThemedComponent } from '../../../shared/theme-support/themed.component';
|
||||
import { MediaViewerItem } from '../../../core/shared/media-viewer-item.model';
|
||||
import { MediaViewerVideoComponent } from './media-viewer-video.component';
|
||||
import { Bitstream } from '../../../core/shared/bitstream.model';
|
||||
|
||||
/**
|
||||
* Themed wrapper for {@link MediaViewerVideoComponent}.
|
||||
@@ -15,8 +16,11 @@ export class ThemedMediaViewerVideoComponent extends ThemedComponent<MediaViewer
|
||||
|
||||
@Input() medias: MediaViewerItem[];
|
||||
|
||||
@Input() captions: Bitstream[];
|
||||
|
||||
protected inAndOutputNames: (keyof MediaViewerVideoComponent & keyof this)[] = [
|
||||
'medias',
|
||||
'captions',
|
||||
];
|
||||
|
||||
protected getComponentName(): string {
|
||||
|
@@ -5,32 +5,23 @@
|
||||
[showMessage]="false"
|
||||
></ds-themed-loading>
|
||||
<div class="media-viewer" *ngIf="!isLoading">
|
||||
<ng-container *ngIf="mediaList.length > 0">
|
||||
<ng-container *ngIf="videoOptions">
|
||||
<ng-container
|
||||
*ngIf="
|
||||
mediaList[0]?.format === 'video' || mediaList[0]?.format === 'audio'
|
||||
"
|
||||
>
|
||||
<ds-themed-media-viewer-video [medias]="mediaList"></ds-themed-media-viewer-video>
|
||||
<ng-container *ngIf="mediaList.length > 0; else showThumbnail">
|
||||
<ng-container *ngVar="mediaOptions.video && ['audio', 'video'].includes(mediaList[0]?.format) as showVideo">
|
||||
<ng-container *ngVar="mediaOptions.image && mediaList[0]?.format === 'image' as showImage">
|
||||
<ds-themed-media-viewer-video *ngIf="showVideo" [medias]="mediaList" [captions]="captions$ | async"></ds-themed-media-viewer-video>
|
||||
<ds-themed-media-viewer-image *ngIf="showImage" [images]="mediaList"></ds-themed-media-viewer-image>
|
||||
<ng-container *ngIf="showImage || showVideo; else showThumbnail"></ng-container>
|
||||
</ng-container>
|
||||
</ng-container>
|
||||
<ng-container *ngIf="mediaList[0]?.format === 'image'">
|
||||
<ds-themed-media-viewer-image [images]="mediaList"></ds-themed-media-viewer-image>
|
||||
</ng-container>
|
||||
</ng-container>
|
||||
<ng-container
|
||||
*ngIf="
|
||||
((mediaList[0]?.format !== 'image') &&
|
||||
(!videoOptions || mediaList[0]?.format !== 'video') &&
|
||||
(!videoOptions || mediaList[0]?.format !== 'audio')) ||
|
||||
mediaList.length === 0
|
||||
"
|
||||
>
|
||||
<ds-themed-media-viewer-image
|
||||
[image]="mediaList[0]?.thumbnail || thumbnailPlaceholder"
|
||||
[preview]="false"
|
||||
></ds-themed-media-viewer-image>
|
||||
</ng-container>
|
||||
</div>
|
||||
<ng-template #showThumbnail>
|
||||
<ds-themed-media-viewer-image *ngIf="mediaOptions.image && mediaOptions.video"
|
||||
[image]="(thumbnailsRD$ | async)?.payload?.page[0]?._links.content.href || thumbnailPlaceholder"
|
||||
[preview]="false"
|
||||
></ds-themed-media-viewer-image>
|
||||
<ds-thumbnail *ngIf="!(mediaOptions.image && mediaOptions.video)"
|
||||
[thumbnail]="(thumbnailsRD$ | async)?.payload?.page[0]">
|
||||
</ds-thumbnail>
|
||||
</ng-template>
|
||||
</ng-container>
|
||||
|
@@ -61,7 +61,7 @@ describe('MediaViewerComponent', () => {
|
||||
);
|
||||
|
||||
beforeEach(waitForAsync(() => {
|
||||
TestBed.configureTestingModule({
|
||||
return TestBed.configureTestingModule({
|
||||
imports: [
|
||||
TranslateModule.forRoot({
|
||||
loader: {
|
||||
@@ -94,7 +94,10 @@ describe('MediaViewerComponent', () => {
|
||||
describe('when the bitstreams are loading', () => {
|
||||
beforeEach(() => {
|
||||
comp.mediaList$.next([mockMediaViewerItem]);
|
||||
comp.videoOptions = true;
|
||||
comp.mediaOptions = {
|
||||
image: true,
|
||||
video: true,
|
||||
};
|
||||
comp.isLoading = true;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
@@ -118,7 +121,10 @@ describe('MediaViewerComponent', () => {
|
||||
describe('when the bitstreams loading is failed', () => {
|
||||
beforeEach(() => {
|
||||
comp.mediaList$.next([]);
|
||||
comp.videoOptions = true;
|
||||
comp.mediaOptions = {
|
||||
image: true,
|
||||
video: true,
|
||||
};
|
||||
comp.isLoading = false;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
@@ -1,4 +1,4 @@
|
||||
import { Component, Input, OnInit } from '@angular/core';
|
||||
import { Component, Input, OnDestroy, OnInit } from '@angular/core';
|
||||
import { BehaviorSubject, Observable } from 'rxjs';
|
||||
import { filter, take } from 'rxjs/operators';
|
||||
import { BitstreamDataService } from '../../core/data/bitstream-data.service';
|
||||
@@ -11,6 +11,9 @@ import { MediaViewerItem } from '../../core/shared/media-viewer-item.model';
|
||||
import { getFirstSucceededRemoteDataPayload } from '../../core/shared/operators';
|
||||
import { hasValue } from '../../shared/empty.util';
|
||||
import { followLink } from '../../shared/utils/follow-link-config.model';
|
||||
import { MediaViewerConfig } from '../../../config/media-viewer-config.interface';
|
||||
import { environment } from '../../../environments/environment';
|
||||
import { Subscription } from 'rxjs/internal/Subscription';
|
||||
|
||||
/**
|
||||
* This component renders the media viewers
|
||||
@@ -20,51 +23,71 @@ import { followLink } from '../../shared/utils/follow-link-config.model';
|
||||
templateUrl: './media-viewer.component.html',
|
||||
styleUrls: ['./media-viewer.component.scss'],
|
||||
})
|
||||
export class MediaViewerComponent implements OnInit {
|
||||
export class MediaViewerComponent implements OnDestroy, OnInit {
|
||||
@Input() item: Item;
|
||||
@Input() videoOptions: boolean;
|
||||
|
||||
mediaList$: BehaviorSubject<MediaViewerItem[]>;
|
||||
@Input() mediaOptions: MediaViewerConfig = environment.mediaViewer;
|
||||
|
||||
isLoading: boolean;
|
||||
mediaList$: BehaviorSubject<MediaViewerItem[]> = new BehaviorSubject([]);
|
||||
|
||||
captions$: BehaviorSubject<Bitstream[]> = new BehaviorSubject([]);
|
||||
|
||||
isLoading = true;
|
||||
|
||||
thumbnailPlaceholder = './assets/images/replacement_document.svg';
|
||||
|
||||
constructor(protected bitstreamDataService: BitstreamDataService) {}
|
||||
thumbnailsRD$: Observable<RemoteData<PaginatedList<Bitstream>>>;
|
||||
|
||||
subs: Subscription[] = [];
|
||||
|
||||
constructor(
|
||||
protected bitstreamDataService: BitstreamDataService,
|
||||
) {
|
||||
}
|
||||
|
||||
ngOnDestroy(): void {
|
||||
this.subs.forEach((subscription: Subscription) => subscription.unsubscribe());
|
||||
}
|
||||
|
||||
/**
|
||||
* This metod loads all the Bitstreams and Thumbnails and contert it to media item
|
||||
* This method loads all the Bitstreams and Thumbnails and converts it to {@link MediaViewerItem}s
|
||||
*/
|
||||
ngOnInit(): void {
|
||||
this.mediaList$ = new BehaviorSubject([]);
|
||||
this.isLoading = true;
|
||||
this.loadRemoteData('ORIGINAL').subscribe((bitstreamsRD) => {
|
||||
const types: string[] = [
|
||||
...(this.mediaOptions.image ? ['image'] : []),
|
||||
...(this.mediaOptions.video ? ['audio', 'video'] : []),
|
||||
];
|
||||
this.thumbnailsRD$ = this.loadRemoteData('THUMBNAIL');
|
||||
this.subs.push(this.loadRemoteData('ORIGINAL').subscribe((bitstreamsRD: RemoteData<PaginatedList<Bitstream>>) => {
|
||||
if (bitstreamsRD.payload.page.length === 0) {
|
||||
this.isLoading = false;
|
||||
this.mediaList$.next([]);
|
||||
} else {
|
||||
this.loadRemoteData('THUMBNAIL').subscribe((thumbnailsRD) => {
|
||||
this.subs.push(this.thumbnailsRD$.subscribe((thumbnailsRD: RemoteData<PaginatedList<Bitstream>>) => {
|
||||
for (
|
||||
let index = 0;
|
||||
index < bitstreamsRD.payload.page.length;
|
||||
index++
|
||||
) {
|
||||
bitstreamsRD.payload.page[index].format
|
||||
this.subs.push(bitstreamsRD.payload.page[index].format
|
||||
.pipe(getFirstSucceededRemoteDataPayload())
|
||||
.subscribe((format) => {
|
||||
const current = this.mediaList$.getValue();
|
||||
.subscribe((format: BitstreamFormat) => {
|
||||
const mediaItem = this.createMediaViewerItem(
|
||||
bitstreamsRD.payload.page[index],
|
||||
format,
|
||||
thumbnailsRD.payload && thumbnailsRD.payload.page[index]
|
||||
);
|
||||
this.mediaList$.next([...current, mediaItem]);
|
||||
});
|
||||
if (types.includes(mediaItem.format)) {
|
||||
this.mediaList$.next([...this.mediaList$.getValue(), mediaItem]);
|
||||
} else if (format.mimetype === 'text/vtt') {
|
||||
this.captions$.next([...this.captions$.getValue(), bitstreamsRD.payload.page[index]]);
|
||||
}
|
||||
}));
|
||||
}
|
||||
this.isLoading = false;
|
||||
});
|
||||
}));
|
||||
}
|
||||
});
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -94,16 +117,12 @@ export class MediaViewerComponent implements OnInit {
|
||||
}
|
||||
|
||||
/**
|
||||
* This method create MediaViewerItem from incoming bitstreams
|
||||
* @param original original remote data bitstream
|
||||
* This method creates a {@link MediaViewerItem} from incoming {@link Bitstream}s
|
||||
* @param original original bitstream
|
||||
* @param format original bitstream format
|
||||
* @param thumbnail trunbnail remote data bitstream
|
||||
* @param thumbnail thumbnail bitstream
|
||||
*/
|
||||
createMediaViewerItem(
|
||||
original: Bitstream,
|
||||
format: BitstreamFormat,
|
||||
thumbnail: Bitstream
|
||||
): MediaViewerItem {
|
||||
createMediaViewerItem(original: Bitstream, format: BitstreamFormat, thumbnail: Bitstream): MediaViewerItem {
|
||||
const mediaItem = new MediaViewerItem();
|
||||
mediaItem.bitstream = original;
|
||||
mediaItem.format = format.mimetype.split('/')[0];
|
||||
|
@@ -2,6 +2,7 @@ import { Component, Input } from '@angular/core';
|
||||
import { ThemedComponent } from '../../shared/theme-support/themed.component';
|
||||
import { MediaViewerComponent } from './media-viewer.component';
|
||||
import { Item } from '../../core/shared/item.model';
|
||||
import { MediaViewerConfig } from '../../../config/media-viewer-config.interface';
|
||||
|
||||
/**
|
||||
* Themed wrapper for {@link MediaViewerComponent}.
|
||||
@@ -14,11 +15,11 @@ import { Item } from '../../core/shared/item.model';
|
||||
export class ThemedMediaViewerComponent extends ThemedComponent<MediaViewerComponent> {
|
||||
|
||||
@Input() item: Item;
|
||||
@Input() videoOptions: boolean;
|
||||
@Input() mediaOptions: MediaViewerConfig;
|
||||
|
||||
protected inAndOutputNames: (keyof MediaViewerComponent & keyof this)[] = [
|
||||
'item',
|
||||
'videoOptions',
|
||||
'mediaOptions',
|
||||
];
|
||||
|
||||
protected getComponentName(): string {
|
||||
|
@@ -15,13 +15,13 @@
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-md-4">
|
||||
<ng-container *ngIf="!mediaViewer.image">
|
||||
<ng-container *ngIf="!(mediaViewer.image || mediaViewer.video)">
|
||||
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
|
||||
<ds-thumbnail [thumbnail]="object?.thumbnail | async"></ds-thumbnail>
|
||||
</ds-metadata-field-wrapper>
|
||||
</ng-container>
|
||||
<div *ngIf="mediaViewer.image" class="mb-2">
|
||||
<ds-themed-media-viewer [item]="object" [videoOptions]="mediaViewer.video"></ds-themed-media-viewer>
|
||||
<div *ngIf="mediaViewer.image || mediaViewer.video" class="mb-2">
|
||||
<ds-themed-media-viewer [item]="object"></ds-themed-media-viewer>
|
||||
</div>
|
||||
<ds-themed-item-page-file-section [item]="object"></ds-themed-item-page-file-section>
|
||||
<ds-item-page-date-field [item]="object"></ds-item-page-date-field>
|
||||
|
@@ -16,13 +16,13 @@
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-xs-12 col-md-4">
|
||||
<ng-container *ngIf="!mediaViewer.image">
|
||||
<ng-container *ngIf="!(mediaViewer.image || mediaViewer.video)">
|
||||
<ds-metadata-field-wrapper [hideIfNoTextContent]="false">
|
||||
<ds-thumbnail [thumbnail]="object?.thumbnail | async"></ds-thumbnail>
|
||||
</ds-metadata-field-wrapper>
|
||||
</ng-container>
|
||||
<div *ngIf="mediaViewer.image" class="mb-2">
|
||||
<ds-themed-media-viewer [item]="object" [videoOptions]="mediaViewer.video"></ds-themed-media-viewer>
|
||||
<div *ngIf="mediaViewer.image || mediaViewer.video" class="mb-2">
|
||||
<ds-themed-media-viewer [item]="object"></ds-themed-media-viewer>
|
||||
</div>
|
||||
<ds-themed-item-page-file-section [item]="object"></ds-themed-item-page-file-section>
|
||||
<ds-item-page-date-field [item]="object"></ds-item-page-date-field>
|
||||
|
@@ -19,7 +19,7 @@ export class ThemedMetadataRepresentationListComponent extends ThemedComponent<M
|
||||
|
||||
@Input() label: string;
|
||||
|
||||
@Input() incrementBy = 10;
|
||||
@Input() incrementBy: number;
|
||||
|
||||
protected getComponentName(): string {
|
||||
return 'MetadataRepresentationListComponent';
|
||||
|
@@ -11,7 +11,6 @@ import { MyDSpacePageComponent } from './my-dspace-page.component';
|
||||
templateUrl: './../shared/theme-support/themed.component.html'
|
||||
})
|
||||
export class ThemedMyDSpacePageComponent extends ThemedComponent<MyDSpacePageComponent> {
|
||||
protected inAndOutputNames: (keyof MyDSpacePageComponent & keyof this)[];
|
||||
|
||||
protected getComponentName(): string {
|
||||
return 'MyDSpacePageComponent';
|
||||
|
@@ -28,19 +28,18 @@ export class ThemedConfigurationSearchPageComponent extends ThemedComponent<Conf
|
||||
/**
|
||||
* True when the search component should show results on the current page
|
||||
*/
|
||||
@Input() inPlaceSearch = true;
|
||||
@Input() inPlaceSearch: boolean;
|
||||
|
||||
/**
|
||||
* Whether or not the search bar should be visible
|
||||
*/
|
||||
@Input()
|
||||
searchEnabled = true;
|
||||
@Input() searchEnabled: boolean;
|
||||
|
||||
/**
|
||||
* The width of the sidebar (bootstrap columns)
|
||||
*/
|
||||
@Input()
|
||||
sideBarWidth = 3;
|
||||
sideBarWidth: number;
|
||||
|
||||
/**
|
||||
* The currently applied configuration (determines title of search)
|
||||
@@ -66,7 +65,7 @@ export class ThemedConfigurationSearchPageComponent extends ThemedComponent<Conf
|
||||
}
|
||||
|
||||
protected importUnthemedComponent(): Promise<any> {
|
||||
return import(`./configuration-search-page.component`);
|
||||
return import('./configuration-search-page.component');
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -11,11 +11,11 @@ export class ThemedCollectionDropdownComponent extends ThemedComponent<Collectio
|
||||
|
||||
@Input() entityType: string;
|
||||
|
||||
@Output() searchComplete = new EventEmitter<any>();
|
||||
@Output() searchComplete: EventEmitter<any> = new EventEmitter();
|
||||
|
||||
@Output() theOnlySelectable = new EventEmitter<CollectionListEntry>();
|
||||
@Output() theOnlySelectable: EventEmitter<CollectionListEntry> = new EventEmitter();
|
||||
|
||||
@Output() selectionChange = new EventEmitter<CollectionListEntry>();
|
||||
@Output() selectionChange = new EventEmitter();
|
||||
|
||||
protected inAndOutputNames: (keyof CollectionDropdownComponent & keyof this)[] = ['entityType', 'searchComplete', 'theOnlySelectable', 'selectionChange'];
|
||||
|
||||
|
@@ -9,7 +9,7 @@ import {
|
||||
import {
|
||||
DsoEditMenuExpandableSectionComponent
|
||||
} from '../dso-page/dso-edit-menu/dso-edit-expandable-menu-section/dso-edit-menu-expandable-section.component';
|
||||
import { NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap';
|
||||
import { NgbDropdownModule, NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap';
|
||||
|
||||
const COMPONENTS = [
|
||||
DsoEditMenuComponent,
|
||||
@@ -25,6 +25,7 @@ const MODULES = [
|
||||
RouterModule,
|
||||
CommonModule,
|
||||
NgbTooltipModule,
|
||||
NgbDropdownModule,
|
||||
];
|
||||
const PROVIDERS = [
|
||||
|
||||
|
@@ -16,7 +16,7 @@
|
||||
<ng-container #componentViewContainer></ng-container>
|
||||
</div>
|
||||
|
||||
<small *ngIf="hasHint && ((!model.repeatable && (isRelationship === false || value?.value === null)) || (model.repeatable === true && context?.index === context?.context?.groups?.length - 1)) && (!showErrorMessages || errorMessages.length === 0)"
|
||||
<small *ngIf="hasHint && (formBuilderService.hasArrayGroupValue(model) || (!model.repeatable && (isRelationship === false || value?.value === null)) || (model.repeatable === true && context?.index === context?.context?.groups?.length - 1)) && (!showErrorMessages || errorMessages.length === 0)"
|
||||
class="text-muted ds-hint" [innerHTML]="model.hint | translate" [ngClass]="getClass('element', 'hint')"></small>
|
||||
<!-- In case of repeatable fields show empty space for all elements except the first -->
|
||||
<div *ngIf="context?.index !== null
|
||||
|
@@ -147,12 +147,14 @@ describe('DsDynamicFormControlContainerComponent test suite', () => {
|
||||
new DynamicListCheckboxGroupModel({
|
||||
id: 'checkboxList',
|
||||
vocabularyOptions: vocabularyOptions,
|
||||
repeatable: true
|
||||
repeatable: true,
|
||||
required: false,
|
||||
}),
|
||||
new DynamicListRadioGroupModel({
|
||||
id: 'radioList',
|
||||
vocabularyOptions: vocabularyOptions,
|
||||
repeatable: false
|
||||
repeatable: false,
|
||||
required: false,
|
||||
}),
|
||||
new DynamicRelationGroupModel({
|
||||
submissionId: '1234',
|
||||
|
@@ -259,7 +259,7 @@ export class DsDynamicFormControlContainerComponent extends DynamicFormControlCo
|
||||
private submissionObjectService: SubmissionObjectDataService,
|
||||
private ref: ChangeDetectorRef,
|
||||
private formService: FormService,
|
||||
private formBuilderService: FormBuilderService,
|
||||
public formBuilderService: FormBuilderService,
|
||||
private submissionService: SubmissionService,
|
||||
@Inject(APP_CONFIG) protected appConfig: AppConfig,
|
||||
) {
|
||||
|
@@ -15,8 +15,10 @@ export interface DynamicListCheckboxGroupModelConfig extends DynamicFormGroupMod
|
||||
vocabularyOptions: VocabularyOptions;
|
||||
groupLength?: number;
|
||||
repeatable: boolean;
|
||||
value?: any;
|
||||
value?: VocabularyEntry[];
|
||||
typeBindRelations?: DynamicFormControlRelation[];
|
||||
required: boolean;
|
||||
hint?: string;
|
||||
}
|
||||
|
||||
export class DynamicListCheckboxGroupModel extends DynamicCheckboxGroupModel {
|
||||
@@ -26,6 +28,8 @@ export class DynamicListCheckboxGroupModel extends DynamicCheckboxGroupModel {
|
||||
@serializable() groupLength: number;
|
||||
@serializable() _value: VocabularyEntry[];
|
||||
@serializable() typeBindRelations: DynamicFormControlRelation[];
|
||||
@serializable() required: boolean;
|
||||
@serializable() hint: string;
|
||||
isListGroup = true;
|
||||
valueUpdates: Subject<any>;
|
||||
|
||||
@@ -36,6 +40,8 @@ export class DynamicListCheckboxGroupModel extends DynamicCheckboxGroupModel {
|
||||
this.groupLength = config.groupLength || 5;
|
||||
this._value = [];
|
||||
this.repeatable = config.repeatable;
|
||||
this.required = config.required;
|
||||
this.hint = config.hint;
|
||||
|
||||
this.valueUpdates = new Subject<any>();
|
||||
this.valueUpdates.subscribe((value: VocabularyEntry | VocabularyEntry[]) => this.value = value);
|
||||
@@ -56,9 +62,8 @@ export class DynamicListCheckboxGroupModel extends DynamicCheckboxGroupModel {
|
||||
if (Array.isArray(value)) {
|
||||
this._value = value;
|
||||
} else {
|
||||
// _value is non extendible so assign it a new array
|
||||
const newValue = (this.value as VocabularyEntry[]).concat([value]);
|
||||
this._value = newValue;
|
||||
// _value is non-extendable so assign it a new array
|
||||
this._value = (this.value as VocabularyEntry[]).concat([value]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -6,12 +6,15 @@ import {
|
||||
} from '@ng-dynamic-forms/core';
|
||||
import { VocabularyOptions } from '../../../../../../core/submission/vocabularies/models/vocabulary-options.model';
|
||||
import { hasValue } from '../../../../../empty.util';
|
||||
import { VocabularyEntry } from '../../../../../../core/submission/vocabularies/models/vocabulary-entry.model';
|
||||
|
||||
export interface DynamicListModelConfig extends DynamicRadioGroupModelConfig<any> {
|
||||
vocabularyOptions: VocabularyOptions;
|
||||
groupLength?: number;
|
||||
repeatable: boolean;
|
||||
value?: any;
|
||||
value?: VocabularyEntry[];
|
||||
required: boolean;
|
||||
hint?: string;
|
||||
}
|
||||
|
||||
export class DynamicListRadioGroupModel extends DynamicRadioGroupModel<any> {
|
||||
@@ -19,6 +22,8 @@ export class DynamicListRadioGroupModel extends DynamicRadioGroupModel<any> {
|
||||
@serializable() vocabularyOptions: VocabularyOptions;
|
||||
@serializable() repeatable: boolean;
|
||||
@serializable() groupLength: number;
|
||||
@serializable() required: boolean;
|
||||
@serializable() hint: string;
|
||||
isListGroup = true;
|
||||
|
||||
constructor(config: DynamicListModelConfig, layout?: DynamicFormControlLayout) {
|
||||
@@ -27,6 +32,8 @@ export class DynamicListRadioGroupModel extends DynamicRadioGroupModel<any> {
|
||||
this.vocabularyOptions = config.vocabularyOptions;
|
||||
this.groupLength = config.groupLength || 5;
|
||||
this.repeatable = config.repeatable;
|
||||
this.required = config.required;
|
||||
this.hint = config.hint;
|
||||
this.value = config.value;
|
||||
}
|
||||
|
||||
|
@@ -17,7 +17,6 @@
|
||||
[id]="item.id"
|
||||
[formControlName]="item.id"
|
||||
[name]="model.name"
|
||||
[required]="model.required"
|
||||
[value]="item.value"
|
||||
(blur)="onBlur($event)"
|
||||
(change)="onChange($event)"
|
||||
|
@@ -1,6 +1,5 @@
|
||||
import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
|
||||
import { FormGroup } from '@angular/forms';
|
||||
|
||||
import { FormGroup, ValidatorFn, ValidationErrors, AbstractControl } from '@angular/forms';
|
||||
import {
|
||||
DynamicCheckboxModel,
|
||||
DynamicFormControlComponent,
|
||||
@@ -110,6 +109,9 @@ export class DsDynamicListComponent extends DynamicFormControlComponent implemen
|
||||
protected setOptionsFromVocabulary() {
|
||||
if (this.model.vocabularyOptions.name && this.model.vocabularyOptions.name.length > 0) {
|
||||
const listGroup = this.group.controls[this.model.id] as FormGroup;
|
||||
if (this.model.repeatable && this.model.required) {
|
||||
listGroup.addValidators(this.hasAtLeastOneVocabularyEntry());
|
||||
}
|
||||
const pageInfo: PageInfo = new PageInfo({
|
||||
elementsPerPage: 9999, currentPage: 1
|
||||
} as PageInfo);
|
||||
@@ -121,7 +123,7 @@ export class DsDynamicListComponent extends DynamicFormControlComponent implemen
|
||||
let tempList: ListItem[] = [];
|
||||
this.optionsList = entries.page;
|
||||
// Make a list of available options (checkbox/radio) and split in groups of 'model.groupLength'
|
||||
entries.page.forEach((option, key) => {
|
||||
entries.page.forEach((option: VocabularyEntry, key: number) => {
|
||||
const value = option.authority || option.value;
|
||||
const checked: boolean = isNotEmpty(findKey(
|
||||
this.model.value,
|
||||
@@ -156,4 +158,13 @@ export class DsDynamicListComponent extends DynamicFormControlComponent implemen
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if at least one {@link VocabularyEntry} has been selected.
|
||||
*/
|
||||
hasAtLeastOneVocabularyEntry(): ValidatorFn {
|
||||
return (control: AbstractControl): ValidationErrors | null => {
|
||||
return control && control.value && Object.values(control.value).find((checked: boolean) => checked === true) ? null : this.model.errorMessages;
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -4,27 +4,14 @@ import { RelationshipOptions } from '../../../models/relationship-options.model'
|
||||
import { ListableObject } from '../../../../../object-collection/shared/listable-object.model';
|
||||
import { Context } from '../../../../../../core/shared/context.model';
|
||||
import { Item } from '../../../../../../core/shared/item.model';
|
||||
import { SEARCH_CONFIG_SERVICE } from '../../../../../../my-dspace-page/my-dspace-page.component';
|
||||
import { SearchConfigurationService } from '../../../../../../core/shared/search/search-configuration.service';
|
||||
import { Collection } from '../../../../../../core/shared/collection.model';
|
||||
import { ExternalSource } from '../../../../../../core/shared/external-source.model';
|
||||
import { DsDynamicLookupRelationExternalSourceTabComponent } from './dynamic-lookup-relation-external-source-tab.component';
|
||||
import { fadeIn, fadeInOut } from '../../../../../animations/fade';
|
||||
|
||||
@Component({
|
||||
selector: 'ds-themed-dynamic-lookup-relation-external-source-tab',
|
||||
styleUrls: [],
|
||||
templateUrl: '../../../../../theme-support/themed.component.html',
|
||||
providers: [
|
||||
{
|
||||
provide: SEARCH_CONFIG_SERVICE,
|
||||
useClass: SearchConfigurationService
|
||||
}
|
||||
],
|
||||
animations: [
|
||||
fadeIn,
|
||||
fadeInOut
|
||||
]
|
||||
})
|
||||
export class ThemedDynamicLookupRelationExternalSourceTabComponent extends ThemedComponent<DsDynamicLookupRelationExternalSourceTabComponent> {
|
||||
protected inAndOutputNames: (keyof DsDynamicLookupRelationExternalSourceTabComponent & keyof this)[] = ['label', 'listId',
|
||||
@@ -44,7 +31,7 @@ export class ThemedDynamicLookupRelationExternalSourceTabComponent extends Theme
|
||||
|
||||
@Input() repeatable: boolean;
|
||||
|
||||
@Output() importedObject: EventEmitter<ListableObject> = new EventEmitter<ListableObject>();
|
||||
@Output() importedObject: EventEmitter<ListableObject> = new EventEmitter();
|
||||
|
||||
@Input() externalSource: ExternalSource;
|
||||
|
||||
|
@@ -10,19 +10,11 @@ import { Item } from '../../../../../../core/shared/item.model';
|
||||
import { SearchResult } from '../../../../../search/models/search-result.model';
|
||||
import { SearchObjects } from '../../../../../search/models/search-objects.model';
|
||||
import { DSpaceObject } from '../../../../../../core/shared/dspace-object.model';
|
||||
import { SEARCH_CONFIG_SERVICE } from '../../../../../../my-dspace-page/my-dspace-page.component';
|
||||
import { SearchConfigurationService } from '../../../../../../core/shared/search/search-configuration.service';
|
||||
|
||||
@Component({
|
||||
selector: 'ds-themed-dynamic-lookup-relation-search-tab',
|
||||
styleUrls: [],
|
||||
templateUrl: '../../../../../theme-support/themed.component.html',
|
||||
providers: [
|
||||
{
|
||||
provide: SEARCH_CONFIG_SERVICE,
|
||||
useClass: SearchConfigurationService
|
||||
}
|
||||
]
|
||||
})
|
||||
export class ThemedDynamicLookupRelationSearchTabComponent extends ThemedComponent<DsDynamicLookupRelationSearchTabComponent> {
|
||||
protected inAndOutputNames: (keyof DsDynamicLookupRelationSearchTabComponent & keyof this)[] = ['relationship', 'listId',
|
||||
@@ -51,11 +43,11 @@ export class ThemedDynamicLookupRelationSearchTabComponent extends ThemedCompone
|
||||
|
||||
@Input() isEditRelationship: boolean;
|
||||
|
||||
@Output() deselectObject: EventEmitter<ListableObject> = new EventEmitter<ListableObject>();
|
||||
@Output() deselectObject: EventEmitter<ListableObject> = new EventEmitter();
|
||||
|
||||
@Output() selectObject: EventEmitter<ListableObject> = new EventEmitter<ListableObject>();
|
||||
@Output() selectObject: EventEmitter<ListableObject> = new EventEmitter();
|
||||
|
||||
@Output() resultFound: EventEmitter<SearchObjects<DSpaceObject>> = new EventEmitter<SearchObjects<DSpaceObject>>();
|
||||
@Output() resultFound: EventEmitter<SearchObjects<DSpaceObject>> = new EventEmitter();
|
||||
|
||||
protected getComponentName(): string {
|
||||
return 'DsDynamicLookupRelationSearchTabComponent';
|
||||
|
@@ -235,10 +235,16 @@ describe('FormBuilderService test suite', () => {
|
||||
new DynamicListCheckboxGroupModel({
|
||||
id: 'testCheckboxList',
|
||||
vocabularyOptions: vocabularyOptions,
|
||||
repeatable: true
|
||||
repeatable: true,
|
||||
required: false,
|
||||
}),
|
||||
|
||||
new DynamicListRadioGroupModel({ id: 'testRadioList', vocabularyOptions: vocabularyOptions, repeatable: false }),
|
||||
new DynamicListRadioGroupModel({
|
||||
id: 'testRadioList',
|
||||
vocabularyOptions: vocabularyOptions,
|
||||
repeatable: false,
|
||||
required: false,
|
||||
}),
|
||||
|
||||
new DynamicRelationGroupModel({
|
||||
submissionId,
|
||||
|
@@ -14,8 +14,8 @@ import { ThemeService } from '../theme-support/theme.service';
|
||||
export class ThemedLoadingComponent extends ThemedComponent<LoadingComponent> {
|
||||
|
||||
@Input() message: string;
|
||||
@Input() showMessage = true;
|
||||
@Input() spinner = false;
|
||||
@Input() showMessage: boolean;
|
||||
@Input() spinner: boolean;
|
||||
|
||||
protected inAndOutputNames: (keyof LoadingComponent & keyof this)[] = ['message', 'showMessage', 'spinner'];
|
||||
|
||||
|
@@ -1,11 +1,10 @@
|
||||
import { ChangeDetectorRef, Component, ComponentFactoryResolver, Input } from '@angular/core';
|
||||
import { Component, Input } from '@angular/core';
|
||||
import { ThemedComponent } from '../../../theme-support/themed.component';
|
||||
import { ItemListPreviewComponent } from './item-list-preview.component';
|
||||
import { Item } from '../../../../core/shared/item.model';
|
||||
import { MyDspaceItemStatusType } from '../../../object-collection/shared/mydspace-item-status/my-dspace-item-status-type';
|
||||
import { SearchResult } from '../../../search/models/search-result.model';
|
||||
import { WorkflowItem } from 'src/app/core/submission/models/workflowitem.model';
|
||||
import { ThemeService } from 'src/app/shared/theme-support/theme.service';
|
||||
|
||||
/**
|
||||
* Themed wrapper for ItemListPreviewComponent
|
||||
@@ -24,22 +23,10 @@ export class ThemedItemListPreviewComponent extends ThemedComponent<ItemListPrev
|
||||
|
||||
@Input() status: MyDspaceItemStatusType;
|
||||
|
||||
@Input() showSubmitter = false;
|
||||
@Input() showSubmitter: boolean;
|
||||
|
||||
@Input() workflowItem: WorkflowItem;
|
||||
|
||||
constructor(
|
||||
protected resolver: ComponentFactoryResolver,
|
||||
protected cdr: ChangeDetectorRef,
|
||||
protected themeService: ThemeService,
|
||||
) {
|
||||
super(resolver, cdr, themeService);
|
||||
}
|
||||
|
||||
ngOnInit() {
|
||||
super.ngOnInit();
|
||||
}
|
||||
|
||||
protected getComponentName(): string {
|
||||
return 'ItemListPreviewComponent';
|
||||
}
|
||||
|
@@ -1,7 +1,6 @@
|
||||
import {Component, EventEmitter, Input, Output} from '@angular/core';
|
||||
import { ObjectListComponent } from './object-list.component';
|
||||
import { ThemedComponent } from '../theme-support/themed.component';
|
||||
import {ViewMode} from '../../core/shared/view-mode.model';
|
||||
import {PaginationComponentOptions} from '../pagination/pagination-component-options.model';
|
||||
import {SortDirection, SortOptions} from '../../core/cache/models/sort-options.model';
|
||||
import {CollectionElementLinkType} from '../object-collection/collection-element-link.type';
|
||||
@@ -19,10 +18,6 @@ import {ListableObject} from '../object-collection/shared/listable-object.model'
|
||||
templateUrl: '../theme-support/themed.component.html',
|
||||
})
|
||||
export class ThemedObjectListComponent extends ThemedComponent<ObjectListComponent> {
|
||||
/**
|
||||
* The view mode of the this component
|
||||
*/
|
||||
viewMode = ViewMode.ListElement;
|
||||
|
||||
/**
|
||||
* The current pagination configuration
|
||||
@@ -37,18 +32,20 @@ export class ThemedObjectListComponent extends ThemedComponent<ObjectListCompone
|
||||
/**
|
||||
* Whether or not the list elements have a border
|
||||
*/
|
||||
@Input() hasBorder = false;
|
||||
@Input() hasBorder: boolean;
|
||||
|
||||
/**
|
||||
* The whether or not the gear is hidden
|
||||
*/
|
||||
@Input() hideGear = false;
|
||||
@Input() hideGear: boolean;
|
||||
|
||||
/**
|
||||
* Whether or not the pager is visible when there is only a single page of results
|
||||
*/
|
||||
@Input() hidePagerWhenSinglePage = true;
|
||||
@Input() selectable = false;
|
||||
@Input() hidePagerWhenSinglePage: boolean;
|
||||
|
||||
@Input() selectable: boolean;
|
||||
|
||||
@Input() selectionConfig: { repeatable: boolean, listId: string };
|
||||
|
||||
/**
|
||||
@@ -64,12 +61,12 @@ export class ThemedObjectListComponent extends ThemedComponent<ObjectListCompone
|
||||
/**
|
||||
* Option for hiding the pagination detail
|
||||
*/
|
||||
@Input() hidePaginationDetail = false;
|
||||
@Input() hidePaginationDetail: boolean;
|
||||
|
||||
/**
|
||||
* Whether or not to add an import button to the object
|
||||
*/
|
||||
@Input() importable = false;
|
||||
@Input() importable: boolean;
|
||||
|
||||
/**
|
||||
* Config used for the import button
|
||||
@@ -79,42 +76,24 @@ export class ThemedObjectListComponent extends ThemedComponent<ObjectListCompone
|
||||
/**
|
||||
* Whether or not the pagination should be rendered as simple previous and next buttons instead of the normal pagination
|
||||
*/
|
||||
@Input() showPaginator = true;
|
||||
@Input() showPaginator: boolean;
|
||||
|
||||
/**
|
||||
* Emit when one of the listed object has changed.
|
||||
*/
|
||||
@Output() contentChange = new EventEmitter<any>();
|
||||
@Output() contentChange: EventEmitter<any> = new EventEmitter();
|
||||
|
||||
/**
|
||||
* If showPaginator is set to true, emit when the previous button is clicked
|
||||
*/
|
||||
@Output() prev = new EventEmitter<boolean>();
|
||||
@Output() prev: EventEmitter<boolean> = new EventEmitter();
|
||||
|
||||
/**
|
||||
* If showPaginator is set to true, emit when the next button is clicked
|
||||
*/
|
||||
@Output() next = new EventEmitter<boolean>();
|
||||
@Output() next: EventEmitter<boolean> = new EventEmitter();
|
||||
|
||||
/**
|
||||
* The current listable objects
|
||||
*/
|
||||
private _objects: RemoteData<PaginatedList<ListableObject>>;
|
||||
|
||||
/**
|
||||
* Setter for the objects
|
||||
* @param objects The new objects
|
||||
*/
|
||||
@Input() set objects(objects: RemoteData<PaginatedList<ListableObject>>) {
|
||||
this._objects = objects;
|
||||
}
|
||||
|
||||
/**
|
||||
* Getter to return the current objects
|
||||
*/
|
||||
get objects() {
|
||||
return this._objects;
|
||||
}
|
||||
@Input() objects: RemoteData<PaginatedList<ListableObject>>;
|
||||
|
||||
/**
|
||||
* An event fired when the page is changed.
|
||||
@@ -123,48 +102,45 @@ export class ThemedObjectListComponent extends ThemedComponent<ObjectListCompone
|
||||
@Output() change: EventEmitter<{
|
||||
pagination: PaginationComponentOptions,
|
||||
sort: SortOptions
|
||||
}> = new EventEmitter<{
|
||||
pagination: PaginationComponentOptions,
|
||||
sort: SortOptions
|
||||
}>();
|
||||
}> = new EventEmitter();
|
||||
|
||||
/**
|
||||
* An event fired when the page is changed.
|
||||
* Event's payload equals to the newly selected page.
|
||||
*/
|
||||
@Output() pageChange: EventEmitter<number> = new EventEmitter<number>();
|
||||
@Output() pageChange: EventEmitter<number> = new EventEmitter();
|
||||
|
||||
/**
|
||||
* An event fired when the page wsize is changed.
|
||||
* Event's payload equals to the newly selected page size.
|
||||
*/
|
||||
@Output() pageSizeChange: EventEmitter<number> = new EventEmitter<number>();
|
||||
@Output() pageSizeChange: EventEmitter<number> = new EventEmitter();
|
||||
|
||||
/**
|
||||
* An event fired when the sort direction is changed.
|
||||
* Event's payload equals to the newly selected sort direction.
|
||||
*/
|
||||
@Output() sortDirectionChange: EventEmitter<SortDirection> = new EventEmitter<SortDirection>();
|
||||
@Output() sortDirectionChange: EventEmitter<SortDirection> = new EventEmitter();
|
||||
|
||||
/**
|
||||
* An event fired when on of the pagination parameters changes
|
||||
*/
|
||||
@Output() paginationChange: EventEmitter<any> = new EventEmitter<any>();
|
||||
@Output() paginationChange: EventEmitter<any> = new EventEmitter();
|
||||
|
||||
@Output() deselectObject: EventEmitter<ListableObject> = new EventEmitter<ListableObject>();
|
||||
@Output() deselectObject: EventEmitter<ListableObject> = new EventEmitter();
|
||||
|
||||
@Output() selectObject: EventEmitter<ListableObject> = new EventEmitter<ListableObject>();
|
||||
@Output() selectObject: EventEmitter<ListableObject> = new EventEmitter();
|
||||
|
||||
/**
|
||||
* Send an import event to the parent component
|
||||
*/
|
||||
@Output() importObject: EventEmitter<ListableObject> = new EventEmitter<ListableObject>();
|
||||
@Output() importObject: EventEmitter<ListableObject> = new EventEmitter();
|
||||
|
||||
/**
|
||||
* An event fired when the sort field is changed.
|
||||
* Event's payload equals to the newly selected sort field.
|
||||
*/
|
||||
@Output() sortFieldChange: EventEmitter<string> = new EventEmitter<string>();
|
||||
@Output() sortFieldChange: EventEmitter<string> = new EventEmitter();
|
||||
|
||||
inAndOutputNames: (keyof ObjectListComponent & keyof this)[] = [
|
||||
'config',
|
||||
|
@@ -29,7 +29,7 @@ export class ThemedSearchResultsComponent extends ThemedComponent<SearchResultsC
|
||||
|
||||
@Input() searchConfig: PaginatedSearchOptions;
|
||||
|
||||
@Input() showCsvExport = false;
|
||||
@Input() showCsvExport: boolean;
|
||||
|
||||
@Input() sortConfig: SortOptions;
|
||||
|
||||
@@ -37,21 +37,21 @@ export class ThemedSearchResultsComponent extends ThemedComponent<SearchResultsC
|
||||
|
||||
@Input() configuration: string;
|
||||
|
||||
@Input() disableHeader = false;
|
||||
@Input() disableHeader: boolean;
|
||||
|
||||
@Input() selectable = false;
|
||||
@Input() selectable: boolean;
|
||||
|
||||
@Input() context: Context;
|
||||
|
||||
@Input() hidePaginationDetail = false;
|
||||
@Input() hidePaginationDetail: boolean;
|
||||
|
||||
@Input() selectionConfig: SelectionConfig = null;
|
||||
@Input() selectionConfig: SelectionConfig;
|
||||
|
||||
@Output() contentChange: EventEmitter<ListableObject> = new EventEmitter<ListableObject>();
|
||||
@Output() contentChange: EventEmitter<ListableObject> = new EventEmitter();
|
||||
|
||||
@Output() deselectObject: EventEmitter<ListableObject> = new EventEmitter<ListableObject>();
|
||||
@Output() deselectObject: EventEmitter<ListableObject> = new EventEmitter();
|
||||
|
||||
@Output() selectObject: EventEmitter<ListableObject> = new EventEmitter<ListableObject>();
|
||||
@Output() selectObject: EventEmitter<ListableObject> = new EventEmitter();
|
||||
|
||||
protected getComponentName(): string {
|
||||
return 'SearchResultsComponent';
|
||||
|
@@ -136,7 +136,7 @@ export class SearchComponent implements OnInit {
|
||||
/**
|
||||
* List of available view mode
|
||||
*/
|
||||
@Input() useUniquePageId: false;
|
||||
@Input() useUniquePageId: boolean;
|
||||
|
||||
/**
|
||||
* List of available view mode
|
||||
|
@@ -11,7 +11,7 @@ import { DSpaceObject } from '../../core/shared/dspace-object.model';
|
||||
import { ListableObject } from '../object-collection/shared/listable-object.model';
|
||||
|
||||
/**
|
||||
* Themed wrapper for SearchComponent
|
||||
* Themed wrapper for {@link SearchComponent}
|
||||
*/
|
||||
@Component({
|
||||
selector: 'ds-themed-search',
|
||||
@@ -21,53 +21,53 @@ import { ListableObject } from '../object-collection/shared/listable-object.mode
|
||||
export class ThemedSearchComponent extends ThemedComponent<SearchComponent> {
|
||||
protected inAndOutputNames: (keyof SearchComponent & keyof this)[] = ['configurationList', 'context', 'configuration', 'fixedFilterQuery', 'useCachedVersionIfAvailable', 'inPlaceSearch', 'linkType', 'paginationId', 'searchEnabled', 'sideBarWidth', 'searchFormPlaceholder', 'selectable', 'selectionConfig', 'showCsvExport', 'showSidebar', 'showViewModes', 'useUniquePageId', 'viewModeList', 'showScopeSelector', 'resultFound', 'deselectObject', 'selectObject', 'trackStatistics', 'query'];
|
||||
|
||||
@Input() configurationList: SearchConfigurationOption[] = [];
|
||||
@Input() configurationList: SearchConfigurationOption[];
|
||||
|
||||
@Input() context: Context = Context.Search;
|
||||
@Input() context: Context;
|
||||
|
||||
@Input() configuration = 'default';
|
||||
@Input() configuration: string;
|
||||
|
||||
@Input() fixedFilterQuery: string;
|
||||
|
||||
@Input() useCachedVersionIfAvailable = true;
|
||||
@Input() useCachedVersionIfAvailable: boolean;
|
||||
|
||||
@Input() inPlaceSearch = true;
|
||||
@Input() inPlaceSearch: boolean;
|
||||
|
||||
@Input() linkType: CollectionElementLinkType;
|
||||
|
||||
@Input() paginationId = 'spc';
|
||||
@Input() paginationId: string;
|
||||
|
||||
@Input() searchEnabled = true;
|
||||
@Input() searchEnabled: boolean;
|
||||
|
||||
@Input() sideBarWidth = 3;
|
||||
@Input() sideBarWidth: number;
|
||||
|
||||
@Input() searchFormPlaceholder = 'search.search-form.placeholder';
|
||||
@Input() searchFormPlaceholder: string;
|
||||
|
||||
@Input() selectable = false;
|
||||
@Input() selectable: boolean;
|
||||
|
||||
@Input() selectionConfig: SelectionConfig;
|
||||
|
||||
@Input() showCsvExport = false;
|
||||
@Input() showCsvExport: boolean;
|
||||
|
||||
@Input() showSidebar = true;
|
||||
@Input() showSidebar: boolean;
|
||||
|
||||
@Input() showViewModes = true;
|
||||
@Input() showViewModes: boolean;
|
||||
|
||||
@Input() useUniquePageId: false;
|
||||
@Input() useUniquePageId: boolean;
|
||||
|
||||
@Input() viewModeList: ViewMode[];
|
||||
|
||||
@Input() showScopeSelector = true;
|
||||
@Input() showScopeSelector: boolean;
|
||||
|
||||
@Input() trackStatistics = false;
|
||||
@Input() trackStatistics: boolean;
|
||||
|
||||
@Input() query: string;
|
||||
|
||||
@Output() resultFound: EventEmitter<SearchObjects<DSpaceObject>> = new EventEmitter<SearchObjects<DSpaceObject>>();
|
||||
@Output() resultFound: EventEmitter<SearchObjects<DSpaceObject>> = new EventEmitter();
|
||||
|
||||
@Output() deselectObject: EventEmitter<ListableObject> = new EventEmitter<ListableObject>();
|
||||
@Output() deselectObject: EventEmitter<ListableObject> = new EventEmitter();
|
||||
|
||||
@Output() selectObject: EventEmitter<ListableObject> = new EventEmitter<ListableObject>();
|
||||
@Output() selectObject: EventEmitter<ListableObject> = new EventEmitter();
|
||||
|
||||
protected getComponentName(): string {
|
||||
return 'SearchComponent';
|
||||
|
@@ -17,6 +17,7 @@ export class AuthServiceStub {
|
||||
token: AuthTokenInfo = new AuthTokenInfo('token_test');
|
||||
impersonating: string;
|
||||
private _tokenExpired = false;
|
||||
private _isExternalAuth = false;
|
||||
private redirectUrl;
|
||||
|
||||
constructor() {
|
||||
@@ -122,6 +123,13 @@ export class AuthServiceStub {
|
||||
checkAuthenticationCookie() {
|
||||
return;
|
||||
}
|
||||
setExternalAuthStatus(externalCookie: boolean) {
|
||||
this._isExternalAuth = externalCookie;
|
||||
}
|
||||
|
||||
isExternalAuthentication(): Observable<boolean> {
|
||||
return observableOf(this._isExternalAuth);
|
||||
}
|
||||
|
||||
retrieveAuthMethodsFromAuthStatus(status: AuthStatus) {
|
||||
return observableOf(authMethodsMock);
|
||||
|
@@ -2629,9 +2629,9 @@
|
||||
// TODO New key - Add a translation
|
||||
"item.bitstreams.upload.bundle.new": "Create bundle",
|
||||
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
// TODO New key - Add a translation
|
||||
"item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
"item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
|
||||
// "item.bitstreams.upload.cancel": "Cancel",
|
||||
// TODO New key - Add a translation
|
||||
@@ -3370,10 +3370,6 @@
|
||||
// TODO New key - Add a translation
|
||||
"item.page.description": "Description",
|
||||
|
||||
// "item.page.edit": "Edit this item",
|
||||
// TODO New key - Add a translation
|
||||
"item.page.edit": "Edit this item",
|
||||
|
||||
// "item.page.journal-issn": "Journal ISSN",
|
||||
// TODO New key - Add a translation
|
||||
"item.page.journal-issn": "Journal ISSN",
|
||||
@@ -6263,9 +6259,9 @@
|
||||
// TODO New key - Add a translation
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
// TODO New key - Add a translation
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant",
|
||||
// TODO New key - Add a translation
|
||||
@@ -6746,7 +6742,7 @@
|
||||
|
||||
// "workflow-item.send-back.button.confirm": "Send back"
|
||||
// TODO New key - Add a translation
|
||||
"workflow-item.send-back.button.confirm": "Send back"
|
||||
"workflow-item.send-back.button.confirm": "Send back",
|
||||
|
||||
|
||||
}
|
||||
|
@@ -2425,7 +2425,7 @@
|
||||
// "item.bitstreams.upload.bundle.new": "Create bundle",
|
||||
"item.bitstreams.upload.bundle.new": "বান্ডিল তৈরি করুন",
|
||||
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
"item.bitstreams.upload.bundles.empty": "এই আইটেমটি একটি বিটস্ট্রিম আপলোড করার জন্য কোন bundles থাকে না।",
|
||||
|
||||
// "item.bitstreams.upload.cancel": "Cancel",
|
||||
@@ -5601,7 +5601,7 @@
|
||||
// "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results",
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "অনুসন্ধানের ফলাফল",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "আপনি এই ব্যক্তির জন্য একটি নাম বৈকল্পিক \"{{ value }}\" হিসাবে সংরক্ষণ করতে চান তাই আপনি এবং অন্যদের ভবিষ্যতের জমা দেওয়ার জন্য এটি পুনঃব্যবহার করতে পারেন? আপনি যদি আপনি এই জমা দেওয়ার জন্য এখনও এটি ব্যবহার করতে পারেন না।",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant",
|
||||
@@ -6128,7 +6128,7 @@
|
||||
"idle-modal.log-out": "প্রস্থান",
|
||||
|
||||
// "idle-modal.extend-session": "Extend session"
|
||||
"idle-modal.extend-session": "সেশন প্রসারিত করুন"
|
||||
"idle-modal.extend-session": "সেশন প্রসারিত করুন",
|
||||
|
||||
|
||||
}
|
||||
|
@@ -2666,7 +2666,7 @@
|
||||
// "item.bitstreams.upload.bundle.new": "Create bundle",
|
||||
"item.bitstreams.upload.bundle.new": "Crear paquet",
|
||||
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
"item.bitstreams.upload.bundles.empty": "Aquest ítem no conté cap paquet per carregar un fitxer.",
|
||||
|
||||
// "item.bitstreams.upload.cancel": "Cancel",
|
||||
@@ -6134,7 +6134,7 @@
|
||||
// "submission.sections.describe.relationship-lookup.selection-tab.title": "Search Results",
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.title": "Resultats de la cerca",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Li agradaria desar \"{{ value }}\" com una variant de nom per a aquesta persona perquè vostè i altres puguin reutilitzar-lo per a enviaments futurs? Si no ho fa, encara pot usar-lo per a aquest enviament.",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant",
|
||||
|
@@ -2569,9 +2569,9 @@
|
||||
// TODO New key - Add a translation
|
||||
"item.bitstreams.upload.bundle.new": "Create bundle",
|
||||
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
// TODO New key - Add a translation
|
||||
"item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
"item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
|
||||
// "item.bitstreams.upload.cancel": "Cancel",
|
||||
// TODO New key - Add a translation
|
||||
@@ -3310,10 +3310,6 @@
|
||||
// TODO New key - Add a translation
|
||||
"item.page.description": "Description",
|
||||
|
||||
// "item.page.edit": "Edit this item",
|
||||
// TODO New key - Add a translation
|
||||
"item.page.edit": "Edit this item",
|
||||
|
||||
// "item.page.journal-issn": "Journal ISSN",
|
||||
// TODO New key - Add a translation
|
||||
"item.page.journal-issn": "Journal ISSN",
|
||||
@@ -6131,9 +6127,9 @@
|
||||
// TODO New key - Add a translation
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
// TODO New key - Add a translation
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant",
|
||||
// TODO New key - Add a translation
|
||||
@@ -6613,7 +6609,7 @@
|
||||
|
||||
// "workflow-item.send-back.button.confirm": "Send back"
|
||||
// TODO New key - Add a translation
|
||||
"workflow-item.send-back.button.confirm": "Send back"
|
||||
"workflow-item.send-back.button.confirm": "Send back",
|
||||
|
||||
|
||||
}
|
||||
|
@@ -1833,9 +1833,6 @@
|
||||
"confirmation-modal.delete-eperson.confirm": "Löschen",
|
||||
|
||||
|
||||
// "dso-selector.select.collection.head": "Select a collection",
|
||||
"dso-selector.select.collection.head": "Bitte wählen Sie eine Sammlung aus.",
|
||||
|
||||
// "dso.name.untitled": "Untitled",
|
||||
"dso.name.untitled": "Unbenannt",
|
||||
|
||||
@@ -2230,7 +2227,7 @@
|
||||
// "item.bitstreams.upload.bundle.new": "Create bundle",
|
||||
"item.bitstreams.upload.bundle.new": "Bündel erstellen",
|
||||
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
"item.bitstreams.upload.bundles.empty": "Diesem Item fehlt ein Bundle. Ohne Bundle kann keine Datei hochgeladen werden.",
|
||||
|
||||
// "item.bitstreams.upload.cancel": "Cancel",
|
||||
@@ -2792,9 +2789,6 @@
|
||||
// "item.page.description": "Description",
|
||||
"item.page.description": "Beschreibung",
|
||||
|
||||
// "item.page.edit": "Edit this item",
|
||||
"item.page.edit": "Dieses Item bearbeiten",
|
||||
|
||||
// "item.page.journal-issn": "Journal ISSN",
|
||||
"item.page.journal-issn": "ISSN der Zeitschrift",
|
||||
|
||||
@@ -3644,12 +3638,6 @@
|
||||
|
||||
|
||||
|
||||
// "process.detail.output": "Process Output",
|
||||
"process.detail.output": "Prozessausgabe (Log)",
|
||||
|
||||
// "process.detail.output-files.empty": "This process doesn't contain any output files",
|
||||
"process.detail.output-files.empty": "Dieser Prozess enthält keine Ausgabedateien.",
|
||||
|
||||
// "process.new.select-parameters": "Parameters",
|
||||
"process.new.select-parameters": "Parameter",
|
||||
|
||||
@@ -5061,7 +5049,7 @@
|
||||
// "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results",
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Suchergebnisse",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Möchten Sie die Namensvariante \"{{ value }}\" speichern, damit sie bei zukünftigen Veröffentlichungen erneut verwendet werden kann? Sie können die Variante bei dieser Veröffentlichung auch verwenden, ohne sie zu speichern.",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant",
|
||||
@@ -5465,6 +5453,6 @@
|
||||
"workflow-item.send-back.button.cancel": "Abbrechen",
|
||||
|
||||
// "workflow-item.send-back.button.confirm": "Send back"
|
||||
"workflow-item.send-back.button.confirm": "Zurücksenden"
|
||||
"workflow-item.send-back.button.confirm": "Zurücksenden",
|
||||
|
||||
}
|
||||
|
@@ -2244,5 +2244,5 @@
|
||||
"workflowAdmin.search.results.head": "Διαχείριση ροής εργασιών",
|
||||
"workspace-item.view.breadcrumbs": "Προβολή χώρου εργασίας",
|
||||
"workspace-item.view.title": "Προβολή χώρου εργασίας",
|
||||
"workspace.search.results.head": "Οι υποβολές σας"
|
||||
"workspace.search.results.head": "Οι υποβολές σας",
|
||||
}
|
||||
|
@@ -1933,7 +1933,7 @@
|
||||
|
||||
"item.bitstreams.upload.bundle.new": "Create bundle",
|
||||
|
||||
"item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
"item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
|
||||
"item.bitstreams.upload.cancel": "Cancel",
|
||||
|
||||
@@ -3259,6 +3259,8 @@
|
||||
|
||||
"process.new.notification.error.content": "An error occurred while creating this process",
|
||||
|
||||
"process.new.notification.error.max-upload.content": "The file exceeds the maximum upload size",
|
||||
|
||||
"process.new.header": "Create a new process",
|
||||
|
||||
"process.new.title": "Create a new process",
|
||||
@@ -4428,7 +4430,7 @@
|
||||
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.title": "Search Results",
|
||||
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant",
|
||||
|
||||
|
@@ -752,8 +752,8 @@
|
||||
// "admin.access-control.groups.form.tooltip.editGroup.addEpeople": "To add or remove an EPerson to/from this group, either click the 'Browse All' button or use the search bar below to search for users (use the dropdown to the left of the search bar to choose whether to search by metadata or by email). Then click the plus icon for each user you wish to add in the list below, or the trash can icon for each user you wish to remove. The list below may have several pages: use the page controls below the list to navigate to the next pages. Once you are ready, save your changes by clicking the 'Save' button in the top section.",
|
||||
"admin.access-control.groups.form.tooltip.editGroup.addEpeople": "Para agregar o remover una persona en este grupo, pulse el botón ‘Examinar todo’ o utilice la barra de búsqueda de abajo para buscar los usuario (Use el desplegable que se encuentra a la derecha de la barra de búsqueda para seleccionar entre buscar por metadato o por correo electrónico). Posteriormente pulse el botón con el icono más por cada usuario que desea agregar a la lista, o el icono de papelera por cada usuario que desea remover. La lista puede contener varias páginas: utilice los controles de paginación debajo de la lista, para navegar a las siguientes páginas. Cuando haya finalizado, guarde sus cambios pulsando el botón ‘Guardar’ ubicado en la parte superior de la sección.",
|
||||
|
||||
// "admin.access-control.groups.form.tooltip.editGroup.addSubgroups": "To add or remove a Subgroup to/from this group, either click the 'Browse All' button or use the search bar below to search for subgroups. Then click the plus icon for each subgroup you wish to add in the list below, or the trash can icon for each subgroup you wish to remove. The list below may have several pages: use the page controls below the list to navigate to the next pages. Once you are ready, save your changes by clicking the 'Save' button in the top section.",
|
||||
"admin.access-control.groups.form.tooltip.editGroup.addSubgroups": "Para agregar o remover un sub-grupo en este grupo, pulse el botón ‘Examinar todo’ o utilice la barra de búsqueda de abajo para buscar los subgrupos- Posteriormente pulse el botón con el icono más por cada sub-grupo que desea agregar a la lista, o el icono de papelera por cada sub-grupo que desea remover. La lista puede contener varias páginas: utilice los controles de paginación debajo de la lista, para navegar a las siguientes páginas. Cuando haya finalizado, guarde sus cambios pulsando el botón ‘Guardar’ ubicado en la parte superior de la sección.",
|
||||
// "admin.access-control.groups.form.tooltip.editGroup.addSubgroups": "To add or remove a Subgroup to/from this group, either click the 'Browse All' button or use the search bar below to search for users. Then click the plus icon for each user you wish to add in the list below, or the trash can icon for each user you wish to remove. The list below may have several pages: use the page controls below the list to navigate to the next pages. Once you are ready, save your changes by clicking the 'Save' button in the top section.",
|
||||
"admin.access-control.groups.form.tooltip.editGroup.addSubgroups": "Para agregar o remover un sub-grupo en este grupo, pulse el botón 'Examinar todo' o utilice la barra de búsqueda de abajo para buscar los subgrupos- Posteriormente pulse el botón con el icono más por cada sub-grupo que desea agregar a la lista, o el icono de papelera por cada sub-grupo que desea remover. La lista puede contener varias páginas: utilice los controles de paginación debajo de la lista, para navegar a las siguientes páginas. Cuando haya finalizado, guarde sus cambios pulsando el botón ‘Guardar’ ubicado en la parte superior de la sección.",
|
||||
|
||||
// "admin.search.breadcrumbs": "Administrative Search",
|
||||
"admin.search.breadcrumbs": "Búsqueda administrativa",
|
||||
@@ -1891,12 +1891,10 @@
|
||||
|
||||
|
||||
// "comcol-role.edit.scorereviewers.name": "Score Reviewers",
|
||||
// TODO New key - Add a translation
|
||||
"comcol-role.edit.scorereviewers.name": "Score Reviewers",
|
||||
"comcol-role.edit.scorereviewers.name": "Revisores de puntuación",
|
||||
|
||||
// "comcol-role.edit.scorereviewers.description": "Reviewers are able to give a score to incoming submissions, this will define whether the submission will be rejected or not.",
|
||||
// TODO New key - Add a translation
|
||||
"comcol-role.edit.scorereviewers.description": "Reviewers are able to give a score to incoming submissions, this will define whether the submission will be rejected or not.",
|
||||
"comcol-role.edit.scorereviewers.description": "Los revisores pueden dar una puntuación a un envío entrante, esto definirá si el envío será rechazado o no.",
|
||||
|
||||
// "community.form.abstract": "Short Description",
|
||||
"community.form.abstract": "Breve descripción",
|
||||
@@ -2588,6 +2586,9 @@
|
||||
// "form.submit": "Save",
|
||||
"form.submit": "Guardar",
|
||||
|
||||
// "form.create": "Create",
|
||||
"form.create": "Crear",
|
||||
|
||||
// "form.repeatable.sort.tip": "Drop the item in the new position",
|
||||
"form.repeatable.sort.tip": "Suelte el ítem en la nueva posición",
|
||||
|
||||
@@ -2847,7 +2848,7 @@
|
||||
// "item.bitstreams.upload.bundle.new": "Create bundle",
|
||||
"item.bitstreams.upload.bundle.new": "Crear bloque",
|
||||
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
"item.bitstreams.upload.bundles.empty": "Este ítem no contiene ningún bloque para cargar un archivo.",
|
||||
|
||||
// "item.bitstreams.upload.cancel": "Cancel",
|
||||
@@ -3547,10 +3548,10 @@
|
||||
"workflow-item.search.result.delete-supervision.modal.confirm": "Borrar",
|
||||
|
||||
// "workflow-item.search.result.notification.deleted.success": "Successfully deleted supervision order \"{{name}}\"",
|
||||
"workflow-item.search.result.notification.deleted.success": "La orden de supervisión \”{{ name }}”\ ha sido borrada exitosamente",
|
||||
"workflow-item.search.result.notification.deleted.success": "La orden de supervisión \"{{ name }}\" ha sido borrada exitosamente",
|
||||
|
||||
// "workflow-item.search.result.notification.deleted.failure": "Failed to delete supervision order \"{{name}}\"",
|
||||
"workflow-item.search.result.notification.deleted.failure": "Error al borrar la orden de supervisión \”{{ name }}\”",
|
||||
"workflow-item.search.result.notification.deleted.failure": "Error al borrar la orden de supervisión \"{{ name }}\"",
|
||||
|
||||
// "workflow-item.search.result.list.element.supervised-by": "Supervised by:",
|
||||
"workflow-item.search.result.list.element.supervised-by": "Supervisado por:",
|
||||
@@ -3953,8 +3954,8 @@
|
||||
// "itemtemplate.edit.metadata.notifications.discarded.content": "Your changes were discarded. To reinstate your changes click the 'Undo' button",
|
||||
"itemtemplate.edit.metadata.notifications.discarded.content": "Sus cambios fueron descartados. Para recuperar sus cambios pulse el botón 'Deshacer'",
|
||||
|
||||
// "itemtemplate.edit.metadata.notifications.discarded.title": "Changed discarded",
|
||||
"itemtemplate.edit.metadata.notifications.discarded.title": "Cambio descartado",
|
||||
// "itemtemplate.edit.metadata.notifications.discarded.title": "Changes discarded",
|
||||
"itemtemplate.edit.metadata.notifications.discarded.title": "Cambios descartados",
|
||||
|
||||
// "itemtemplate.edit.metadata.notifications.error.title": "An error occurred",
|
||||
"itemtemplate.edit.metadata.notifications.error.title": "Ocurrió un error",
|
||||
@@ -3968,8 +3969,8 @@
|
||||
// "itemtemplate.edit.metadata.notifications.outdated.content": "The item template you're currently working on has been changed by another user. Your current changes are discarded to prevent conflicts",
|
||||
"itemtemplate.edit.metadata.notifications.outdated.content": "La plantilla de ítem en la que usted esta trabajando actualmente ha sido cambiada por otro usuario. Sus cambios han sido descartados para evitar conflictos",
|
||||
|
||||
// "itemtemplate.edit.metadata.notifications.outdated.title": "Changed outdated",
|
||||
"itemtemplate.edit.metadata.notifications.outdated.title": "Cambiado obsoleto",
|
||||
// "itemtemplate.edit.metadata.notifications.outdated.title": "Changes outdated",
|
||||
"itemtemplate.edit.metadata.notifications.outdated.title": "Cambios obsoletos",
|
||||
|
||||
// "itemtemplate.edit.metadata.notifications.saved.content": "Your changes to this item template's metadata were saved.",
|
||||
"itemtemplate.edit.metadata.notifications.saved.content": "Sus cambios a los metadatos de esta plantilla de ítem han sido guardados.",
|
||||
@@ -5211,7 +5212,6 @@
|
||||
|
||||
// "register-page.registration.google-recaptcha.must-accept-cookies": "In order to register you must accept the <b>Registration and Password recovery</b> (Google reCaptcha) cookies.",
|
||||
"register-page.registration.google-recaptcha.must-accept-cookies": "Para registrarse debe aceptar las cookies de <b>Registro y recuperación de contraseña</b> (Google reCaptcha).",
|
||||
|
||||
// "register-page.registration.error.maildomain": "This email address is not on the list of domains who can register. Allowed domains are {{ domains }}",
|
||||
"register-page.registration.error.maildomain": "Este correo electrónico no esta en la lista de dominios que pueden registrarse. Los dominios permitidos son {{ domains }}",
|
||||
|
||||
@@ -5226,7 +5226,6 @@
|
||||
|
||||
// "register-page.registration.google-recaptcha.notification.message.expired": "Verification expired. Please verify again.",
|
||||
"register-page.registration.google-recaptcha.notification.message.expired": "Verificación caducada. Verifique de nuevo.",
|
||||
|
||||
// "register-page.registration.info.maildomain": "Accounts can be registered for mail addresses of the domains",
|
||||
"register-page.registration.info.maildomain": "Las cuentas pueden registrarse para las direcciones de correo de los dominios",
|
||||
|
||||
@@ -5943,6 +5942,8 @@
|
||||
// "statistics.table.header.views": "Views",
|
||||
"statistics.table.header.views": "Visitas",
|
||||
|
||||
// "statistics.table.no-name": "(object name could not be loaded)",
|
||||
"statistics.table.no-name": "(el nombre del objeto no pudo ser cargado)",
|
||||
|
||||
|
||||
// "submission.edit.breadcrumbs": "Edit Submission",
|
||||
@@ -6531,7 +6532,7 @@
|
||||
// "submission.sections.describe.relationship-lookup.selection-tab.title": "Search Results",
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.title": "Resultados de la búsqueda",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "¿Le gustaría guardar \"{{ value }}\" como una variante de nombre para esta persona para que usted y otros puedan reutilizarlo para envíos futuros? Si no lo hace, aún puede usarlo para este envío.",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant",
|
||||
@@ -6936,8 +6937,8 @@
|
||||
// "submission.workflow.generic.delete": "Delete",
|
||||
"submission.workflow.generic.delete": "Eliminar",
|
||||
|
||||
// "submission.workflow.generic.delete-help": "If you would to discard this item, select \"Delete\". You will then be asked to confirm it.",
|
||||
"submission.workflow.generic.delete-help": "Si desea descartar este ítem, seleccione \"Eliminar\". Luego se le pedirá que lo confirme.",
|
||||
// "submission.workflow.generic.delete-help": "Select this option to discard this item. You will then be asked to confirm it.",
|
||||
"submission.workflow.generic.delete-help": "Seleccione esta opción para descartar este ítem. A contunuación se le pedirá confirmación.",
|
||||
|
||||
// "submission.workflow.generic.edit": "Edit",
|
||||
"submission.workflow.generic.edit": "Editar",
|
||||
@@ -7084,12 +7085,12 @@
|
||||
"subscriptions.modal.close": "Cerrar",
|
||||
|
||||
// "subscriptions.modal.delete-info": "To remove this subscription, please visit the \"Subscriptions\" page under your user profile",
|
||||
"subscriptions.modal.delete-info": "Para eliminar esta suscripción, por favor visite la página \”Suscripciones”\ en su perfil de usuario",
|
||||
"subscriptions.modal.delete-info": "Para eliminar esta suscripción, por favor visite la página \"Suscripciones\" en su perfil de usuario",
|
||||
|
||||
// "subscriptions.modal.new-subscription-form.type.content": "Content",
|
||||
"subscriptions.modal.new-subscription-form.type.content": "Contenido",
|
||||
|
||||
// "subscriptions.modal.new-subscription-form.frequency.D": "Diario",
|
||||
// "subscriptions.modal.new-subscription-form.frequency.D": "Daily",
|
||||
"subscriptions.modal.new-subscription-form.frequency.D": "Diario",
|
||||
|
||||
// "subscriptions.modal.new-subscription-form.frequency.W": "Weekly",
|
||||
@@ -7345,8 +7346,8 @@
|
||||
"workflow-item.selectrevieweraction.button.confirm": "Confirmar",
|
||||
|
||||
|
||||
// "workflow-item.scorereviewaction.notification.success.title": "Revisar evaluación",
|
||||
"workflow-item.scorereviewaction.notification.success.title": "Revisar evaluación",
|
||||
// "workflow-item.scorereviewaction.notification.success.title": "Rating review",
|
||||
"workflow-item.scorereviewaction.notification.success.title": "Revisión de evaluación",
|
||||
|
||||
// "workflow-item.scorereviewaction.notification.success.content": "The rating for this item workflow item has been successfully submitted",
|
||||
"workflow-item.scorereviewaction.notification.success.content": "La evaluación para este ítem ha sido enviada exitosamente",
|
||||
|
@@ -2006,7 +2006,7 @@
|
||||
// "item.bitstreams.upload.bundle.new": "Create bundle",
|
||||
"item.bitstreams.upload.bundle.new": "Luo nippu",
|
||||
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
"item.bitstreams.upload.bundles.empty": "Tällä tietueella ei ole nippua, johon tiedoston voisi ladata.",
|
||||
|
||||
// "item.bitstreams.upload.cancel": "Cancel",
|
||||
@@ -2566,9 +2566,6 @@
|
||||
// "item.page.description": "Description",
|
||||
"item.page.description": "Kuvaus",
|
||||
|
||||
// "item.page.edit": "Edit this item",
|
||||
"item.page.edit": "Muokkaa tietuetta",
|
||||
|
||||
// "item.page.journal-issn": "Journal ISSN",
|
||||
"item.page.journal-issn": "Kausijulkaisun ISSN",
|
||||
|
||||
@@ -4768,7 +4765,7 @@
|
||||
// "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results",
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Hakutulokset",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Haluatko tallentaa nimen \"{{ value }}\" käyttäjän vaihtoehtoiseksi nimeksi, jota muutkin voivat käyttää uudelleen myös tulevissa tallennuksissa? Ellet tallenna nimeä, voit silti käyttää sitä tässä tallennuksessa.",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant",
|
||||
@@ -5136,7 +5133,7 @@
|
||||
"workflow-item.send-back.button.cancel": "Peruuta",
|
||||
|
||||
// "workflow-item.send-back.button.confirm": "Send back"
|
||||
"workflow-item.send-back.button.confirm": "Lähetä takaisin"
|
||||
"workflow-item.send-back.button.confirm": "Lähetä takaisin",
|
||||
|
||||
|
||||
}
|
||||
|
@@ -1013,7 +1013,7 @@
|
||||
"browse.startsWith.choose_year.label": "Choisir l'année de publication",
|
||||
|
||||
// "browse.startsWith.jump": "Jump to a point in the index:",
|
||||
"browse.startsWith.jump": "Aller directement à une entrée de l'index :",
|
||||
"browse.startsWith.jump": "Aller directement à une entrée de l'index:",
|
||||
|
||||
// "browse.startsWith.months.april": "April",
|
||||
"browse.startsWith.months.april": "Avril",
|
||||
@@ -1061,10 +1061,10 @@
|
||||
"browse.startsWith.submit": "Valider",
|
||||
|
||||
// "browse.startsWith.type_date": "Or type in a date (year-month) and click 'Browse'",
|
||||
"browse.startsWith.type_date": "Ou saisir une date (année-mois) puis cliquer sur « Parcourir par »",
|
||||
"browse.startsWith.type_date": "Ou saisir une date (année-mois) puis cliquer sur « Parcourir par »",
|
||||
|
||||
// "browse.startsWith.type_date.label": "Or type in a date (year-month) and click on the Browse button",
|
||||
"browse.startsWith.type_date.label": "Ou saisir une date (année-mois) puis cliquer sur le bouton « Parcourir »",
|
||||
"browse.startsWith.type_date.label": "Ou saisir une date (année-mois) puis cliquer sur le bouton « Parcourir »",
|
||||
|
||||
// "browse.startsWith.type_text": "Type the first few letters and click on the Browse button",
|
||||
"browse.startsWith.type_text": "Ou saisir les premières lettres puis cliquer sur le bouton « Parcourir »",
|
||||
@@ -1136,7 +1136,7 @@
|
||||
"collection.edit.item-mapper.cancel": "Annuler",
|
||||
|
||||
// "collection.edit.item-mapper.collection": "Collection: \"<b>{{name}}</b>\"",
|
||||
"collection.edit.item-mapper.collection": "Collection : « <b>{{name}}</b> »",
|
||||
"collection.edit.item-mapper.collection": "Collection: « <b>{{name}}</b> »",
|
||||
|
||||
// "collection.edit.item-mapper.confirm": "Map selected items",
|
||||
"collection.edit.item-mapper.confirm": "Associer les Items sélectionnés",
|
||||
@@ -1975,7 +1975,7 @@
|
||||
"error.sub-communities": "Erreur lors de la récupération des sous-communautés",
|
||||
|
||||
// "error.submission.sections.init-form-error": "An error occurred during section initialize, please check your input-form configuration. Details are below : <br> <br>",
|
||||
"error.submission.sections.init-form-error": "Une erreur s'est produite dans la section d'initialisation, veuillez vérifier la configuration de votre formulaire de dépôt. Plus de détails sont disponibles ci-dessous : <br> <br>",
|
||||
"error.submission.sections.init-form-error": "Une erreur s'est produite dans la section d'initialisation, veuillez vérifier la configuration de votre formulaire de dépôt. Plus de détails sont disponibles ci-dessous: <br> <br>",
|
||||
|
||||
// "error.top-level-communities": "Error fetching top-level communities",
|
||||
"error.top-level-communities": "Erreur lors de la récupération des communautés de 1er niveau",
|
||||
@@ -2367,7 +2367,7 @@
|
||||
// "item.bitstreams.upload.bundle.new": "Create bundle",
|
||||
"item.bitstreams.upload.bundle.new": "Créer un Bundle",
|
||||
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
"item.bitstreams.upload.bundles.empty": "Il n'existe pas, au niveau de cet Item, de Bundle dans lequel un Bitstream pourrait être téléchargé.",
|
||||
|
||||
// "item.bitstreams.upload.cancel": "Cancel",
|
||||
@@ -2488,7 +2488,7 @@
|
||||
"item.edit.delete.confirm": "Supprimer",
|
||||
|
||||
// "item.edit.delete.description": "Are you sure this item should be completely deleted? Caution: At present, no tombstone would be left.",
|
||||
"item.edit.delete.description": "Êtes-vous certain(e) de vouloir complètement supprimer cet Item ? Attention, il n'y aura pas de retour en arrière possible.",
|
||||
"item.edit.delete.description": "Êtes-vous certain(e) de vouloir complètement supprimer cet Item? Attention, il n'y aura pas de retour en arrière possible.",
|
||||
|
||||
// "item.edit.delete.error": "An error occurred while deleting the item",
|
||||
"item.edit.delete.error": "Une erreur s'est produite lors de la suppression de l'Item",
|
||||
@@ -2527,7 +2527,7 @@
|
||||
"item.edit.identifiers.doi.status.IS_REGISTERED": "Inscrit",
|
||||
|
||||
// "item.edit.identifiers.doi.status.IS_RESERVED": "Reserved",
|
||||
"item.edit.identifiers.doi.status.IS_RESERVED": "Réseré",
|
||||
"item.edit.identifiers.doi.status.IS_RESERVED": "Réservé",
|
||||
|
||||
// "item.edit.identifiers.doi.status.UPDATE_RESERVED": "Reserved (update queued)",
|
||||
"item.edit.identifiers.doi.status.UPDATE_RESERVED": "Réservé (en attente)",
|
||||
@@ -2560,7 +2560,7 @@
|
||||
"item.edit.register-doi.header": "Inscrire un nouveau DOI ou un DOI en attente",
|
||||
|
||||
// "item.edit.register-doi.description": "Review any pending identifiers and item metadata below and click Confirm to proceed with DOI registration, or Cancel to back out",
|
||||
"item.edit.register-doi.description": "Réviser les identifiants en attente and les métadonnées ci-dessous item metadata below puis cliquer sur Confirmer afin de lancer l'inscription du DOI ou sur Annuler pour interrompre l'inscription",
|
||||
"item.edit.register-doi.description": "Réviser les identifiants en attente et les métadonnées ci-dessous puis cliquer sur Confirmer afin de lancer l'inscription du DOI ou sur Annuler pour interrompre l'inscription",
|
||||
|
||||
// "item.edit.register-doi.confirm": "Confirm",
|
||||
"item.edit.register-doi.confirm": "Confirmer",
|
||||
@@ -2757,7 +2757,7 @@
|
||||
"item.edit.private.confirm": "Définir comme privé",
|
||||
|
||||
// "item.edit.private.description": "Are you sure this item should be made private in the archive?",
|
||||
"item.edit.private.description": "Êtes-vous certain(e) de vouloir définir cet Item comme privé ?",
|
||||
"item.edit.private.description": "Êtes-vous certain(e) de vouloir définir cet Item comme privé?",
|
||||
|
||||
// "item.edit.private.error": "An error occurred while making the item private",
|
||||
"item.edit.private.error": "Une erreur s'est produite lors de la privatisation de l'Item",
|
||||
@@ -2775,7 +2775,7 @@
|
||||
"item.edit.public.confirm": "Définir comme public",
|
||||
|
||||
// "item.edit.public.description": "Are you sure this item should be made public in the archive?",
|
||||
"item.edit.public.description": "Êtes-vous certain(e) de vouloir définir cet Item comme public ?",
|
||||
"item.edit.public.description": "Êtes-vous certain(e) de vouloir définir cet Item comme public?",
|
||||
|
||||
// "item.edit.public.error": "An error occurred while making the item public",
|
||||
"item.edit.public.error": "Une erreur s'est produite lors de la définition de l'Item en tant qu'Item public",
|
||||
@@ -2793,7 +2793,7 @@
|
||||
"item.edit.reinstate.confirm": "Réintégrer",
|
||||
|
||||
// "item.edit.reinstate.description": "Are you sure this item should be reinstated to the archive?",
|
||||
"item.edit.reinstate.description": "Êtes-vous certain(e) de vouloir réintégrer cet Item ?",
|
||||
"item.edit.reinstate.description": "Êtes-vous certain(e) de vouloir réintégrer cet Item?",
|
||||
|
||||
// "item.edit.reinstate.error": "An error occurred while reinstating the item",
|
||||
"item.edit.reinstate.error": "Une erreur s'est produite lors de la réintégration de l'Item",
|
||||
@@ -2970,7 +2970,7 @@
|
||||
"item.edit.withdraw.confirm": "Retirer",
|
||||
|
||||
// "item.edit.withdraw.description": "Are you sure this item should be withdrawn from the archive?",
|
||||
"item.edit.withdraw.description": "Êtes-vous certain que cet Item doit être retiré du dépôt ?",
|
||||
"item.edit.withdraw.description": "Êtes-vous certain que cet Item doit être retiré du dépôt?",
|
||||
|
||||
// "item.edit.withdraw.error": "An error occurred while withdrawing the item",
|
||||
"item.edit.withdraw.error": "Une erreur s'est produite lors du retrait de l'Item",
|
||||
@@ -3043,19 +3043,19 @@
|
||||
"item.page.files": "Fichiers",
|
||||
|
||||
// "item.page.filesection.description": "Description:",
|
||||
"item.page.filesection.description": "Description :",
|
||||
"item.page.filesection.description": "Description:",
|
||||
|
||||
// "item.page.filesection.download": "Download",
|
||||
"item.page.filesection.download": "Télécharger",
|
||||
|
||||
// "item.page.filesection.format": "Format:",
|
||||
"item.page.filesection.format": "Format :",
|
||||
"item.page.filesection.format": "Format:",
|
||||
|
||||
// "item.page.filesection.name": "Name:",
|
||||
"item.page.filesection.name": "Nom :",
|
||||
"item.page.filesection.name": "Nom:",
|
||||
|
||||
// "item.page.filesection.size": "Size:",
|
||||
"item.page.filesection.size": "Taille :",
|
||||
"item.page.filesection.size": "Taille:",
|
||||
|
||||
// "item.page.journal.search.title": "Articles in this journal",
|
||||
"item.page.journal.search.title": "Articles dans cette revue",
|
||||
@@ -3328,7 +3328,7 @@
|
||||
"journal.page.publisher": "Éditeur",
|
||||
|
||||
// "journal.page.titleprefix": "Journal: ",
|
||||
"journal.page.titleprefix": "Revue : ",
|
||||
"journal.page.titleprefix": "Revue: ",
|
||||
|
||||
// "journal.search.results.head": "Journal Search Results",
|
||||
"journal.search.results.head": "Résultats de recherche de revues",
|
||||
@@ -3361,7 +3361,7 @@
|
||||
"journalissue.page.number": "Nombre",
|
||||
|
||||
// "journalissue.page.titleprefix": "Journal Issue: ",
|
||||
"journalissue.page.titleprefix": "Numéro de revue : ",
|
||||
"journalissue.page.titleprefix": "Numéro de revue: ",
|
||||
|
||||
// "journalvolume.listelement.badge": "Journal Volume",
|
||||
"journalvolume.listelement.badge": "Volume de la revue",
|
||||
@@ -3376,7 +3376,7 @@
|
||||
"journalvolume.page.issuedate": "Date de publication",
|
||||
|
||||
// "journalvolume.page.titleprefix": "Journal Volume: ",
|
||||
"journalvolume.page.titleprefix": "Volume de la revue : ",
|
||||
"journalvolume.page.titleprefix": "Volume de la revue: ",
|
||||
|
||||
// "journalvolume.page.volume": "Volume",
|
||||
"journalvolume.page.volume": "Volume",
|
||||
@@ -3472,13 +3472,13 @@
|
||||
"login.form.email": "Adresse électronique",
|
||||
|
||||
// "login.form.forgot-password": "Have you forgotten your password?",
|
||||
"login.form.forgot-password": "Mot de passe oublié ?",
|
||||
"login.form.forgot-password": "Mot de passe oublié?",
|
||||
|
||||
// "login.form.header": "Please log in to DSpace",
|
||||
"login.form.header": "Se connecter à DSpace",
|
||||
|
||||
// "login.form.new-user": "New user? Click here to register.",
|
||||
"login.form.new-user": "Pas encore de compte ? Cliquer ici pour vous enregistrer.",
|
||||
"login.form.new-user": "Pas encore de compte? Cliquer ici pour vous enregistrer.",
|
||||
|
||||
// "login.form.or-divider": "or",
|
||||
"login.form.or-divider": "ou",
|
||||
@@ -3925,7 +3925,7 @@
|
||||
"orgunit.page.id": "ID",
|
||||
|
||||
// "orgunit.page.titleprefix": "Organizational Unit: ",
|
||||
"orgunit.page.titleprefix": "Structure Organisationnelle : ",
|
||||
"orgunit.page.titleprefix": "Structure Organisationnelle: ",
|
||||
|
||||
// "pagination.options.description": "Pagination options",
|
||||
"pagination.options.description": "Options de pagination",
|
||||
@@ -4251,7 +4251,7 @@
|
||||
"project.page.status": "Statut",
|
||||
|
||||
// "project.page.titleprefix": "Research Project: ",
|
||||
"project.page.titleprefix": "Projet de recherche : ",
|
||||
"project.page.titleprefix": "Projet de recherche: ",
|
||||
|
||||
// "project.search.results.head": "Project Search Results",
|
||||
"project.search.results.head": "Résultats de recherche de projets",
|
||||
@@ -4275,7 +4275,7 @@
|
||||
"publication.page.publisher": "Éditeur",
|
||||
|
||||
// "publication.page.titleprefix": "Publication: ",
|
||||
"publication.page.titleprefix": "Publication : ",
|
||||
"publication.page.titleprefix": "Publication: ",
|
||||
|
||||
// "publication.page.volume-title": "Volume Title",
|
||||
"publication.page.volume-title": "Titre du volume",
|
||||
@@ -4932,7 +4932,7 @@
|
||||
"search.results.head": "Résultats de recherche",
|
||||
|
||||
// "search.results.no-results": "Your search returned no results. Having trouble finding what you're looking for? Try putting",
|
||||
"search.results.no-results": "Votre recherche n'a retourné aucun résultat. Vous n'arrivez pas à trouver ce que vous recherchez ? Essayez de mettre",
|
||||
"search.results.no-results": "Votre recherche n'a retourné aucun résultat. Vous n'arrivez pas à trouver ce que vous recherchez? Essayez de mettre",
|
||||
|
||||
// "search.results.no-results-link": "quotes around it",
|
||||
"search.results.no-results-link": "des guillemets avant et après les termes recherchés",
|
||||
@@ -5067,7 +5067,7 @@
|
||||
"submission.general.discard.confirm.cancel": "Annuler",
|
||||
|
||||
// "submission.general.discard.confirm.info": "This operation can't be undone. Are you sure?",
|
||||
"submission.general.discard.confirm.info": "L'annulation est irréversible, les données de la soumission en cours seront perdues. Êtes-vous certain(e) ?",
|
||||
"submission.general.discard.confirm.info": "L'annulation est irréversible, les données de la soumission en cours seront perdues. Êtes-vous certain(e)?",
|
||||
|
||||
// "submission.general.discard.confirm.submit": "Yes, I'm sure",
|
||||
"submission.general.discard.confirm.submit": "Oui, je suis certain(e)",
|
||||
@@ -5567,7 +5567,7 @@
|
||||
// "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results",
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Résultats de recherche",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Souhaitez-vous sauvegarder \"{{ value }}\" en tant que nom alternatif pour cette personne afin que vous ou un autre utilisateur puisse l'utiliser pour de futures soumissions ? Si vous ne le souhaitez pas, vous pouvez tout de même l'utiliser pour cette soumission.",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant",
|
||||
@@ -5700,7 +5700,7 @@
|
||||
"submission.sections.upload.delete.confirm.cancel": "Annuler",
|
||||
|
||||
// "submission.sections.upload.delete.confirm.info": "This operation can't be undone. Are you sure?",
|
||||
"submission.sections.upload.delete.confirm.info": "Cette opération est irréversible. Êtes-vous certain(e) ?",
|
||||
"submission.sections.upload.delete.confirm.info": "Cette opération est irréversible. Êtes-vous certain(e)?",
|
||||
|
||||
// "submission.sections.upload.delete.confirm.submit": "Yes, I'm sure",
|
||||
"submission.sections.upload.delete.confirm.submit": "Oui, je suis certain(e)",
|
||||
@@ -5760,10 +5760,10 @@
|
||||
"submission.sections.upload.form.until-placeholder": "Jusqu'au",
|
||||
|
||||
// "submission.sections.upload.header.policy.default.nolist": "Uploaded files in the {{collectionName}} collection will be accessible according to the following group(s):",
|
||||
"submission.sections.upload.header.policy.default.nolist": "Les fichiers téléchargés dans la collection {{collectionName}} seront accessibles au(x) groupe(s) suivant(s) :",
|
||||
"submission.sections.upload.header.policy.default.nolist": "Les fichiers téléchargés dans la collection {{collectionName}} seront accessibles au(x) groupe(s) suivant(s):",
|
||||
|
||||
// "submission.sections.upload.header.policy.default.withlist": "Please note that uploaded files in the {{collectionName}} collection will be accessible, in addition to what is explicitly decided for the single file, with the following group(s):",
|
||||
"submission.sections.upload.header.policy.default.withlist": "Veuillez noter que, en complément des accès spécifiquement accordés pour le fichier, les fichiers téléchargés dans la collection {{collectionName}} seront accessibles par défaut au(x) groupe(s) suivant(s) :",
|
||||
"submission.sections.upload.header.policy.default.withlist": "Veuillez noter que, en complément des accès spécifiquement accordés pour le fichier, les fichiers téléchargés dans la collection {{collectionName}} seront accessibles par défaut au(x) groupe(s) suivant(s):",
|
||||
|
||||
// "submission.sections.upload.info": "Here you will find all the files currently in the item. You can update the file metadata and access conditions or <strong>upload additional files by dragging & dropping them anywhere on the page.</strong>",
|
||||
"submission.sections.upload.info": "Vous trouverez ici tous les fichiers actuellement associés à l'Item. Vous pouvez éditer les métadonnés et les niveaux d'accès de ce(s) fichier(s) ou <strong>télécharger des fichiers complémentaires simplement en les glissant n'importe où sur cette page</strong>",
|
||||
@@ -6088,7 +6088,7 @@
|
||||
|
||||
|
||||
//"supervisedWorkspace.search.results.head": "Supervised Items",
|
||||
"supervisedWorkspace.search.results.head": "Items supervisés",
|
||||
"supervisedWorkspace.search.results.head": "Documents supervisés",
|
||||
|
||||
//"workspace.search.results.head": "Your submissions",
|
||||
"workspace.search.results.head": "Vos dépôts",
|
||||
|
@@ -2403,7 +2403,7 @@
|
||||
// "item.bitstreams.upload.bundle.new": "Create bundle",
|
||||
"item.bitstreams.upload.bundle.new": "Cruthaich trusgan",
|
||||
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
"item.bitstreams.upload.bundles.empty": "Chan eil trusganan san nì seo dhan gabh bitstream a luchdachadh suas.",
|
||||
|
||||
// "item.bitstreams.upload.cancel": "Cancel",
|
||||
@@ -5608,7 +5608,7 @@
|
||||
// "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results",
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Toraidhean Rannsachaidh",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "A bheil thu airson \"{{ value }}\" a shàbhaladh mar ainm diofraichte don neach seo airson gum faigh thu fhèin agus daoine eile a chleachdadh airson chur-a-steachan ri thighinn? Mura bheil, is urrainn dhut fhathast a chleachdadh airson a' chur-a-steach seo.",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant",
|
||||
@@ -6077,5 +6077,5 @@
|
||||
"idle-modal.log-out": "Log a-mach",
|
||||
|
||||
// "idle-modal.extend-session": "Extend session"
|
||||
"idle-modal.extend-session": "Leudaich seisean"
|
||||
"idle-modal.extend-session": "Leudaich seisean",
|
||||
}
|
||||
|
@@ -4531,6 +4531,6 @@
|
||||
|
||||
"workspace-item.view.title": "कार्यक्षेत्र दृश्य",
|
||||
|
||||
"workspace.search.results.head": "आपकी प्रस्तुतियाँ"
|
||||
"workspace.search.results.head": "आपकी प्रस्तुतियाँ",
|
||||
|
||||
}
|
||||
|
@@ -2629,9 +2629,9 @@
|
||||
// TODO New key - Add a translation
|
||||
"item.bitstreams.upload.bundle.new": "Create bundle",
|
||||
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
// TODO New key - Add a translation
|
||||
"item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
"item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
|
||||
// "item.bitstreams.upload.cancel": "Cancel",
|
||||
// TODO New key - Add a translation
|
||||
@@ -3370,10 +3370,6 @@
|
||||
// TODO New key - Add a translation
|
||||
"item.page.description": "Description",
|
||||
|
||||
// "item.page.edit": "Edit this item",
|
||||
// TODO New key - Add a translation
|
||||
"item.page.edit": "Edit this item",
|
||||
|
||||
// "item.page.journal-issn": "Journal ISSN",
|
||||
// TODO New key - Add a translation
|
||||
"item.page.journal-issn": "Journal ISSN",
|
||||
@@ -6263,9 +6259,9 @@
|
||||
// TODO New key - Add a translation
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
// TODO New key - Add a translation
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant",
|
||||
// TODO New key - Add a translation
|
||||
@@ -6746,7 +6742,7 @@
|
||||
|
||||
// "workflow-item.send-back.button.confirm": "Send back"
|
||||
// TODO New key - Add a translation
|
||||
"workflow-item.send-back.button.confirm": "Send back"
|
||||
"workflow-item.send-back.button.confirm": "Send back",
|
||||
|
||||
|
||||
}
|
||||
|
@@ -1950,7 +1950,7 @@
|
||||
|
||||
|
||||
// "deny-request-copy.email.message": "Dear {{ recipientName }},\nIn response to your request I regret to inform you that it's not possible to send you a copy of the file(s) you have requested, concerning the document: \"{{ itemUrl }}\" ({{ itemName }}), of which I am an author.\n\nBest regards,\n{{ authorName }} <{{ authorEmail }}>",
|
||||
"deny-request-copy.email.message": "Құрметті {{ recipientName }}, \nСіздің сұрауыңызға жауап ретінде Мен сізге құжатқа қатысты сіз сұраған файлдардың көшірмесін жіберу мүмкін емес екенін өкінішпен айтамын: \"{{ itemUrl }}\" ({{ itemName }}), оның авторы мен.\n\nІзгі тілектермен,\N{{ authorName }} <{{ authorEmail }}>",
|
||||
"deny-request-copy.email.message": "Құрметті {{ recipientName }}, \nСіздің сұрауыңызға жауап ретінде Мен сізге құжатқа қатысты сіз сұраған файлдардың көшірмесін жіберу мүмкін емес екенін өкінішпен айтамын: \"{{ itemUrl }}\" ({{ itemName }}), оның авторы мен.\n\nІзгі тілектермен,\n{{ authorName }} <{{ authorEmail }}>",
|
||||
|
||||
// "deny-request-copy.email.subject": "Request copy of document",
|
||||
"deny-request-copy.email.subject": "Құжаттың көшірмесін сұрау",
|
||||
@@ -2403,7 +2403,7 @@
|
||||
|
||||
|
||||
// "grant-request-copy.email.message": "Dear {{ recipientName }},\nIn response to your request I have the pleasure to send you in attachment a copy of the file(s) concerning the document: \"{{ itemUrl }}\" ({{ itemName }}), of which I am an author.\n\nBest regards,\n{{ authorName }} <{{ authorEmail }}>",
|
||||
"grant-request-copy.email.message": "Құрметті {{ recipientName }},\nСіздің сұрауыңызға жауап ретінде Мен сізге құжатқа қатысты файлдың көшірмесін тіркемеде жібергеніме қуаныштымын: \"{{ itemUrl }}\" ({{ itemName }}), оның авторы мен.\n\nІзгі тілектермен,\N{{ authorName }} <{{ authorEmail }}>",
|
||||
"grant-request-copy.email.message": "Құрметті {{ recipientName }},\nСіздің сұрауыңызға жауап ретінде Мен сізге құжатқа қатысты файлдың көшірмесін тіркемеде жібергеніме қуаныштымын: \"{{ itemUrl }}\" ({{ itemName }}), оның авторы мен.\n\nІзгі тілектермен,\n{{ authorName }} <{{ authorEmail }}>",
|
||||
|
||||
// "grant-request-copy.email.subject": "Request copy of document",
|
||||
"grant-request-copy.email.subject": "Құжаттың көшірмесін сұрау",
|
||||
@@ -2611,7 +2611,7 @@
|
||||
// "item.bitstreams.upload.bundle.new": "Create bundle",
|
||||
"item.bitstreams.upload.bundle.new": "Буманы жасау",
|
||||
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
"item.bitstreams.upload.bundles.empty": "Бұл элементте биттік ағынды жүктеп салуға арналған бумалар жоқ.",
|
||||
|
||||
// "item.bitstreams.upload.cancel": "Cancel",
|
||||
@@ -6064,7 +6064,7 @@
|
||||
// "submission.sections.describe.relationship-lookup.selection-tab.title": "Search Results",
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.title": "Іздеу нәтижелері",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Сіз \"{{ value }}\" сол адамға арналған атау опциясы ретінде сақтағыңыз келе ме, сондықтан сіз және басқалар оны болашақ жіберу үшін қайта пайдалана аласыз ба? Егер жоқ болса, сіз оны осы жіберу үшін пайдалана аласыз.",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant",
|
||||
|
@@ -2196,7 +2196,7 @@
|
||||
// "item.bitstreams.upload.bundle.new": "Create bundle",
|
||||
"item.bitstreams.upload.bundle.new": "Izveidot kopienu",
|
||||
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
"item.bitstreams.upload.bundles.empty": "Materiālā nav neviena kopiena ko augšupielādēt bitu straumē.",
|
||||
|
||||
// "item.bitstreams.upload.cancel": "Cancel",
|
||||
@@ -2768,10 +2768,6 @@
|
||||
// TODO New key - Add a translation
|
||||
"item.page.description": "Description",
|
||||
|
||||
// "item.page.edit": "Edit this item",
|
||||
// TODO New key - Add a translation
|
||||
"item.page.edit": "Edit this item",
|
||||
|
||||
// "item.page.journal-issn": "Journal ISSN",
|
||||
// TODO New key - Add a translation
|
||||
"item.page.journal-issn": "Journal ISSN",
|
||||
@@ -5221,7 +5217,7 @@
|
||||
// TODO New key - Add a translation
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Vai vēlaties saglabāt \"{{ value }}\" kā vārda variantu šai personai, lai jūs un citi varētu to izmantot turpmākai iesniegšanai? Ja nē, jūs joprojām varat to izmantot šai iesniegšanai.",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant",
|
||||
@@ -5624,7 +5620,7 @@
|
||||
|
||||
// "workflow-item.send-back.button.confirm": "Send back"
|
||||
// TODO New key - Add a translation
|
||||
"workflow-item.send-back.button.confirm": "Send back"
|
||||
"workflow-item.send-back.button.confirm": "Send back",
|
||||
|
||||
|
||||
}
|
||||
|
@@ -2397,9 +2397,9 @@
|
||||
// TODO New key - Add a translation
|
||||
"item.bitstreams.upload.bundle.new": "Create bundle",
|
||||
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
// TODO New key - Add a translation
|
||||
"item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
"item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
|
||||
// "item.bitstreams.upload.cancel": "Cancel",
|
||||
// TODO New key - Add a translation
|
||||
@@ -3015,10 +3015,6 @@
|
||||
// TODO New key - Add a translation
|
||||
"item.page.description": "Description",
|
||||
|
||||
// "item.page.edit": "Edit this item",
|
||||
// TODO New key - Add a translation
|
||||
"item.page.edit": "Edit this item",
|
||||
|
||||
// "item.page.journal-issn": "Journal ISSN",
|
||||
// TODO New key - Add a translation
|
||||
"item.page.journal-issn": "Journal ISSN",
|
||||
@@ -5591,9 +5587,9 @@
|
||||
// TODO New key - Add a translation
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
// TODO New key - Add a translation
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant",
|
||||
// TODO New key - Add a translation
|
||||
@@ -6001,7 +5997,7 @@
|
||||
|
||||
// "workflow-item.send-back.button.confirm": "Send back"
|
||||
// TODO New key - Add a translation
|
||||
"workflow-item.send-back.button.confirm": "Send back"
|
||||
"workflow-item.send-back.button.confirm": "Send back",
|
||||
|
||||
|
||||
}
|
||||
|
@@ -2298,5 +2298,5 @@
|
||||
"submission.sections.license.notgranted": "Najpierw musisz zaakceptować licencję",
|
||||
"submission.sections.license.required": "Najpierw musisz zaakceptować licencję",
|
||||
"confirmation-modal.export-batch.confirm": "Eksportuj",
|
||||
"confirmation-modal.export-batch.cancel":"Anuluj"
|
||||
"confirmation-modal.export-batch.cancel": "Anuluj",
|
||||
}
|
||||
|
@@ -70,18 +70,6 @@
|
||||
// "admin.curation-tasks.breadcrumbs": "System curation tasks",
|
||||
"admin.curation-tasks.breadcrumbs": "Tarefas de Curadoria do Sistema",
|
||||
|
||||
// "admin.curation-tasks.title": "System curation tasks",
|
||||
"admin.curation-tasks.title": "Tarefas de Curadoria do Sistema",
|
||||
|
||||
// "admin.curation-tasks.header": "System curation tasks",
|
||||
"admin.curation-tasks.header": "Tarefas de Curadoria do Sistema",
|
||||
|
||||
// "admin.registries.bitstream-formats.breadcrumbs": "Format registry",
|
||||
"admin.registries.bitstream-formats.breadcrumbs": "Formatar registro",
|
||||
|
||||
// "admin.registries.bitstream-formats.create.breadcrumbs": "Bitstream format",
|
||||
"admin.registries.bitstream-formats.create.breadcrumbs": "Formatar Bitstream",
|
||||
|
||||
// "admin.curation-tasks.title": "System curation tasks",
|
||||
"admin.curation-tasks.title": "Tarefas de curadoria do sistema",
|
||||
|
||||
@@ -2531,7 +2519,7 @@
|
||||
// "item.bitstreams.upload.bundle.new": "Create bundle",
|
||||
"item.bitstreams.upload.bundle.new": "Criar pacote",
|
||||
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
"item.bitstreams.upload.bundles.empty": "Este item não possui um pacote para poder receber o bitstream.",
|
||||
|
||||
// "item.bitstreams.upload.cancel": "Cancel",
|
||||
@@ -5850,7 +5838,7 @@
|
||||
// "submission.sections.describe.relationship-lookup.selection-tab.title": "Search Results",
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.title": "Resultados da pesquisa",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Você gostaria de salvar \"{{ value }}\" como uma variante de nome para esta pessoa para que você e outros possam reutilizá-lo para futuras submissões? Se você não fizer isso, ainda poderá usá-lo para esta submissão.",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant",
|
||||
|
@@ -2208,7 +2208,7 @@
|
||||
// "item.bitstreams.upload.bundle.new": "Create bundle",
|
||||
"item.bitstreams.upload.bundle.new": "Criar um pacote",
|
||||
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
"item.bitstreams.upload.bundles.empty": "Este item não possui um pacote para poder receber os ficheiros.",
|
||||
|
||||
// "item.bitstreams.upload.cancel": "Cancel",
|
||||
@@ -2770,9 +2770,6 @@
|
||||
// "item.page.description": "Description",
|
||||
"item.page.description": "Descrição",
|
||||
|
||||
// "item.page.edit": "Edit this item",
|
||||
"item.page.edit": "Editar este item",
|
||||
|
||||
// "item.page.journal-issn": "Journal ISSN",
|
||||
"item.page.journal-issn": "ISSN da Revista",
|
||||
|
||||
@@ -4969,7 +4966,7 @@
|
||||
// "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results",
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Resultados da Pesquisa",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Pretende guardar \"{{ value }}\" como um nome alternativo para esta pessoa permitindo a sua reutilização por outros em futuras submissões? Se não, pode usar apenas nesta submissão.",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant",
|
||||
@@ -5338,7 +5335,7 @@
|
||||
"workflow-item.send-back.button.cancel": "Cancelar",
|
||||
|
||||
// "workflow-item.send-back.button.confirm": "Send back"
|
||||
"workflow-item.send-back.button.confirm": "Devolver"
|
||||
"workflow-item.send-back.button.confirm": "Devolver",
|
||||
|
||||
|
||||
}
|
||||
|
@@ -2453,7 +2453,7 @@
|
||||
// "item.bitstreams.upload.bundle.new": "Create bundle",
|
||||
"item.bitstreams.upload.bundle.new": "Skapa bunt",
|
||||
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
"item.bitstreams.upload.bundles.empty": "Denna post innehåller inga buntar som man kan ladda upp filer i.",
|
||||
|
||||
// "item.bitstreams.upload.cancel": "Cancel",
|
||||
@@ -5752,7 +5752,7 @@
|
||||
// "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results",
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Sökresultat",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Vill du spara \"{{ value }}\" som en namnvariation för denna person? Om inte så kan du fortfarande använda det i detta bidrag.",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant",
|
||||
@@ -6281,6 +6281,6 @@
|
||||
"idle-modal.log-out": "Logga ut",
|
||||
|
||||
// "idle-modal.extend-session": "Extend session"
|
||||
"idle-modal.extend-session": "Fortsätt"
|
||||
"idle-modal.extend-session": "Fortsätt",
|
||||
|
||||
}
|
||||
|
@@ -2629,9 +2629,9 @@
|
||||
// TODO New key - Add a translation
|
||||
"item.bitstreams.upload.bundle.new": "Create bundle",
|
||||
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
// TODO New key - Add a translation
|
||||
"item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
"item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
|
||||
// "item.bitstreams.upload.cancel": "Cancel",
|
||||
// TODO New key - Add a translation
|
||||
@@ -3370,10 +3370,6 @@
|
||||
// TODO New key - Add a translation
|
||||
"item.page.description": "Description",
|
||||
|
||||
// "item.page.edit": "Edit this item",
|
||||
// TODO New key - Add a translation
|
||||
"item.page.edit": "Edit this item",
|
||||
|
||||
// "item.page.journal-issn": "Journal ISSN",
|
||||
// TODO New key - Add a translation
|
||||
"item.page.journal-issn": "Journal ISSN",
|
||||
@@ -6263,9 +6259,9 @@
|
||||
// TODO New key - Add a translation
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
// TODO New key - Add a translation
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant",
|
||||
// TODO New key - Add a translation
|
||||
@@ -6746,7 +6742,7 @@
|
||||
|
||||
// "workflow-item.send-back.button.confirm": "Send back"
|
||||
// TODO New key - Add a translation
|
||||
"workflow-item.send-back.button.confirm": "Send back"
|
||||
"workflow-item.send-back.button.confirm": "Send back",
|
||||
|
||||
|
||||
}
|
||||
|
@@ -769,7 +769,7 @@
|
||||
"bitstream.edit.form.description.label": "Açıklama",
|
||||
|
||||
// "bitstream.edit.form.embargo.hint": "The first day from which access is allowed. <b>This date cannot be modified on this form.</b> To set an embargo date for a bitstream, go to the <i>Item Status</i> tab, click <i>Authorizations...</i>, create or edit the bitstream's <i>READ</i> policy, and set the <i>Start Date</i> as desired.",
|
||||
"bitstream.edit.form.embargo.hint": "Erişime izin verilen ilk gün. <b>Bu tarih bu formda değiştirilemez.</b> Bir bitstream için bir ambargo tarihi ayarlamak için <i>Öğe Durumu</i> sekmesine gidin, <i>Yetkiler...</i>'i tıklayın., bitstreamın <i>OKU</i> politikasını oluşturun veya düzenleyin ve <i>Başlangıç Tarihi</i>'ni istediğiniz gibi ayarlayın.",
|
||||
"bitstream.edit.form.embargo.hint": "Erişime izin verilen ilk gün. <b>Bu tarih bu formda değiştirilemez.</b> Bir bitstream için bir ambargo tarihi ayarlamak için <i>Öğe Durumu</i> sekmesine gidin, <i>Yetkiler...</i>'i tıklayın., bitstreamın <i>OKU</i> politikasını oluşturun veya düzenleyin ve <i>Başlangıç Tarihi</i>'ni istediğiniz gibi ayarlayın.",
|
||||
|
||||
// "bitstream.edit.form.embargo.label": "Embargo until specific date",
|
||||
"bitstream.edit.form.embargo.label": "Belirli bir tarihe kadar ambargo",
|
||||
@@ -2004,7 +2004,7 @@
|
||||
// "item.bitstreams.upload.bundle.new": "Create bundle",
|
||||
"item.bitstreams.upload.bundle.new": "Paket oluştur",
|
||||
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
"item.bitstreams.upload.bundles.empty": "Bu öğe, bir bitstream yüklemek için herhangi bir paket içermiyor.",
|
||||
|
||||
// "item.bitstreams.upload.cancel": "Cancel",
|
||||
@@ -2566,9 +2566,6 @@
|
||||
// "item.page.description": "Description",
|
||||
"item.page.description": "Açıklama",
|
||||
|
||||
// "item.page.edit": "Edit this item",
|
||||
"item.page.edit": "Bu ögeyi düzenle",
|
||||
|
||||
// "item.page.journal-issn": "Journal ISSN",
|
||||
"item.page.journal-issn": "Süreli Yayın ISSN",
|
||||
|
||||
@@ -4757,7 +4754,7 @@
|
||||
// "submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Search Results",
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Sonuçları Ara",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Bu kişi için \"{{ value }}\" ilerideki gönderilerde kullanılabilmek için Yeni İsim olarak kaydedilsin mi? Bunu yapmazsanız, yine de bu gönderim için kullanabilirsiniz .",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant",
|
||||
@@ -5126,6 +5123,6 @@
|
||||
"workflow-item.send-back.button.cancel": "İptal",
|
||||
|
||||
// "workflow-item.send-back.button.confirm": "Send back"
|
||||
"workflow-item.send-back.button.confirm": "Geri Gönder"
|
||||
"workflow-item.send-back.button.confirm": "Geri Gönder",
|
||||
|
||||
}
|
||||
|
@@ -2120,7 +2120,7 @@
|
||||
// "item.bitstreams.upload.bundle.new": "Create bundle",
|
||||
"item.bitstreams.upload.bundle.new": "Створити контейнер файлів",
|
||||
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn\'t contain any bundles to upload a bitstream to.",
|
||||
// "item.bitstreams.upload.bundles.empty": "This item doesn't contain any bundles to upload a bitstream to.",
|
||||
"item.bitstreams.upload.bundles.empty": "Цей документ не містить контейнеру файлів, щоб завантажити файл.",
|
||||
|
||||
// "item.bitstreams.upload.cancel": "Cancel",
|
||||
@@ -2684,9 +2684,6 @@
|
||||
// "item.page.description": "Description",
|
||||
"item.page.description": "Опис",
|
||||
|
||||
// "item.page.edit": "Edit this item",
|
||||
"item.page.edit": "Редагувати цей документ",
|
||||
|
||||
// "item.page.journal-issn": "Journal ISSN",
|
||||
"item.page.journal-issn": "Номер ISSN",
|
||||
|
||||
@@ -5067,7 +5064,7 @@
|
||||
|
||||
"submission.sections.describe.relationship-lookup.selection-tab.title.arxiv": "Результати пошуку",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don\'t you can still use it for this submission.",
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.content": "Would you like to save \"{{ value }}\" as a name variant for this person so you and others can reuse it for future submissions? If you don't you can still use it for this submission.",
|
||||
"submission.sections.describe.relationship-lookup.name-variant.notification.content": "Чи бажаєте ви зберегти \"{{ value }}\" як варіант імені для цього користувача, щоб ви та інші могли повторно використовувати його для майбутніх надсилань? Якщо ви цього не зробите, ви можете використовувати його для цього надсилання.",
|
||||
|
||||
// "submission.sections.describe.relationship-lookup.name-variant.notification.confirm": "Save a new name variant",
|
||||
@@ -5197,7 +5194,7 @@
|
||||
"submission.sections.upload.form.access-condition-label": "Умови доступу",
|
||||
|
||||
// "submission.sections.upload.form.date-required": "Date is required.",
|
||||
"submission.sections.upload.form.date-required": "Поле дати є обов\'язковим для заповнення.",
|
||||
"submission.sections.upload.form.date-required": "Поле дати є обов'язковим для заповнення.",
|
||||
|
||||
// "submission.sections.upload.form.from-label": "Grant access from",
|
||||
|
||||
@@ -5210,7 +5207,7 @@
|
||||
"submission.sections.upload.form.group-label": "Група",
|
||||
|
||||
// "submission.sections.upload.form.group-required": "Group is required.",
|
||||
"submission.sections.upload.form.group-required": "Група є обов\'язковою.",
|
||||
"submission.sections.upload.form.group-required": "Група є обов'язковою.",
|
||||
|
||||
// "submission.sections.upload.form.until-label": "Grant access until",
|
||||
|
||||
@@ -5469,7 +5466,7 @@
|
||||
|
||||
// "workflow-item.send-back.button.confirm": "Send back"
|
||||
|
||||
"workflow-item.send-back.button.confirm": "Надіслати назад"
|
||||
"workflow-item.send-back.button.confirm": "Надіслати назад",
|
||||
|
||||
|
||||
}
|
||||
|
@@ -3,7 +3,6 @@ import 'reflect-metadata';
|
||||
import 'core-js/es/reflect';
|
||||
|
||||
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
|
||||
import { load as loadWebFont } from 'webfontloader';
|
||||
|
||||
import { BrowserAppModule } from './modules/app/browser-app.module';
|
||||
|
||||
@@ -24,14 +23,6 @@ const bootstrap = () => platformBrowserDynamic()
|
||||
const hasTransferState = document.querySelector('script#dspace-angular-state') !== null;
|
||||
|
||||
const main = () => {
|
||||
// Load fonts async
|
||||
// https://github.com/typekit/webfontloader#configuration
|
||||
loadWebFont({
|
||||
google: {
|
||||
families: ['Droid Sans']
|
||||
}
|
||||
});
|
||||
|
||||
if (environment.production) {
|
||||
enableProdMode();
|
||||
}
|
||||
|
@@ -26,16 +26,21 @@ import { AuthService } from '../../app/core/auth/auth.service';
|
||||
import { ThemeService } from '../../app/shared/theme-support/theme.service';
|
||||
import { StoreAction, StoreActionTypes } from '../../app/store.actions';
|
||||
import { coreSelector } from '../../app/core/core.selectors';
|
||||
import { find, map } from 'rxjs/operators';
|
||||
import { filter, find, map } from 'rxjs/operators';
|
||||
import { isNotEmpty } from '../../app/shared/empty.util';
|
||||
import { logStartupMessage } from '../../../startup-message';
|
||||
import { MenuService } from '../../app/shared/menu/menu.service';
|
||||
import { RootDataService } from '../../app/core/data/root-data.service';
|
||||
import { firstValueFrom, Subscription } from 'rxjs';
|
||||
|
||||
/**
|
||||
* Performs client-side initialization.
|
||||
*/
|
||||
@Injectable()
|
||||
export class BrowserInitService extends InitService {
|
||||
|
||||
sub: Subscription;
|
||||
|
||||
constructor(
|
||||
protected store: Store<AppState>,
|
||||
protected correlationIdService: CorrelationIdService,
|
||||
@@ -51,6 +56,7 @@ export class BrowserInitService extends InitService {
|
||||
protected authService: AuthService,
|
||||
protected themeService: ThemeService,
|
||||
protected menuService: MenuService,
|
||||
private rootDataService: RootDataService
|
||||
) {
|
||||
super(
|
||||
store,
|
||||
@@ -80,6 +86,7 @@ export class BrowserInitService extends InitService {
|
||||
return async () => {
|
||||
await this.loadAppState();
|
||||
this.checkAuthenticationToken();
|
||||
this.externalAuthCheck();
|
||||
this.initCorrelationId();
|
||||
|
||||
this.checkEnvironment();
|
||||
@@ -134,4 +141,35 @@ export class BrowserInitService extends InitService {
|
||||
protected initGoogleAnalytics() {
|
||||
this.googleAnalyticsService.addTrackingIdToPage();
|
||||
}
|
||||
|
||||
/**
|
||||
* During an external authentication flow invalidate the SSR transferState
|
||||
* data in the cache. This allows the app to fetch fresh content.
|
||||
* @private
|
||||
*/
|
||||
private externalAuthCheck() {
|
||||
|
||||
this.sub = this.authService.isExternalAuthentication().pipe(
|
||||
filter((externalAuth: boolean) => externalAuth)
|
||||
).subscribe(() => {
|
||||
// Clear the transferState data.
|
||||
this.rootDataService.invalidateRootCache();
|
||||
this.authService.setExternalAuthStatus(false);
|
||||
}
|
||||
);
|
||||
|
||||
this.closeAuthCheckSubscription();
|
||||
}
|
||||
|
||||
/**
|
||||
* Unsubscribe the external authentication subscription
|
||||
* when authentication is no longer blocking.
|
||||
* @private
|
||||
*/
|
||||
private closeAuthCheckSubscription() {
|
||||
firstValueFrom(this.authenticationReady$()).then(() => {
|
||||
this.sub.unsubscribe();
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
29
yarn.lock
29
yarn.lock
@@ -4270,10 +4270,10 @@ cypress-axe@^1.1.0:
|
||||
resolved "https://registry.yarnpkg.com/cypress-axe/-/cypress-axe-1.4.0.tgz#e67482bfe9e740796bf77c7823f19781a8a2faff"
|
||||
integrity sha512-Ut7NKfzjyKm0BEbt2WxuKtLkIXmx6FD2j0RwdvO/Ykl7GmB/qRQkwbKLk3VP35+83hiIr8GKD04PDdrTK5BnyA==
|
||||
|
||||
cypress@^12.0.1:
|
||||
version "12.7.0"
|
||||
resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.7.0.tgz#69900f82af76cf3ba0ddb9b59ec3b0d38222ab22"
|
||||
integrity sha512-7rq+nmhzz0u6yabCFyPtADU2OOrYt6pvUau9qV7xyifJ/hnsaw/vkr0tnLlcuuQKUAOC1v1M1e4Z0zG7S0IAvA==
|
||||
cypress@12.9.0:
|
||||
version "12.9.0"
|
||||
resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.9.0.tgz#e6ab43cf329fd7c821ef7645517649d72ccf0a12"
|
||||
integrity sha512-Ofe09LbHKgSqX89Iy1xen2WvpgbvNxDzsWx3mgU1mfILouELeXYGwIib3ItCwoRrRifoQwcBFmY54Vs0zw7QCg==
|
||||
dependencies:
|
||||
"@cypress/request" "^2.88.10"
|
||||
"@cypress/xvfb" "^1.2.4"
|
||||
@@ -5147,6 +5147,15 @@ eslint-plugin-jsdoc@^39.6.4:
|
||||
semver "^7.3.8"
|
||||
spdx-expression-parse "^3.0.1"
|
||||
|
||||
eslint-plugin-jsonc@^2.6.0:
|
||||
version "2.6.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint-plugin-jsonc/-/eslint-plugin-jsonc-2.6.0.tgz#5a439ec15b4930c022bf157264a3d4f4712b982c"
|
||||
integrity sha512-4bA9YTx58QaWalua1Q1b82zt7eZMB7i+ed8q8cKkbKP75ofOA2SXbtFyCSok7RY6jIXeCqQnKjN9If8zCgv6PA==
|
||||
dependencies:
|
||||
eslint-utils "^3.0.0"
|
||||
jsonc-eslint-parser "^2.0.4"
|
||||
natural-compare "^1.4.0"
|
||||
|
||||
eslint-plugin-lodash@^7.4.0:
|
||||
version "7.4.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint-plugin-lodash/-/eslint-plugin-lodash-7.4.0.tgz#14a761547f126c92ff56789662a20a44f8bb6290"
|
||||
@@ -5249,7 +5258,7 @@ esm@^3.2.25:
|
||||
resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10"
|
||||
integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==
|
||||
|
||||
espree@^9.4.0:
|
||||
espree@^9.0.0, espree@^9.4.0:
|
||||
version "9.4.1"
|
||||
resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd"
|
||||
integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==
|
||||
@@ -7030,6 +7039,16 @@ json5@^2.1.2, json5@^2.2.1, json5@^2.2.2:
|
||||
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.2.tgz#64471c5bdcc564c18f7c1d4df2e2297f2457c5ab"
|
||||
integrity sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==
|
||||
|
||||
jsonc-eslint-parser@^2.0.4:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/jsonc-eslint-parser/-/jsonc-eslint-parser-2.1.0.tgz#4c126b530aa583d85308d0b3041ff81ce402bbb2"
|
||||
integrity sha512-qCRJWlbP2v6HbmKW7R3lFbeiVWHo+oMJ0j+MizwvauqnCV/EvtAeEeuCgoc/ErtsuoKgYB8U4Ih8AxJbXoE6/g==
|
||||
dependencies:
|
||||
acorn "^8.5.0"
|
||||
eslint-visitor-keys "^3.0.0"
|
||||
espree "^9.0.0"
|
||||
semver "^7.3.5"
|
||||
|
||||
jsonc-parser@3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22"
|
||||
|
Reference in New Issue
Block a user