mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-16 14:33:03 +00:00
Merge branch 'main' into 2387-i18n_for_status_badges_and_status_search_filter_entries
This commit is contained in:
2
.github/workflows/label_merge_conflicts.yml
vendored
2
.github/workflows/label_merge_conflicts.yml
vendored
@@ -25,6 +25,8 @@ jobs:
|
||||
# See: https://github.com/prince-chrismc/label-merge-conflicts-action
|
||||
- name: Auto-label PRs with merge conflicts
|
||||
uses: prince-chrismc/label-merge-conflicts-action@v3
|
||||
# Ignore any failures -- may occur (randomly?) for older, outdated PRs.
|
||||
continue-on-error: true
|
||||
# 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
|
||||
|
44
.github/workflows/port_merged_pull_request.yml
vendored
Normal file
44
.github/workflows/port_merged_pull_request.yml
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
# This workflow will attempt to port a merged pull request to
|
||||
# the branch specified in a "port to" label (if exists)
|
||||
name: Port merged Pull Request
|
||||
|
||||
# Only run for merged PRs against the "main" or maintenance branches
|
||||
# We allow this to run for `pull_request_target` so that github secrets are available
|
||||
# (This is required when the PR comes from a forked repo)
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [ closed ]
|
||||
branches:
|
||||
- main
|
||||
- 'dspace-**'
|
||||
|
||||
permissions:
|
||||
contents: write # so action can add comments
|
||||
pull-requests: write # so action can create pull requests
|
||||
|
||||
jobs:
|
||||
port_pr:
|
||||
runs-on: ubuntu-latest
|
||||
# Don't run on closed *unmerged* pull requests
|
||||
if: github.event.pull_request.merged
|
||||
steps:
|
||||
# Checkout code
|
||||
- uses: actions/checkout@v3
|
||||
# Port PR to other branch (ONLY if labeled with "port to")
|
||||
# See https://github.com/korthout/backport-action
|
||||
- name: Create backport pull requests
|
||||
uses: korthout/backport-action@v1
|
||||
with:
|
||||
# Trigger based on a "port to [branch]" label on PR
|
||||
# (This label must specify the branch name to port to)
|
||||
label_pattern: '^port to ([^ ]+)$'
|
||||
# Title to add to the (newly created) port PR
|
||||
pull_title: '[Port ${target_branch}] ${pull_title}'
|
||||
# Description to add to the (newly created) port PR
|
||||
pull_description: 'Port of #${pull_number} by @${pull_author} to `${target_branch}`.'
|
||||
# Copy all labels from original PR to (newly created) port PR
|
||||
# NOTE: The labels matching 'label_pattern' are automatically excluded
|
||||
copy_labels_pattern: '.*'
|
||||
# Use a personal access token (PAT) to create PR as 'dspace-bot' user.
|
||||
# A PAT is required in order for the new PR to trigger its own actions (for CI checks)
|
||||
github_token: ${{ secrets.PR_PORT_TOKEN }}
|
@@ -37,7 +37,7 @@ import {
|
||||
getFirstCompletedRemoteData,
|
||||
getFirstSucceededRemoteDataPayload
|
||||
} from '../../../core/shared/operators';
|
||||
import { AlertType } from '../../../shared/alert/aletr-type';
|
||||
import { AlertType } from '../../../shared/alert/alert-type';
|
||||
import { ConfirmationModalComponent } from '../../../shared/confirmation-modal/confirmation-modal.component';
|
||||
import { hasValue, isNotEmpty, hasValueOperator } from '../../../shared/empty.util';
|
||||
import { FormBuilderService } from '../../../shared/form/builder/form-builder.service';
|
||||
|
@@ -8,7 +8,7 @@ import { ItemTemplateDataService } from '../../core/data/item-template-data.serv
|
||||
import { getCollectionEditRoute } from '../collection-page-routing-paths';
|
||||
import { Item } from '../../core/shared/item.model';
|
||||
import { getFirstSucceededRemoteDataPayload } from '../../core/shared/operators';
|
||||
import { AlertType } from '../../shared/alert/aletr-type';
|
||||
import { AlertType } from '../../shared/alert/alert-type';
|
||||
import { DSONameService } from '../../core/breadcrumbs/dso-name.service';
|
||||
|
||||
@Component({
|
||||
|
@@ -1,5 +1,5 @@
|
||||
import { Component, Inject, Injector, Input, OnDestroy, OnInit, ViewChild } from '@angular/core';
|
||||
import { AlertType } from '../../shared/alert/aletr-type';
|
||||
import { AlertType } from '../../shared/alert/alert-type';
|
||||
import { DSpaceObject } from '../../core/shared/dspace-object.model';
|
||||
import { DsoEditMetadataForm } from './dso-edit-metadata-form';
|
||||
import { map } from 'rxjs/operators';
|
||||
|
@@ -3,7 +3,7 @@ import { Component, Input } from '@angular/core';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
import { HealthComponent } from '../../models/health-component.model';
|
||||
import { AlertType } from '../../../shared/alert/aletr-type';
|
||||
import { AlertType } from '../../../shared/alert/alert-type';
|
||||
|
||||
/**
|
||||
* A component to render a "health component" object.
|
||||
|
@@ -1,6 +1,6 @@
|
||||
import { Component, Input } from '@angular/core';
|
||||
import { Item } from '../../core/shared/item.model';
|
||||
import { AlertType } from '../../shared/alert/aletr-type';
|
||||
import { AlertType } from '../../shared/alert/alert-type';
|
||||
|
||||
@Component({
|
||||
selector: 'ds-item-alerts',
|
||||
|
@@ -5,7 +5,7 @@ import { Item } from '../../../core/shared/item.model';
|
||||
import { map } from 'rxjs/operators';
|
||||
import { getFirstSucceededRemoteData } from '../../../core/shared/operators';
|
||||
import { ActivatedRoute } from '@angular/router';
|
||||
import { AlertType } from '../../../shared/alert/aletr-type';
|
||||
import { AlertType } from '../../../shared/alert/alert-type';
|
||||
|
||||
@Component({
|
||||
selector: 'ds-item-version-history',
|
||||
|
@@ -15,7 +15,7 @@ import { getFirstCompletedRemoteData } from '../../../core/shared/operators';
|
||||
import { hasValue } from '../../../shared/empty.util';
|
||||
import { NotificationsService } from '../../../shared/notifications/notifications.service';
|
||||
import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model';
|
||||
import { AlertType } from '../../../shared/alert/aletr-type';
|
||||
import { AlertType } from '../../../shared/alert/alert-type';
|
||||
import { Item } from '../../../core/shared/item.model';
|
||||
import { OrcidAuthService } from '../../../core/orcid/orcid-auth.service';
|
||||
|
||||
|
@@ -5,8 +5,7 @@ import { RemoteData } from '../../../../core/data/remote-data';
|
||||
import { Relationship } from '../../../../core/shared/item-relationships/relationship.model';
|
||||
import { Item } from '../../../../core/shared/item.model';
|
||||
import {
|
||||
getFirstSucceededRemoteDataPayload,
|
||||
getFirstSucceededRemoteData
|
||||
getFirstCompletedRemoteData
|
||||
} from '../../../../core/shared/operators';
|
||||
import { hasValue } from '../../../../shared/empty.util';
|
||||
import { InjectionToken } from '@angular/core';
|
||||
@@ -77,24 +76,42 @@ export const relationsToItems = (thisId: string) =>
|
||||
* @param {string} thisId The item's id of which the relations belong to
|
||||
* @returns {(source: Observable<Relationship[]>) => Observable<Item[]>}
|
||||
*/
|
||||
export const paginatedRelationsToItems = (thisId: string) =>
|
||||
(source: Observable<RemoteData<PaginatedList<Relationship>>>): Observable<RemoteData<PaginatedList<Item>>> =>
|
||||
export const paginatedRelationsToItems = (thisId: string) => (source: Observable<RemoteData<PaginatedList<Relationship>>>): Observable<RemoteData<PaginatedList<Item>>> =>
|
||||
source.pipe(
|
||||
getFirstSucceededRemoteData(),
|
||||
getFirstCompletedRemoteData(),
|
||||
switchMap((relationshipsRD: RemoteData<PaginatedList<Relationship>>) => {
|
||||
return observableCombineLatest(
|
||||
relationshipsRD.payload.page.map((rel: Relationship) =>
|
||||
observableCombineLatest([
|
||||
rel.leftItem.pipe(getFirstSucceededRemoteDataPayload()),
|
||||
rel.rightItem.pipe(getFirstSucceededRemoteDataPayload())]
|
||||
rel.leftItem.pipe(
|
||||
getFirstCompletedRemoteData(),
|
||||
map((rd: RemoteData<Item>) => {
|
||||
if (rd.hasSucceeded) {
|
||||
return rd.payload;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
})
|
||||
),
|
||||
rel.rightItem.pipe(
|
||||
getFirstCompletedRemoteData(),
|
||||
map((rd: RemoteData<Item>) => {
|
||||
if (rd.hasSucceeded) {
|
||||
return rd.payload;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
})
|
||||
),
|
||||
]
|
||||
)
|
||||
)).pipe(
|
||||
)
|
||||
).pipe(
|
||||
map((arr) =>
|
||||
arr
|
||||
.map(([leftItem, rightItem]) => {
|
||||
if (leftItem.id === thisId) {
|
||||
arr.map(([leftItem, rightItem]) => {
|
||||
if (hasValue(leftItem) && leftItem.id === thisId) {
|
||||
return rightItem;
|
||||
} else if (rightItem.id === thisId) {
|
||||
} else if (hasValue(rightItem) && rightItem.id === thisId) {
|
||||
return leftItem;
|
||||
}
|
||||
})
|
||||
|
@@ -23,7 +23,7 @@ import { PaginatedList } from '../../core/data/paginated-list.model';
|
||||
import { PaginationComponentOptions } from '../../shared/pagination/pagination-component-options.model';
|
||||
import { VersionHistoryDataService } from '../../core/data/version-history-data.service';
|
||||
import { PaginatedSearchOptions } from '../../shared/search/models/paginated-search-options.model';
|
||||
import { AlertType } from '../../shared/alert/aletr-type';
|
||||
import { AlertType } from '../../shared/alert/alert-type';
|
||||
import { followLink } from '../../shared/utils/follow-link-config.model';
|
||||
import { hasValue, hasValueOperator } from '../../shared/empty.util';
|
||||
import { PaginationService } from '../../core/pagination/pagination.service';
|
||||
|
@@ -12,7 +12,7 @@ import {
|
||||
} from '../../../core/shared/operators';
|
||||
import { map, startWith, switchMap } from 'rxjs/operators';
|
||||
import { VersionHistoryDataService } from '../../../core/data/version-history-data.service';
|
||||
import { AlertType } from '../../../shared/alert/aletr-type';
|
||||
import { AlertType } from '../../../shared/alert/alert-type';
|
||||
import { getItemPageRoute } from '../../item-page-routing-paths';
|
||||
|
||||
@Component({
|
||||
|
@@ -17,7 +17,7 @@ import {
|
||||
getFirstSucceededRemoteDataPayload
|
||||
} from '../../core/shared/operators';
|
||||
import { URLCombiner } from '../../core/url-combiner/url-combiner';
|
||||
import { AlertType } from '../../shared/alert/aletr-type';
|
||||
import { AlertType } from '../../shared/alert/alert-type';
|
||||
import { hasValue } from '../../shared/empty.util';
|
||||
import { ProcessStatus } from '../processes/process-status.model';
|
||||
import { Process } from '../processes/process.model';
|
||||
|
@@ -161,7 +161,7 @@ export class ProfilePageComponent implements OnInit {
|
||||
} else {
|
||||
this.notificationsService.error(
|
||||
this.translate.instant(this.PASSWORD_NOTIFICATIONS_PREFIX + 'error.title'),
|
||||
this.translate.instant(this.PASSWORD_NOTIFICATIONS_PREFIX + 'error.change-failed')
|
||||
this.getPasswordErrorMessage(response)
|
||||
);
|
||||
}
|
||||
});
|
||||
@@ -199,4 +199,18 @@ export class ProfilePageComponent implements OnInit {
|
||||
return this.isResearcherProfileEnabled$.asObservable();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an error message from a password validation request with a specific reason or
|
||||
* a default message without specific reason.
|
||||
* @param response from the validation password patch request.
|
||||
*/
|
||||
getPasswordErrorMessage(response) {
|
||||
if (response.hasFailed && isNotEmpty(response.errorMessage)) {
|
||||
// Response has a specific error message. Show this message in the error notification.
|
||||
return this.translate.instant(response.errorMessage);
|
||||
}
|
||||
// Show default error message notification.
|
||||
return this.translate.instant(this.PASSWORD_NOTIFICATIONS_PREFIX + 'error.change-failed');
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -13,7 +13,7 @@ import {isNotEmpty} from '../shared/empty.util';
|
||||
import {BehaviorSubject, combineLatest, Observable, of, switchMap} from 'rxjs';
|
||||
import {map, startWith, take} from 'rxjs/operators';
|
||||
import {CAPTCHA_NAME, GoogleRecaptchaService} from '../core/google-recaptcha/google-recaptcha.service';
|
||||
import {AlertType} from '../shared/alert/aletr-type';
|
||||
import {AlertType} from '../shared/alert/alert-type';
|
||||
import {KlaroService} from '../shared/cookies/klaro.service';
|
||||
import {CookieService} from '../core/services/cookie.service';
|
||||
import { Subscription } from 'rxjs';
|
||||
|
@@ -15,7 +15,7 @@ import {
|
||||
import { BulkAccessConfigDataService } from '../../core/config/bulk-access-config-data.service';
|
||||
import { getFirstCompletedRemoteData } from '../../core/shared/operators';
|
||||
import { BulkAccessConditionOptions } from '../../core/config/models/bulk-access-condition-options.model';
|
||||
import { AlertType } from '../alert/aletr-type';
|
||||
import { AlertType } from '../alert/alert-type';
|
||||
import {
|
||||
createAccessControlInitialFormState
|
||||
} from './access-control-form-container-intial-state';
|
||||
|
@@ -8,7 +8,7 @@ import { TranslateModule } from '@ngx-translate/core';
|
||||
|
||||
import { AlertComponent } from './alert.component';
|
||||
import { createTestComponent } from '../testing/utils.test';
|
||||
import { AlertType } from './aletr-type';
|
||||
import { AlertType } from './alert-type';
|
||||
|
||||
describe('AlertComponent test suite', () => {
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import { ChangeDetectorRef, Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
|
||||
import { trigger } from '@angular/animations';
|
||||
|
||||
import { AlertType } from './aletr-type';
|
||||
import { AlertType } from './alert-type';
|
||||
import { fadeOutLeave, fadeOutState } from '../animations/fade';
|
||||
|
||||
/**
|
||||
|
@@ -3,7 +3,7 @@ import { Component, Input } from '@angular/core';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
import { Subscription } from 'rxjs';
|
||||
import { AlertType } from '../alert/aletr-type';
|
||||
import { AlertType } from '../alert/alert-type';
|
||||
|
||||
@Component({
|
||||
selector: 'ds-error',
|
||||
|
@@ -67,7 +67,9 @@ export class MarkdownPipe implements PipeTransform {
|
||||
// sanitize-html doesn't let through SVG by default, so we extend its allowlists to cover MathJax SVG
|
||||
allowedTags: [
|
||||
...sanitizeHtml.defaults.allowedTags,
|
||||
'mjx-container', 'svg', 'g', 'path', 'rect', 'text'
|
||||
'mjx-container', 'svg', 'g', 'path', 'rect', 'text',
|
||||
// Also let the mjx-assistive-mml tag (and it's children) through (for screen readers)
|
||||
'mjx-assistive-mml', 'math', 'mrow', 'mi',
|
||||
],
|
||||
allowedAttributes: {
|
||||
...sanitizeHtml.defaults.allowedAttributes,
|
||||
@@ -88,7 +90,16 @@ export class MarkdownPipe implements PipeTransform {
|
||||
],
|
||||
text: [
|
||||
'transform', 'font-size'
|
||||
]
|
||||
],
|
||||
'mjx-assistive-mml': [
|
||||
'unselectable', 'display', 'style',
|
||||
],
|
||||
math: [
|
||||
'xmlns',
|
||||
],
|
||||
mrow: [
|
||||
'data-mjx-texclass',
|
||||
],
|
||||
},
|
||||
parser: {
|
||||
lowerCaseAttributeNames: false,
|
||||
|
@@ -3,7 +3,7 @@ import { Component, Injector, Input, OnInit, ViewChild } from '@angular/core';
|
||||
import { SectionsDirective } from '../sections.directive';
|
||||
import { SectionDataObject } from '../models/section-data.model';
|
||||
import { rendersSectionType } from '../sections-decorator';
|
||||
import { AlertType } from '../../../shared/alert/aletr-type';
|
||||
import { AlertType } from '../../../shared/alert/alert-type';
|
||||
|
||||
/**
|
||||
* This component represents a section that contains the submission license form.
|
||||
|
@@ -7,7 +7,7 @@ import { SectionModelComponent } from '../models/section.model';
|
||||
import { renderSectionFor } from '../sections-decorator';
|
||||
import { SectionDataObject } from '../models/section-data.model';
|
||||
import { SubmissionService } from '../../submission.service';
|
||||
import { AlertType } from '../../../shared/alert/aletr-type';
|
||||
import { AlertType } from '../../../shared/alert/alert-type';
|
||||
import { SectionsService } from '../sections.service';
|
||||
import { WorkspaceitemSectionIdentifiersObject } from '../../../core/submission/models/workspaceitem-section-identifiers.model';
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
import { Component, Input } from '@angular/core';
|
||||
|
||||
import { Policy } from '../../../../core/submission/models/sherpa-policies-details.model';
|
||||
import { AlertType } from '../../../../shared/alert/aletr-type';
|
||||
import { AlertType } from '../../../../shared/alert/alert-type';
|
||||
|
||||
/**
|
||||
* This component represents a section that contains the publisher policy informations.
|
||||
|
@@ -1,4 +1,4 @@
|
||||
import { AlertType } from '../../../shared/alert/aletr-type';
|
||||
import { AlertType } from '../../../shared/alert/alert-type';
|
||||
import { Component, Inject } from '@angular/core';
|
||||
|
||||
import { BehaviorSubject, Observable, of, Subscription } from 'rxjs';
|
||||
|
@@ -21,7 +21,7 @@ import { SectionsType } from '../sections-type';
|
||||
import { renderSectionFor } from '../sections-decorator';
|
||||
import { SectionDataObject } from '../models/section-data.model';
|
||||
import { SubmissionObjectEntry } from '../../objects/submission-objects.reducer';
|
||||
import { AlertType } from '../../../shared/alert/aletr-type';
|
||||
import { AlertType } from '../../../shared/alert/alert-type';
|
||||
import { RemoteData } from '../../../core/data/remote-data';
|
||||
import { Group } from '../../../core/eperson/models/group.model';
|
||||
import { SectionsService } from '../sections.service';
|
||||
|
File diff suppressed because it is too large
Load Diff
26
yarn.lock
26
yarn.lock
@@ -10114,33 +10114,33 @@ selfsigned@^2.1.1:
|
||||
dependencies:
|
||||
node-forge "^1"
|
||||
|
||||
semver@7.3.8, semver@^7.3.5, semver@^7.3.8:
|
||||
semver@7.3.8:
|
||||
version "7.3.8"
|
||||
resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798"
|
||||
integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==
|
||||
dependencies:
|
||||
lru-cache "^6.0.0"
|
||||
|
||||
semver@^5.3.0, semver@^5.6.0, semver@^5.7.1:
|
||||
version "5.7.1"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
|
||||
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
|
||||
version "5.7.2"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
|
||||
integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
|
||||
|
||||
semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
|
||||
version "6.3.0"
|
||||
resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
|
||||
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
|
||||
version "6.3.1"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
|
||||
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
|
||||
|
||||
semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.7:
|
||||
version "7.4.0"
|
||||
resolved "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz"
|
||||
integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==
|
||||
semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8:
|
||||
version "7.5.4"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
|
||||
integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
|
||||
dependencies:
|
||||
lru-cache "^6.0.0"
|
||||
|
||||
semver@~7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz"
|
||||
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
|
||||
integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
|
||||
|
||||
send@0.16.2:
|
||||
|
Reference in New Issue
Block a user